diff --git a/Telegram/Telegram.vcxproj b/Telegram/Telegram.vcxproj index c473287b2..d73c79792 100644 --- a/Telegram/Telegram.vcxproj +++ b/Telegram/Telegram.vcxproj @@ -69,7 +69,7 @@ AL_LIBTYPE_STATIC;UNICODE;WIN32;WIN64;HAVE_STDINT_H;ZLIB_WINAPI;_SCL_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - .\..\..\Libraries\lzma\C;.\..\..\Libraries\libexif-0.6.20;.\..\..\Libraries\zlib-1.2.8;.\..\..\Libraries\OpenSSL-Win32\include;.\..\..\Libraries\ffmpeg-2.6.3;.\..\..\Libraries\openal-soft\include;.\SourceFiles;.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.0\QtCore;.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.0\QtGui;%(AdditionalIncludeDirectories) + .\..\..\Libraries\lzma\C;.\..\..\Libraries\libexif-0.6.20;.\..\..\Libraries\zlib-1.2.8;.\..\..\Libraries\OpenSSL-Win32\include;.\..\..\Libraries\ffmpeg-2.6.3;.\..\..\Libraries\openal-soft\include;.\SourceFiles;.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.1\QtCore;.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.1\QtGui;%(AdditionalIncludeDirectories) ProgramDatabase false Use diff --git a/Telegram/_qt_5_5_0_patch/qtbase/mkspecs/common/msvc-desktop.conf b/Telegram/_qt_5_5_0_patch/qtbase/mkspecs/common/msvc-desktop.conf deleted file mode 100644 index e44ee5e8d..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/mkspecs/common/msvc-desktop.conf +++ /dev/null @@ -1,147 +0,0 @@ -# -# qmake configuration for Microsoft Visual Studio C/C++ Compiler -# This mkspec is used for all win32-msvcXXXX specs -# - -isEmpty(MSC_VER)|isEmpty(MSVC_VER): error("Source mkspec must set both MSC_VER and MSVC_VER.") - -# -# Baseline: Visual Studio 2005 (8.0), VC++ 14.0 -# - -MAKEFILE_GENERATOR = MSVC.NET -QMAKE_PLATFORM = win32 -QMAKE_COMPILER = msvc -CONFIG += incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe -DEFINES += UNICODE WIN32 -QMAKE_COMPILER_DEFINES += _MSC_VER=$$MSC_VER _WIN32 -contains(QMAKE_TARGET.arch, x86_64) { - DEFINES += WIN64 - QMAKE_COMPILER_DEFINES += _WIN64 -} - -QMAKE_CC = cl -QMAKE_LEX = flex -QMAKE_LEXFLAGS = -QMAKE_YACC = byacc -QMAKE_YACCFLAGS = -d -QMAKE_CFLAGS = -nologo -Zc:wchar_t -QMAKE_CFLAGS_WARN_ON = -W3 -QMAKE_CFLAGS_WARN_OFF = -W0 -QMAKE_CFLAGS_RELEASE = -O2 -MT -QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi -QMAKE_CFLAGS_DEBUG = -Zi -MTd -QMAKE_CFLAGS_YACC = -QMAKE_CFLAGS_LTCG = -GL -QMAKE_CFLAGS_SSE2 = -arch:SSE2 -QMAKE_CFLAGS_SSE3 = -arch:SSE2 -QMAKE_CFLAGS_SSSE3 = -arch:SSE2 -QMAKE_CFLAGS_SSE4_1 = -arch:SSE2 -QMAKE_CFLAGS_SSE4_2 = -arch:SSE2 - -QMAKE_CXX = $$QMAKE_CC -QMAKE_CXXFLAGS = $$QMAKE_CFLAGS -QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON -w34100 -w34189 -w44996 -QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF -QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE -QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO -QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG -QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC -QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG -QMAKE_CXXFLAGS_STL_ON = -EHsc -QMAKE_CXXFLAGS_STL_OFF = -QMAKE_CXXFLAGS_RTTI_ON = -GR -QMAKE_CXXFLAGS_RTTI_OFF = -QMAKE_CXXFLAGS_EXCEPTIONS_ON = -EHsc -QMAKE_CXXFLAGS_EXCEPTIONS_OFF = - -QMAKE_INCDIR = - -QMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$obj $src -QMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $< -QMAKE_RUN_CC_IMP_BATCH = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ @<< -QMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$obj $src -QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $< -QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<< - -QMAKE_LINK = link -QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT -QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO -QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF /INCREMENTAL:NO -QMAKE_LFLAGS_DEBUG = /DEBUG -QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE -QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS -QMAKE_LFLAGS_EXE = \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\" -QMAKE_LFLAGS_DLL = /DLL -QMAKE_LFLAGS_LTCG = /LTCG -QMAKE_EXTENSION_STATICLIB = lib - -QMAKE_LIBS_CORE = kernel32.lib user32.lib shell32.lib uuid.lib ole32.lib advapi32.lib ws2_32.lib -QMAKE_LIBS_GUI = gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib ws2_32.lib ole32.lib user32.lib advapi32.lib -QMAKE_LIBS_NETWORK = ws2_32.lib -QMAKE_LIBS_OPENGL = glu32.lib opengl32.lib gdi32.lib user32.lib -QMAKE_LIBS_OPENGL_ES2 = libEGL.lib libGLESv2.lib gdi32.lib user32.lib -QMAKE_LIBS_OPENGL_ES2_DEBUG = libEGLd.lib libGLESv2d.lib gdi32.lib user32.lib -QMAKE_LIBS_COMPAT = advapi32.lib shell32.lib comdlg32.lib user32.lib gdi32.lib ws2_32.lib - -QMAKE_LIBS_QT_ENTRY = -lqtmain - -QMAKE_IDL = midl -QMAKE_LIB = lib /NOLOGO -QMAKE_RC = rc - -VCPROJ_EXTENSION = .vcproj -VCSOLUTION_EXTENSION = .sln -VCPROJ_KEYWORD = Qt4VSv1.0 - -# -# Version-specific changes -# -greaterThan(MSC_VER, 1499) { - # Visual Studio 2008 (9.0) / Visual C++ 15.0 and up - QMAKE_CFLAGS_MP = -MP - QMAKE_CXXFLAGS_MP = $$QMAKE_CFLAGS_MP -} - -greaterThan(MSC_VER, 1599) { - # Visual Studio 2010 (10.0) / Visual C++ 16.0 and up - MAKEFILE_GENERATOR = MSBUILD - - QMAKE_CFLAGS_AVX = -arch:AVX - QMAKE_CFLAGS_AVX2 = -arch:AVX - - VCPROJ_EXTENSION = .vcxproj -} - -greaterThan(MSC_VER, 1699) { - # Visual Studio 2012 (11.0) / Visual C++ 17.0 and up - QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -D_HAS_EXCEPTIONS=0 - QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE@QMAKE_SUBSYSTEM_SUFFIX@ - QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS@QMAKE_SUBSYSTEM_SUFFIX@ - QT_CONFIG += c++11 - CONFIG += c++11 -} - -greaterThan(MSC_VER, 1799) { - # Visual Studio 2013 (12.0) / Visual C++ 18.0 and up - QMAKE_CFLAGS += -FS - QMAKE_CXXFLAGS += -FS - - equals(MSC_VER, 1800) { - QMAKE_CFLAGS_RELEASE += -Zc:strictStrings - QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -Zc:strictStrings - QMAKE_CXXFLAGS_RELEASE += -Zc:strictStrings - QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += -Zc:strictStrings - } -} - -greaterThan(MSC_VER, 1899) { - # Visual Studio 2015 (14.0) / Visual C++ 19.0 and up - QMAKE_CFLAGS += -Zc:strictStrings - QMAKE_CFLAGS_WARN_ON += -w44456 -w44457 -w44458 - QMAKE_CFLAGS_AVX2 = -arch:AVX2 - QMAKE_CXXFLAGS += -Zc:strictStrings - QMAKE_CXXFLAGS_WARN_ON += -w44456 -w44457 -w44458 -} - -unset(MSC_VER) diff --git a/Telegram/_qt_5_5_0_patch/qtbase/qmake/generators/mac/pbuilder_pbx.cpp b/Telegram/_qt_5_5_0_patch/qtbase/qmake/generators/mac/pbuilder_pbx.cpp deleted file mode 100644 index a0fe0163b..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/qmake/generators/mac/pbuilder_pbx.cpp +++ /dev/null @@ -1,2046 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the qmake application of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "pbuilder_pbx.h" -#include "option.h" -#include "meta.h" -#include -#include -#include -#include -#include -#include -#include -#ifdef Q_OS_UNIX -# include -# include -#endif -#ifdef Q_OS_DARWIN -#include -#include -#endif - -QT_BEGIN_NAMESPACE - -//#define GENERATE_AGGREGRATE_SUBDIR - -// Note: this is fairly hacky, but it does the job... - -using namespace QMakeInternal; - -static QString qtSha1(const QByteArray &src) -{ - QByteArray digest = QCryptographicHash::hash(src, QCryptographicHash::Sha1); - return QString::fromLatin1(digest.toHex()); -} - -ProjectBuilderMakefileGenerator::ProjectBuilderMakefileGenerator() : UnixMakefileGenerator() -{ - -} - -bool -ProjectBuilderMakefileGenerator::writeMakefile(QTextStream &t) -{ - writingUnixMakefileGenerator = false; - if(!project->values("QMAKE_FAILED_REQUIREMENTS").isEmpty()) { - /* for now just dump, I need to generated an empty xml or something.. */ - fprintf(stderr, "Project file not generated because all requirements not met:\n\t%s\n", - var("QMAKE_FAILED_REQUIREMENTS").toLatin1().constData()); - return true; - } - - project->values("MAKEFILE").clear(); - project->values("MAKEFILE").append("Makefile"); - if(project->first("TEMPLATE") == "app" || project->first("TEMPLATE") == "lib") - return writeMakeParts(t); - else if(project->first("TEMPLATE") == "subdirs") - return writeSubDirs(t); - return false; -} - -struct ProjectBuilderSubDirs { - QMakeProject *project; - QString subdir; - bool autoDelete; - ProjectBuilderSubDirs(QMakeProject *p, QString s, bool a=true) : project(p), subdir(s), autoDelete(a) { } - ~ProjectBuilderSubDirs() { - if(autoDelete) - delete project; - } -}; - -bool -ProjectBuilderMakefileGenerator::writeSubDirs(QTextStream &t) -{ - if(project->isActiveConfig("generate_pbxbuild_makefile")) { - QString mkwrap = fileFixify(pbx_dir + Option::dir_sep + ".." + Option::dir_sep + project->first("MAKEFILE"), - FileFixifyToIndir); - QFile mkwrapf(mkwrap); - if(mkwrapf.open(QIODevice::WriteOnly | QIODevice::Text)) { - debug_msg(1, "pbuilder: Creating file: %s", mkwrap.toLatin1().constData()); - QTextStream mkwrapt(&mkwrapf); - writingUnixMakefileGenerator = true; - UnixMakefileGenerator::writeSubDirs(mkwrapt); - writingUnixMakefileGenerator = false; - } - } - - //HEADER - const int pbVersion = pbuilderVersion(); - t << "// !$*UTF8*$!\n" - << "{\n" - << "\t" << writeSettings("archiveVersion", "1", SettingsNoQuote) << ";\n" - << "\tclasses = {\n\t};\n" - << "\t" << writeSettings("objectVersion", QString::number(pbVersion), SettingsNoQuote) << ";\n" - << "\tobjects = {\n"; - - //SUBDIRS - QList pb_subdirs; - pb_subdirs.append(new ProjectBuilderSubDirs(project, QString(), false)); - QString oldpwd = qmake_getpwd(); - QString oldoutpwd = Option::output_dir; - QMap groups; - for(int pb_subdir = 0; pb_subdir < pb_subdirs.size(); ++pb_subdir) { - ProjectBuilderSubDirs *pb = pb_subdirs[pb_subdir]; - const ProStringList &subdirs = pb->project->values("SUBDIRS"); - for(int subdir = 0; subdir < subdirs.count(); subdir++) { - ProString tmpk = subdirs[subdir]; - const ProKey fkey(tmpk + ".file"); - if (!pb->project->isEmpty(fkey)) { - tmpk = pb->project->first(fkey); - } else { - const ProKey skey(tmpk + ".subdir"); - if (!pb->project->isEmpty(skey)) - tmpk = pb->project->first(skey); - } - QString tmp = tmpk.toQString(); - if(fileInfo(tmp).isRelative() && !pb->subdir.isEmpty()) { - QString subdir = pb->subdir; - if(!subdir.endsWith(Option::dir_sep)) - subdir += Option::dir_sep; - tmp = subdir + tmp; - } - QFileInfo fi(fileInfo(Option::normalizePath(tmp))); - if(fi.exists()) { - if(fi.isDir()) { - QString profile = tmp; - if(!profile.endsWith(Option::dir_sep)) - profile += Option::dir_sep; - profile += fi.baseName() + Option::pro_ext; - fi = QFileInfo(profile); - } - QMakeProject tmp_proj; - QString dir = fi.path(), fn = fi.fileName(); - if(!dir.isEmpty()) { - if(!qmake_setpwd(dir)) - fprintf(stderr, "Cannot find directory: %s\n", dir.toLatin1().constData()); - } - Option::output_dir = Option::globals->shadowedPath(QDir::cleanPath(fi.absoluteFilePath())); - if(tmp_proj.read(fn)) { - if(tmp_proj.first("TEMPLATE") == "subdirs") { - QMakeProject *pp = new QMakeProject(&tmp_proj); - pb_subdirs += new ProjectBuilderSubDirs(pp, dir); - } else if(tmp_proj.first("TEMPLATE") == "app" || tmp_proj.first("TEMPLATE") == "lib") { - QString pbxproj = qmake_getpwd() + Option::dir_sep + tmp_proj.first("TARGET") + projectSuffix(); - if(!exists(pbxproj)) { - warn_msg(WarnLogic, "Ignored (not found) '%s'", pbxproj.toLatin1().constData()); - goto nextfile; // # Dirty! - } - const QString project_key = keyFor(pbxproj + "_PROJECTREF"); - project->values("QMAKE_PBX_SUBDIRS") += pbxproj; - //PROJECTREF - { - bool in_root = true; - QString name = qmake_getpwd(); - if(project->isActiveConfig("flat")) { - QString flat_file = fileFixify(name, FileFixifyBackwards | FileFixifyRelative); - if(flat_file.indexOf(Option::dir_sep) != -1) { - QStringList dirs = flat_file.split(Option::dir_sep); - name = dirs.back(); - } - } else { - QString flat_file = fileFixify(name, FileFixifyBackwards | FileFixifyRelative); - if(QDir::isRelativePath(flat_file) && flat_file.indexOf(Option::dir_sep) != -1) { - QString last_grp("QMAKE_SUBDIR_PBX_HEIR_GROUP"); - QStringList dirs = flat_file.split(Option::dir_sep); - name = dirs.back(); - for(QStringList::Iterator dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) { - QString new_grp(last_grp + Option::dir_sep + (*dir_it)), new_grp_key(keyFor(new_grp)); - if(dir_it == dirs.begin()) { - if(!groups.contains(new_grp)) - project->values("QMAKE_SUBDIR_PBX_GROUPS").append(new_grp_key); - } else { - if(!groups[last_grp].contains(new_grp_key)) - groups[last_grp] += new_grp_key; - } - last_grp = new_grp; - } - groups[last_grp] += project_key; - in_root = false; - } - } - if(in_root) - project->values("QMAKE_SUBDIR_PBX_GROUPS") += project_key; - t << "\t\t" << project_key << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXFileReference", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("lastKnownFileType", "wrapper.pb-project") << ";\n" - << "\t\t\t" << writeSettings("name", tmp_proj.first("TARGET") + projectSuffix()) << ";\n" - << "\t\t\t" << writeSettings("path", pbxproj) << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "") << ";\n" - << "\t\t};\n"; - //WRAPPER - t << "\t\t" << keyFor(pbxproj + "_WRAPPER") << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXReferenceProxy", SettingsNoQuote) << ";\n"; - if(tmp_proj.first("TEMPLATE") == "app") { - t << "\t\t\t" << writeSettings("fileType", "wrapper.application") << ";\n" - << "\t\t\t" << writeSettings("path", tmp_proj.first("TARGET") + ".app") << ";\n"; - } else { - t << "\t\t\t" << writeSettings("fileType", "compiled.mach-o.dylib") << ";\n" - << "\t\t\t" << writeSettings("path", tmp_proj.first("TARGET") + ".dylib") << ";\n"; - } - t << "\t\t\t" << writeSettings("remoteRef", keyFor(pbxproj + "_WRAPPERREF")) << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "BUILT_PRODUCTS_DIR", SettingsNoQuote) << ";\n" - << "\t\t};\n"; - t << "\t\t" << keyFor(pbxproj + "_WRAPPERREF") << " = {\n" - << "\t\t\t" << writeSettings("containerPortal", project_key) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXContainerItemProxy", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("proxyType", "2") << ";\n" -// << "\t\t\t" << writeSettings("remoteGlobalIDString", keyFor(pbxproj + "QMAKE_PBX_REFERENCE")) << ";\n" - << "\t\t\t" << writeSettings("remoteGlobalIDString", keyFor(pbxproj + "QMAKE_PBX_REFERENCE!!!")) << ";\n" - << "\t\t\t" << writeSettings("remoteInfo", tmp_proj.first("TARGET")) << ";\n" - << "\t\t};\n"; - //PRODUCTGROUP - t << "\t\t" << keyFor(pbxproj + "_PRODUCTGROUP") << " = {\n" - << "\t\t\t" << writeSettings("children", project->values(ProKey(pbxproj + "_WRAPPER")), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXGroup", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", "Products") << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "") << ";\n" - << "\t\t};\n"; - } -#ifdef GENERATE_AGGREGRATE_SUBDIR - //TARGET (for aggregate) - { - //container - const QString container_proxy = keyFor(pbxproj + "_CONTAINERPROXY"); - t << "\t\t" << container_proxy << " = {\n" - << "\t\t\t" << writeSettings("containerPortal", project_key) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXContainerItemProxy", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("proxyType", "1") << ";\n" - << "\t\t\t" << writeSettings("remoteGlobalIDString", keyFor(pbxproj + "QMAKE_PBX_TARGET")) << ";\n" - << "\t\t\t" << writeSettings("remoteInfo", tmp_proj.first("TARGET")) << ";\n" - << "\t\t};\n"; - //targetref - t << "\t\t" << keyFor(pbxproj + "_TARGETREF") << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXTargetDependency", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", fixForOutput(tmp_proj.first("TARGET") +" (from " + tmp_proj.first("TARGET") + projectSuffix() + ")")) << ";\n" - << "\t\t\t" << writeSettings("targetProxy", container_proxy) << ";\n" - << "\t\t};\n"; - } -#endif - } - } - nextfile: - qmake_setpwd(oldpwd); - Option::output_dir = oldoutpwd; - } - } - } - qDeleteAll(pb_subdirs); - pb_subdirs.clear(); - - for (QMap::Iterator grp_it = groups.begin(); grp_it != groups.end(); ++grp_it) { - t << "\t\t" << keyFor(grp_it.key()) << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXGroup", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("children", grp_it.value(), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("name", grp_it.key().section(Option::dir_sep, -1)) << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "") << ";\n" - << "\t\t};\n"; - } - - //DUMP EVERYTHING THAT TIES THE ABOVE TOGETHER - //BUILDCONFIGURATIONS - QString defaultConfig; - for(int as_release = 0; as_release < 2; as_release++) - { - QString configName = (as_release ? "Release" : "Debug"); - - QMap settings; - settings.insert("COPY_PHASE_STRIP", (as_release ? "YES" : "NO")); - if(as_release) - settings.insert("GCC_GENERATE_DEBUGGING_SYMBOLS", "NO"); - if(project->isActiveConfig("sdk") && !project->isEmpty("QMAKE_MAC_SDK")) - settings.insert("SDKROOT", project->first("QMAKE_MAC_SDK").toQString()); - { - const ProStringList &l = project->values("QMAKE_MAC_XCODE_SETTINGS"); - for(int i = 0; i < l.size(); ++i) { - ProString name = l.at(i); - const ProKey buildKey(name + ".build"); - if (!project->isEmpty(buildKey)) { - const QString build = project->first(buildKey).toQString(); - if (build.toLower() != configName.toLower()) - continue; - } - const ProKey nkey(name + ".name"); - if (!project->isEmpty(nkey)) - name = project->first(nkey); - const QString value = project->values(ProKey(name + ".value")).join(QString(Option::field_sep)); - settings.insert(name.toQString(), value); - } - } - - if (project->isActiveConfig("debug") != (bool)as_release) - defaultConfig = configName; - QString key = keyFor("QMAKE_SUBDIR_PBX_BUILDCONFIG_" + configName); - project->values("QMAKE_SUBDIR_PBX_BUILDCONFIGS").append(key); - t << "\t\t" << key << " = {\n" - << "\t\t\t" << writeSettings("isa", "XCBuildConfiguration", SettingsNoQuote) << ";\n" - << "\t\t\tbuildSettings = {\n"; - for (QMap::Iterator set_it = settings.begin(); set_it != settings.end(); ++set_it) - t << "\t\t\t\t" << writeSettings(set_it.key(), set_it.value()) << ";\n"; - t << "\t\t\t};\n" - << "\t\t\t" << writeSettings("name", configName) << ";\n" - << "\t\t};\n"; - } - t << "\t\t" << keyFor("QMAKE_SUBDIR_PBX_BUILDCONFIG_LIST") << " = {\n" - << "\t\t\t" << writeSettings("isa", "XCConfigurationList", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("buildConfigurations", project->values("QMAKE_SUBDIR_PBX_BUILDCONFIGS"), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("defaultConfigurationIsVisible", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("defaultConfigurationName", defaultConfig, SettingsNoQuote) << ";\n" - << "\t\t};\n"; - -#ifdef GENERATE_AGGREGRATE_SUBDIR - //target - t << "\t\t" << keyFor("QMAKE_SUBDIR_PBX_AGGREGATE_TARGET") << " = {\n" - << "\t\t\t" << writeSettings("buildPhases", ProStringList(), SettingsAsList, 4) << ";\n" - << "\t\t\tbuildSettings = {\n" - << "\t\t\t\t" << writeSettings("PRODUCT_NAME", project->first("TARGET")) << ";\n" - << "\t\t\t};\n"; - { - ProStringList dependencies; - const ProStringList &qmake_subdirs = project->values("QMAKE_PBX_SUBDIRS"); - for(int i = 0; i < qmake_subdirs.count(); i++) - dependencies += keyFor(qmake_subdirs[i] + "_TARGETREF"); - t << "\t\t\t" << writeSettings("dependencies", dependencies, SettingsAsList, 4) << ";\n" - } - t << "\t\t\t" << writeSettings("isa", "PBXAggregateTarget", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", project->first("TARGET")) << ";\n" - << "\t\t\t" << writeSettings("productName", project->first("TARGET")) << ";\n" - << "\t\t};\n"; -#endif - - //ROOT_GROUP - t << "\t\t" << keyFor("QMAKE_SUBDIR_PBX_ROOT_GROUP") << " = {\n" - << "\t\t\t" << writeSettings("children", project->values("QMAKE_SUBDIR_PBX_GROUPS"), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXGroup", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "") << ";\n" - << "\t\t};\n"; - - - //ROOT - t << "\t\t" << keyFor("QMAKE_SUBDIR_PBX_ROOT") << " = {\n" - << "\t\t\tbuildSettings = {\n" - << "\t\t\t};\n" - << "\t\t\t" << writeSettings("buildStyles", project->values("QMAKE_SUBDIR_PBX_BUILDSTYLES"), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXProject", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("mainGroup", keyFor("QMAKE_SUBDIR_PBX_ROOT_GROUP")) << ";\n" - << "\t\t\t" << writeSettings("projectDirPath", ProStringList()) << ";\n"; - t << "\t\t\t" << writeSettings("buildConfigurationList", keyFor("QMAKE_SUBDIR_PBX_BUILDCONFIG_LIST")) << ";\n"; - t << "\t\t\tprojectReferences = (\n"; - { - const ProStringList &qmake_subdirs = project->values("QMAKE_PBX_SUBDIRS"); - for(int i = 0; i < qmake_subdirs.count(); i++) { - const ProString &subdir = qmake_subdirs[i]; - t << "\t\t\t\t{\n" - << "\t\t\t\t\t" << writeSettings("ProductGroup", keyFor(subdir + "_PRODUCTGROUP")) << ";\n" - << "\t\t\t\t\t" << writeSettings("ProjectRef", keyFor(subdir + "_PROJECTREF")) << ";\n" - << "\t\t\t\t},\n"; - } - } - t << "\t\t\t);\n" - << "\t\t\t" << writeSettings("targets", -#ifdef GENERATE_AGGREGRATE_SUBDIR - project->values("QMAKE_SUBDIR_AGGREGATE_TARGET"), -#else - ProStringList(), -#endif - SettingsAsList, 4) << ";\n" - << "\t\t};\n"; - - //FOOTER - t << "\t};\n" - << "\t" << writeSettings("rootObject", keyFor("QMAKE_SUBDIR_PBX_ROOT")) << ";\n" - << "}\n"; - - return true; -} - -class ProjectBuilderSources -{ - bool buildable, object_output; - QString key, group, compiler; -public: - ProjectBuilderSources(const QString &key, bool buildable = false, const QString &compiler = QString(), bool producesObject = false); - QStringList files(QMakeProject *project) const; - inline bool isBuildable() const { return buildable; } - inline QString keyName() const { return key; } - inline QString groupName() const { return group; } - inline QString compilerName() const { return compiler; } - inline bool isObjectOutput(const QString &file) const { - bool ret = object_output; - for(int i = 0; !ret && i < Option::c_ext.size(); ++i) { - if(file.endsWith(Option::c_ext.at(i))) { - ret = true; - break; - } - } - for(int i = 0; !ret && i < Option::cpp_ext.size(); ++i) { - if(file.endsWith(Option::cpp_ext.at(i))) { - ret = true; - break; - } - } - return ret; - } -}; - -ProjectBuilderSources::ProjectBuilderSources(const QString &k, bool b, const QString &c, bool o) : - buildable(b), object_output(o), key(k), compiler(c) -{ - // Override group name for a few common keys - if (k == "SOURCES" || k == "OBJECTIVE_SOURCES" || k == "HEADERS") - group = "Sources"; - else if (k == "QMAKE_INTERNAL_INCLUDED_FILES") - group = "Supporting Files"; - else if (k == "GENERATED_SOURCES" || k == "GENERATED_FILES") - group = "Generated Sources"; - else if (k == "RESOURCES") - group = "Resources"; - else if (group.isNull()) - group = QString("Sources [") + c + "]"; -} - -QStringList -ProjectBuilderSources::files(QMakeProject *project) const -{ - QStringList ret = project->values(ProKey(key)).toQStringList(); - if(key == "QMAKE_INTERNAL_INCLUDED_FILES") { - QString qtPrefix(project->propertyValue(ProKey("QT_INSTALL_PREFIX/get")).toQString() + '/'); - QString qtSrcPrefix(project->propertyValue(ProKey("QT_INSTALL_PREFIX/src")).toQString() + '/'); - - QStringList newret; - for(int i = 0; i < ret.size(); ++i) { - // Don't show files "internal" to Qt in Xcode - if (ret.at(i).startsWith(qtPrefix) || ret.at(i).startsWith(qtSrcPrefix)) - continue; - - newret.append(ret.at(i)); - } - ret = newret; - } - if(key == "SOURCES" && project->first("TEMPLATE") == "app" && !project->isEmpty("ICON")) - ret.append(project->first("ICON").toQString()); - return ret; -} - -static QString xcodeFiletypeForFilename(const QString &filename) -{ - foreach (const QString &ext, Option::cpp_ext) { - if (filename.endsWith(ext)) - return QStringLiteral("sourcecode.cpp.cpp"); - } - - foreach (const QString &ext, Option::c_ext) { - if (filename.endsWith(ext)) - return QStringLiteral("sourcecode.c.c"); - } - - foreach (const QString &ext, Option::h_ext) { - if (filename.endsWith(ext)) - return "sourcecode.c.h"; - } - - if (filename.endsWith(QStringLiteral(".mm"))) - return QStringLiteral("sourcecode.cpp.objcpp"); - if (filename.endsWith(QStringLiteral(".m"))) - return QStringLiteral("sourcecode.c.objc"); - if (filename.endsWith(QStringLiteral(".framework"))) - return QStringLiteral("wrapper.framework"); - if (filename.endsWith(QStringLiteral(".a"))) - return QStringLiteral("archive.ar"); - if (filename.endsWith(QStringLiteral(".pro")) || filename.endsWith(QStringLiteral(".qrc"))) - return QStringLiteral("text"); - - return QString(); -} - -bool -ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) -{ - ProStringList tmp; - bool did_preprocess = false; - - //HEADER - const int pbVersion = pbuilderVersion(); - ProStringList buildConfigGroups; - buildConfigGroups << "PROJECT" << "TARGET"; - - t << "// !$*UTF8*$!\n" - << "{\n" - << "\t" << writeSettings("archiveVersion", "1", SettingsNoQuote) << ";\n" - << "\tclasses = {\n\t};\n" - << "\t" << writeSettings("objectVersion", QString::number(pbVersion), SettingsNoQuote) << ";\n" - << "\tobjects = {\n"; - - //MAKE QMAKE equivelant - if (!project->isActiveConfig("no_autoqmake")) { - QString mkfile = pbx_dir + Option::dir_sep + "qt_makeqmake.mak"; - QFile mkf(mkfile); - if(mkf.open(QIODevice::WriteOnly | QIODevice::Text)) { - writingUnixMakefileGenerator = true; - debug_msg(1, "pbuilder: Creating file: %s", mkfile.toLatin1().constData()); - QTextStream mkt(&mkf); - writeHeader(mkt); - mkt << "QMAKE = " << var("QMAKE_QMAKE") << endl; - writeMakeQmake(mkt); - mkt.flush(); - mkf.close(); - writingUnixMakefileGenerator = false; - } - QString phase_key = keyFor("QMAKE_PBX_MAKEQMAKE_BUILDPHASE"); - mkfile = fileFixify(mkfile); - project->values("QMAKE_PBX_PRESCRIPT_BUILDPHASES").append(phase_key); - t << "\t\t" << phase_key << " = {\n" - << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("files", ProStringList(), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXShellScriptBuildPhase", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", "Qt Qmake") << ";\n" - << "\t\t\t" << writeSettings("shellPath", "/bin/sh") << ";\n" - << "\t\t\t" << writeSettings("shellScript", "make -C " + IoUtils::shellQuoteUnix(Option::output_dir) - + " -f " + IoUtils::shellQuoteUnix(mkfile)) << ";\n" - << "\t\t\t" << writeSettings("showEnvVarsInLog", "0") << ";\n" - << "\t\t};\n"; - } - - // FIXME: Move all file resolving logic out of ProjectBuilderSources::files(), as it - // doesn't have access to any of the information it needs to resolve relative paths. - project->values("QMAKE_INTERNAL_INCLUDED_FILES").prepend(project->projectFile()); - - // Since we can't fileFixify inside ProjectBuilderSources::files(), we resolve the absolute paths here - project->values("QMAKE_INTERNAL_INCLUDED_FILES") = ProStringList( - fileFixify(project->values("QMAKE_INTERNAL_INCLUDED_FILES").toQStringList(), - FileFixifyFromOutdir | FileFixifyAbsolute)); - - //DUMP SOURCES - QMap groups; - QList sources; - sources.append(ProjectBuilderSources("SOURCES", true)); - sources.append(ProjectBuilderSources("GENERATED_SOURCES", true)); - sources.append(ProjectBuilderSources("GENERATED_FILES")); - sources.append(ProjectBuilderSources("HEADERS")); - sources.append(ProjectBuilderSources("QMAKE_INTERNAL_INCLUDED_FILES")); - if(!project->isEmpty("QMAKE_EXTRA_COMPILERS")) { - const ProStringList &quc = project->values("QMAKE_EXTRA_COMPILERS"); - for (ProStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) { - if (project->isEmpty(ProKey(*it + ".output"))) - continue; - ProStringList &inputs = project->values(ProKey(*it + ".input")); - int input = 0; - while (input < inputs.size()) { - if (project->isEmpty(inputs.at(input).toKey())) { - ++input; - continue; - } - bool duplicate = false; - bool isObj = project->values(ProKey(*it + ".CONFIG")).indexOf("no_link") == -1; - if (!isObj) { - for (int i = 0; i < sources.size(); ++i) { - if (sources.at(i).keyName() == inputs.at(input)) { - duplicate = true; - break; - } - } - } - if (!duplicate) { - const ProStringList &outputs = project->values(ProKey(*it + ".variable_out")); - for(int output = 0; output < outputs.size(); ++output) { - if(outputs.at(output) != "OBJECT") { - isObj = false; - break; - } - } - sources.append(ProjectBuilderSources(inputs.at(input).toQString(), true, - (*it).toQString(), isObj)); - - if (isObj) { - inputs.removeAt(input); - continue; - } - } - - ++input; - } - } - } - for(int source = 0; source < sources.size(); ++source) { - ProStringList &src_list = project->values(ProKey("QMAKE_PBX_" + sources.at(source).keyName())); - ProStringList &root_group_list = project->values("QMAKE_PBX_GROUPS"); - - const QStringList &files = fileFixify(sources.at(source).files(project), - FileFixifyFromOutdir | FileFixifyAbsolute); - for(int f = 0; f < files.count(); ++f) { - QString file = files[f]; - if(!sources.at(source).compilerName().isNull() && - !verifyExtraCompiler(sources.at(source).compilerName(), file)) - continue; - if(file.endsWith(Option::prl_ext)) - continue; - - bool in_root = true; - QString src_key = keyFor(file); - - QString name = file.split(Option::dir_sep).back(); - - if (!project->isActiveConfig("flat")) { - // Build group hierarchy for file references that match the source our build dir - QString relativePath = fileFixify(file, FileFixifyToIndir | FileFixifyRelative); - if (QDir::isRelativePath(relativePath) && relativePath.startsWith(QLatin1String("../"))) - relativePath = fileFixify(file, FileFixifyRelative); // Try build dir - - if (QDir::isRelativePath(relativePath) - && !relativePath.startsWith(QLatin1String("../")) - && relativePath.indexOf(Option::dir_sep) != -1) { - QString last_grp("QMAKE_PBX_" + sources.at(source).groupName() + "_HEIR_GROUP"); - QStringList dirs = relativePath.split(Option::dir_sep); - name = dirs.back(); - dirs.pop_back(); //remove the file portion as it will be added via src_key - for(QStringList::Iterator dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) { - QString new_grp(last_grp + Option::dir_sep + (*dir_it)), new_grp_key(keyFor(new_grp)); - if(dir_it == dirs.begin()) { - if(!src_list.contains(new_grp_key)) - src_list.append(new_grp_key); - } else { - if(!groups[last_grp].contains(new_grp_key)) - groups[last_grp] += new_grp_key; - } - last_grp = new_grp; - } - if (groups[last_grp].contains(src_key)) - continue; - groups[last_grp] += src_key; - in_root = false; - } - } - if (in_root) { - if (src_list.contains(src_key)) - continue; - src_list.append(src_key); - } - //source reference - t << "\t\t" << src_key << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXFileReference", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("path", file) << ";\n"; - if (name != file) - t << "\t\t\t" << writeSettings("name", name) << ";\n"; - t << "\t\t\t" << writeSettings("sourceTree", "") << ";\n"; - QString filetype = xcodeFiletypeForFilename(file); - if (!filetype.isNull()) - t << "\t\t\t" << writeSettings("lastKnownFileType", filetype) << ";\n"; - t << "\t\t};\n"; - if (sources.at(source).isBuildable()) { //build reference - QString build_key = keyFor(file + ".BUILDABLE"); - t << "\t\t" << build_key << " = {\n" - << "\t\t\t" << writeSettings("fileRef", src_key) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXBuildFile", SettingsNoQuote) << ";\n" - << "\t\t\tsettings = {\n" - << "\t\t\t\t" << writeSettings("ATTRIBUTES", ProStringList(), SettingsAsList, 5) << ";\n" - << "\t\t\t};\n" - << "\t\t};\n"; - if (sources.at(source).isObjectOutput(file)) - project->values("QMAKE_PBX_OBJ").append(build_key); - } - } - if(!src_list.isEmpty()) { - QString group_key = keyFor(sources.at(source).groupName()); - if(root_group_list.indexOf(group_key) == -1) - root_group_list += group_key; - - ProStringList &group = groups[sources.at(source).groupName()]; - for(int src = 0; src < src_list.size(); ++src) { - if(group.indexOf(src_list.at(src)) == -1) - group += src_list.at(src); - } - } - } - for (QMap::Iterator grp_it = groups.begin(); grp_it != groups.end(); ++grp_it) { - t << "\t\t" << keyFor(grp_it.key()) << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXGroup", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("children", grp_it.value(), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("name", grp_it.key().section(Option::dir_sep, -1)) << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "") << ";\n" - << "\t\t};\n"; - } - - //PREPROCESS BUILDPHASE (just a makefile) - { - QString mkfile = pbx_dir + Option::dir_sep + "qt_preprocess.mak"; - QFile mkf(mkfile); - if(mkf.open(QIODevice::WriteOnly | QIODevice::Text)) { - writingUnixMakefileGenerator = true; - did_preprocess = true; - debug_msg(1, "pbuilder: Creating file: %s", mkfile.toLatin1().constData()); - QTextStream mkt(&mkf); - writeHeader(mkt); - mkt << "MOC = " << var("QMAKE_MOC") << endl; - mkt << "UIC = " << var("QMAKE_UIC") << endl; - mkt << "LEX = " << var("QMAKE_LEX") << endl; - mkt << "LEXFLAGS = " << var("QMAKE_LEXFLAGS") << endl; - mkt << "YACC = " << var("QMAKE_YACC") << endl; - mkt << "YACCFLAGS = " << var("QMAKE_YACCFLAGS") << endl; - mkt << "DEFINES = " - << varGlue("PRL_EXPORT_DEFINES","-D"," -D"," ") - << varGlue("DEFINES","-D"," -D","") << endl; - mkt << "INCPATH ="; - { - const ProStringList &incs = project->values("INCLUDEPATH"); - for (ProStringList::ConstIterator incit = incs.begin(); incit != incs.end(); ++incit) - mkt << " -I" << escapeFilePath((*incit)); - } - if(!project->isEmpty("QMAKE_FRAMEWORKPATH_FLAGS")) - mkt << " " << var("QMAKE_FRAMEWORKPATH_FLAGS"); - mkt << endl; - mkt << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl; - mkt << "MOVE = " << var("QMAKE_MOVE") << endl << endl; - mkt << "preprocess: compilers\n"; - mkt << "clean preprocess_clean: compiler_clean\n\n"; - writeExtraTargets(mkt); - if(!project->isEmpty("QMAKE_EXTRA_COMPILERS")) { - mkt << "compilers:"; - const ProStringList &compilers = project->values("QMAKE_EXTRA_COMPILERS"); - for(int compiler = 0; compiler < compilers.size(); ++compiler) { - const ProStringList &tmp_out = project->values(ProKey(compilers.at(compiler) + ".output")); - if (tmp_out.isEmpty()) - continue; - const ProStringList &inputs = project->values(ProKey(compilers.at(compiler) + ".input")); - for(int input = 0; input < inputs.size(); ++input) { - const ProStringList &files = project->values(inputs.at(input).toKey()); - if (files.isEmpty()) - continue; - for(int file = 0, added = 0; file < files.size(); ++file) { - QString fn = files.at(file).toQString(); - if (!verifyExtraCompiler(compilers.at(compiler), fn)) - continue; - if(added && !(added % 3)) - mkt << "\\\n\t"; - ++added; - const QString file_name = fileFixify(fn, FileFixifyFromOutdir); - mkt << ' ' << escapeDependencyPath(Option::fixPathToTargetOS( - replaceExtraCompilerVariables(tmp_out.first().toQString(), file_name, QString(), NoShell))); - } - } - } - mkt << endl; - writeExtraCompilerTargets(mkt); - writingUnixMakefileGenerator = false; - } - mkt.flush(); - mkf.close(); - } - mkfile = fileFixify(mkfile); - QString phase_key = keyFor("QMAKE_PBX_PREPROCESS_TARGET"); -// project->values("QMAKE_PBX_BUILDPHASES").append(phase_key); - project->values("QMAKE_PBX_PRESCRIPT_BUILDPHASES").append(phase_key); - t << "\t\t" << phase_key << " = {\n" - << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("files", ProStringList(), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXShellScriptBuildPhase", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", "Qt Preprocessors") << ";\n" - << "\t\t\t" << writeSettings("shellPath", "/bin/sh") << ";\n" - << "\t\t\t" << writeSettings("shellScript", "make -C " + IoUtils::shellQuoteUnix(Option::output_dir) - + " -f " + IoUtils::shellQuoteUnix(mkfile)) << ";\n" - << "\t\t\t" << writeSettings("showEnvVarsInLog", "0") << ";\n" - << "\t\t};\n"; - } - - //SOURCE BUILDPHASE - if(!project->isEmpty("QMAKE_PBX_OBJ")) { - QString grp = "Compile Sources", key = keyFor(grp); - project->values("QMAKE_PBX_BUILDPHASES").append(key); - t << "\t\t" << key << " = {\n" - << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("files", fixListForOutput("QMAKE_PBX_OBJ"), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXSourcesBuildPhase", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", grp) << ";\n" - << "\t\t};\n"; - } - - if(!project->isActiveConfig("staticlib")) { //DUMP LIBRARIES - ProStringList &libdirs = project->values("QMAKE_PBX_LIBPATHS"), - &frameworkdirs = project->values("QMAKE_FRAMEWORKPATH"); - static const char * const libs[] = { "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", 0 }; - for (int i = 0; libs[i]; i++) { - tmp = project->values(libs[i]); - for(int x = 0; x < tmp.count();) { - bool remove = false; - QString library, name; - ProString opt = tmp[x].trimmed(); - if(opt.startsWith("-L")) { - QString r = opt.mid(2).toQString(); - fixForOutput(r); - libdirs.append(r); - } else if(opt.startsWith("-l")) { - name = opt.mid(2).toQString(); - QString lib("lib" + name); - for (ProStringList::Iterator lit = libdirs.begin(); lit != libdirs.end(); ++lit) { - if(project->isActiveConfig("link_prl")) { - /* This isn't real nice, but it is real useful. This looks in a prl - for what the library will ultimately be called so we can stick it - in the ProjectFile. If the prl format ever changes (not likely) then - this will not really work. However, more concerning is that it will - encode the version number in the Project file which might be a bad - things in days to come? --Sam - */ - QString lib_file = (*lit) + Option::dir_sep + lib; - if(QMakeMetaInfo::libExists(lib_file)) { - QMakeMetaInfo libinfo(project); - if(libinfo.readLib(lib_file)) { - if(!libinfo.isEmpty("QMAKE_PRL_TARGET")) { - library = (*lit) + Option::dir_sep + libinfo.first("QMAKE_PRL_TARGET"); - debug_msg(1, "pbuilder: Found library (%s) via PRL %s (%s)", - opt.toLatin1().constData(), lib_file.toLatin1().constData(), library.toLatin1().constData()); - remove = true; - - if (project->isActiveConfig("xcode_dynamic_library_suffix")) { - QString suffixSetting = project->first("QMAKE_XCODE_LIBRARY_SUFFIX_SETTING").toQString(); - if (!suffixSetting.isEmpty()) { - QString librarySuffix = project->first("QMAKE_XCODE_LIBRARY_SUFFIX").toQString(); - suffixSetting = "$(" + suffixSetting + ")"; - if (!librarySuffix.isEmpty()) { - library.replace(librarySuffix, suffixSetting); - name.remove(librarySuffix); - } else { - library.replace(name, name + suffixSetting); - } - } - } - } - } - } - } - if(!remove) { - QString extns[] = { ".dylib", ".so", ".a", QString() }; - for(int n = 0; !remove && !extns[n].isNull(); n++) { - QString tmp = (*lit) + Option::dir_sep + lib + extns[n]; - if(exists(tmp)) { - library = tmp; - debug_msg(1, "pbuilder: Found library (%s) via %s", - opt.toLatin1().constData(), library.toLatin1().constData()); - remove = true; - } - } - } - } - } else if(opt.startsWith("-F")) { - QString r; - if(opt.size() > 2) { - r = opt.mid(2).toQString(); - } else { - if(x == tmp.count()-1) - break; - r = tmp[++x].toQString(); - } - if(!r.isEmpty()) { - fixForOutput(r); - frameworkdirs.append(r); - } - } else if(opt == "-framework") { - if(x == tmp.count()-1) - break; - const ProString &framework = tmp[x+1]; - ProStringList fdirs = frameworkdirs; - fdirs << "/System/Library/Frameworks/" << "/Library/Frameworks/"; - for(int fdir = 0; fdir < fdirs.count(); fdir++) { - if(exists(fdirs[fdir] + QDir::separator() + framework + ".framework")) { - remove = true; - library = fdirs[fdir] + Option::dir_sep + framework + ".framework"; - tmp.removeAt(x); - break; - } - } - } else if (!opt.startsWith('-')) { - QString fn = opt.toQString(); - if (exists(fn)) { - remove = true; - library = fn; - } - } - if(!library.isEmpty()) { - const int slsh = library.lastIndexOf(Option::dir_sep); - if(name.isEmpty()) { - if(slsh != -1) - name = library.right(library.length() - slsh - 1); - } - if(slsh != -1) { - const QString path = QFileInfo(library.left(slsh)).absoluteFilePath(); - if(!path.isEmpty() && !libdirs.contains(path)) - libdirs += path; - } - library = fileFixify(library, FileFixifyFromOutdir | FileFixifyAbsolute); - QString key = keyFor(library); - if (!project->values("QMAKE_PBX_LIBRARIES").contains(key)) { - bool is_frmwrk = (library.endsWith(".framework")); - t << "\t\t" << key << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXFileReference", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", name) << ";\n" - << "\t\t\t" << writeSettings("path", library) << ";\n" - << "\t\t\t" << writeSettings("refType", QString::number(reftypeForFile(library)), SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "") << ";\n"; - if (is_frmwrk) - t << "\t\t\t" << writeSettings("lastKnownFileType", "wrapper.framework") << ";\n"; - t << "\t\t};\n"; - project->values("QMAKE_PBX_LIBRARIES").append(key); - QString build_key = keyFor(library + ".BUILDABLE"); - t << "\t\t" << build_key << " = {\n" - << "\t\t\t" << writeSettings("fileRef", key) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXBuildFile", SettingsNoQuote) << ";\n" - << "\t\t\tsettings = {\n" - << "\t\t\t};\n" - << "\t\t};\n"; - project->values("QMAKE_PBX_BUILD_LIBRARIES").append(build_key); - } - } - if(remove) - tmp.removeAt(x); - else - x++; - } - project->values(libs[i]) = tmp; - } - } - //SUBLIBS BUILDPHASE (just another makefile) - if(!project->isEmpty("SUBLIBS")) { - QString mkfile = pbx_dir + Option::dir_sep + "qt_sublibs.mak"; - QFile mkf(mkfile); - if(mkf.open(QIODevice::WriteOnly | QIODevice::Text)) { - writingUnixMakefileGenerator = true; - debug_msg(1, "pbuilder: Creating file: %s", mkfile.toLatin1().constData()); - QTextStream mkt(&mkf); - writeHeader(mkt); - mkt << "SUBLIBS= "; - // ### This is missing the parametrization found in unixmake2.cpp - tmp = project->values("SUBLIBS"); - for(int i = 0; i < tmp.count(); i++) - t << escapeFilePath("tmp/lib" + tmp[i] + ".a") << ' '; - t << endl << endl; - mkt << "sublibs: $(SUBLIBS)\n\n"; - tmp = project->values("SUBLIBS"); - for(int i = 0; i < tmp.count(); i++) - t << escapeFilePath("tmp/lib" + tmp[i] + ".a") + ":\n\t" - << var(ProKey("MAKELIB" + tmp[i])) << endl << endl; - mkt.flush(); - mkf.close(); - writingUnixMakefileGenerator = false; - } - QString phase_key = keyFor("QMAKE_PBX_SUBLIBS_BUILDPHASE"); - mkfile = fileFixify(mkfile); - project->values("QMAKE_PBX_PRESCRIPT_BUILDPHASES").append(phase_key); - t << "\t\t" << phase_key << " = {\n" - << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("files", ProStringList(), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXShellScriptBuildPhase", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", "Qt Sublibs") << ";\n" - << "\t\t\t" << writeSettings("shellPath", "/bin/sh") << "\n" - << "\t\t\t" << writeSettings("shellScript", "make -C " + IoUtils::shellQuoteUnix(Option::output_dir) - + " -f " + IoUtils::shellQuoteUnix(mkfile)) << ";\n" - << "\t\t\t" << writeSettings("showEnvVarsInLog", "0") << ";\n" - << "\t\t};\n"; - } - - if (!project->isEmpty("QMAKE_PRE_LINK")) { - QString phase_key = keyFor("QMAKE_PBX_PRELINK_BUILDPHASE"); - project->values("QMAKE_PBX_BUILDPHASES").append(phase_key); - - ProStringList inputPaths; - ProStringList outputPaths; - const ProStringList &archs = project->values("QMAKE_XCODE_ARCHS"); - if (!archs.isEmpty()) { - for (int i = 0; i < archs.size(); ++i) { - const ProString &arch = archs.at(i); - inputPaths << "$(OBJECT_FILE_DIR_$(CURRENT_VARIANT))/" + arch + "/"; - outputPaths << "$(LINK_FILE_LIST_$(CURRENT_VARIANT)_" + arch + ")"; - } - } else { - inputPaths << "$(OBJECT_FILE_DIR_$(CURRENT_VARIANT))/$(CURRENT_ARCH)/"; - outputPaths << "$(LINK_FILE_LIST_$(CURRENT_VARIANT)_$(CURRENT_ARCH))"; - } - - t << "\t\t" << phase_key << " = {\n" - << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("files", ProStringList(), SettingsAsList, 4) << ";\n" - // The build phases are not executed in the order they are defined, but by their - // resolved dependenices, so we have to ensure that this phase is run after the - // compilation phase, and before the link phase. Making the phase depend on the - // object file directory, and "write" to the list of files to link achieves that. - << "\t\t\t" << writeSettings("inputPaths", inputPaths, SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("outputPaths", outputPaths, SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXShellScriptBuildPhase", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", "Qt Prelink") << ";\n" - << "\t\t\t" << writeSettings("shellPath", "/bin/sh") << ";\n" - << "\t\t\t" << writeSettings("shellScript", project->values("QMAKE_PRE_LINK")) << ";\n" - << "\t\t\t" << writeSettings("showEnvVarsInLog", "0") << ";\n" - << "\t\t};\n"; - } - - //LIBRARY BUILDPHASE - if(!project->isEmpty("QMAKE_PBX_LIBRARIES")) { - tmp = project->values("QMAKE_PBX_LIBRARIES"); - if(!tmp.isEmpty()) { - QString grp("Frameworks"), key = keyFor(grp); - project->values("QMAKE_PBX_GROUPS").append(key); - t << "\t\t" << key << " = {\n" - << "\t\t\t" << writeSettings("children", project->values("QMAKE_PBX_LIBRARIES"), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXGroup", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", grp) << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "") << ";\n" - << "\t\t};\n"; - } - } - { - QString grp("Link Binary With Libraries"), key = keyFor(grp); - project->values("QMAKE_PBX_BUILDPHASES").append(key); - t << "\t\t" << key << " = {\n" - << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("files", project->values("QMAKE_PBX_BUILD_LIBRARIES"), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXFrameworksBuildPhase", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", grp) << ";\n" - << "\t\t};\n"; - } - - if (!project->isEmpty("QMAKE_POST_LINK")) { - QString phase_key = keyFor("QMAKE_PBX_POSTLINK_BUILDPHASE"); - project->values("QMAKE_PBX_BUILDPHASES").append(phase_key); - t << "\t\t" << phase_key << " = {\n" - << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("files", ProStringList(), SettingsAsList, 4) << ";\n" - // The build phases are not executed in the order they are defined, but by their - // resolved dependenices, so we have to ensure the phase is run after linking. - << "\t\t\t" << writeSettings("inputPaths", ProStringList("$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)"), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXShellScriptBuildPhase", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", "Qt Postlink") << ";\n" - << "\t\t\t" << writeSettings("shellPath", "/bin/sh") << ";\n" - << "\t\t\t" << writeSettings("shellScript", project->values("QMAKE_POST_LINK")) << ";\n" - << "\t\t\t" << writeSettings("showEnvVarsInLog", "0") << ";\n" - << "\t\t};\n"; - } - - if (!project->isEmpty("DESTDIR")) { - QString phase_key = keyFor("QMAKE_PBX_TARGET_COPY_PHASE"); - QString destDir = fileFixify(project->first("DESTDIR").toQString(), - FileFixifyFromOutdir | FileFixifyAbsolute); - project->values("QMAKE_PBX_BUILDPHASES").append(phase_key); - t << "\t\t" << phase_key << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXShellScriptBuildPhase", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", "Project Copy") << ";\n" - << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("files", ProStringList(), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("inputPaths", ProStringList(), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("outputPaths", ProStringList(), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("shellPath", "/bin/sh") << ";\n" - << "\t\t\t" << writeSettings("shellScript", fixForOutput("cp -r $BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME " + IoUtils::shellQuoteUnix(destDir))) << ";\n" - << "\t\t\t" << writeSettings("showEnvVarsInLog", "0") << ";\n" - << "\t\t};\n"; - } - bool copyBundleResources = project->isActiveConfig("app_bundle") && project->first("TEMPLATE") == "app"; - ProStringList bundle_resources_files; - // Copy Bundle Data - if (!project->isEmpty("QMAKE_BUNDLE_DATA")) { - ProStringList bundle_file_refs; - bool ios = project->isActiveConfig("ios"); - - //all bundle data - const ProStringList &bundle_data = project->values("QMAKE_BUNDLE_DATA"); - for(int i = 0; i < bundle_data.count(); i++) { - ProStringList bundle_files; - ProString path = project->first(ProKey(bundle_data[i] + ".path")); - //all files - const ProStringList &files = project->values(ProKey(bundle_data[i] + ".files")); - for(int file = 0; file < files.count(); file++) { - QString fn = fileFixify(files[file].toQString(), FileFixifyAbsolute); - QString name = fn.split(Option::dir_sep).back(); - QString file_ref_key = keyFor("QMAKE_PBX_BUNDLE_DATA_FILE_REF." + bundle_data[i] + "-" + fn); - bundle_file_refs += file_ref_key; - t << "\t\t" << file_ref_key << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXFileReference", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("path", fn) << ";\n" - << "\t\t\t" << writeSettings("name", name) << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "") << ";\n" - << "\t\t};\n"; - QString file_key = keyFor("QMAKE_PBX_BUNDLE_DATA_FILE." + bundle_data[i] + "-" + fn); - bundle_files += file_key; - t << "\t\t" << file_key << " = {\n" - << "\t\t\t" << writeSettings("fileRef", file_ref_key) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXBuildFile", SettingsNoQuote) << ";\n" - << "\t\t};\n"; - } - - if (copyBundleResources && ((ios && path.isEmpty()) - || (!ios && path == QLatin1String("Contents/Resources")))) { - foreach (const ProString &s, bundle_files) - bundle_resources_files << s; - } else { - QString phase_key = keyFor("QMAKE_PBX_BUNDLE_COPY." + bundle_data[i]); - if (!project->isEmpty(ProKey(bundle_data[i] + ".version"))) { - //### - } - - project->values("QMAKE_PBX_BUILDPHASES").append(phase_key); - t << "\t\t" << phase_key << " = {\n" - << "\t\t\t" << writeSettings("name", "Copy '" + bundle_data[i] + "' Files to Bundle") << ";\n" - << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("dstPath", path) << ";\n" - << "\t\t\t" << writeSettings("dstSubfolderSpec", "1", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXCopyFilesBuildPhase", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("files", bundle_files, SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n" - << "\t\t};\n"; - } - } - - QString bundle_data_key = keyFor("QMAKE_PBX_BUNDLE_DATA"); - project->values("QMAKE_PBX_GROUPS").append(bundle_data_key); - t << "\t\t" << bundle_data_key << " = {\n" - << "\t\t\t" << writeSettings("children", bundle_file_refs, SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXGroup", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", "Bundle Data") << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "") << ";\n" - << "\t\t};\n"; - } - - // Copy bundle resources. Optimizes resources, and puts them into the Resources - // subdirectory on OSX, but doesn't support paths. - if (copyBundleResources) { - if (!project->isEmpty("ICON")) { - ProString icon = project->first("ICON"); - bundle_resources_files += keyFor(icon + ".BUILDABLE"); - } - - // Always add "Copy Bundle Resources" phase, even when we have no bundle - // resources, since Xcode depends on it being there for e.g asset catalogs. - QString grp("Copy Bundle Resources"), key = keyFor(grp); - project->values("QMAKE_PBX_BUILDPHASES").append(key); - t << "\t\t" << key << " = {\n" - << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("files", bundle_resources_files, SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXResourcesBuildPhase", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", grp) << ";\n" - << "\t\t};\n"; - } - - //REFERENCE - project->values("QMAKE_PBX_PRODUCTS").append(keyFor(pbx_dir + "QMAKE_PBX_REFERENCE")); - t << "\t\t" << keyFor(pbx_dir + "QMAKE_PBX_REFERENCE") << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXFileReference", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("includeInIndex", "0", SettingsNoQuote) << ";\n"; - if(project->first("TEMPLATE") == "app") { - ProString targ = project->first("QMAKE_ORIG_TARGET"); - if(project->isActiveConfig("bundle") && !project->isEmpty("QMAKE_BUNDLE_EXTENSION")) { - if(!project->isEmpty("QMAKE_BUNDLE_NAME")) - targ = project->first("QMAKE_BUNDLE_NAME"); - targ += project->first("QMAKE_BUNDLE_EXTENSION"); - if(!project->isEmpty("QMAKE_PBX_BUNDLE_TYPE")) - t << "\t\t\t" << writeSettings("explicitFileType", project->first("QMAKE_PBX_BUNDLE_TYPE")) + ";\n"; - } else if(project->isActiveConfig("app_bundle")) { - if(!project->isEmpty("QMAKE_APPLICATION_BUNDLE_NAME")) - targ = project->first("QMAKE_APPLICATION_BUNDLE_NAME"); - targ += ".app"; - t << "\t\t\t" << writeSettings("explicitFileType", "wrapper.application") << ";\n"; - } else { - t << "\t\t\t" << writeSettings("explicitFileType", "compiled.mach-o.executable") << ";\n"; - } - t << "\t\t\t" << writeSettings("path", targ) << ";\n"; - } else { - ProString lib = project->first("QMAKE_ORIG_TARGET"); - if(project->isActiveConfig("staticlib")) { - lib = project->first("TARGET"); - } else if(!project->isActiveConfig("lib_bundle")) { - if(project->isActiveConfig("plugin")) - lib = project->first("TARGET"); - else - lib = project->first("TARGET_"); - } - int slsh = lib.lastIndexOf(Option::dir_sep); - if(slsh != -1) - lib = lib.right(lib.length() - slsh - 1); - if(project->isActiveConfig("bundle") && !project->isEmpty("QMAKE_BUNDLE_EXTENSION")) { - if(!project->isEmpty("QMAKE_BUNDLE_NAME")) - lib = project->first("QMAKE_BUNDLE_NAME"); - lib += project->first("QMAKE_BUNDLE_EXTENSION"); - if(!project->isEmpty("QMAKE_PBX_BUNDLE_TYPE")) - t << "\t\t\t" << writeSettings("explicitFileType", project->first("QMAKE_PBX_BUNDLE_TYPE")) << ";\n"; - } else if(!project->isActiveConfig("staticlib") && project->isActiveConfig("lib_bundle")) { - if(!project->isEmpty("QMAKE_FRAMEWORK_BUNDLE_NAME")) - lib = project->first("QMAKE_FRAMEWORK_BUNDLE_NAME"); - lib += ".framework"; - t << "\t\t\t" << writeSettings("explicitFileType", "wrapper.framework") << ";\n"; - } else { - t << "\t\t\t" << writeSettings("explicitFileType", "compiled.mach-o.dylib") << ";\n"; - } - t << "\t\t\t" << writeSettings("path", lib) << ";\n"; - } - t << "\t\t\t" << writeSettings("sourceTree", "BUILT_PRODUCTS_DIR", SettingsNoQuote) << ";\n" - << "\t\t};\n"; - { //Products group - QString grp("Products"), key = keyFor(grp); - project->values("QMAKE_PBX_GROUPS").append(key); - t << "\t\t" << key << " = {\n" - << "\t\t\t" << writeSettings("children", project->values("QMAKE_PBX_PRODUCTS"), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXGroup", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", "Products") << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "") << ";\n" - << "\t\t};\n"; - } - - //DUMP EVERYTHING THAT TIES THE ABOVE TOGETHER - //ROOT_GROUP - t << "\t\t" << keyFor("QMAKE_PBX_ROOT_GROUP") << " = {\n" - << "\t\t\t" << writeSettings("children", project->values("QMAKE_PBX_GROUPS"), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXGroup", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", project->first("QMAKE_ORIG_TARGET")) << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "") << ";\n" - << "\t\t};\n"; - - { - QString aggregate_target_key = keyFor(pbx_dir + "QMAKE_PBX_AGGREGATE_TARGET"); - project->values("QMAKE_PBX_TARGETS").append(aggregate_target_key); - t << "\t\t" << aggregate_target_key << " = {\n" - << "\t\t\t" << writeSettings("buildPhases", project->values("QMAKE_PBX_PRESCRIPT_BUILDPHASES"), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("dependencies", ProStringList(), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("buildConfigurationList", keyFor("QMAKE_PBX_BUILDCONFIG_LIST_TARGET"), SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXAggregateTarget", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("buildRules", ProStringList(), SettingsAsList) << ";\n" - << "\t\t\t" << writeSettings("productName", "Qt Preprocess") << ";\n" - << "\t\t\t" << writeSettings("name", "Qt Preprocess") << ";\n" - << "\t\t};\n"; - - QString aggregate_target_dep_key = keyFor(pbx_dir + "QMAKE_PBX_AGGREGATE_TARGET_DEP"); - t << "\t\t" << aggregate_target_dep_key << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXTargetDependency", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("target", aggregate_target_key) << ";\n" - << "\t\t};\n"; - - project->values("QMAKE_PBX_TARGET_DEPENDS").append(aggregate_target_dep_key); - } - - //TARGET - QString target_key = keyFor(pbx_dir + "QMAKE_PBX_TARGET"); - project->values("QMAKE_PBX_TARGETS").prepend(target_key); - t << "\t\t" << target_key << " = {\n" - << "\t\t\t" << writeSettings("buildPhases", project->values("QMAKE_PBX_BUILDPHASES"), - SettingsAsList, 4) << ";\n"; - t << "\t\t\t" << writeSettings("dependencies", project->values("QMAKE_PBX_TARGET_DEPENDS"), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("productReference", keyFor(pbx_dir + "QMAKE_PBX_REFERENCE")) << ";\n"; - t << "\t\t\t" << writeSettings("buildConfigurationList", keyFor("QMAKE_PBX_BUILDCONFIG_LIST_TARGET"), SettingsNoQuote) << ";\n"; - t << "\t\t\t" << writeSettings("isa", "PBXNativeTarget", SettingsNoQuote) << ";\n"; - t << "\t\t\t" << writeSettings("buildRules", ProStringList(), SettingsAsList) << ";\n"; - if(project->first("TEMPLATE") == "app") { - if (!project->isEmpty("QMAKE_PBX_PRODUCT_TYPE")) { - t << "\t\t\t" << writeSettings("productType", project->first("QMAKE_PBX_PRODUCT_TYPE")) << ";\n"; - } else { - if (project->isActiveConfig("app_bundle")) - t << "\t\t\t" << writeSettings("productType", "com.apple.product-type.application") << ";\n"; - else - t << "\t\t\t" << writeSettings("productType", "com.apple.product-type.tool") << ";\n"; - } - t << "\t\t\t" << writeSettings("name", project->first("QMAKE_ORIG_TARGET")) << ";\n" - << "\t\t\t" << writeSettings("productName", project->first("QMAKE_ORIG_TARGET")) << ";\n"; - } else { - ProString lib = project->first("QMAKE_ORIG_TARGET"); - if(!project->isActiveConfig("lib_bundle") && !project->isActiveConfig("staticlib")) - lib.prepend("lib"); - t << "\t\t\t" << writeSettings("name", lib) << ";\n" - << "\t\t\t" << writeSettings("productName", lib) << ";\n"; - if (!project->isEmpty("QMAKE_PBX_PRODUCT_TYPE")) - t << "\t\t\t" << writeSettings("productType", project->first("QMAKE_PBX_PRODUCT_TYPE")) << ";\n"; - else if (project->isActiveConfig("staticlib")) - t << "\t\t\t" << writeSettings("productType", "com.apple.product-type.library.static") << ";\n"; - else if (project->isActiveConfig("lib_bundle")) - t << "\t\t\t" << writeSettings("productType", "com.apple.product-type.framework") << ";\n"; - else - t << "\t\t\t" << writeSettings("productType", "com.apple.product-type.library.dynamic") << ";\n"; - } - if(!project->isEmpty("DESTDIR")) - t << "\t\t\t" << writeSettings("productInstallPath", project->first("DESTDIR")) << ";\n"; - t << "\t\t};\n"; - - // Test target for running Qt unit tests under XCTest - if (project->isActiveConfig("testcase") && project->isActiveConfig("app_bundle")) { - QString devNullFileReferenceKey = keyFor(pbx_dir + "QMAKE_PBX_DEV_NULL_FILE_REFERENCE"); - t << "\t\t" << devNullFileReferenceKey << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXFileReference", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("name", "/dev/null") << ";\n" - << "\t\t\t" << writeSettings("path", "/dev/null") << ";\n" - << "\t\t\t" << writeSettings("lastKnownFileType", "sourcecode.c.c") << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "") << ";\n" - << "\t\t};\n"; - - QString devNullBuildFileKey = keyFor(pbx_dir + "QMAKE_PBX_DEV_NULL_BUILD_FILE"); - t << "\t\t" << devNullBuildFileKey << " = {\n" - << "\t\t\t" << writeSettings("fileRef", devNullFileReferenceKey) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXBuildFile", SettingsNoQuote) << ";\n" - << "\t\t};\n"; - - QString dummySourceBuildPhaseKey = keyFor(pbx_dir + "QMAKE_PBX_DUMMY_SOURCE_BUILD_PHASE"); - t << "\t\t" << dummySourceBuildPhaseKey << " = {\n" - << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("files", devNullBuildFileKey, SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXSourcesBuildPhase", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("runOnlyForDeploymentPostprocessing", "0", SettingsNoQuote) << ";\n" - << "\t\t};\n"; - - ProStringList testBundleBuildConfigs; - - ProString targetName = project->first("QMAKE_ORIG_TARGET"); - ProString testHost = "$(BUILT_PRODUCTS_DIR)/" + targetName + ".app/"; - if (!project->isActiveConfig("ios")) - testHost.append("Contents/MacOS/"); - testHost.append(targetName); - - static const char * const configs[] = { "Debug", "Release", 0 }; - for (int i = 0; configs[i]; i++) { - QString testBundleBuildConfig = keyFor(pbx_dir + "QMAKE_PBX_TEST_BUNDLE_BUILDCONFIG_" + configs[i]); - t << "\t\t" << testBundleBuildConfig << " = {\n" - << "\t\t\t" << writeSettings("isa", "XCBuildConfiguration", SettingsNoQuote) << ";\n" - << "\t\t\tbuildSettings = {\n" - << "\t\t\t\t" << writeSettings("INFOPLIST_FILE", project->first("QMAKE_XCODE_SPECDIR") + "/QtTest.plist") << ";\n" - << "\t\t\t\t" << writeSettings("OTHER_LDFLAGS", "") << ";\n" - << "\t\t\t\t" << writeSettings("TEST_HOST", testHost) << ";\n" - << "\t\t\t\t" << writeSettings("DEBUG_INFORMATION_FORMAT", "dwarf-with-dsym") << ";\n" - << "\t\t\t};\n" - << "\t\t\t" << writeSettings("name", configs[i], SettingsNoQuote) << ";\n" - << "\t\t};\n"; - - testBundleBuildConfigs.append(testBundleBuildConfig); - } - - QString testBundleBuildConfigurationListKey = keyFor(pbx_dir + "QMAKE_PBX_TEST_BUNDLE_BUILDCONFIG_LIST"); - t << "\t\t" << testBundleBuildConfigurationListKey << " = {\n" - << "\t\t\t" << writeSettings("isa", "XCConfigurationList", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("buildConfigurations", testBundleBuildConfigs, SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("defaultConfigurationIsVisible", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("defaultConfigurationName", "Debug", SettingsNoQuote) << ";\n" - << "\t\t};\n"; - - QString primaryTargetDependencyKey = keyFor(pbx_dir + "QMAKE_PBX_PRIMARY_TARGET_DEP"); - t << "\t\t" << primaryTargetDependencyKey << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXTargetDependency", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("target", keyFor(pbx_dir + "QMAKE_PBX_TARGET")) << ";\n" - << "\t\t};\n"; - - QString testBundleReferenceKey = keyFor("QMAKE_TEST_BUNDLE_REFERENCE"); - t << "\t\t" << testBundleReferenceKey << " = {\n" - << "\t\t\t" << writeSettings("isa", "PBXFileReference", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("explicitFileType", "wrapper.cfbundle") << ";\n" - << "\t\t\t" << writeSettings("includeInIndex", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("sourceTree", "BUILT_PRODUCTS_DIR", SettingsNoQuote) << ";\n" - << "\t\t};\n"; - - QString testTargetKey = keyFor(pbx_dir + "QMAKE_PBX_TEST_TARGET"); - project->values("QMAKE_PBX_TARGETS").append(testTargetKey); - t << "\t\t" << testTargetKey << " = {\n" - << "\t\t\t" << writeSettings("buildPhases", dummySourceBuildPhaseKey, SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("dependencies", primaryTargetDependencyKey, SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("buildConfigurationList", testBundleBuildConfigurationListKey) << ";\n" - << "\t\t\t" << writeSettings("productType", "com.apple.product-type.bundle.unit-test") << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXNativeTarget", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("productReference", testBundleReferenceKey) << ";\n" - << "\t\t\t" << writeSettings("name", "Qt Test") << ";\n" - << "\t\t};\n"; - - QLatin1Literal testTargetID("TestTargetID"); - project->values(ProKey("QMAKE_PBX_TARGET_ATTRIBUTES_" + testTargetKey + "_" + testTargetID)).append(keyFor(pbx_dir + "QMAKE_PBX_TARGET")); - project->values(ProKey("QMAKE_PBX_TARGET_ATTRIBUTES_" + testTargetKey)).append(ProKey(testTargetID)); - } - - //DEBUG/RELEASE - QString defaultConfig; - for(int as_release = 0; as_release < 2; as_release++) - { - QString configName = (as_release ? "Release" : "Debug"); - - QMap settings; - settings.insert("COPY_PHASE_STRIP", (as_release ? "YES" : "NO")); - // Bitcode is only supported with a deployment target >= iOS 6.0. - // Disable it for now, and consider switching it on when later - // bumping the deployment target. - settings.insert("ENABLE_BITCODE", "NO"); - settings.insert("GCC_GENERATE_DEBUGGING_SYMBOLS", as_release ? "NO" : "YES"); - if(!as_release) - settings.insert("GCC_OPTIMIZATION_LEVEL", "0"); - if(project->isActiveConfig("sdk") && !project->isEmpty("QMAKE_MAC_SDK")) - settings.insert("SDKROOT", project->first("QMAKE_MAC_SDK").toQString()); - { - const ProStringList &l = project->values("QMAKE_MAC_XCODE_SETTINGS"); - for(int i = 0; i < l.size(); ++i) { - ProString name = l.at(i); - const ProKey buildKey(name + ".build"); - if (!project->isEmpty(buildKey)) { - const QString build = project->first(buildKey).toQString(); - if (build.toLower() != configName.toLower()) - continue; - } - const QString value = project->values(ProKey(name + ".value")).join(QString(Option::field_sep)); - const ProKey nkey(name + ".name"); - if (!project->isEmpty(nkey)) - name = project->first(nkey); - settings.insert(name.toQString(), value); - } - } - if (project->first("TEMPLATE") == "app") { - settings.insert("PRODUCT_NAME", fixForOutput(project->first("QMAKE_ORIG_TARGET").toQString())); - } else { - ProString lib = project->first("QMAKE_ORIG_TARGET"); - if (!project->isActiveConfig("lib_bundle") && !project->isActiveConfig("staticlib")) - lib.prepend("lib"); - settings.insert("PRODUCT_NAME", lib.toQString()); - } - - if (project->isActiveConfig("debug") != (bool)as_release) - defaultConfig = configName; - for (int i = 0; i < buildConfigGroups.size(); i++) { - QString key = keyFor("QMAKE_PBX_BUILDCONFIG_" + configName + buildConfigGroups.at(i)); - project->values(ProKey("QMAKE_PBX_BUILDCONFIGS_" + buildConfigGroups.at(i))).append(key); - t << "\t\t" << key << " = {\n" - << "\t\t\t" << writeSettings("isa", "XCBuildConfiguration", SettingsNoQuote) << ";\n" - << "\t\t\tbuildSettings = {\n"; - for (QMap::Iterator set_it = settings.begin(); set_it != settings.end(); ++set_it) - t << "\t\t\t\t" << writeSettings(set_it.key(), set_it.value()) << ";\n"; - if (buildConfigGroups.at(i) == QLatin1String("PROJECT")) { - if (!project->isEmpty("QMAKE_XCODE_GCC_VERSION")) - t << "\t\t\t\t" << writeSettings("GCC_VERSION", project->first("QMAKE_XCODE_GCC_VERSION"), SettingsNoQuote) << ";\n"; - ProString program = project->first("QMAKE_CC"); - if (!program.isEmpty()) - t << "\t\t\t\t" << writeSettings("CC", fixForOutput(findProgram(program))) << ";\n"; - program = project->first("QMAKE_CXX"); - // Xcode will automatically take care of using CC with the right -x option, - // and will actually break if we pass CPLUSPLUS, by adding an additional set of "++" - if (!program.isEmpty() && !program.contains("clang++")) - t << "\t\t\t\t" << writeSettings("CPLUSPLUS", fixForOutput(findProgram(program))) << ";\n"; - program = project->first("QMAKE_LINK"); - if (!program.isEmpty()) - t << "\t\t\t\t" << writeSettings("LDPLUSPLUS", fixForOutput(findProgram(program))) << ";\n"; - - if ((project->first("TEMPLATE") == "app" && project->isActiveConfig("app_bundle")) || - (project->first("TEMPLATE") == "lib" && !project->isActiveConfig("staticlib") && - project->isActiveConfig("lib_bundle"))) { - QString plist = fileFixify(project->first("QMAKE_INFO_PLIST").toQString(), FileFixifyToIndir); - if (!plist.isEmpty()) { - if (exists(plist)) - t << "\t\t\t\t" << writeSettings("INFOPLIST_FILE", fileFixify(plist)) << ";\n"; - else - warn_msg(WarnLogic, "Could not resolve Info.plist: '%s'. Check if QMAKE_INFO_PLIST points to a valid file.", plist.toLatin1().constData()); - } else { - plist = specdir() + QDir::separator() + "Info.plist." + project->first("TEMPLATE"); - QFile plist_in_file(plist); - if (plist_in_file.open(QIODevice::ReadOnly)) { - QTextStream plist_in(&plist_in_file); - QString plist_in_text = plist_in.readAll(); - plist_in_text.replace("@ICON@", - (project->isEmpty("ICON") ? QString("") : project->first("ICON").toQString().section(Option::dir_sep, -1))); - if (project->first("TEMPLATE") == "app") { - plist_in_text.replace("@EXECUTABLE@", project->first("QMAKE_ORIG_TARGET").toQString()); - } else { - plist_in_text.replace("@LIBRARY@", project->first("QMAKE_ORIG_TARGET").toQString()); - } - QString bundlePrefix = project->first("QMAKE_TARGET_BUNDLE_PREFIX").toQString(); - if (bundlePrefix.isEmpty()) - bundlePrefix = "com.yourcompany"; - plist_in_text.replace("@BUNDLEIDENTIFIER@", bundlePrefix + '.' + QLatin1String("${PRODUCT_NAME:rfc1034identifier}")); - if (!project->values("VERSION").isEmpty()) { - plist_in_text.replace("@SHORT_VERSION@", project->first("VER_MAJ") + "." + project->first("VER_MIN")); - } - plist_in_text.replace("@TYPEINFO@", - (project->isEmpty("QMAKE_PKGINFO_TYPEINFO") - ? QString::fromLatin1("????") : project->first("QMAKE_PKGINFO_TYPEINFO").left(4).toQString())); - QString plist_dir; - if (!project->isEmpty("PLIST_DIR")) - plist_dir = project->first("PLIST_DIR").toQString(); - QString plist_in_filename = QFileInfo(plist_in_file).fileName(); - QFile plist_out_file(Option::output_dir + "/" + plist_dir + plist_in_filename); - if (plist_out_file.open(QIODevice::WriteOnly | QIODevice::Text)) { - QTextStream plist_out(&plist_out_file); - plist_out << plist_in_text; - t << "\t\t\t\t" << writeSettings("INFOPLIST_FILE", fixForOutput(plist_dir + plist_in_filename)) << ";\n"; - } - } - } - } - - t << "\t\t\t\t" << writeSettings("SYMROOT", Option::output_dir) << ";\n"; - - if (!project->isEmpty("DESTDIR")) { - ProString dir = project->first("DESTDIR"); - if (QDir::isRelativePath(dir.toQString())) - dir.prepend(Option::output_dir + Option::dir_sep); - t << "\t\t\t\t" << writeSettings("INSTALL_DIR", dir) << ";\n"; - } - - if (project->first("TEMPLATE") == "lib") - t << "\t\t\t\t" << writeSettings("INSTALL_PATH", ProStringList()) << ";\n"; - - if (!project->isEmpty("VERSION") && project->first("VERSION") != "0.0.0") { - t << "\t\t\t\t" << writeSettings("DYLIB_CURRENT_VERSION", project->first("VER_MAJ")+"."+project->first("VER_MIN")+"."+project->first("VER_PAT")) << ";\n"; - if (project->isEmpty("COMPAT_VERSION")) - t << "\t\t\t\t" << writeSettings("DYLIB_COMPATIBILITY_VERSION", project->first("VER_MAJ")+"."+project->first("VER_MIN")) << ";\n"; - if (project->first("TEMPLATE") == "lib" && !project->isActiveConfig("staticlib") && - project->isActiveConfig("lib_bundle")) - t << "\t\t\t\t" << writeSettings("FRAMEWORK_VERSION", project->first("QMAKE_FRAMEWORK_VERSION")) << ";\n"; - } - if (!project->isEmpty("COMPAT_VERSION")) - t << "\t\t\t\t" << writeSettings("DYLIB_COMPATIBILITY_VERSION", project->first("COMPAT_VERSION")) << ";\n"; - - if (!project->isEmpty("QMAKE_MACOSX_DEPLOYMENT_TARGET")) - t << "\t\t\t\t" << writeSettings("MACOSX_DEPLOYMENT_TARGET", project->first("QMAKE_MACOSX_DEPLOYMENT_TARGET")) << ";\n"; - if (!project->isEmpty("QMAKE_IOS_DEPLOYMENT_TARGET")) - t << "\t\t\t\t" << writeSettings("IPHONEOS_DEPLOYMENT_TARGET", project->first("QMAKE_IOS_DEPLOYMENT_TARGET")) << ";\n"; - - if (!project->isEmpty("QMAKE_XCODE_CODE_SIGN_IDENTITY")) - t << "\t\t\t\t" << writeSettings("CODE_SIGN_IDENTITY", project->first("QMAKE_XCODE_CODE_SIGN_IDENTITY")) << ";\n"; - - tmp = project->values("QMAKE_PBX_VARS"); - for (int i = 0; i < tmp.count(); i++) { - QString var = tmp[i].toQString(), val = QString::fromLocal8Bit(qgetenv(var.toLatin1().constData())); - if (val.isEmpty() && var == "TB") - val = "/usr/bin/"; - t << "\t\t\t\t" << writeSettings(var, val) << ";\n"; - } - if (!project->isEmpty("PRECOMPILED_HEADER")) { - t << "\t\t\t\t" << writeSettings("GCC_PRECOMPILE_PREFIX_HEADER", "YES") << ";\n" - << "\t\t\t\t" << writeSettings("GCC_PREFIX_HEADER", project->first("PRECOMPILED_HEADER")) << ";\n"; - } - t << "\t\t\t\t" << writeSettings("HEADER_SEARCH_PATHS", fixListForOutput("INCLUDEPATH"), SettingsAsList, 5) << ";\n" - << "\t\t\t\t" << writeSettings("LIBRARY_SEARCH_PATHS", fixListForOutput("QMAKE_PBX_LIBPATHS"), SettingsAsList, 5) << ";\n" - << "\t\t\t\t" << writeSettings("FRAMEWORK_SEARCH_PATHS", fixListForOutput("QMAKE_FRAMEWORKPATH"), - !project->values("QMAKE_FRAMEWORKPATH").isEmpty() ? SettingsAsList : 0, 5) << ";\n"; - - { - ProStringList cflags = project->values("QMAKE_CFLAGS"); - const ProStringList &prl_defines = project->values("PRL_EXPORT_DEFINES"); - for (int i = 0; i < prl_defines.size(); ++i) - cflags += "-D" + prl_defines.at(i); - const ProStringList &defines = project->values("DEFINES"); - for (int i = 0; i < defines.size(); ++i) - cflags += "-D" + defines.at(i); - t << "\t\t\t\t" << writeSettings("OTHER_CFLAGS", fixListForOutput(cflags), SettingsAsList, 5) << ";\n"; - } - { - ProStringList cxxflags = project->values("QMAKE_CXXFLAGS"); - const ProStringList &prl_defines = project->values("PRL_EXPORT_DEFINES"); - for (int i = 0; i < prl_defines.size(); ++i) - cxxflags += "-D" + prl_defines.at(i); - const ProStringList &defines = project->values("DEFINES"); - for (int i = 0; i < defines.size(); ++i) - cxxflags += "-D" + defines.at(i); - t << "\t\t\t\t" << writeSettings("OTHER_CPLUSPLUSFLAGS", fixListForOutput(cxxflags), SettingsAsList, 5) << ";\n"; - } - if (!project->isActiveConfig("staticlib")) { - t << "\t\t\t\t" << writeSettings("OTHER_LDFLAGS", - fixListForOutput("SUBLIBS") - + fixListForOutput("QMAKE_LFLAGS") - + fixListForOutput(fixLibFlags("QMAKE_LIBS")) - + fixListForOutput(fixLibFlags("QMAKE_LIBS_PRIVATE")), - SettingsAsList, 6) << ";\n"; - } - const ProStringList &archs = !project->values("QMAKE_XCODE_ARCHS").isEmpty() ? - project->values("QMAKE_XCODE_ARCHS") : project->values("QT_ARCH"); - if (!archs.isEmpty()) - t << "\t\t\t\t" << writeSettings("ARCHS", archs) << ";\n"; - if (!project->isEmpty("OBJECTS_DIR")) - t << "\t\t\t\t" << writeSettings("OBJROOT", project->first("OBJECTS_DIR")) << ";\n"; - } else { - if (project->first("TEMPLATE") == "app") { - t << "\t\t\t\t" << writeSettings("PRODUCT_NAME", fixForOutput(project->first("QMAKE_ORIG_TARGET").toQString())) << ";\n"; - } else { - if (!project->isActiveConfig("plugin") && project->isActiveConfig("staticlib")) - t << "\t\t\t\t" << writeSettings("LIBRARY_STYLE", "STATIC") << ";\n"; - else - t << "\t\t\t\t" << writeSettings("LIBRARY_STYLE", "DYNAMIC") << ";\n"; - ProString lib = project->first("QMAKE_ORIG_TARGET"); - if (!project->isActiveConfig("lib_bundle") && !project->isActiveConfig("staticlib")) - lib.prepend("lib"); - t << "\t\t\t\t" << writeSettings("PRODUCT_NAME", lib) << ";\n"; - } - } - t << "\t\t\t};\n" - << "\t\t\t" << writeSettings("name", configName) << ";\n" - << "\t\t};\n"; - } - } - for (int i = 0; i < buildConfigGroups.size(); i++) { - t << "\t\t" << keyFor("QMAKE_PBX_BUILDCONFIG_LIST_" + buildConfigGroups.at(i)) << " = {\n" - << "\t\t\t" << writeSettings("isa", "XCConfigurationList", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("buildConfigurations", project->values(ProKey("QMAKE_PBX_BUILDCONFIGS_" + buildConfigGroups.at(i))), SettingsAsList, 4) << ";\n" - << "\t\t\t" << writeSettings("defaultConfigurationIsVisible", "0", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("defaultConfigurationName", defaultConfig) << ";\n" - << "\t\t};\n"; - } - //ROOT - t << "\t\t" << keyFor("QMAKE_PBX_ROOT") << " = {\n" - << "\t\t\t" << writeSettings("hasScannedForEncodings", "1", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("compatibilityVersion", "Xcode 3.2") << ";\n" - << "\t\t\t" << writeSettings("isa", "PBXProject", SettingsNoQuote) << ";\n" - << "\t\t\t" << writeSettings("mainGroup", keyFor("QMAKE_PBX_ROOT_GROUP")) << ";\n" - << "\t\t\t" << writeSettings("productRefGroup", keyFor("Products")) << ";\n"; - t << "\t\t\t" << writeSettings("buildConfigurationList", keyFor("QMAKE_PBX_BUILDCONFIG_LIST_PROJECT")) << ";\n"; - t << "\t\t\t" << writeSettings("projectDirPath", ProStringList()) << ";\n" - << "\t\t\t" << writeSettings("projectRoot", "") << ";\n" - << "\t\t\t" << writeSettings("targets", project->values("QMAKE_PBX_TARGETS"), SettingsAsList, 4) << ";\n" - << "\t\t\t" << "attributes = {\n" - << "\t\t\t\tTargetAttributes = {\n"; - foreach (const ProString &target, project->values("QMAKE_PBX_TARGETS")) { - const ProStringList &attributes = project->values(ProKey("QMAKE_PBX_TARGET_ATTRIBUTES_" + target)); - if (attributes.isEmpty()) - continue; - t << "\t\t\t\t\t" << target << " = {\n"; - foreach (const ProString &attribute, attributes) - t << "\t\t\t\t\t\t" << writeSettings(attribute.toQString(), project->first(ProKey("QMAKE_PBX_TARGET_ATTRIBUTES_" + target + "_" + attribute))) << ";\n"; - t << "\t\t\t\t\t};\n"; - } - t << "\t\t\t\t};\n" - << "\t\t\t};\n" - << "\t\t};\n"; - - // FIXME: Deal with developmentRegion and knownRegions for QMAKE_PBX_ROOT - - //FOOTER - t << "\t};\n" - << "\t" << writeSettings("rootObject", keyFor("QMAKE_PBX_ROOT")) << ";\n" - << "}\n"; - - if(project->isActiveConfig("generate_pbxbuild_makefile")) { - QString mkwrap = Option::output_dir + project->first("/MAKEFILE"); - QFile mkwrapf(mkwrap); - if(mkwrapf.open(QIODevice::WriteOnly | QIODevice::Text)) { - writingUnixMakefileGenerator = true; - debug_msg(1, "pbuilder: Creating file: %s", mkwrap.toLatin1().constData()); - QTextStream mkwrapt(&mkwrapf); - writeHeader(mkwrapt); - const char cleans[] = "preprocess_clean "; - const QString cmd = escapeFilePath(project->first("QMAKE_ORIG_TARGET") + projectSuffix() + "/") + " && " + pbxbuild(); - mkwrapt << "#This is a makefile wrapper for PROJECT BUILDER\n" - << "all:\n\t" - << "cd " << cmd << "\n" - << "install: all\n\t" - << "cd " << cmd << " install\n" - << "distclean clean: preprocess_clean\n\t" - << "cd " << cmd << " clean\n" - << (!did_preprocess ? cleans : "") << ":\n"; - if(did_preprocess) - mkwrapt << cleans << ":\n\t" - << "make -f " - << pbx_dir << Option::dir_sep << "qt_preprocess.mak $@\n"; - writingUnixMakefileGenerator = false; - } - } - - // Scheme - { - QString xcodeSpecDir = project->first("QMAKE_XCODE_SPECDIR").toQString(); - - bool wroteCustomScheme = false; - - QString projectSharedSchemesPath = pbx_dir + "/xcshareddata/xcschemes"; - if (mkdir(projectSharedSchemesPath)) { - QString target = project->first("QMAKE_ORIG_TARGET").toQString(); - - QFile defaultSchemeFile(xcodeSpecDir + "/default.xcscheme"); - QFile outputSchemeFile(projectSharedSchemesPath + Option::dir_sep + target + ".xcscheme"); - - if (defaultSchemeFile.open(QIODevice::ReadOnly) - && outputSchemeFile.open(QIODevice::WriteOnly | QIODevice::Text)) { - - QTextStream defaultSchemeStream(&defaultSchemeFile); - QString schemeData = defaultSchemeStream.readAll(); - - schemeData.replace("@QMAKE_ORIG_TARGET@", target); - schemeData.replace("@TARGET_PBX_KEY@", keyFor(pbx_dir + "QMAKE_PBX_TARGET")); - schemeData.replace("@TEST_BUNDLE_PBX_KEY@", keyFor("QMAKE_TEST_BUNDLE_REFERENCE")); - - QTextStream outputSchemeStream(&outputSchemeFile); - outputSchemeStream << schemeData; - - wroteCustomScheme = true; - } - } - - if (wroteCustomScheme) { - // Prevent Xcode from auto-generating schemes - QString workspaceSettingsFilename("WorkspaceSettings.xcsettings"); - QString workspaceSharedDataPath = pbx_dir + "/project.xcworkspace/xcshareddata"; - if (mkdir(workspaceSharedDataPath)) { - QFile::copy(xcodeSpecDir + Option::dir_sep + workspaceSettingsFilename, - workspaceSharedDataPath + Option::dir_sep + workspaceSettingsFilename); - } else { - wroteCustomScheme = false; - } - } - - if (!wroteCustomScheme) - warn_msg(WarnLogic, "Failed to generate schemes in '%s', " \ - "falling back to Xcode auto-generated schemes", qPrintable(projectSharedSchemesPath)); - } - - return true; -} - -QString -ProjectBuilderMakefileGenerator::findProgram(const ProString &prog) -{ - QString ret = prog.toQString(); - if(QDir::isRelativePath(ret)) { - QStringList paths = QString(qgetenv("PATH")).split(':'); - for(int i = 0; i < paths.size(); ++i) { - QString path = paths.at(i) + "/" + prog; - if(exists(path)) { - ret = path; - break; - } - } - } - return ret; -} - -QString -ProjectBuilderMakefileGenerator::fixForOutput(const QString &values) -{ - //get the environment variables references - QRegExp reg_var("\\$\\((.*)\\)"); - for(int rep = 0; (rep = reg_var.indexIn(values, rep)) != -1;) { - if(project->values("QMAKE_PBX_VARS").indexOf(reg_var.cap(1)) == -1) - project->values("QMAKE_PBX_VARS").append(reg_var.cap(1)); - rep += reg_var.matchedLength(); - } - - return values; -} - -ProStringList -ProjectBuilderMakefileGenerator::fixListForOutput(const char *where) -{ - return fixListForOutput(project->values(where)); -} - -ProStringList -ProjectBuilderMakefileGenerator::fixListForOutput(const ProStringList &l) -{ - ProStringList ret; - for(int i = 0; i < l.count(); i++) - ret += fixForOutput(l[i].toQString()); - return ret; -} - -QString -ProjectBuilderMakefileGenerator::keyFor(const QString &block) -{ -#if 1 //This make this code much easier to debug.. - if(project->isActiveConfig("no_pb_munge_key")) - return block; -#endif - QString ret; - if(!keys.contains(block)) { - ret = qtSha1(block.toUtf8()).left(24).toUpper(); - keys.insert(block, ret); - } else { - ret = keys[block]; - } - return ret; -} - -bool -ProjectBuilderMakefileGenerator::openOutput(QFile &file, const QString &build) const -{ - if(QDir::isRelativePath(file.fileName())) - file.setFileName(Option::output_dir + "/" + file.fileName()); //pwd when qmake was run - QFileInfo fi(fileInfo(file.fileName())); - if(fi.suffix() != "pbxproj" || file.fileName().isEmpty()) { - QString output = file.fileName(); - if(fi.isDir()) - output += QDir::separator(); - if(!output.endsWith(projectSuffix())) { - if(file.fileName().isEmpty() || fi.isDir()) { - if(project->first("TEMPLATE") == "subdirs" || project->isEmpty("QMAKE_ORIG_TARGET")) - output += fileInfo(project->projectFile()).baseName(); - else - output += project->first("QMAKE_ORIG_TARGET").toQString(); - } - output += projectSuffix() + QDir::separator(); - } else if(output[(int)output.length() - 1] != QDir::separator()) { - output += QDir::separator(); - } - output += QString("project.pbxproj"); - file.setFileName(output); - bool ret = UnixMakefileGenerator::openOutput(file, build); - ((ProjectBuilderMakefileGenerator*)this)->pbx_dir = Option::output_dir.section(Option::dir_sep, 0, -1); - Option::output_dir = pbx_dir.section(Option::dir_sep, 0, -2); - return ret; - } - - ((ProjectBuilderMakefileGenerator*)this)->pbx_dir = Option::output_dir; - return UnixMakefileGenerator::openOutput(file, build); -} - -/* This function is such a hack it is almost pointless, but it - eliminates the warning message from ProjectBuilder that the project - file is for an older version. I guess this could be used someday if - the format of the output is dependant upon the version of - ProjectBuilder as well. -*/ -int -ProjectBuilderMakefileGenerator::pbuilderVersion() const -{ - QString ret; - if(!project->isEmpty("QMAKE_PBUILDER_VERSION")) { - ret = project->first("QMAKE_PBUILDER_VERSION").toQString(); - } else { - QString version, version_plist = project->first("QMAKE_PBUILDER_VERSION_PLIST").toQString(); - if(version_plist.isEmpty()) { -#ifdef Q_OS_DARWIN - ret = QLatin1String("34"); - QCFType cfurl; - // Check for XCode 4 first - OSStatus err = LSFindApplicationForInfo(0, CFSTR("com.apple.dt.Xcode"), 0, 0, &cfurl); - // Now check for XCode 3 - if (err == kLSApplicationNotFoundErr) - err = LSFindApplicationForInfo(0, CFSTR("com.apple.Xcode"), 0, 0, &cfurl); - if (err == noErr) { - QCFType bundle = CFBundleCreate(0, cfurl); - if (bundle) { - CFStringRef str = CFStringRef(CFBundleGetValueForInfoDictionaryKey(bundle, - CFSTR("CFBundleShortVersionString"))); - if (str) { - QStringList versions = QCFString::toQString(str).split(QLatin1Char('.')); - int versionMajor = versions.at(0).toInt(); - int versionMinor = versions.at(1).toInt(); - if (versionMajor >= 3) { - ret = QLatin1String("46"); - } else if (versionMajor >= 2) { - ret = QLatin1String("42"); - } else if (versionMajor == 1 && versionMinor >= 5) { - ret = QLatin1String("39"); - } - } - } - } -#else - if(exists("/Developer/Applications/Xcode.app/Contents/version.plist")) - version_plist = "/Developer/Applications/Xcode.app/Contents/version.plist"; - else - version_plist = "/Developer/Applications/Project Builder.app/Contents/version.plist"; -#endif - } - if (ret.isEmpty()) { - QFile version_file(version_plist); - if (version_file.open(QIODevice::ReadOnly)) { - debug_msg(1, "pbuilder: version.plist: Reading file: %s", version_plist.toLatin1().constData()); - QTextStream plist(&version_file); - - bool in_dict = false; - QString current_key; - QRegExp keyreg("^(.*)$"), stringreg("^(.*)$"); - while(!plist.atEnd()) { - QString line = plist.readLine().trimmed(); - if(line == "") - in_dict = true; - else if(line == "") - in_dict = false; - else if(in_dict) { - if(keyreg.exactMatch(line)) - current_key = keyreg.cap(1); - else if(current_key == "CFBundleShortVersionString" && stringreg.exactMatch(line)) - version = stringreg.cap(1); - } - } - plist.flush(); - version_file.close(); - } else { - debug_msg(1, "pbuilder: version.plist: Failure to open %s", version_plist.toLatin1().constData()); - } - if(version.isEmpty() && version_plist.contains("Xcode")) { - ret = "39"; - } else { - int versionMajor = version.left(1).toInt(); - if(versionMajor >= 2) - ret = "42"; - else if(version == "1.5") - ret = "39"; - else if(version == "1.1") - ret = "34"; - } - } - } - - if(!ret.isEmpty()) { - bool ok; - int int_ret = ret.toInt(&ok); - if(ok) { - debug_msg(1, "pbuilder: version.plist: Got version: %d", int_ret); - if (int_ret < 46) - warn_msg(WarnLogic, "XCode version is too old, at least XCode 3.2 is required"); - return int_ret; - } - } - debug_msg(1, "pbuilder: version.plist: Fallback to default version"); - return 46; //my fallback -} - -int -ProjectBuilderMakefileGenerator::reftypeForFile(const QString &where) -{ - int ret = 0; //absolute is the default.. - if (QDir::isRelativePath(where)) - ret = 4; //relative - return ret; -} - -QString -ProjectBuilderMakefileGenerator::projectSuffix() const -{ - const int pbVersion = pbuilderVersion(); - if(pbVersion >= 42) - return ".xcodeproj"; - else if(pbVersion >= 38) - return ".xcode"; - return ".pbproj"; -} - -QString -ProjectBuilderMakefileGenerator::pbxbuild() -{ - if(exists("/usr/bin/pbbuild")) - return "pbbuild"; - if(exists("/usr/bin/xcodebuild")) - return "xcodebuild"; - return (pbuilderVersion() >= 38 ? "xcodebuild" : "pbxbuild"); -} - -static QString quotedStringLiteral(const QString &value) -{ - QString result; - const int len = value.length(); - result.reserve(int(len * 1.1) + 2); - - result += QLatin1Char('"'); - - // Escape - for (int i = 0; i < len; ++i) { - QChar character = value.at(i);; - ushort code = character.unicode(); - switch (code) { - case '\\': - result += QLatin1String("\\\\"); - break; - case '"': - result += QLatin1String("\\\""); - break; - case '\b': - result += QLatin1String("\\b"); - break; - case '\n': - result += QLatin1String("\\n"); - break; - case '\r': - result += QLatin1String("\\r"); - break; - case '\t': - result += QLatin1String("\\t"); - break; - default: - if (code >= 32 && code <= 127) - result += character; - else - result += QLatin1String("\\u") + QString::number(code, 16).rightJustified(4, '0'); - } - } - - result += QLatin1Char('"'); - - result.squeeze(); - return result; -} - -QString -ProjectBuilderMakefileGenerator::writeSettings(const QString &var, const ProStringList &vals, int flags, int indent_level) -{ - QString ret; - bool shouldQuote = !((flags & SettingsNoQuote)); - - QString newline = "\n"; - for(int i = 0; i < indent_level; ++i) - newline += "\t"; - - static QRegExp allowedVariableCharacters("^[a-zA-Z0-9_]*$"); - ret += var.contains(allowedVariableCharacters) ? var : quotedStringLiteral(var); - - ret += " = "; - - if(flags & SettingsAsList) { - ret += "(" + newline; - for(int i = 0, count = 0; i < vals.size(); ++i) { - QString val = vals.at(i).toQString(); - if(!val.isEmpty()) { - if(count++ > 0) - ret += "," + newline; - if (shouldQuote) - val = quotedStringLiteral(val); - ret += val; - } - } - ret += ")"; - } else { - QString val = vals.join(QLatin1Char(' ')); - if (shouldQuote) - val = quotedStringLiteral(val); - ret += val; - } - return ret; -} - -QT_END_NAMESPACE diff --git a/Telegram/_qt_5_5_0_patch/qtbase/qmake/generators/makefile.cpp b/Telegram/_qt_5_5_0_patch/qtbase/qmake/generators/makefile.cpp deleted file mode 100644 index 2c18c48b9..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/qmake/generators/makefile.cpp +++ /dev/null @@ -1,3339 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the qmake application of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "makefile.h" -#include "option.h" -#include "cachekeys.h" -#include "meta.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(Q_OS_UNIX) -#include -#else -#include -#endif -#include -#include -#include -#include -#include -#include - -QT_BEGIN_NAMESPACE - -using namespace QMakeInternal; - -bool MakefileGenerator::canExecute(const QStringList &cmdline, int *a) const -{ - int argv0 = -1; - for(int i = 0; i < cmdline.count(); ++i) { - if(!cmdline.at(i).contains('=')) { - argv0 = i; - break; - } - } - if(a) - *a = argv0; - if(argv0 != -1) { - const QString c = Option::normalizePath(cmdline.at(argv0)); - if(exists(c)) - return true; - } - return false; -} - -QString MakefileGenerator::mkdir_p_asstring(const QString &dir, bool escape) const -{ - QString edir = escape ? escapeFilePath(Option::fixPathToTargetOS(dir, false, false)) : dir; - return "@" + makedir.arg(edir); -} - -bool MakefileGenerator::mkdir(const QString &in_path) const -{ - QString path = Option::normalizePath(in_path); - if(QFile::exists(path)) - return true; - - return QDir().mkpath(path); -} - -// ** base makefile generator -MakefileGenerator::MakefileGenerator() : - no_io(false), project(0) -{ -} - - -void -MakefileGenerator::verifyCompilers() -{ - ProValueMap &v = project->variables(); - ProStringList &quc = v["QMAKE_EXTRA_COMPILERS"]; - for(int i = 0; i < quc.size(); ) { - bool error = false; - const ProString &comp = quc.at(i); - const ProKey okey(comp + ".output"); - if (v[okey].isEmpty()) { - const ProKey ofkey(comp + ".output_function"); - if (!v[ofkey].isEmpty()) { - v[okey].append("${QMAKE_FUNC_FILE_IN_" + v[ofkey].first() + "}"); - } else { - error = true; - warn_msg(WarnLogic, "Compiler: %s: No output file specified", comp.toLatin1().constData()); - } - } else if (v[ProKey(comp + ".input")].isEmpty()) { - error = true; - warn_msg(WarnLogic, "Compiler: %s: No input variable specified", comp.toLatin1().constData()); - } - if(error) - quc.removeAt(i); - else - ++i; - } -} - -void -MakefileGenerator::initOutPaths() -{ - ProValueMap &v = project->variables(); - //for shadow builds - if(!v.contains("QMAKE_ABSOLUTE_SOURCE_PATH")) { - if (Option::globals->do_cache && !project->cacheFile().isEmpty() && - v.contains("QMAKE_ABSOLUTE_SOURCE_ROOT")) { - QString root = v["QMAKE_ABSOLUTE_SOURCE_ROOT"].first().toQString(); - root = QDir::fromNativeSeparators(root); - if(!root.isEmpty()) { - QFileInfo fi = fileInfo(project->cacheFile()); - if(!fi.makeAbsolute()) { - QString cache_r = fi.path(), pwd = Option::output_dir; - if(pwd.startsWith(cache_r) && !pwd.startsWith(root)) { - pwd = root + pwd.mid(cache_r.length()); - if(exists(pwd)) - v.insert("QMAKE_ABSOLUTE_SOURCE_PATH", ProStringList(pwd)); - } - } - } - } - } - if(!v["QMAKE_ABSOLUTE_SOURCE_PATH"].isEmpty()) { - ProString &asp = v["QMAKE_ABSOLUTE_SOURCE_PATH"].first(); - asp = QDir::fromNativeSeparators(asp.toQString()); - if(asp.isEmpty() || asp == Option::output_dir) //if they're the same, why bother? - v["QMAKE_ABSOLUTE_SOURCE_PATH"].clear(); - } - - //some builtin directories - if(project->isEmpty("PRECOMPILED_DIR") && !project->isEmpty("OBJECTS_DIR")) - v["PRECOMPILED_DIR"] = v["OBJECTS_DIR"]; - static const char * const dirs[] = { "OBJECTS_DIR", "DESTDIR", - "SUBLIBS_DIR", "DLLDESTDIR", - "PRECOMPILED_DIR", "PLIST_DIR", 0 }; - for (int x = 0; dirs[x]; x++) { - const ProKey dkey(dirs[x]); - if (v[dkey].isEmpty()) - continue; - const ProString orig_path = v[dkey].first(); - - ProString &pathRef = v[dkey].first(); - pathRef = fileFixify(pathRef.toQString(), FileFixifyFromOutdir); - -#ifdef Q_OS_WIN - // We don't want to add a separator for DLLDESTDIR on Windows (###why?) - if(!(dirs[x] == "DLLDESTDIR")) -#endif - { - if(!pathRef.endsWith(Option::dir_sep)) - pathRef += Option::dir_sep; - } - - if (noIO() || (project->first("TEMPLATE") == "subdirs")) - continue; - - QString path = project->first(dkey).toQString(); //not to be changed any further - path = fileFixify(path, FileFixifyBackwards); - debug_msg(3, "Fixed output_dir %s (%s) into %s", dirs[x], - orig_path.toLatin1().constData(), path.toLatin1().constData()); - if(!mkdir(path)) - warn_msg(WarnLogic, "%s: Cannot access directory '%s'", dirs[x], - path.toLatin1().constData()); - } - - //out paths from the extra compilers - const ProStringList &quc = project->values("QMAKE_EXTRA_COMPILERS"); - for (ProStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) { - QString tmp_out = project->first(ProKey(*it + ".output")).toQString(); - if(tmp_out.isEmpty()) - continue; - const ProStringList &tmp = project->values(ProKey(*it + ".input")); - for (ProStringList::ConstIterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) { - ProStringList &inputs = project->values((*it2).toKey()); - for (ProStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) { - QString finp = fileFixify((*input).toQString(), FileFixifyFromOutdir); - *input = ProString(finp); - QString path = replaceExtraCompilerVariables(tmp_out, finp, QString(), NoShell); - path = Option::normalizePath(path); - int slash = path.lastIndexOf('/'); - if(slash != -1) { - path = path.left(slash); - // Make out path only if it does not contain makefile variables - if(!path.contains("${")) - if(path != "." && - !mkdir(fileFixify(path, FileFixifyBackwards))) - warn_msg(WarnLogic, "%s: Cannot access directory '%s'", - (*it).toLatin1().constData(), path.toLatin1().constData()); - } - } - } - } - - if(!v["DESTDIR"].isEmpty()) { - QDir d(v["DESTDIR"].first().toQString()); - if (Option::normalizePath(d.absolutePath()) == Option::normalizePath(Option::output_dir)) - v.remove("DESTDIR"); - } -} - -QMakeProject -*MakefileGenerator::projectFile() const -{ - return project; -} - -void -MakefileGenerator::setProjectFile(QMakeProject *p) -{ - if(project) - return; - project = p; - if (project->isActiveConfig("win32")) - target_mode = TARG_WIN_MODE; - else if (project->isActiveConfig("mac")) - target_mode = TARG_MAC_MODE; - else - target_mode = TARG_UNIX_MODE; - init(); - findLibraries(); - if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE && - project->isActiveConfig("link_prl")) //load up prl's' - processPrlFiles(); -} - -ProStringList -MakefileGenerator::findFilesInVPATH(ProStringList l, uchar flags, const QString &vpath_var) -{ - ProStringList vpath; - const ProValueMap &v = project->variables(); - for(int val_it = 0; val_it < l.count(); ) { - bool remove_file = false; - ProString &val = l[val_it]; - if(!val.isEmpty()) { - QString qval = val.toQString(); - QString file = fixEnvVariables(qval); - if (file.isEmpty()) { - ++val_it; - continue; - } - if(!(flags & VPATH_NoFixify)) - file = fileFixify(file, FileFixifyBackwards); - - if(exists(file)) { - ++val_it; - continue; - } - bool found = false; - if (QDir::isRelativePath(qval)) { - if(vpath.isEmpty()) { - if(!vpath_var.isEmpty()) - vpath = v[ProKey(vpath_var)]; - vpath += v["VPATH"] + v["QMAKE_ABSOLUTE_SOURCE_PATH"]; - if(Option::output_dir != qmake_getpwd()) - vpath << Option::output_dir; - } - for (ProStringList::Iterator vpath_it = vpath.begin(); - vpath_it != vpath.end(); ++vpath_it) { - QString real_dir = Option::normalizePath((*vpath_it).toQString()); - if (exists(real_dir + '/' + val)) { - ProString dir = (*vpath_it); - if(!dir.endsWith(Option::dir_sep)) - dir += Option::dir_sep; - val = dir + val; - if(!(flags & VPATH_NoFixify)) - val = fileFixify(val.toQString()); - found = true; - debug_msg(1, "Found file through vpath %s -> %s", - file.toLatin1().constData(), val.toLatin1().constData()); - break; - } - } - } - if(!found) { - QString dir, regex = val.toQString(), real_dir; - if(regex.lastIndexOf(Option::dir_sep) != -1) { - dir = regex.left(regex.lastIndexOf(Option::dir_sep) + 1); - real_dir = dir; - if(!(flags & VPATH_NoFixify)) - real_dir = fileFixify(real_dir, FileFixifyBackwards) + '/'; - regex.remove(0, dir.length()); - } - if(real_dir.isEmpty() || exists(real_dir)) { - QStringList files = QDir(real_dir).entryList(QStringList(regex), - QDir::NoDotAndDotDot | QDir::AllEntries); - if(files.isEmpty()) { - debug_msg(1, "%s:%d Failure to find %s in vpath (%s)", - __FILE__, __LINE__, - val.toLatin1().constData(), vpath.join("::").toLatin1().constData()); - if(flags & VPATH_RemoveMissingFiles) - remove_file = true; - else if(flags & VPATH_WarnMissingFiles) - warn_msg(WarnLogic, "Failure to find: %s", val.toLatin1().constData()); - } else { - l.removeAt(val_it); - QString a; - for(int i = (int)files.count()-1; i >= 0; i--) { - a = real_dir + files[i]; - if(!(flags & VPATH_NoFixify)) - a = fileFixify(a); - l.insert(val_it, a); - } - } - } else { - debug_msg(1, "%s:%d Cannot match %s%s, as %s does not exist.", - __FILE__, __LINE__, real_dir.toLatin1().constData(), - regex.toLatin1().constData(), real_dir.toLatin1().constData()); - if(flags & VPATH_RemoveMissingFiles) - remove_file = true; - else if(flags & VPATH_WarnMissingFiles) - warn_msg(WarnLogic, "Failure to find: %s", val.toLatin1().constData()); - } - } - } - if(remove_file) - l.removeAt(val_it); - else - ++val_it; - } - return l; -} - -void -MakefileGenerator::initCompiler(const MakefileGenerator::Compiler &comp) -{ - ProValueMap &v = project->variables(); - ProStringList &l = v[ProKey(comp.variable_in)]; - // find all the relevant file inputs - if(!init_compiler_already.contains(comp.variable_in)) { - init_compiler_already.insert(comp.variable_in, true); - if(!noIO()) - l = findFilesInVPATH(l, (comp.flags & Compiler::CompilerRemoveNoExist) ? - VPATH_RemoveMissingFiles : VPATH_WarnMissingFiles, "VPATH_" + comp.variable_in); - } -} - -void -MakefileGenerator::init() -{ - verifyCompilers(); - initOutPaths(); - - ProValueMap &v = project->variables(); - - if (v["TARGET"].isEmpty()) - warn_msg(WarnLogic, "TARGET is empty"); - - makedir = v["QMAKE_MKDIR_CMD"].join(' '); - chkexists = v["QMAKE_CHK_EXISTS"].join(' '); - if (makedir.isEmpty()) { // Backwards compat with Qt < 5.0.2 specs - if (isWindowsShell()) { - makedir = "if not exist %1 mkdir %1 & if not exist %1 exit 1"; - chkexists = "if not exist %1"; - } else { - makedir = "test -d %1 || mkdir -p %1"; - chkexists = "test -e %1 ||"; - } - } - - if (v["QMAKE_CC_O_FLAG"].isEmpty()) - v["QMAKE_CC_O_FLAG"].append("-o "); - - if (v["QMAKE_LINK_O_FLAG"].isEmpty()) - v["QMAKE_LINK_O_FLAG"].append("-o "); - - setSystemIncludes(v["QMAKE_DEFAULT_INCDIRS"]); - - ProStringList &incs = project->values("INCLUDEPATH"); - if (!project->isActiveConfig("no_include_pwd")) { - if (Option::output_dir != qmake_getpwd()) { - // Pretend that the build dir is the source dir for #include purposes, - // consistently with the "transparent shadow builds" strategy. This is - // also consistent with #include "foo.h" falling back to #include - // behavior if it doesn't find the file in the source dir. - incs.prepend(Option::output_dir); - } - // This makes #include work if the header lives in the source dir. - // The benefit of that is questionable, as generally the user should use the - // correct include style, and extra compilers that put stuff in the source dir - // should add the dir themselves. - // More importantly, it makes #include "foo.h" work with MSVC when shadow-building, - // as this compiler looks files up relative to %CD%, not the source file's parent. - incs.prepend(qmake_getpwd()); - } - incs.append(project->specDir()); - - const char * const cacheKeys[] = { "_QMAKE_STASH_", "_QMAKE_SUPER_CACHE_", 0 }; - for (int i = 0; cacheKeys[i]; ++i) { - if (v[cacheKeys[i]].isEmpty()) - continue; - const ProString &file = v[cacheKeys[i]].first(); - if (file.isEmpty()) - continue; - - QFileInfo fi(fileInfo(file.toQString())); - - // If the file lives in the output dir we treat it as 'owned' by - // the current project, so it should be distcleaned by it as well. - if (fi.path() == Option::output_dir) - v["QMAKE_DISTCLEAN"].append(fi.fileName()); - } - - ProStringList &quc = v["QMAKE_EXTRA_COMPILERS"]; - - //make sure the COMPILERS are in the correct input/output chain order - for(int comp_out = 0, jump_count = 0; comp_out < quc.size(); ++comp_out) { - continue_compiler_chain: - if(jump_count > quc.size()) //just to avoid an infinite loop here - break; - const ProKey vokey(quc.at(comp_out) + ".variable_out"); - if (v.contains(vokey)) { - const ProStringList &outputs = v.value(vokey); - for(int out = 0; out < outputs.size(); ++out) { - for(int comp_in = 0; comp_in < quc.size(); ++comp_in) { - if(comp_in == comp_out) - continue; - const ProKey ikey(quc.at(comp_in) + ".input"); - if (v.contains(ikey)) { - const ProStringList &inputs = v.value(ikey); - for(int in = 0; in < inputs.size(); ++in) { - if(inputs.at(in) == outputs.at(out) && comp_out > comp_in) { - ++jump_count; - //move comp_out to comp_in and continue the compiler chain - // quc.move(comp_out, comp_in); - quc.insert(comp_in, quc.value(comp_out)); - // comp_out > comp_in, so the insertion did move everything up - quc.remove(comp_out + 1); - comp_out = comp_in; - goto continue_compiler_chain; - } - } - } - } - } - } - } - - if(!project->isEmpty("QMAKE_SUBSTITUTES")) { - const ProStringList &subs = v["QMAKE_SUBSTITUTES"]; - for(int i = 0; i < subs.size(); ++i) { - QString sub = subs.at(i).toQString(); - QString inn = sub + ".input", outn = sub + ".output"; - const ProKey innkey(inn), outnkey(outn); - if (v.contains(innkey) || v.contains(outnkey)) { - if (!v.contains(innkey) || !v.contains(outnkey)) { - warn_msg(WarnLogic, "Substitute '%s' has only one of .input and .output", - sub.toLatin1().constData()); - continue; - } - const ProStringList &tinn = v[innkey], &toutn = v[outnkey]; - if (tinn.length() != 1) { - warn_msg(WarnLogic, "Substitute '%s.input' does not have exactly one value", - sub.toLatin1().constData()); - continue; - } - if (toutn.length() != 1) { - warn_msg(WarnLogic, "Substitute '%s.output' does not have exactly one value", - sub.toLatin1().constData()); - continue; - } - inn = fileFixify(tinn.first().toQString(), FileFixifyToIndir); - outn = fileFixify(toutn.first().toQString(), FileFixifyBackwards); - } else { - inn = fileFixify(sub, FileFixifyToIndir); - if (!QFile::exists(inn)) { - // random insanity for backwards compat: .in file specified with absolute out dir - inn = fileFixify(sub); - } - if(!inn.endsWith(".in")) { - warn_msg(WarnLogic, "Substitute '%s' does not end with '.in'", - inn.toLatin1().constData()); - continue; - } - outn = fileFixify(inn.left(inn.length() - 3), FileFixifyBackwards); - } - - const ProKey confign(sub + ".CONFIG"); - bool verbatim = false; - if (v.contains(confign)) - verbatim = v[confign].contains(QLatin1String("verbatim")); - - QFile in(inn); - if (in.open(QFile::ReadOnly)) { - QByteArray contentBytes; - if (verbatim) { - contentBytes = in.readAll(); - } else { - QString contents; - QStack state; - enum { IN_CONDITION, MET_CONDITION, PENDING_CONDITION }; - for (int count = 1; !in.atEnd(); ++count) { - QString line = QString::fromUtf8(in.readLine()); - if (line.startsWith("!!IF ")) { - if (state.isEmpty() || state.top() == IN_CONDITION) { - QString test = line.mid(5, line.length()-(5+1)); - if (project->test(test, inn, count)) - state.push(IN_CONDITION); - else - state.push(PENDING_CONDITION); - } else { - state.push(MET_CONDITION); - } - } else if (line.startsWith("!!ELIF ")) { - if (state.isEmpty()) { - warn_msg(WarnLogic, "(%s:%d): Unexpected else condition", - in.fileName().toLatin1().constData(), count); - } else if (state.top() == PENDING_CONDITION) { - QString test = line.mid(7, line.length()-(7+1)); - if (project->test(test, inn, count)) { - state.pop(); - state.push(IN_CONDITION); - } - } else if (state.top() == IN_CONDITION) { - state.pop(); - state.push(MET_CONDITION); - } - } else if (line.startsWith("!!ELSE")) { - if (state.isEmpty()) { - warn_msg(WarnLogic, "(%s:%d): Unexpected else condition", - in.fileName().toLatin1().constData(), count); - } else if (state.top() == PENDING_CONDITION) { - state.pop(); - state.push(IN_CONDITION); - } else if (state.top() == IN_CONDITION) { - state.pop(); - state.push(MET_CONDITION); - } - } else if (line.startsWith("!!ENDIF")) { - if (state.isEmpty()) - warn_msg(WarnLogic, "(%s:%d): Unexpected endif", - in.fileName().toLatin1().constData(), count); - else - state.pop(); - } else if (state.isEmpty() || state.top() == IN_CONDITION) { - contents += project->expand(line, in.fileName(), count); - } - } - contentBytes = contents.toUtf8(); - } - QFile out(outn); - QFileInfo outfi(out); - if (out.exists() && out.open(QFile::ReadOnly)) { - QByteArray old = out.readAll(); - if (contentBytes == old) { - v["QMAKE_INTERNAL_INCLUDED_FILES"].append(in.fileName()); - v["QMAKE_DISTCLEAN"].append(outfi.absoluteFilePath()); - continue; - } - out.close(); - if(!out.remove()) { - warn_msg(WarnLogic, "Cannot clear substitute '%s'", - out.fileName().toLatin1().constData()); - continue; - } - } - mkdir(outfi.absolutePath()); - if(out.open(QFile::WriteOnly)) { - v["QMAKE_INTERNAL_INCLUDED_FILES"].append(in.fileName()); - v["QMAKE_DISTCLEAN"].append(outfi.absoluteFilePath()); - out.write(contentBytes); - } else { - warn_msg(WarnLogic, "Cannot open substitute for output '%s'", - out.fileName().toLatin1().constData()); - } - } else { - warn_msg(WarnLogic, "Cannot open substitute for input '%s'", - in.fileName().toLatin1().constData()); - } - } - } - - int x; - - //build up a list of compilers - QList compilers; - { - const char *builtins[] = { "OBJECTS", "SOURCES", "PRECOMPILED_HEADER", 0 }; - for(x = 0; builtins[x]; ++x) { - Compiler compiler; - compiler.variable_in = builtins[x]; - compiler.flags = Compiler::CompilerBuiltin; - compiler.type = QMakeSourceFileInfo::TYPE_C; - if(!strcmp(builtins[x], "OBJECTS")) - compiler.flags |= Compiler::CompilerNoCheckDeps; - compilers.append(compiler); - } - for (ProStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) { - const ProStringList &inputs = v[ProKey(*it + ".input")]; - for(x = 0; x < inputs.size(); ++x) { - Compiler compiler; - compiler.variable_in = inputs.at(x).toQString(); - compiler.flags = Compiler::CompilerNoFlags; - const ProStringList &config = v[ProKey(*it + ".CONFIG")]; - if (config.indexOf("ignore_no_exist") != -1) - compiler.flags |= Compiler::CompilerRemoveNoExist; - if (config.indexOf("no_dependencies") != -1) - compiler.flags |= Compiler::CompilerNoCheckDeps; - if (config.indexOf("add_inputs_as_makefile_deps") != -1) - compiler.flags |= Compiler::CompilerAddInputsAsMakefileDeps; - - const ProKey dkey(*it + ".dependency_type"); - ProString dep_type; - if (!project->isEmpty(dkey)) - dep_type = project->first(dkey); - if (dep_type.isEmpty()) - compiler.type = QMakeSourceFileInfo::TYPE_UNKNOWN; - else if(dep_type == "TYPE_UI") - compiler.type = QMakeSourceFileInfo::TYPE_UI; - else - compiler.type = QMakeSourceFileInfo::TYPE_C; - compilers.append(compiler); - } - } - } - { //do the path fixifying - ProStringList paths; - for(x = 0; x < compilers.count(); ++x) { - if(!paths.contains(compilers.at(x).variable_in)) - paths << compilers.at(x).variable_in; - } - paths << "INCLUDEPATH" << "QMAKE_INTERNAL_INCLUDED_FILES" << "PRECOMPILED_HEADER"; - for(int y = 0; y < paths.count(); y++) { - ProStringList &l = v[paths[y].toKey()]; - for (ProStringList::Iterator it = l.begin(); it != l.end(); ++it) { - if((*it).isEmpty()) - continue; - QString fn = (*it).toQString(); - if (exists(fn)) - (*it) = fileFixify(fn); - } - } - } - - if(noIO() || !doDepends() || project->isActiveConfig("GNUmake")) - QMakeSourceFileInfo::setDependencyMode(QMakeSourceFileInfo::NonRecursive); - for(x = 0; x < compilers.count(); ++x) - initCompiler(compilers.at(x)); - - //merge actual compiler outputs into their variable_out. This is done last so that - //files are already properly fixified. - for (ProStringList::Iterator it = quc.begin(); it != quc.end(); ++it) { - const ProKey ikey(*it + ".input"); - const ProKey vokey(*it + ".variable_out"); - const ProStringList &config = project->values(ProKey(*it + ".CONFIG")); - const ProString &tmp_out = project->first(ProKey(*it + ".output")); - if(tmp_out.isEmpty()) - continue; - if (config.indexOf("combine") != -1) { - const ProStringList &compilerInputs = project->values(ikey); - // Don't generate compiler output if it doesn't have input. - if (compilerInputs.isEmpty() || project->values(compilerInputs.first().toKey()).isEmpty()) - continue; - if(tmp_out.indexOf("$") == -1) { - if(!verifyExtraCompiler((*it), QString())) //verify - continue; - QString out = fileFixify(tmp_out.toQString(), FileFixifyFromOutdir); - bool pre_dep = (config.indexOf("target_predeps") != -1); - if (v.contains(vokey)) { - const ProStringList &var_out = v.value(vokey); - for(int i = 0; i < var_out.size(); ++i) { - ProKey v = var_out.at(i).toKey(); - if(v == QLatin1String("SOURCES")) - v = "GENERATED_SOURCES"; - else if(v == QLatin1String("OBJECTS")) - pre_dep = false; - ProStringList &list = project->values(v); - if(!list.contains(out)) - list.append(out); - } - } else if (config.indexOf("no_link") == -1) { - ProStringList &list = project->values("OBJECTS"); - pre_dep = false; - if(!list.contains(out)) - list.append(out); - } else { - ProStringList &list = project->values("UNUSED_SOURCES"); - if(!list.contains(out)) - list.append(out); - } - if(pre_dep) { - ProStringList &list = project->values("PRE_TARGETDEPS"); - if(!list.contains(out)) - list.append(out); - } - } - } else { - const ProStringList &tmp = project->values(ikey); - for (ProStringList::ConstIterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) { - const ProStringList &inputs = project->values((*it2).toKey()); - for (ProStringList::ConstIterator input = inputs.constBegin(); input != inputs.constEnd(); ++input) { - if((*input).isEmpty()) - continue; - QString inpf = (*input).toQString(); - if (!verifyExtraCompiler((*it).toQString(), inpf)) //verify - continue; - QString out = replaceExtraCompilerVariables(tmp_out.toQString(), inpf, QString(), NoShell); - out = fileFixify(out, FileFixifyFromOutdir); - bool pre_dep = (config.indexOf("target_predeps") != -1); - if (v.contains(vokey)) { - const ProStringList &var_out = project->values(vokey); - for(int i = 0; i < var_out.size(); ++i) { - ProKey v = var_out.at(i).toKey(); - if(v == QLatin1String("SOURCES")) - v = "GENERATED_SOURCES"; - else if(v == QLatin1String("OBJECTS")) - pre_dep = false; - ProStringList &list = project->values(v); - if(!list.contains(out)) - list.append(out); - } - } else if (config.indexOf("no_link") == -1) { - pre_dep = false; - ProStringList &list = project->values("OBJECTS"); - if(!list.contains(out)) - list.append(out); - } else { - ProStringList &list = project->values("UNUSED_SOURCES"); - if(!list.contains(out)) - list.append(out); - } - if(pre_dep) { - ProStringList &list = project->values("PRE_TARGETDEPS"); - if(!list.contains(out)) - list.append(out); - } - } - } - } - } - - //handle dependencies - depHeuristicsCache.clear(); - if(!noIO()) { - // dependency paths - ProStringList incDirs = v["DEPENDPATH"] + v["QMAKE_ABSOLUTE_SOURCE_PATH"]; - if(project->isActiveConfig("depend_includepath")) - incDirs += v["INCLUDEPATH"]; - QList deplist; - for (ProStringList::Iterator it = incDirs.begin(); it != incDirs.end(); ++it) - deplist.append(QMakeLocalFileName((*it).toQString())); - QMakeSourceFileInfo::setDependencyPaths(deplist); - debug_msg(1, "Dependency Directories: %s", incDirs.join(" :: ").toLatin1().constData()); - //cache info - if(project->isActiveConfig("qmake_cache")) { - QString cache_file; - if(!project->isEmpty("QMAKE_INTERNAL_CACHE_FILE")) { - cache_file = QDir::fromNativeSeparators(project->first("QMAKE_INTERNAL_CACHE_FILE").toQString()); - } else { - cache_file = ".qmake.internal.cache"; - if(project->isActiveConfig("build_pass")) - cache_file += ".BUILD." + project->first("BUILD_PASS"); - } - if(cache_file.indexOf('/') == -1) - cache_file.prepend(Option::output_dir + '/'); - QMakeSourceFileInfo::setCacheFile(cache_file); - } - - //add to dependency engine - for(x = 0; x < compilers.count(); ++x) { - const MakefileGenerator::Compiler &comp = compilers.at(x); - if(!(comp.flags & Compiler::CompilerNoCheckDeps)) { - const ProKey ikey(comp.variable_in); - addSourceFiles(v[ikey], QMakeSourceFileInfo::SEEK_DEPS, - (QMakeSourceFileInfo::SourceFileType)comp.type); - - if (comp.flags & Compiler::CompilerAddInputsAsMakefileDeps) { - ProStringList &l = v[ikey]; - for (int i=0; i < l.size(); ++i) { - if(v["QMAKE_INTERNAL_INCLUDED_FILES"].indexOf(l.at(i)) == -1) - v["QMAKE_INTERNAL_INCLUDED_FILES"].append(l.at(i)); - } - } - } - } - } - - processSources(); //remove anything in SOURCES which is included (thus it need not be linked in) - - //all sources and generated sources must be turned into objects at some point (the one builtin compiler) - v["OBJECTS"] += createObjectList(v["SOURCES"]) + createObjectList(v["GENERATED_SOURCES"]); - - //Translation files - if(!project->isEmpty("TRANSLATIONS")) { - ProStringList &trf = project->values("TRANSLATIONS"); - for (ProStringList::Iterator it = trf.begin(); it != trf.end(); ++it) - (*it) = Option::fixPathToTargetOS((*it).toQString()); - } - - //fix up the target deps - static const char * const fixpaths[] = { "PRE_TARGETDEPS", "POST_TARGETDEPS", 0 }; - for (int path = 0; fixpaths[path]; path++) { - ProStringList &l = v[fixpaths[path]]; - for (ProStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it) { - if(!(*val_it).isEmpty()) - (*val_it) = Option::fixPathToTargetOS((*val_it).toQString(), false, false); - } - } - - //extra depends - if(!project->isEmpty("DEPENDS")) { - ProStringList &l = v["DEPENDS"]; - for (ProStringList::Iterator it = l.begin(); it != l.end(); ++it) { - const ProStringList &files = v[ProKey(*it + ".file")] + v[ProKey(*it + ".files")]; //why do I support such evil things? - for (ProStringList::ConstIterator file_it = files.begin(); file_it != files.end(); ++file_it) { - QStringList &out_deps = findDependencies((*file_it).toQString()); - const ProStringList &in_deps = v[ProKey(*it + ".depends")]; //even more evilness.. - for (ProStringList::ConstIterator dep_it = in_deps.begin(); dep_it != in_deps.end(); ++dep_it) { - QString dep = (*dep_it).toQString(); - if (exists(dep)) { - out_deps.append(dep); - } else { - QString dir, regex = Option::normalizePath(dep); - if (regex.lastIndexOf('/') != -1) { - dir = regex.left(regex.lastIndexOf('/') + 1); - regex.remove(0, dir.length()); - } - QStringList files = QDir(dir).entryList(QStringList(regex)); - if(files.isEmpty()) { - warn_msg(WarnLogic, "Dependency for [%s]: Not found %s", (*file_it).toLatin1().constData(), - dep.toLatin1().constData()); - } else { - for(int i = 0; i < files.count(); i++) - out_deps.append(dir + files[i]); - } - } - } - } - } - } - - // escape qmake command - project->values("QMAKE_QMAKE") = - ProStringList(escapeFilePath(Option::fixPathToTargetOS(Option::globals->qmake_abslocation, false))); -} - -bool -MakefileGenerator::processPrlFile(QString &file) -{ - bool ret = false, try_replace_file=false; - QString meta_file, orig_file = file; - if(QMakeMetaInfo::libExists(file)) { - try_replace_file = true; - meta_file = file; - file = ""; - } else { - QString tmp = file; - int ext = tmp.lastIndexOf('.'); - if(ext != -1) - tmp = tmp.left(ext); - meta_file = tmp; - } -// meta_file = fileFixify(meta_file); - QString real_meta_file = Option::normalizePath(meta_file); - if(!meta_file.isEmpty()) { - QString f = fileFixify(real_meta_file, FileFixifyBackwards); - if(QMakeMetaInfo::libExists(f)) { - QMakeMetaInfo libinfo(project); - debug_msg(1, "Processing PRL file: %s", real_meta_file.toLatin1().constData()); - if(!libinfo.readLib(f)) { - fprintf(stderr, "Error processing meta file: %s\n", real_meta_file.toLatin1().constData()); - } else if(project->isActiveConfig("no_read_prl_" + libinfo.type().toLower())) { - debug_msg(2, "Ignored meta file %s [%s]", real_meta_file.toLatin1().constData(), libinfo.type().toLatin1().constData()); - } else { - ret = true; - project->values("QMAKE_CURRENT_PRL_LIBS") = libinfo.values("QMAKE_PRL_LIBS"); - ProStringList &defs = project->values("DEFINES"); - const ProStringList &prl_defs = project->values("PRL_EXPORT_DEFINES"); - foreach (const ProString &def, libinfo.values("QMAKE_PRL_DEFINES")) - if (!defs.contains(def) && prl_defs.contains(def)) - defs.append(def); - if(try_replace_file && !libinfo.isEmpty("QMAKE_PRL_TARGET")) { - QString dir; - int slsh = real_meta_file.lastIndexOf('/'); - if(slsh != -1) - dir = real_meta_file.left(slsh+1); - file = libinfo.first("QMAKE_PRL_TARGET").toQString(); - if(QDir::isRelativePath(file)) - file.prepend(dir); - } - } - } - if(ret) { - QString mf = QMakeMetaInfo::findLib(meta_file); - if(project->values("QMAKE_PRL_INTERNAL_FILES").indexOf(mf) == -1) - project->values("QMAKE_PRL_INTERNAL_FILES").append(mf); - if(project->values("QMAKE_INTERNAL_INCLUDED_FILES").indexOf(mf) == -1) - project->values("QMAKE_INTERNAL_INCLUDED_FILES").append(mf); - } - } - if(try_replace_file && file.isEmpty()) { -#if 0 - warn_msg(WarnLogic, "Found prl [%s] file with no target [%s]!", meta_file.toLatin1().constData(), - orig_file.toLatin1().constData()); -#endif - file = orig_file; - } - return ret; -} - -void -MakefileGenerator::filterIncludedFiles(const char *var) -{ - ProStringList &inputs = project->values(var); - for (ProStringList::Iterator input = inputs.begin(); input != inputs.end(); ) { - if (QMakeSourceFileInfo::included((*input).toQString()) > 0) - input = inputs.erase(input); - else - ++input; - } -} - -void -MakefileGenerator::processPrlFiles() -{ - qFatal("MakefileGenerator::processPrlFiles() called!"); -} - -static QString -qv(const ProString &val) -{ - return ' ' + QMakeEvaluator::quoteValue(val); -} - -static QString -qv(const ProStringList &val) -{ - QString ret; - foreach (const ProString &v, val) - ret += qv(v); - return ret; -} - -void -MakefileGenerator::writePrlFile(QTextStream &t) -{ - ProString target = project->first("TARGET"); - int slsh = target.lastIndexOf(Option::dir_sep); - if(slsh != -1) - target.chopFront(slsh + 1); - QString bdir = Option::output_dir; - if(bdir.isEmpty()) - bdir = qmake_getpwd(); - t << "QMAKE_PRL_BUILD_DIR =" << qv(bdir) << endl; - - t << "QMAKE_PRO_INPUT =" << qv(project->projectFile().section('/', -1)) << endl; - - if(!project->isEmpty("QMAKE_ABSOLUTE_SOURCE_PATH")) - t << "QMAKE_PRL_SOURCE_DIR =" << qv(project->first("QMAKE_ABSOLUTE_SOURCE_PATH")) << endl; - t << "QMAKE_PRL_TARGET =" << qv(target) << endl; - if(!project->isEmpty("PRL_EXPORT_DEFINES")) - t << "QMAKE_PRL_DEFINES =" << qv(project->values("PRL_EXPORT_DEFINES")) << endl; - if(!project->isEmpty("PRL_EXPORT_CFLAGS")) - t << "QMAKE_PRL_CFLAGS =" << qv(project->values("PRL_EXPORT_CFLAGS")) << endl; - if(!project->isEmpty("PRL_EXPORT_CXXFLAGS")) - t << "QMAKE_PRL_CXXFLAGS =" << qv(project->values("PRL_EXPORT_CXXFLAGS")) << endl; - if(!project->isEmpty("CONFIG")) - t << "QMAKE_PRL_CONFIG =" << qv(project->values("CONFIG")) << endl; - if(!project->isEmpty("TARGET_VERSION_EXT")) - t << "QMAKE_PRL_VERSION = " << project->first("TARGET_VERSION_EXT") << endl; - else if(!project->isEmpty("VERSION")) - t << "QMAKE_PRL_VERSION = " << project->first("VERSION") << endl; - if(project->isActiveConfig("staticlib") || project->isActiveConfig("explicitlib")) { - ProStringList libs; - if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS")) - libs = project->values("QMAKE_INTERNAL_PRL_LIBS"); - else - libs << "QMAKE_LIBS"; //obvious one - if(project->isActiveConfig("staticlib")) - libs << "QMAKE_LIBS_PRIVATE"; - t << "QMAKE_PRL_LIBS ="; - for (ProStringList::Iterator it = libs.begin(); it != libs.end(); ++it) - t << qv(project->values((*it).toKey())); - t << endl; - } -} - -bool -MakefileGenerator::writeProjectMakefile() -{ - QTextStream t(&Option::output); - - //header - writeHeader(t); - - QList targets; - { - ProStringList builds = project->values("BUILDS"); - for (ProStringList::Iterator it = builds.begin(); it != builds.end(); ++it) { - SubTarget *st = new SubTarget; - targets.append(st); - st->makefile = "$(MAKEFILE)." + (*it); - st->name = (*it).toQString(); - const ProKey tkey(*it + ".target"); - st->target = (project->isEmpty(tkey) ? (*it) : project->first(tkey)).toQString(); - } - } - if(project->isActiveConfig("build_all")) { - t << "first: all\n"; - QList::Iterator it; - - //install - t << "install: "; - for(it = targets.begin(); it != targets.end(); ++it) - t << (*it)->target << "-install "; - t << endl; - - //uninstall - t << "uninstall: "; - for(it = targets.begin(); it != targets.end(); ++it) - t << (*it)->target << "-uninstall "; - t << endl; - } else { - t << "first: " << targets.first()->target << endl - << "install: " << targets.first()->target << "-install\n" - << "uninstall: " << targets.first()->target << "-uninstall\n"; - } - - writeSubTargets(t, targets, SubTargetsNoFlags); - if(!project->isActiveConfig("no_autoqmake")) { - QString mkf = escapeDependencyPath(fileFixify(Option::output.fileName())); - for(QList::Iterator it = targets.begin(); it != targets.end(); ++it) - t << escapeDependencyPath((*it)->makefile) << ": " << mkf << endl; - } - qDeleteAll(targets); - return true; -} - -bool -MakefileGenerator::write() -{ - if(!project) - return false; - writePrlFile(); - if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE || //write makefile - Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT) { - QTextStream t(&Option::output); - if(!writeMakefile(t)) { -#if 1 - warn_msg(WarnLogic, "Unable to generate output for: %s [TEMPLATE %s]", - Option::output.fileName().toLatin1().constData(), - project->first("TEMPLATE").toLatin1().constData()); - if(Option::output.exists()) - Option::output.remove(); -#endif - } - } - return true; -} - -QString -MakefileGenerator::prlFileName(bool fixify) -{ - QString ret = project->first("TARGET_PRL").toQString(); - if(ret.isEmpty()) - ret = project->first("TARGET").toQString(); - int slsh = ret.lastIndexOf(Option::dir_sep); - if(slsh != -1) - ret.remove(0, slsh); - if(!ret.endsWith(Option::prl_ext)) { - int dot = ret.indexOf('.'); - if(dot != -1) - ret.truncate(dot); - ret += Option::prl_ext; - } - if(!project->isEmpty("QMAKE_BUNDLE")) - ret.prepend(project->first("QMAKE_BUNDLE") + Option::dir_sep); - if(fixify) { - if(!project->isEmpty("DESTDIR")) - ret.prepend(project->first("DESTDIR").toQString()); - ret = fileFixify(ret, FileFixifyBackwards); - } - return ret; -} - -void -MakefileGenerator::writePrlFile() -{ - if((Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE || - Option::qmake_mode == Option::QMAKE_GENERATE_PRL) - && project->values("QMAKE_FAILED_REQUIREMENTS").isEmpty() - && project->isActiveConfig("create_prl") - && (project->first("TEMPLATE") == "lib" - || project->first("TEMPLATE") == "vclib") - && (!project->isActiveConfig("plugin") || project->isActiveConfig("static"))) { //write prl file - QString local_prl = prlFileName(); - QString prl = fileFixify(local_prl); - mkdir(fileInfo(local_prl).path()); - QFile ft(local_prl); - if(ft.open(QIODevice::WriteOnly)) { - project->values("ALL_DEPS").append(prl); - project->values("QMAKE_INTERNAL_PRL_FILE").append(prl); - project->values("QMAKE_DISTCLEAN").append(prl); - QTextStream t(&ft); - writePrlFile(t); - } - } -} - -void -MakefileGenerator::writeObj(QTextStream &t, const char *src) -{ - const ProStringList &srcl = project->values(src); - const ProStringList objl = createObjectList(srcl); - - ProStringList::ConstIterator oit = objl.begin(); - ProStringList::ConstIterator sit = srcl.begin(); - QString stringSrc("$src"); - QString stringObj("$obj"); - for(;sit != srcl.end() && oit != objl.end(); ++oit, ++sit) { - if((*sit).isEmpty()) - continue; - - QString srcf = (*sit).toQString(); - QString dstf = (*oit).toQString(); - t << escapeDependencyPath(dstf) << ": " << escapeDependencyPath(srcf) - << " " << escapeDependencyPaths(findDependencies(srcf)).join(" \\\n\t\t"); - - ProKey comp; - for(QStringList::Iterator cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) { - if((*sit).endsWith((*cppit))) { - comp = "QMAKE_RUN_CXX"; - break; - } - } - if (comp.isEmpty()) - comp = "QMAKE_RUN_CC"; - if (!project->isEmpty(comp)) { - QString p = var(comp); - p.replace(stringSrc, escapeFilePath(srcf)); - p.replace(stringObj, escapeFilePath(dstf)); - t << "\n\t" << p; - } - t << endl << endl; - } -} - -QString -MakefileGenerator::filePrefixRoot(const QString &root, const QString &path) -{ - QString ret(path); - if(path.length() > 2 && path[1] == ':') //c:\foo - ret.insert(2, root); - else - ret.prepend(root); - while (ret.endsWith('\\')) - ret.chop(1); - return ret; -} - -void -MakefileGenerator::writeInstalls(QTextStream &t, bool noBuild) -{ - QString rm_dir_contents("-$(DEL_FILE)"); - if (!isWindowsShell()) //ick - rm_dir_contents = "-$(DEL_FILE) -r"; - - QString all_installs, all_uninstalls; - QSet made_dirs, removed_dirs; - const ProStringList &l = project->values("INSTALLS"); - for (ProStringList::ConstIterator it = l.begin(); it != l.end(); ++it) { - const ProKey pvar(*it + ".path"); - const ProStringList &installConfigValues = project->values(ProKey(*it + ".CONFIG")); - if (installConfigValues.indexOf("no_path") == -1 && - installConfigValues.indexOf("dummy_install") == -1 && - project->values(pvar).isEmpty()) { - warn_msg(WarnLogic, "%s is not defined: install target not created\n", pvar.toLatin1().constData()); - continue; - } - - bool do_default = true; - const QString root = "$(INSTALL_ROOT)"; - QString dst; - if (installConfigValues.indexOf("no_path") == -1 && - installConfigValues.indexOf("dummy_install") == -1) { - dst = fileFixify(project->first(pvar).toQString(), FileFixifyAbsolute, false); - if(!dst.endsWith(Option::dir_sep)) - dst += Option::dir_sep; - } - - QStringList tmp, inst, uninst; - //other - ProStringList tmp2 = project->values(ProKey(*it + ".extra")); - if (tmp2.isEmpty()) - tmp2 = project->values(ProKey(*it + ".commands")); //to allow compatible name - if (!tmp2.isEmpty()) { - do_default = false; - inst << tmp2.join(' '); - } - //masks - tmp2 = findFilesInVPATH(project->values(ProKey(*it + ".files")), VPATH_NoFixify); - tmp = fileFixify(tmp2.toQStringList(), FileFixifyAbsolute); - if(!tmp.isEmpty()) { - do_default = false; - QString base_path = project->first(ProKey(*it + ".base")).toQString(); - if (!base_path.isEmpty()) { - base_path = Option::fixPathToTargetOS(base_path, false, true); - if (!base_path.endsWith(Option::dir_sep)) - base_path += Option::dir_sep; - } - for(QStringList::Iterator wild_it = tmp.begin(); wild_it != tmp.end(); ++wild_it) { - QString wild = Option::fixPathToTargetOS((*wild_it), false, false); - QString dirstr = qmake_getpwd(), filestr = wild; - int slsh = filestr.lastIndexOf(Option::dir_sep); - if(slsh != -1) { - dirstr = filestr.left(slsh+1); - filestr.remove(0, slsh+1); - } - if(!dirstr.endsWith(Option::dir_sep)) - dirstr += Option::dir_sep; - QString dst_dir = dst; - if (!base_path.isEmpty()) { - if (!dirstr.startsWith(base_path)) { - warn_msg(WarnLogic, "File %s in install rule %s does not start with base %s", - qPrintable(wild), qPrintable((*it).toQString()), - qPrintable(base_path)); - } else { - QString dir_sfx = dirstr.mid(base_path.length()); - dst_dir += dir_sfx; - if (!dir_sfx.isEmpty() && !made_dirs.contains(dir_sfx)) { - made_dirs.insert(dir_sfx); - QString tmp_dst = fileFixify(dst_dir, FileFixifyAbsolute, false); - tmp_dst.chop(1); - inst << mkdir_p_asstring(filePrefixRoot(root, tmp_dst)); - for (int i = dst.length(); i < dst_dir.length(); i++) { - if (dst_dir.at(i) == Option::dir_sep) { - QString subd = dst_dir.left(i); - if (!removed_dirs.contains(subd)) { - removed_dirs.insert(subd); - tmp_dst = fileFixify(subd, FileFixifyAbsolute, false); - uninst << "-$(DEL_DIR) " - + escapeFilePath(filePrefixRoot(root, tmp_dst)); - } - } - } - } - } - } - bool is_target = (wild == fileFixify(var("TARGET"), FileFixifyAbsolute)); - if(is_target || exists(wild)) { //real file or target - QFileInfo fi(fileInfo(wild)); - QString dst_file = filePrefixRoot(root, dst_dir); - if(fi.isDir() && project->isActiveConfig("copy_dir_files")) { - if(!dst_file.endsWith(Option::dir_sep)) - dst_file += Option::dir_sep; - dst_file += fi.fileName(); - } - QString cmd; - if (fi.isDir()) - cmd = "-$(INSTALL_DIR)"; - else if (is_target || fi.isExecutable()) - cmd = "-$(INSTALL_PROGRAM)"; - else - cmd = "-$(INSTALL_FILE)"; - cmd += " " + escapeFilePath(wild) + " " + escapeFilePath(dst_file); - inst << cmd; - if (!project->isActiveConfig("debug_info") && !project->isActiveConfig("nostrip") && - !fi.isDir() && fi.isExecutable() && !project->isEmpty("QMAKE_STRIP")) - inst << QString("-") + var("QMAKE_STRIP") + " " + - escapeFilePath(filePrefixRoot(root, fileFixify(dst_dir + filestr, FileFixifyAbsolute, false))); - uninst.append(rm_dir_contents + " " + escapeFilePath(filePrefixRoot(root, fileFixify(dst_dir + filestr, FileFixifyAbsolute, false)))); - continue; - } - QString local_dirstr = Option::normalizePath(dirstr); - QStringList files = QDir(local_dirstr).entryList(QStringList(filestr), - QDir::NoDotAndDotDot | QDir::AllEntries); - if (installConfigValues.contains("no_check_exist") && files.isEmpty()) { - QString dst_file = filePrefixRoot(root, dst_dir); - QString cmd; - if (installConfigValues.contains("directory")) { - cmd = QLatin1String("-$(INSTALL_DIR)"); - if (project->isActiveConfig("copy_dir_files")) { - if (!dst_file.endsWith(Option::dir_sep)) - dst_file += Option::dir_sep; - dst_file += filestr; - } - } else if (installConfigValues.contains("executable")) { - cmd = QLatin1String("-$(INSTALL_PROGRAM)"); - } else { - cmd = QLatin1String("-$(INSTALL_FILE)"); - } - cmd += " " + escapeFilePath(wild) + " " + escapeFilePath(dst_file); - inst << cmd; - uninst.append(rm_dir_contents + " " + escapeFilePath(filePrefixRoot(root, fileFixify(dst_dir + filestr, FileFixifyAbsolute, false)))); - } - for(int x = 0; x < files.count(); x++) { - QString file = files[x]; - uninst.append(rm_dir_contents + " " + escapeFilePath(filePrefixRoot(root, fileFixify(dst_dir + file, FileFixifyAbsolute, false)))); - QFileInfo fi(fileInfo(dirstr + file)); - QString dst_file = filePrefixRoot(root, fileFixify(dst_dir, FileFixifyAbsolute, false)); - if(fi.isDir() && project->isActiveConfig("copy_dir_files")) { - if(!dst_file.endsWith(Option::dir_sep)) - dst_file += Option::dir_sep; - dst_file += fi.fileName(); - } - QString cmd = QString(fi.isDir() ? "-$(INSTALL_DIR)" : "-$(INSTALL_FILE)") + " " + - escapeFilePath(dirstr + file) + " " + escapeFilePath(dst_file); - inst << cmd; - if (!project->isActiveConfig("debug_info") && !project->isActiveConfig("nostrip") && - !fi.isDir() && fi.isExecutable() && !project->isEmpty("QMAKE_STRIP")) - inst << QString("-") + var("QMAKE_STRIP") + " " + - escapeFilePath(filePrefixRoot(root, fileFixify(dst_dir + file, FileFixifyAbsolute, false))); - } - } - } - QString target; - //default? - if (do_default) - target = defaultInstall((*it).toQString()); - else - target = inst.join("\n\t"); - QString puninst = project->values(ProKey(*it + ".uninstall")).join(' '); - if (!puninst.isEmpty()) - uninst << puninst; - - if (!target.isEmpty() || installConfigValues.indexOf("dummy_install") != -1) { - if (noBuild || installConfigValues.indexOf("no_build") != -1) - t << "install_" << (*it) << ":"; - else if(project->isActiveConfig("build_all")) - t << "install_" << (*it) << ": all"; - else - t << "install_" << (*it) << ": first"; - const ProStringList &deps = project->values(ProKey(*it + ".depends")); - if(!deps.isEmpty()) { - for (ProStringList::ConstIterator dep_it = deps.begin(); dep_it != deps.end(); ++dep_it) { - QString targ = var(ProKey(*dep_it + ".target")); - if(targ.isEmpty()) - targ = (*dep_it).toQString(); - t << " " << escapeDependencyPath(targ); - } - } - t << " FORCE\n\t"; - const ProStringList &dirs = project->values(pvar); - for (ProStringList::ConstIterator pit = dirs.begin(); pit != dirs.end(); ++pit) { - QString tmp_dst = fileFixify((*pit).toQString(), FileFixifyAbsolute, false); - t << mkdir_p_asstring(filePrefixRoot(root, tmp_dst)) << "\n\t"; - } - t << target << endl << endl; - if(!uninst.isEmpty()) { - t << "uninstall_" << (*it) << ": FORCE"; - for (int i = uninst.size(); --i >= 0; ) - t << "\n\t" << uninst.at(i); - t << "\n\t-$(DEL_DIR) " << escapeFilePath(filePrefixRoot(root, dst)) << " \n\n"; - } - t << endl; - - if (installConfigValues.indexOf("no_default_install") == -1) { - all_installs += QString("install_") + (*it) + " "; - if(!uninst.isEmpty()) - all_uninstalls += "uninstall_" + (*it) + " "; - } - } else { - debug_msg(1, "no definition for install %s: install target not created",(*it).toLatin1().constData()); - } - } - t << "install:" << depVar("INSTALLDEPS") << ' ' << all_installs - << " FORCE\n\nuninstall: " << all_uninstalls << depVar("UNINSTALLDEPS") - << " FORCE\n\n"; -} - -QString -MakefileGenerator::var(const ProKey &var) const -{ - return val(project->values(var)); -} - -QString -MakefileGenerator::fileVar(const ProKey &var) const -{ - return val(escapeFilePaths(project->values(var))); -} - -QString -MakefileGenerator::fileVarList(const ProKey &var) const -{ - return valList(escapeFilePaths(project->values(var))); -} - -QString -MakefileGenerator::depVar(const ProKey &var) const -{ - return val(escapeDependencyPaths(project->values(var))); -} - -QString -MakefileGenerator::val(const ProStringList &varList) const -{ - return valGlue(varList, "", " ", ""); -} - -QString -MakefileGenerator::val(const QStringList &varList) const -{ - return valGlue(varList, "", " ", ""); -} - -QString -MakefileGenerator::varGlue(const ProKey &var, const QString &before, const QString &glue, const QString &after) const -{ - return valGlue(project->values(var), before, glue, after); -} - -QString -MakefileGenerator::fileVarGlue(const ProKey &var, const QString &before, const QString &glue, const QString &after) const -{ - return valGlue(escapeFilePaths(project->values(var)), before, glue, after); -} - -QString -MakefileGenerator::fixFileVarGlue(const ProKey &var, const QString &before, const QString &glue, const QString &after) const -{ - ProStringList varList; - foreach (const ProString &val, project->values(var)) - varList << escapeFilePath(Option::fixPathToTargetOS(val.toQString())); - return valGlue(varList, before, glue, after); -} - -QString -MakefileGenerator::valGlue(const ProStringList &varList, const QString &before, const QString &glue, const QString &after) const -{ - QString ret; - for (ProStringList::ConstIterator it = varList.begin(); it != varList.end(); ++it) { - if (!(*it).isEmpty()) { - if (!ret.isEmpty()) - ret += glue; - ret += (*it).toQString(); - } - } - return ret.isEmpty() ? QString("") : before + ret + after; -} - -QString -MakefileGenerator::valGlue(const QStringList &varList, const QString &before, const QString &glue, const QString &after) const -{ - QString ret; - for(QStringList::ConstIterator it = varList.begin(); it != varList.end(); ++it) { - if(!(*it).isEmpty()) { - if(!ret.isEmpty()) - ret += glue; - ret += (*it); - } - } - return ret.isEmpty() ? QString("") : before + ret + after; -} - - -QString -MakefileGenerator::varList(const ProKey &var) const -{ - return valList(project->values(var)); -} - -QString -MakefileGenerator::valList(const ProStringList &varList) const -{ - return valGlue(varList, "", " \\\n\t\t", ""); -} - -QString -MakefileGenerator::valList(const QStringList &varList) const -{ - return valGlue(varList, "", " \\\n\t\t", ""); -} - -ProStringList -MakefileGenerator::createObjectList(const ProStringList &sources) -{ - ProStringList ret; - QString objdir; - if(!project->values("OBJECTS_DIR").isEmpty()) - objdir = project->first("OBJECTS_DIR").toQString(); - for (ProStringList::ConstIterator it = sources.begin(); it != sources.end(); ++it) { - QString sfn = (*it).toQString(); - QFileInfo fi(fileInfo(Option::normalizePath(sfn))); - QString dir; - if (project->isActiveConfig("object_parallel_to_source")) { - // The source paths are relative to the output dir, but we need source-relative paths - QString sourceRelativePath = fileFixify(sfn, FileFixifyBackwards); - - if (sourceRelativePath.startsWith(".." + Option::dir_sep)) - sourceRelativePath = fileFixify(sourceRelativePath, FileFixifyAbsolute); - - if (QDir::isAbsolutePath(sourceRelativePath)) - sourceRelativePath.remove(0, sourceRelativePath.indexOf(Option::dir_sep) + 1); - - dir = objdir; // We still respect OBJECTS_DIR - - int lastDirSepPosition = sourceRelativePath.lastIndexOf(Option::dir_sep); - if (lastDirSepPosition != -1) - dir += sourceRelativePath.leftRef(lastDirSepPosition + 1); - - if (!noIO()) { - // Ensure that the final output directory of each object exists - QString outRelativePath = fileFixify(dir, FileFixifyBackwards); - if (!mkdir(outRelativePath)) - warn_msg(WarnLogic, "Cannot create directory '%s'", outRelativePath.toLatin1().constData()); - } - } else { - dir = objdir; - } - ret.append(dir + fi.completeBaseName() + Option::obj_ext); - } - return ret; -} - -ReplaceExtraCompilerCacheKey::ReplaceExtraCompilerCacheKey( - const QString &v, const QStringList &i, const QStringList &o, MakefileGenerator::ReplaceFor s) -{ - static QString doubleColon = QLatin1String("::"); - - hash = 0; - pwd = qmake_getpwd(); - var = v; - { - QStringList il = i; - il.sort(); - in = il.join(doubleColon); - } - { - QStringList ol = o; - ol.sort(); - out = ol.join(doubleColon); - } - forShell = s; -} - -bool ReplaceExtraCompilerCacheKey::operator==(const ReplaceExtraCompilerCacheKey &f) const -{ - return (hashCode() == f.hashCode() && - f.forShell == forShell && - f.in == in && - f.out == out && - f.var == var && - f.pwd == pwd); -} - - -QString -MakefileGenerator::replaceExtraCompilerVariables( - const QString &orig_var, const QStringList &in, const QStringList &out, ReplaceFor forShell) -{ - //lazy cache - ReplaceExtraCompilerCacheKey cacheKey(orig_var, in, out, forShell); - QString cacheVal = extraCompilerVariablesCache.value(cacheKey); - if(!cacheVal.isNull()) - return cacheVal; - - //do the work - QString ret = orig_var; - QRegExp reg_var("\\$\\{.*\\}"); - reg_var.setMinimal(true); - for(int rep = 0; (rep = reg_var.indexIn(ret, rep)) != -1; ) { - QStringList val; - const ProString var(ret.mid(rep + 2, reg_var.matchedLength() - 3)); - bool filePath = false; - if(val.isEmpty() && var.startsWith(QLatin1String("QMAKE_VAR_"))) { - const ProKey varname = var.mid(10).toKey(); - val += project->values(varname).toQStringList(); - } - if(val.isEmpty() && var.startsWith(QLatin1String("QMAKE_VAR_FIRST_"))) { - const ProKey varname = var.mid(16).toKey(); - val += project->first(varname).toQString(); - } - - if(val.isEmpty() && !in.isEmpty()) { - if(var.startsWith(QLatin1String("QMAKE_FUNC_FILE_IN_"))) { - filePath = true; - const ProKey funcname = var.mid(19).toKey(); - val += project->expand(funcname, QList() << ProStringList(in)); - } else if(var == QLatin1String("QMAKE_FILE_BASE") || var == QLatin1String("QMAKE_FILE_IN_BASE")) { - //filePath = true; - for(int i = 0; i < in.size(); ++i) { - QFileInfo fi(fileInfo(Option::normalizePath(in.at(i)))); - QString base = fi.completeBaseName(); - if(base.isNull()) - base = fi.fileName(); - val += base; - } - } else if(var == QLatin1String("QMAKE_FILE_EXT")) { - filePath = true; - for(int i = 0; i < in.size(); ++i) { - QFileInfo fi(fileInfo(Option::normalizePath(in.at(i)))); - QString ext; - // Ensure complementarity with QMAKE_FILE_BASE - int baseLen = fi.completeBaseName().length(); - if(baseLen == 0) - ext = fi.fileName(); - else - ext = fi.fileName().remove(0, baseLen); - val += ext; - } - } else if(var == QLatin1String("QMAKE_FILE_PATH") || var == QLatin1String("QMAKE_FILE_IN_PATH")) { - filePath = true; - for(int i = 0; i < in.size(); ++i) - val += fileInfo(Option::normalizePath(in.at(i))).path(); - } else if(var == QLatin1String("QMAKE_FILE_NAME") || var == QLatin1String("QMAKE_FILE_IN")) { - filePath = true; - for(int i = 0; i < in.size(); ++i) - val += fileInfo(Option::normalizePath(in.at(i))).filePath(); - - } - } - if(val.isEmpty() && !out.isEmpty()) { - if(var.startsWith(QLatin1String("QMAKE_FUNC_FILE_OUT_"))) { - filePath = true; - const ProKey funcname = var.mid(20).toKey(); - val += project->expand(funcname, QList() << ProStringList(out)); - } else if(var == QLatin1String("QMAKE_FILE_OUT")) { - filePath = true; - for(int i = 0; i < out.size(); ++i) - val += fileInfo(Option::normalizePath(out.at(i))).filePath(); - } else if(var == QLatin1String("QMAKE_FILE_OUT_BASE")) { - //filePath = true; - for(int i = 0; i < out.size(); ++i) { - QFileInfo fi(fileInfo(Option::normalizePath(out.at(i)))); - QString base = fi.completeBaseName(); - if(base.isNull()) - base = fi.fileName(); - val += base; - } - } - } - if(val.isEmpty() && var.startsWith(QLatin1String("QMAKE_FUNC_"))) { - const ProKey funcname = var.mid(11).toKey(); - val += project->expand(funcname, QList() << ProStringList(in) << ProStringList(out)); - } - - if(!val.isEmpty()) { - QString fullVal; - if (filePath && forShell != NoShell) { - for(int i = 0; i < val.size(); ++i) { - if(!fullVal.isEmpty()) - fullVal += " "; - if (forShell == LocalShell) - fullVal += IoUtils::shellQuote(Option::fixPathToLocalOS(val.at(i), false)); - else - fullVal += escapeFilePath(Option::fixPathToTargetOS(val.at(i), false)); - } - } else { - fullVal = val.join(' '); - } - ret.replace(rep, reg_var.matchedLength(), fullVal); - rep += fullVal.length(); - } else { - rep += reg_var.matchedLength(); - } - } - - //cache the value - extraCompilerVariablesCache.insert(cacheKey, ret); - return ret; -} - -bool -MakefileGenerator::verifyExtraCompiler(const ProString &comp, const QString &file_unfixed) -{ - if(noIO()) - return false; - const QString file = Option::normalizePath(file_unfixed); - - const ProStringList &config = project->values(ProKey(comp + ".CONFIG")); - if (config.indexOf("moc_verify") != -1) { - if(!file.isNull()) { - QMakeSourceFileInfo::addSourceFile(file, QMakeSourceFileInfo::SEEK_MOCS); - if(!mocable(file)) { - return false; - } else { - project->values("MOCABLES").append(file); - } - } - } else if (config.indexOf("function_verify") != -1) { - ProString tmp_out = project->first(ProKey(comp + ".output")); - if(tmp_out.isEmpty()) - return false; - ProStringList verify_function = project->values(ProKey(comp + ".verify_function")); - if(verify_function.isEmpty()) - return false; - - for(int i = 0; i < verify_function.size(); ++i) { - bool invert = false; - ProString verify = verify_function.at(i); - if(verify.at(0) == QLatin1Char('!')) { - invert = true; - verify = verify.mid(1); - } - - if (config.indexOf("combine") != -1) { - bool pass = project->test(verify.toKey(), QList() << ProStringList(tmp_out) << ProStringList(file)); - if(invert) - pass = !pass; - if(!pass) - return false; - } else { - const ProStringList &tmp = project->values(ProKey(comp + ".input")); - for (ProStringList::ConstIterator it = tmp.begin(); it != tmp.end(); ++it) { - const ProStringList &inputs = project->values((*it).toKey()); - for (ProStringList::ConstIterator input = inputs.begin(); input != inputs.end(); ++input) { - if((*input).isEmpty()) - continue; - QString inpf = (*input).toQString(); - QString in = fileFixify(inpf); - if(in == file) { - bool pass = project->test(verify.toKey(), - QList() << ProStringList(replaceExtraCompilerVariables(tmp_out.toQString(), inpf, QString(), NoShell)) << - ProStringList(file)); - if(invert) - pass = !pass; - if(!pass) - return false; - break; - } - } - } - } - } - } else if (config.indexOf("verify") != -1) { - QString tmp_out = project->first(ProKey(comp + ".output")).toQString(); - if(tmp_out.isEmpty()) - return false; - const QString tmp_cmd = project->values(ProKey(comp + ".commands")).join(' '); - if (config.indexOf("combine") != -1) { - QString cmd = replaceExtraCompilerVariables(tmp_cmd, QString(), tmp_out, LocalShell); - if(system(cmd.toLatin1().constData())) - return false; - } else { - const ProStringList &tmp = project->values(ProKey(comp + ".input")); - for (ProStringList::ConstIterator it = tmp.begin(); it != tmp.end(); ++it) { - const ProStringList &inputs = project->values((*it).toKey()); - for (ProStringList::ConstIterator input = inputs.begin(); input != inputs.end(); ++input) { - if((*input).isEmpty()) - continue; - QString inpf = (*input).toQString(); - QString in = fileFixify(inpf); - if(in == file) { - QString out = replaceExtraCompilerVariables(tmp_out, inpf, QString(), NoShell); - QString cmd = replaceExtraCompilerVariables(tmp_cmd, in, out, LocalShell); - if(system(cmd.toLatin1().constData())) - return false; - break; - } - } - } - } - } - return true; -} - -void -MakefileGenerator::writeExtraTargets(QTextStream &t) -{ - const ProStringList &qut = project->values("QMAKE_EXTRA_TARGETS"); - for (ProStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it) { - QString targ = var(ProKey(*it + ".target")), - cmd = var(ProKey(*it + ".commands")), deps; - if(targ.isEmpty()) - targ = (*it).toQString(); - const ProStringList &deplist = project->values(ProKey(*it + ".depends")); - for (ProStringList::ConstIterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) { - QString dep = var(ProKey(*dep_it + ".target")); - if(dep.isEmpty()) - dep = (*dep_it).toQString(); - deps += " " + escapeDependencyPath(dep); - } - const ProStringList &config = project->values(ProKey(*it + ".CONFIG")); - if (config.indexOf("fix_target") != -1) - targ = fileFixify(targ, FileFixifyFromOutdir); - if (config.indexOf("phony") != -1) - deps += QLatin1String(" FORCE"); - t << escapeDependencyPath(targ) << ":" << deps; - if(!cmd.isEmpty()) - t << "\n\t" << cmd; - t << endl << endl; - } -} - -void -MakefileGenerator::writeExtraCompilerTargets(QTextStream &t) -{ - QString clean_targets; - const ProStringList &quc = project->values("QMAKE_EXTRA_COMPILERS"); - for (ProStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) { - QString tmp_out = fileFixify(project->first(ProKey(*it + ".output")).toQString(), - FileFixifyFromOutdir); - const QString tmp_cmd = project->values(ProKey(*it + ".commands")).join(' '); - const QString tmp_dep_cmd = project->values(ProKey(*it + ".depend_command")).join(' '); - QString dep_cd_cmd; - if (!tmp_dep_cmd.isEmpty()) { - dep_cd_cmd = QLatin1String("cd ") - + escapeFilePath(Option::fixPathToLocalOS(Option::output_dir, false)) - + QLatin1String(" && "); - } - const ProStringList &vars = project->values(ProKey(*it + ".variables")); - if(tmp_out.isEmpty() || tmp_cmd.isEmpty()) - continue; - ProStringList tmp_inputs; - { - const ProStringList &comp_inputs = project->values(ProKey(*it + ".input")); - for (ProStringList::ConstIterator it2 = comp_inputs.begin(); it2 != comp_inputs.end(); ++it2) { - const ProStringList &tmp = project->values((*it2).toKey()); - for (ProStringList::ConstIterator input = tmp.begin(); input != tmp.end(); ++input) { - if (verifyExtraCompiler((*it), (*input).toQString())) - tmp_inputs.append((*input)); - } - } - } - - t << "compiler_" << (*it) << "_make_all:"; - const ProStringList &config = project->values(ProKey(*it + ".CONFIG")); - if (config.indexOf("combine") != -1) { - // compilers with a combined input only have one output - QString input = project->first(ProKey(*it + ".output")).toQString(); - t << ' ' << escapeDependencyPath(Option::fixPathToTargetOS( - replaceExtraCompilerVariables(tmp_out, input, QString(), NoShell))); - } else { - for (ProStringList::ConstIterator input = tmp_inputs.begin(); input != tmp_inputs.end(); ++input) { - t << ' ' << escapeDependencyPath(Option::fixPathToTargetOS( - replaceExtraCompilerVariables(tmp_out, (*input).toQString(), QString(), NoShell))); - } - } - t << endl; - - if (config.indexOf("no_clean") == -1) { - QStringList raw_clean = project->values(ProKey(*it + ".clean")).toQStringList(); - if (raw_clean.isEmpty()) - raw_clean << tmp_out; - QString tmp_clean; - foreach (const QString &rc, raw_clean) - tmp_clean += ' ' + escapeFilePath(Option::fixPathToTargetOS(rc)); - QString tmp_clean_cmds = project->values(ProKey(*it + ".clean_commands")).join(' '); - if(!tmp_inputs.isEmpty()) - clean_targets += QString("compiler_" + (*it) + "_clean "); - t << "compiler_" << (*it) << "_clean:"; - bool wrote_clean_cmds = false, wrote_clean = false; - if(tmp_clean_cmds.isEmpty()) { - wrote_clean_cmds = true; - } else if(tmp_clean_cmds.indexOf("${QMAKE_") == -1) { - t << "\n\t" << tmp_clean_cmds; - wrote_clean_cmds = true; - } - if(tmp_clean.indexOf("${QMAKE_") == -1) { - t << "\n\t-$(DEL_FILE)" << tmp_clean; - wrote_clean = true; - } - if(!wrote_clean_cmds || !wrote_clean) { - QStringList cleans; - const QString del_statement("-$(DEL_FILE)"); - if(!wrote_clean) { - QStringList dels; - for (ProStringList::ConstIterator input = tmp_inputs.begin(); input != tmp_inputs.end(); ++input) { - QString tinp = (*input).toQString(); - QString out = replaceExtraCompilerVariables(tmp_out, tinp, QString(), NoShell); - foreach (const QString &rc, raw_clean) { - dels << ' ' + escapeFilePath(Option::fixPathToTargetOS( - replaceExtraCompilerVariables(rc, tinp, out, NoShell), false)); - } - } - if(project->isActiveConfig("no_delete_multiple_files")) { - cleans = dels; - } else { - QString files; - const int commandlineLimit = 2047; // NT limit, expanded - foreach (const QString &file, dels) { - if(del_statement.length() + files.length() + - qMax(fixEnvVariables(file).length(), file.length()) > commandlineLimit) { - cleans.append(files); - files.clear(); - } - files += file; - } - if(!files.isEmpty()) - cleans.append(files); - } - } - if(!cleans.isEmpty()) - t << valGlue(cleans, "\n\t" + del_statement, "\n\t" + del_statement, ""); - if(!wrote_clean_cmds) { - for (ProStringList::ConstIterator input = tmp_inputs.begin(); input != tmp_inputs.end(); ++input) { - QString tinp = (*input).toQString(); - t << "\n\t" << replaceExtraCompilerVariables(tmp_clean_cmds, tinp, - replaceExtraCompilerVariables(tmp_out, tinp, QString(), NoShell), TargetShell); - } - } - } - t << endl; - } - QStringList tmp_dep = project->values(ProKey(*it + ".depends")).toQStringList(); - if (config.indexOf("combine") != -1) { - if (tmp_out.contains(QRegExp("(^|[^$])\\$\\{QMAKE_(?!VAR_)"))) { - warn_msg(WarnLogic, "QMAKE_EXTRA_COMPILERS(%s) with combine has variable output.", - (*it).toLatin1().constData()); - continue; - } - QStringList deps, inputs; - if(!tmp_dep.isEmpty()) - deps += fileFixify(tmp_dep, FileFixifyFromOutdir); - for (ProStringList::ConstIterator input = tmp_inputs.begin(); input != tmp_inputs.end(); ++input) { - QString inpf = (*input).toQString(); - deps += findDependencies(inpf); - inputs += Option::fixPathToTargetOS(inpf, false); - if(!tmp_dep_cmd.isEmpty() && doDepends()) { - char buff[256]; - QString dep_cmd = replaceExtraCompilerVariables(tmp_dep_cmd, inpf, tmp_out, LocalShell); - dep_cmd = dep_cd_cmd + fixEnvVariables(dep_cmd); - if(FILE *proc = QT_POPEN(dep_cmd.toLatin1().constData(), "r")) { - QString indeps; - while(!feof(proc)) { - int read_in = (int)fread(buff, 1, 255, proc); - if(!read_in) - break; - indeps += QByteArray(buff, read_in); - } - QT_PCLOSE(proc); - if(!indeps.isEmpty()) { - // ### This is basically fubar. Add 'lines' flag to CONFIG? - QStringList dep_cmd_deps = indeps.replace('\n', ' ').simplified().split(' '); - for(int i = 0; i < dep_cmd_deps.count(); ++i) { - QString &file = dep_cmd_deps[i]; - QString absFile = QDir(Option::output_dir).absoluteFilePath(file); - if (exists(absFile)) { - file = absFile; - } else { - QString localFile; - QList depdirs = QMakeSourceFileInfo::dependencyPaths(); - for (QList::Iterator dit = depdirs.begin(); - dit != depdirs.end(); ++dit) { - if (exists((*dit).local() + '/' + file)) { - localFile = (*dit).local() + '/' + file; - break; - } - } - if (localFile.isEmpty()) { - if (exists(file)) - warn_msg(WarnDeprecated, ".depend_command for extra compiler %s" - " prints paths relative to source directory", - (*it).toLatin1().constData()); - else - file.clear(); - } else { - file = localFile; - } - } - if(!file.isEmpty()) - file = fileFixify(file); - } - deps += dep_cmd_deps; - } - } - } - } - for(int i = 0; i < inputs.size(); ) { - if(tmp_out == inputs.at(i)) - inputs.removeAt(i); - else - ++i; - } - for(int i = 0; i < deps.size(); ) { - if(tmp_out == deps.at(i)) - deps.removeAt(i); - else - ++i; - } - if (inputs.isEmpty()) - continue; - - QString out = replaceExtraCompilerVariables(tmp_out, QString(), QString(), NoShell); - QString cmd = replaceExtraCompilerVariables(tmp_cmd, inputs, QStringList() << out, TargetShell); - t << escapeDependencyPath(Option::fixPathToTargetOS(out)) << ":"; - // compiler.CONFIG+=explicit_dependencies means that ONLY compiler.depends gets to cause Makefile dependencies - if (config.indexOf("explicit_dependencies") != -1) { - t << " " << valList(escapeDependencyPaths(fileFixify(tmp_dep, FileFixifyFromOutdir))); - } else { - t << " " << valList(escapeDependencyPaths(inputs)) << " " << valList(escapeDependencyPaths(deps)); - } - t << "\n\t" << cmd << endl << endl; - continue; - } - for (ProStringList::ConstIterator input = tmp_inputs.begin(); input != tmp_inputs.end(); ++input) { - QString inpf = (*input).toQString(); - QString in = Option::fixPathToTargetOS(inpf, false); - QStringList deps = findDependencies(inpf); - deps << in; - QString out = Option::fixPathToTargetOS(replaceExtraCompilerVariables(tmp_out, inpf, QString(), NoShell)); - if(!tmp_dep.isEmpty()) { - QStringList pre_deps = fileFixify(tmp_dep, FileFixifyFromOutdir); - for(int i = 0; i < pre_deps.size(); ++i) - deps << replaceExtraCompilerVariables(pre_deps.at(i), inpf, out, NoShell); - } - QString cmd = replaceExtraCompilerVariables(tmp_cmd, inpf, out, TargetShell); - // NOTE: The var -> QMAKE_COMP_var replace feature is unsupported, do not use! - for (ProStringList::ConstIterator it3 = vars.constBegin(); it3 != vars.constEnd(); ++it3) - cmd.replace("$(" + (*it3) + ")", "$(QMAKE_COMP_" + (*it3)+")"); - if(!tmp_dep_cmd.isEmpty() && doDepends()) { - char buff[256]; - QString dep_cmd = replaceExtraCompilerVariables(tmp_dep_cmd, inpf, out, LocalShell); - dep_cmd = dep_cd_cmd + fixEnvVariables(dep_cmd); - if(FILE *proc = QT_POPEN(dep_cmd.toLatin1().constData(), "r")) { - QString indeps; - while(!feof(proc)) { - int read_in = (int)fread(buff, 1, 255, proc); - if(!read_in) - break; - indeps += QByteArray(buff, read_in); - } - QT_PCLOSE(proc); - if(!indeps.isEmpty()) { - // ### This is basically fubar. Add 'lines' flag to CONFIG? - QStringList dep_cmd_deps = indeps.replace('\n', ' ').simplified().split(' '); - for(int i = 0; i < dep_cmd_deps.count(); ++i) { - QString &file = dep_cmd_deps[i]; - QString absFile = QDir(Option::output_dir).absoluteFilePath(file); - if (exists(absFile)) { - file = absFile; - } else { - QString localFile; - QList depdirs = QMakeSourceFileInfo::dependencyPaths(); - for (QList::Iterator dit = depdirs.begin(); - dit != depdirs.end(); ++dit) { - if (exists((*dit).local() + '/' + file)) { - localFile = (*dit).local() + '/' + file; - break; - } - } - if (localFile.isEmpty()) { - if (exists(file)) - warn_msg(WarnDeprecated, ".depend_command for extra compiler %s" - " prints paths relative to source directory", - (*it).toLatin1().constData()); - else - file.clear(); - } else { - file = localFile; - } - } - if(!file.isEmpty()) - file = fileFixify(file); - } - deps += dep_cmd_deps; - } - } - //use the depend system to find includes of these included files - QStringList inc_deps; - for(int i = 0; i < deps.size(); ++i) { - const QString dep = deps.at(i); - if(QFile::exists(dep)) { - SourceFileType type = TYPE_UNKNOWN; - if(type == TYPE_UNKNOWN) { - for(QStringList::Iterator cit = Option::c_ext.begin(); - cit != Option::c_ext.end(); ++cit) { - if(dep.endsWith((*cit))) { - type = TYPE_C; - break; - } - } - } - if(type == TYPE_UNKNOWN) { - for(QStringList::Iterator cppit = Option::cpp_ext.begin(); - cppit != Option::cpp_ext.end(); ++cppit) { - if(dep.endsWith((*cppit))) { - type = TYPE_C; - break; - } - } - } - if(type == TYPE_UNKNOWN) { - for(QStringList::Iterator hit = Option::h_ext.begin(); - type == TYPE_UNKNOWN && hit != Option::h_ext.end(); ++hit) { - if(dep.endsWith((*hit))) { - type = TYPE_C; - break; - } - } - } - if(type != TYPE_UNKNOWN) { - if(!QMakeSourceFileInfo::containsSourceFile(dep, type)) - QMakeSourceFileInfo::addSourceFile(dep, type); - inc_deps += QMakeSourceFileInfo::dependencies(dep); - } - } - } - deps += inc_deps; - } - for(int i = 0; i < deps.size(); ) { - QString &dep = deps[i]; - dep = Option::fixPathToTargetOS(dep, false); - if(out == dep) - deps.removeAt(i); - else - ++i; - } - t << escapeDependencyPath(out) << ": " << valList(escapeDependencyPaths(deps)) << "\n\t" - << cmd << endl << endl; - } - } - t << "compiler_clean: " << clean_targets << endl << endl; -} - -void -MakefileGenerator::writeExtraCompilerVariables(QTextStream &t) -{ - bool first = true; - const ProStringList &quc = project->values("QMAKE_EXTRA_COMPILERS"); - for (ProStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) { - const ProStringList &vars = project->values(ProKey(*it + ".variables")); - for (ProStringList::ConstIterator varit = vars.begin(); varit != vars.end(); ++varit) { - if(first) { - t << "\n####### Custom Compiler Variables\n"; - first = false; - } - t << "QMAKE_COMP_" << (*varit) << " = " - << valList(project->values((*varit).toKey())) << endl; - } - } - if(!first) - t << endl; -} - -void -MakefileGenerator::writeExtraVariables(QTextStream &t) -{ - t << endl; - - ProStringList outlist; - const ProValueMap &vars = project->variables(); - const ProStringList &exports = project->values("QMAKE_EXTRA_VARIABLES"); - for (ProValueMap::ConstIterator it = vars.begin(); it != vars.end(); ++it) { - for (ProStringList::ConstIterator exp_it = exports.begin(); exp_it != exports.end(); ++exp_it) { - QRegExp rx((*exp_it).toQString(), Qt::CaseInsensitive, QRegExp::Wildcard); - if (rx.exactMatch(it.key().toQString())) - outlist << ("EXPORT_" + it.key() + " = " + it.value().join(' ')); - } - } - if (!outlist.isEmpty()) { - t << "####### Custom Variables\n"; - t << outlist.join("\n") << endl << endl; - } -} - -bool -MakefileGenerator::writeDummyMakefile(QTextStream &t) -{ - if (project->values("QMAKE_FAILED_REQUIREMENTS").isEmpty()) - return false; - t << "QMAKE = " << var("QMAKE_QMAKE") << endl; - const ProStringList &qut = project->values("QMAKE_EXTRA_TARGETS"); - for (ProStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it) - t << *it << " "; - t << "first all clean install distclean uninstall qmake_all:\n\t" - << "@echo \"Some of the required modules (" - << var("QMAKE_FAILED_REQUIREMENTS") << ") are not available.\"\n\t" - << "@echo \"Skipped.\"\n\n"; - writeMakeQmake(t); - t << "FORCE:\n\n"; - return true; -} - -bool -MakefileGenerator::writeStubMakefile(QTextStream &t) -{ - t << "QMAKE = " << var("QMAKE_QMAKE") << endl; - const ProStringList &qut = project->values("QMAKE_EXTRA_TARGETS"); - for (ProStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it) - t << *it << " "; - //const QString ofile = Option::fixPathToTargetOS(fileFixify(Option::output.fileName())); - t << "first all clean install distclean uninstall: qmake\n" - << "qmake_all:\n"; - writeMakeQmake(t); - t << "FORCE:\n\n"; - return true; -} - -bool -MakefileGenerator::writeMakefile(QTextStream &t) -{ - t << "####### Compile\n\n"; - writeObj(t, "SOURCES"); - writeObj(t, "GENERATED_SOURCES"); - - t << "####### Install\n\n"; - writeInstalls(t); - - t << "FORCE:\n\n"; - return true; -} - -void -MakefileGenerator::writeDefaultVariables(QTextStream &t) -{ - t << "QMAKE = " << var("QMAKE_QMAKE") << endl; - t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl; - t << "CHK_DIR_EXISTS= " << var("QMAKE_CHK_DIR_EXISTS") << endl; - t << "MKDIR = " << var("QMAKE_MKDIR") << endl; - t << "COPY = " << var("QMAKE_COPY") << endl; - t << "COPY_FILE = " << var("QMAKE_COPY_FILE") << endl; - t << "COPY_DIR = " << var("QMAKE_COPY_DIR") << endl; - t << "INSTALL_FILE = " << var("QMAKE_INSTALL_FILE") << endl; - t << "INSTALL_PROGRAM = " << var("QMAKE_INSTALL_PROGRAM") << endl; - t << "INSTALL_DIR = " << var("QMAKE_INSTALL_DIR") << endl; - t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl; - t << "SYMLINK = " << var("QMAKE_SYMBOLIC_LINK") << endl; - t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl; - t << "MOVE = " << var("QMAKE_MOVE") << endl; -} - -QString MakefileGenerator::buildArgs() -{ - QString ret; - - foreach (const QString &arg, Option::globals->qmake_args) - ret += " " + shellQuote(arg); - return ret; -} - -//could get stored argv, but then it would have more options than are -//probably necesary this will try to guess the bare minimum.. -QString MakefileGenerator::build_args() -{ - QString ret = "$(QMAKE)"; - - // general options and arguments - ret += buildArgs(); - - //output - QString ofile = fileFixify(Option::output.fileName()); - if(!ofile.isEmpty() && ofile != project->first("QMAKE_MAKEFILE")) - ret += " -o " + escapeFilePath(ofile); - - //inputs - ret += " " + escapeFilePath(fileFixify(project->projectFile())); - - return ret; -} - -void -MakefileGenerator::writeHeader(QTextStream &t) -{ - t << "#############################################################################\n"; - t << "# Makefile for building: " << escapeFilePath(var("TARGET")) << endl; - t << "# Generated by qmake (" QMAKE_VERSION_STR ") (Qt " QT_VERSION_STR ")\n"; - t << "# Project: " << fileFixify(project->projectFile()) << endl; - t << "# Template: " << var("TEMPLATE") << endl; - if(!project->isActiveConfig("build_pass")) - t << "# Command: " << build_args().replace("$(QMAKE)", var("QMAKE_QMAKE")) << endl; - t << "#############################################################################\n"; - t << endl; - QString ofile = Option::fixPathToTargetOS(Option::output.fileName()); - if (ofile.lastIndexOf(Option::dir_sep) != -1) - ofile.remove(0, ofile.lastIndexOf(Option::dir_sep) +1); - t << "MAKEFILE = " << escapeFilePath(ofile) << endl << endl; -} - -QList -MakefileGenerator::findSubDirsSubTargets() const -{ - QList targets; - { - const ProStringList &subdirs = project->values("SUBDIRS"); - for(int subdir = 0; subdir < subdirs.size(); ++subdir) { - ProString ofile = subdirs[subdir]; - QString oname = ofile.toQString(); - QString fixedSubdir = oname; - fixedSubdir.replace(QRegExp("[^a-zA-Z0-9_]"),"-"); - - SubTarget *st = new SubTarget; - st->name = oname; - targets.append(st); - - bool fromFile = false; - const ProKey fkey(fixedSubdir + ".file"); - const ProKey skey(fixedSubdir + ".subdir"); - if (!project->isEmpty(fkey)) { - if (!project->isEmpty(skey)) - warn_msg(WarnLogic, "Cannot assign both file and subdir for subdir %s", - subdirs[subdir].toLatin1().constData()); - ofile = project->first(fkey); - fromFile = true; - } else if (!project->isEmpty(skey)) { - ofile = project->first(skey); - fromFile = false; - } else { - fromFile = ofile.endsWith(Option::pro_ext); - } - QString file = Option::fixPathToTargetOS(ofile.toQString()); - - if(fromFile) { - int slsh = file.lastIndexOf(Option::dir_sep); - if(slsh != -1) { - st->in_directory = file.left(slsh+1); - st->profile = file.mid(slsh+1); - } else { - st->profile = file; - } - } else { - if(!file.isEmpty() && !project->isActiveConfig("subdir_first_pro")) - st->profile = file.section(Option::dir_sep, -1) + Option::pro_ext; - st->in_directory = file; - } - while(st->in_directory.endsWith(Option::dir_sep)) - st->in_directory.chop(1); - if(fileInfo(st->in_directory).isRelative()) - st->out_directory = st->in_directory; - else - st->out_directory = fileFixify(st->in_directory, FileFixifyBackwards); - const ProKey mkey(fixedSubdir + ".makefile"); - if (!project->isEmpty(mkey)) { - st->makefile = project->first(mkey).toQString(); - } else { - st->makefile = "Makefile"; - if(!st->profile.isEmpty()) { - QString basename = st->in_directory; - int new_slsh = basename.lastIndexOf(Option::dir_sep); - if(new_slsh != -1) - basename = basename.mid(new_slsh+1); - if(st->profile != basename + Option::pro_ext) - st->makefile += "." + st->profile.left(st->profile.length() - Option::pro_ext.length()); - } - } - const ProKey dkey(fixedSubdir + ".depends"); - if (!project->isEmpty(dkey)) { - const ProStringList &depends = project->values(dkey); - for(int depend = 0; depend < depends.size(); ++depend) { - bool found = false; - for(int subDep = 0; subDep < subdirs.size(); ++subDep) { - if(subdirs[subDep] == depends.at(depend)) { - QString subName = subdirs[subDep].toQString(); - QString fixedSubDep = subName; - fixedSubDep.replace(QRegExp("[^a-zA-Z0-9_]"),"-"); - const ProKey dtkey(fixedSubDep + ".target"); - if (!project->isEmpty(dtkey)) { - st->depends += project->first(dtkey); - } else { - QString d = Option::fixPathToTargetOS(subName); - const ProKey dfkey(fixedSubDep + ".file"); - if (!project->isEmpty(dfkey)) { - d = project->first(dfkey).toQString(); - } else { - const ProKey dskey(fixedSubDep + ".subdir"); - if (!project->isEmpty(dskey)) - d = project->first(dskey).toQString(); - } - st->depends += "sub-" + d.replace(QRegExp("[^a-zA-Z0-9_]"),"-"); - } - found = true; - break; - } - } - if(!found) { - QString depend_str = depends.at(depend).toQString(); - st->depends += depend_str.replace(QRegExp("[^a-zA-Z0-9_]"),"-"); - } - } - } - const ProKey tkey(fixedSubdir + ".target"); - if (!project->isEmpty(tkey)) { - st->target = project->first(tkey).toQString(); - } else { - st->target = "sub-" + file; - st->target.replace(QRegExp("[^a-zA-Z0-9_]"), "-"); - } - } - } - return targets; -} - -void -MakefileGenerator::writeSubDirs(QTextStream &t) -{ - QList targets = findSubDirsSubTargets(); - t << "first: make_first\n"; - int flags = SubTargetInstalls; - if(project->isActiveConfig("ordered")) - flags |= SubTargetOrdered; - writeSubTargets(t, targets, flags); - qDeleteAll(targets); -} - -void MakefileGenerator::writeSubMakeCall(QTextStream &t, const QString &callPrefix, - const QString &makeArguments) -{ - t << callPrefix << "$(MAKE)" << makeArguments << endl; -} - -void -MakefileGenerator::writeSubTargetCall(QTextStream &t, - const QString &in_directory, const QString &in, const QString &out_directory, const QString &out, - const QString &out_directory_cdin, const QString &makefilein) -{ - QString pfx; - if (!in.isEmpty()) { - if (!in_directory.isEmpty()) - t << "\n\t" << mkdir_p_asstring(out_directory); - pfx = "( " + chkexists.arg(out) + - + " $(QMAKE) " + in + buildArgs() + " -o " + out - + " ) && "; - } - writeSubMakeCall(t, out_directory_cdin + pfx, makefilein); -} - -void -MakefileGenerator::writeSubTargets(QTextStream &t, QList targets, int flags) -{ - // blasted includes - const ProStringList &qeui = project->values("QMAKE_EXTRA_INCLUDES"); - for (ProStringList::ConstIterator qeui_it = qeui.begin(); qeui_it != qeui.end(); ++qeui_it) - t << "include " << (*qeui_it) << endl; - - if (!(flags & SubTargetSkipDefaultVariables)) { - writeDefaultVariables(t); - t << "SUBTARGETS = "; // subtargets are sub-directory - for(int target = 0; target < targets.size(); ++target) - t << " \\\n\t\t" << targets.at(target)->target; - t << endl << endl; - } - writeExtraVariables(t); - - QStringList targetSuffixes; - const QString abs_source_path = project->first("QMAKE_ABSOLUTE_SOURCE_PATH").toQString(); - if (!(flags & SubTargetSkipDefaultTargets)) { - targetSuffixes << "make_first" << "all" << "clean" << "distclean" - << QString((flags & SubTargetInstalls) ? "install_subtargets" : "install") - << QString((flags & SubTargetInstalls) ? "uninstall_subtargets" : "uninstall"); - } - - bool dont_recurse = project->isActiveConfig("dont_recurse"); - - // generate target rules - for(int target = 0; target < targets.size(); ++target) { - SubTarget *subtarget = targets.at(target); - QString in_directory = subtarget->in_directory; - if(!in_directory.isEmpty() && !in_directory.endsWith(Option::dir_sep)) - in_directory += Option::dir_sep; - QString out_directory = subtarget->out_directory; - if(!out_directory.isEmpty() && !out_directory.endsWith(Option::dir_sep)) - out_directory += Option::dir_sep; - if(!abs_source_path.isEmpty() && out_directory.startsWith(abs_source_path)) - out_directory = Option::output_dir + out_directory.mid(abs_source_path.length()); - - QString out_directory_cdin = out_directory.isEmpty() ? "\n\t" - : "\n\tcd " + escapeFilePath(out_directory) + " && "; - QString makefilein = " -f " + escapeFilePath(subtarget->makefile); - - //qmake it - QString out; - QString in; - if(!subtarget->profile.isEmpty()) { - out = subtarget->makefile; - in = escapeFilePath(fileFixify(in_directory + subtarget->profile, FileFixifyAbsolute)); - if(out.startsWith(in_directory)) - out = out.mid(in_directory.length()); - out = escapeFilePath(out); - t << subtarget->target << "-qmake_all: "; - if (flags & SubTargetOrdered) { - if (target) - t << targets.at(target - 1)->target << "-qmake_all"; - } else { - if (!subtarget->depends.isEmpty()) - t << valGlue(subtarget->depends, QString(), "-qmake_all ", "-qmake_all"); - } - t << " FORCE\n\t"; - if(!in_directory.isEmpty()) { - t << mkdir_p_asstring(out_directory) - << out_directory_cdin; - } - t << "$(QMAKE) " << in << buildArgs() << " -o " << out; - if (!dont_recurse) - writeSubMakeCall(t, out_directory_cdin, makefilein + " qmake_all"); - else - t << endl; - } - - { //actually compile - t << subtarget->target << ":"; - if(!subtarget->depends.isEmpty()) - t << " " << valList(subtarget->depends); - t << " FORCE"; - writeSubTargetCall(t, in_directory, in, out_directory, out, - out_directory_cdin, makefilein); - } - - for(int suffix = 0; suffix < targetSuffixes.size(); ++suffix) { - QString s = targetSuffixes.at(suffix); - if(s == "install_subtargets") - s = "install"; - else if(s == "uninstall_subtargets") - s = "uninstall"; - else if(s == "make_first") - s = QString(); - - if(flags & SubTargetOrdered) { - t << subtarget->target << "-" << targetSuffixes.at(suffix) << "-ordered:"; - if(target) - t << " " << targets.at(target-1)->target << "-" << targetSuffixes.at(suffix) << "-ordered "; - t << " FORCE"; - writeSubTargetCall(t, in_directory, in, out_directory, out, - out_directory_cdin, makefilein + " " + s); - } - t << subtarget->target << "-" << targetSuffixes.at(suffix) << ":"; - if(!subtarget->depends.isEmpty()) - t << " " << valGlue(subtarget->depends, QString(), "-" + targetSuffixes.at(suffix) + " ", - "-"+targetSuffixes.at(suffix)); - t << " FORCE"; - writeSubTargetCall(t, in_directory, in, out_directory, out, - out_directory_cdin, makefilein + " " + s); - } - } - t << endl; - - if (!(flags & SubTargetSkipDefaultTargets)) { - writeMakeQmake(t, true); - - t << "qmake_all:"; - if(!targets.isEmpty()) { - for(QList::Iterator it = targets.begin(); it != targets.end(); ++it) { - if(!(*it)->profile.isEmpty()) - t << " " << (*it)->target << "-qmake_all"; - } - } - t << " FORCE\n\n"; - } - - for(int s = 0; s < targetSuffixes.size(); ++s) { - QString suffix = targetSuffixes.at(s); - if(!(flags & SubTargetInstalls) && suffix.endsWith("install")) - continue; - - t << suffix << ":"; - for(int target = 0; target < targets.size(); ++target) { - SubTarget *subTarget = targets.at(target); - const ProStringList &config = project->values(ProKey(subTarget->name + ".CONFIG")); - if (suffix == "make_first" - && config.indexOf("no_default_target") != -1) { - continue; - } - if((suffix == "install_subtargets" || suffix == "uninstall_subtargets") - && config.indexOf("no_default_install") != -1) { - continue; - } - QString targetRule = subTarget->target + "-" + suffix; - if(flags & SubTargetOrdered) - targetRule += "-ordered"; - t << " " << targetRule; - } - if(suffix == "all" || suffix == "make_first") - t << ' ' << depVar("ALL_DEPS"); - if(suffix == "clean") - t << ' ' << depVar("CLEAN_DEPS"); - else if (suffix == "distclean") - t << ' ' << depVar("DISTCLEAN_DEPS"); - t << " FORCE\n"; - if(suffix == "clean") { - t << fixFileVarGlue("QMAKE_CLEAN", "\t-$(DEL_FILE) ", "\n\t-$(DEL_FILE) ", "\n"); - } else if(suffix == "distclean") { - QString ofile = fileFixify(Option::output.fileName()); - if(!ofile.isEmpty()) - t << "\t-$(DEL_FILE) " << escapeFilePath(ofile) << endl; - t << fixFileVarGlue("QMAKE_DISTCLEAN", "\t-$(DEL_FILE) ", " ", "\n"); - } - } - - // user defined targets - const ProStringList &qut = project->values("QMAKE_EXTRA_TARGETS"); - for (ProStringList::ConstIterator qut_it = qut.begin(); qut_it != qut.end(); ++qut_it) { - const ProStringList &config = project->values(ProKey(*qut_it + ".CONFIG")); - QString targ = var(ProKey(*qut_it + ".target")), - cmd = var(ProKey(*qut_it + ".commands")), deps; - if(targ.isEmpty()) - targ = (*qut_it).toQString(); - t << endl; - - const ProStringList &deplist = project->values(ProKey(*qut_it + ".depends")); - for (ProStringList::ConstIterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) { - QString dep = var(ProKey(*dep_it + ".target")); - if(dep.isEmpty()) - dep = Option::fixPathToTargetOS((*dep_it).toQString(), false); - deps += ' ' + escapeDependencyPath(dep); - } - if (config.indexOf("recursive") != -1) { - QSet recurse; - const ProKey rkey(*qut_it + ".recurse"); - if (project->isSet(rkey)) { - recurse = project->values(rkey).toQStringList().toSet(); - } else { - for(int target = 0; target < targets.size(); ++target) - recurse.insert(targets.at(target)->name); - } - for(int target = 0; target < targets.size(); ++target) { - SubTarget *subtarget = targets.at(target); - QString in_directory = subtarget->in_directory; - if(!in_directory.isEmpty() && !in_directory.endsWith(Option::dir_sep)) - in_directory += Option::dir_sep; - QString out_directory = subtarget->out_directory; - if(!out_directory.isEmpty() && !out_directory.endsWith(Option::dir_sep)) - out_directory += Option::dir_sep; - if(!abs_source_path.isEmpty() && out_directory.startsWith(abs_source_path)) - out_directory = Option::output_dir + out_directory.mid(abs_source_path.length()); - - if(!recurse.contains(subtarget->name)) - continue; - - QString out_directory_cdin = out_directory.isEmpty() ? "\n\t" - : "\n\tcd " + escapeFilePath(out_directory) + " && "; - QString makefilein = " -f " + escapeFilePath(subtarget->makefile); - - QString out; - QString in; - if (!subtarget->profile.isEmpty()) { - out = subtarget->makefile; - in = escapeFilePath(fileFixify(in_directory + subtarget->profile, FileFixifyAbsolute)); - if (out.startsWith(in_directory)) - out = out.mid(in_directory.length()); - out = escapeFilePath(out); - } - - //write the rule/depends - if(flags & SubTargetOrdered) { - const QString dep = subtarget->target + "-" + (*qut_it) + "_ordered"; - t << dep << ":"; - if(target) - t << " " << targets.at(target-1)->target << "-" << (*qut_it) << "_ordered "; - deps += " " + dep; - } else { - const QString dep = subtarget->target + "-" + (*qut_it); - t << dep << ":"; - if(!subtarget->depends.isEmpty()) - t << " " << valGlue(subtarget->depends, QString(), "-" + (*qut_it) + " ", "-" + (*qut_it)); - deps += " " + dep; - } - - QString sub_targ = targ; - const ProKey rtkey(*qut_it + ".recurse_target"); - if (project->isSet(rtkey)) - sub_targ = project->first(rtkey).toQString(); - - //write the commands - writeSubTargetCall(t, in_directory, in, out_directory, out, - out_directory_cdin, makefilein + " " + sub_targ); - } - } - if (config.indexOf("phony") != -1) - deps += " FORCE"; - t << targ << ":" << deps << "\n"; - if(!cmd.isEmpty()) - t << "\t" << cmd << endl; - } - - if(flags & SubTargetInstalls) { - project->values("INSTALLDEPS") += "install_subtargets"; - project->values("UNINSTALLDEPS") += "uninstall_subtargets"; - writeInstalls(t, true); - } - t << "FORCE:\n\n"; -} - -void -MakefileGenerator::writeMakeQmake(QTextStream &t, bool noDummyQmakeAll) -{ - QString ofile = fileFixify(Option::output.fileName()); - if(project->isEmpty("QMAKE_FAILED_REQUIREMENTS") && !project->isEmpty("QMAKE_INTERNAL_PRL_FILE")) { - QStringList files = escapeFilePaths(fileFixify(Option::mkfile::project_files)); - t << escapeDependencyPath(project->first("QMAKE_INTERNAL_PRL_FILE").toQString()) << ": \n\t" - << "@$(QMAKE) -prl " << buildArgs() << " " << files.join(' ') << endl; - } - - QString qmake = build_args(); - if(!ofile.isEmpty() && !project->isActiveConfig("no_autoqmake")) { - t << escapeDependencyPath(ofile) << ": " - << escapeDependencyPath(fileFixify(project->projectFile())) << " "; - if (Option::globals->do_cache) { - if (!project->confFile().isEmpty()) - t << escapeDependencyPath(fileFixify(project->confFile())) << " "; - if (!project->cacheFile().isEmpty()) - t << escapeDependencyPath(fileFixify(project->cacheFile())) << " "; - } - if(!specdir().isEmpty()) { - if (exists(Option::normalizePath(specdir() + "/qmake.conf"))) - t << escapeDependencyPath(specdir() + Option::dir_sep + "qmake.conf") << " "; - } - const ProStringList &included = escapeDependencyPaths(project->values("QMAKE_INTERNAL_INCLUDED_FILES")); - t << included.join(" \\\n\t\t") << "\n\t" - << qmake << endl; - for(int include = 0; include < included.size(); ++include) { - const ProString &i = included.at(include); - if(!i.isEmpty()) - t << i << ":\n"; - } - } - if(project->first("QMAKE_ORIG_TARGET") != "qmake") { - t << "qmake: FORCE\n\t@" << qmake << endl << endl; - if (!noDummyQmakeAll) - t << "qmake_all: FORCE\n\n"; - } -} - -QFileInfo -MakefileGenerator::fileInfo(QString file) const -{ - static QHash *cache = 0; - static QFileInfo noInfo = QFileInfo(); - if(!cache) { - cache = new QHash; - qmakeAddCacheClear(qmakeDeleteCacheClear >, (void**)&cache); - } - FileInfoCacheKey cacheKey(file); - QFileInfo value = cache->value(cacheKey, noInfo); - if (value != noInfo) - return value; - - QFileInfo fi(file); - if (fi.exists()) - cache->insert(cacheKey, fi); - return fi; -} - -ProStringList -MakefileGenerator::fixLibFlags(const ProKey &var) -{ - ProStringList in = project->values(var); - ProStringList ret; - - ret.reserve(in.length()); - foreach (const ProString &v, in) - ret << fixLibFlag(v); - return ret; -} - -ProString MakefileGenerator::fixLibFlag(const ProString &) -{ - qFatal("MakefileGenerator::fixLibFlag() called"); - return ProString(); -} - -ProString -MakefileGenerator::escapeFilePath(const ProString &path) const -{ - return ProString(escapeFilePath(path.toQString())); -} - -QStringList -MakefileGenerator::escapeFilePaths(const QStringList &paths) const -{ - QStringList ret; - for(int i = 0; i < paths.size(); ++i) - ret.append(escapeFilePath(paths.at(i))); - return ret; -} - -ProStringList -MakefileGenerator::escapeFilePaths(const ProStringList &paths) const -{ - ProStringList ret; - for (int i = 0; i < paths.size(); ++i) - ret.append(escapeFilePath(paths.at(i))); - return ret; -} - -ProString -MakefileGenerator::escapeDependencyPath(const ProString &path) const -{ - return ProString(escapeDependencyPath(path.toQString())); -} - -QStringList -MakefileGenerator::escapeDependencyPaths(const QStringList &paths) const -{ - QStringList ret; - for(int i = 0; i < paths.size(); ++i) - ret.append(escapeDependencyPath(paths.at(i))); - return ret; -} - -ProStringList -MakefileGenerator::escapeDependencyPaths(const ProStringList &paths) const -{ - ProStringList ret; - for (int i = 0; i < paths.size(); ++i) - ret.append(escapeDependencyPath(paths.at(i).toQString())); - return ret; -} - -QStringList -MakefileGenerator::fileFixify(const QStringList &files, FileFixifyTypes fix, bool canon) const -{ - if(files.isEmpty()) - return files; - QStringList ret; - for(QStringList::ConstIterator it = files.begin(); it != files.end(); ++it) { - if(!(*it).isEmpty()) - ret << fileFixify((*it), fix, canon); - } - return ret; -} - -QString -MakefileGenerator::fileFixify(const QString &file, FileFixifyTypes fix, bool canon) const -{ - if(file.isEmpty()) - return file; - QString ret = file; - - //do the fixin' - QString orig_file = ret; - if(ret.startsWith(QLatin1Char('~'))) { - if(ret.startsWith(QLatin1String("~/"))) - ret = QDir::homePath() + ret.mid(1); - else - warn_msg(WarnLogic, "Unable to expand ~ in %s", ret.toLatin1().constData()); - } - if ((fix & FileFixifyAbsolute) - || (!(fix & FileFixifyRelative) && project->isActiveConfig("no_fixpath"))) { - if ((fix & FileFixifyAbsolute) && QDir::isRelativePath(ret)) { - QString pwd = !(fix & FileFixifyFromOutdir) ? project->projectDir() : Option::output_dir; - { - QFileInfo in_fi(fileInfo(pwd)); - if (in_fi.exists()) - pwd = in_fi.canonicalFilePath(); - } - if (!pwd.endsWith(QLatin1Char('/'))) - pwd += QLatin1Char('/'); - ret.prepend(pwd); - } - ret = Option::fixPathToTargetOS(ret, false, canon); - } else { //fix it.. - QString out_dir = (fix & FileFixifyToIndir) ? project->projectDir() : Option::output_dir; - QString in_dir = !(fix & FileFixifyFromOutdir) ? project->projectDir() : Option::output_dir; - { - QFileInfo in_fi(fileInfo(in_dir)); - if(in_fi.exists()) - in_dir = in_fi.canonicalFilePath(); - QFileInfo out_fi(fileInfo(out_dir)); - if(out_fi.exists()) - out_dir = out_fi.canonicalFilePath(); - } - - QString qfile(Option::normalizePath(ret)); - QFileInfo qfileinfo(fileInfo(qfile)); - if(out_dir != in_dir || !qfileinfo.isRelative()) { - if(qfileinfo.isRelative()) { - ret = in_dir + "/" + qfile; - qfileinfo.setFile(ret); - } - ret = Option::fixPathToTargetOS(ret, false, canon); - QString match_dir = Option::fixPathToTargetOS(out_dir, false, canon); - if(ret == match_dir) { - ret = ""; - } else if(ret.startsWith(match_dir + Option::dir_sep)) { - ret = ret.mid(match_dir.length() + Option::dir_sep.length()); - } else { - //figure out the depth - int depth = 4; - if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE || - Option::qmake_mode == Option::QMAKE_GENERATE_PRL) { - if(project && !project->isEmpty("QMAKE_PROJECT_DEPTH")) - depth = project->first("QMAKE_PROJECT_DEPTH").toInt(); - else if(Option::mkfile::cachefile_depth != -1) - depth = Option::mkfile::cachefile_depth; - } - //calculate how much can be removed - QString dot_prefix; - for(int i = 1; i <= depth; i++) { - int sl = match_dir.lastIndexOf(Option::dir_sep); - if(sl == -1) - break; - match_dir = match_dir.left(sl); - if(match_dir.isEmpty()) - break; - if(ret.startsWith(match_dir + Option::dir_sep)) { - //concat - int remlen = ret.length() - (match_dir.length() + 1); - if(remlen < 0) - remlen = 0; - ret = ret.right(remlen); - //prepend - for(int o = 0; o < i; o++) - dot_prefix += ".." + Option::dir_sep; - break; - } - } - ret.prepend(dot_prefix); - } - } else { - ret = Option::fixPathToTargetOS(ret, false, canon); - } - } - if(ret.isEmpty()) - ret = "."; - debug_msg(3, "Fixed[%d,%d] %s :: to :: %s [%s::%s]", - int(fix), canon, orig_file.toLatin1().constData(), ret.toLatin1().constData(), - qmake_getpwd().toLatin1().constData(), Option::output_dir.toLatin1().constData()); - return ret; -} - -QMakeLocalFileName -MakefileGenerator::fixPathForFile(const QMakeLocalFileName &file, bool forOpen) -{ - if(forOpen) - return QMakeLocalFileName(fileFixify(file.real(), FileFixifyBackwards)); - return QMakeLocalFileName(fileFixify(file.real())); -} - -QFileInfo -MakefileGenerator::findFileInfo(const QMakeLocalFileName &file) -{ - return fileInfo(file.local()); -} - -QMakeLocalFileName -MakefileGenerator::findFileForDep(const QMakeLocalFileName &dep, const QMakeLocalFileName &file) -{ - QMakeLocalFileName ret; - if(!project->isEmpty("SKIP_DEPENDS")) { - bool found = false; - const ProStringList &nodeplist = project->values("SKIP_DEPENDS"); - for (ProStringList::ConstIterator it = nodeplist.begin(); - it != nodeplist.end(); ++it) { - QRegExp regx((*it).toQString()); - if(regx.indexIn(dep.local()) != -1) { - found = true; - break; - } - } - if(found) - return ret; - } - - ret = QMakeSourceFileInfo::findFileForDep(dep, file); - if(!ret.isNull()) - return ret; - - //these are some "hacky" heuristics it will try to do on an include - //however these can be turned off at runtime, I'm not sure how - //reliable these will be, most likely when problems arise turn it off - //and see if they go away.. - if(Option::mkfile::do_dep_heuristics) { - if(depHeuristicsCache.contains(dep.real())) - return depHeuristicsCache[dep.real()]; - - if(Option::output_dir != qmake_getpwd() - && QDir::isRelativePath(dep.real())) { //is it from the shadow tree - QList depdirs = QMakeSourceFileInfo::dependencyPaths(); - depdirs.prepend(fileInfo(file.real()).absoluteDir().path()); - QString pwd = qmake_getpwd(); - if(pwd.at(pwd.length()-1) != '/') - pwd += '/'; - for(int i = 0; i < depdirs.count(); i++) { - QString dir = depdirs.at(i).real(); - if(!QDir::isRelativePath(dir) && dir.startsWith(pwd)) - dir = dir.mid(pwd.length()); - if(QDir::isRelativePath(dir)) { - if(!dir.endsWith(Option::dir_sep)) - dir += Option::dir_sep; - QString shadow = fileFixify(dir + dep.local(), FileFixifyBackwards); - if(exists(shadow)) { - ret = QMakeLocalFileName(shadow); - goto found_dep_from_heuristic; - } - } - } - } - { //is it from an EXTRA_TARGET - const QString dep_basename = dep.local().section('/', -1); - const ProStringList &qut = project->values("QMAKE_EXTRA_TARGETS"); - for (ProStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it) { - QString targ = var(ProKey(*it + ".target")); - if(targ.isEmpty()) - targ = (*it).toQString(); - QString out = Option::fixPathToTargetOS(targ); - if(out == dep.real() || out.section(Option::dir_sep, -1) == dep_basename) { - ret = QMakeLocalFileName(out); - goto found_dep_from_heuristic; - } - } - } - { //is it from an EXTRA_COMPILER - const QString dep_basename = dep.local().section('/', -1); - const ProStringList &quc = project->values("QMAKE_EXTRA_COMPILERS"); - for (ProStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) { - const ProString &tmp_out = project->first(ProKey(*it + ".output")); - if(tmp_out.isEmpty()) - continue; - const ProStringList &tmp = project->values(ProKey(*it + ".input")); - for (ProStringList::ConstIterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) { - const ProStringList &inputs = project->values((*it2).toKey()); - for (ProStringList::ConstIterator input = inputs.begin(); input != inputs.end(); ++input) { - QString out = Option::fixPathToTargetOS( - replaceExtraCompilerVariables(tmp_out.toQString(), (*input).toQString(), QString(), NoShell)); - if (out == dep.real() || out.section(Option::dir_sep, -1) == dep_basename) { - ret = QMakeLocalFileName(fileFixify(out, FileFixifyBackwards)); - goto found_dep_from_heuristic; - } - } - } - } - } - found_dep_from_heuristic: - depHeuristicsCache.insert(dep.real(), ret); - } - return ret; -} - -QStringList -&MakefileGenerator::findDependencies(const QString &file) -{ - const QString fixedFile = fileFixify(file); - if(!dependsCache.contains(fixedFile)) { -#if 1 - QStringList deps = QMakeSourceFileInfo::dependencies(file); - if(file != fixedFile) - deps += QMakeSourceFileInfo::dependencies(fixedFile); -#else - QStringList deps = QMakeSourceFileInfo::dependencies(fixedFile); -#endif - dependsCache.insert(fixedFile, deps); - } - return dependsCache[fixedFile]; -} - -QString -MakefileGenerator::specdir() -{ - if (spec.isEmpty()) - spec = fileFixify(project->specDir()); - return spec; -} - -bool -MakefileGenerator::openOutput(QFile &file, const QString &build) const -{ - { - QString outdir; - if(!file.fileName().isEmpty()) { - if(QDir::isRelativePath(file.fileName())) - file.setFileName(Option::output_dir + "/" + file.fileName()); //pwd when qmake was run - QFileInfo fi(fileInfo(file.fileName())); - if(fi.isDir()) - outdir = file.fileName() + '/'; - } - if(!outdir.isEmpty() || file.fileName().isEmpty()) { - QString fname = "Makefile"; - if(!project->isEmpty("MAKEFILE")) - fname = project->first("MAKEFILE").toQString(); - file.setFileName(outdir + fname); - } - } - if(QDir::isRelativePath(file.fileName())) { - QString fname = Option::output_dir; //pwd when qmake was run - if(!fname.endsWith("/")) - fname += "/"; - fname += file.fileName(); - file.setFileName(fname); - } - if(!build.isEmpty()) - file.setFileName(file.fileName() + "." + build); - if(project->isEmpty("QMAKE_MAKEFILE")) - project->values("QMAKE_MAKEFILE").append(file.fileName()); - int slsh = file.fileName().lastIndexOf('/'); - if(slsh != -1) - mkdir(file.fileName().left(slsh)); - if(file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) { - QFileInfo fi(fileInfo(Option::output.fileName())); - QString od; - if(fi.isSymLink()) - od = fileInfo(fi.readLink()).absolutePath(); - else - od = fi.path(); - od = QDir::fromNativeSeparators(od); - if(QDir::isRelativePath(od)) { - QString dir = Option::output_dir; - if (!dir.endsWith('/') && !od.isEmpty()) - dir += '/'; - od.prepend(dir); - } - Option::output_dir = od; - return true; - } - return false; -} - -QString -MakefileGenerator::pkgConfigFileName(bool fixify) -{ - QString ret = project->first("QMAKE_PKGCONFIG_FILE").toQString(); - if (ret.isEmpty()) { - ret = project->first("TARGET").toQString(); - int slsh = ret.lastIndexOf(Option::dir_sep); - if (slsh != -1) - ret = ret.right(ret.length() - slsh - 1); - if (ret.startsWith("lib")) - ret = ret.mid(3); - int dot = ret.indexOf('.'); - if (dot != -1) - ret = ret.left(dot); - } - ret += Option::pkgcfg_ext; - QString subdir = project->first("QMAKE_PKGCONFIG_DESTDIR").toQString(); - if(!subdir.isEmpty()) { - // initOutPaths() appends dir_sep, but just to be safe.. - if (!subdir.endsWith(Option::dir_sep)) - ret.prepend(Option::dir_sep); - ret.prepend(subdir); - } - if(fixify) { - if(QDir::isRelativePath(ret) && !project->isEmpty("DESTDIR")) - ret.prepend(project->first("DESTDIR").toQString()); - ret = fileFixify(ret, FileFixifyBackwards); - } - return ret; -} - -QString -MakefileGenerator::pkgConfigPrefix() const -{ - if(!project->isEmpty("QMAKE_PKGCONFIG_PREFIX")) - return project->first("QMAKE_PKGCONFIG_PREFIX").toQString(); - return project->propertyValue(ProKey("QT_INSTALL_PREFIX")).toQString(); -} - -QString -MakefileGenerator::pkgConfigFixPath(QString path) const -{ - QString prefix = pkgConfigPrefix(); - if(path.startsWith(prefix)) - path.replace(prefix, "${prefix}"); - return path; -} - -void -MakefileGenerator::writePkgConfigFile() -{ - QString fname = pkgConfigFileName(); - mkdir(fileInfo(fname).path()); - QFile ft(fname); - if(!ft.open(QIODevice::WriteOnly)) - return; - QString ffname(fileFixify(fname)); - project->values("ALL_DEPS").append(ffname); - project->values("QMAKE_DISTCLEAN").append(ffname); - QTextStream t(&ft); - - QString prefix = pkgConfigPrefix(); - QString libDir = project->first("QMAKE_PKGCONFIG_LIBDIR").toQString(); - if(libDir.isEmpty()) - libDir = prefix + "/lib"; - QString includeDir = project->first("QMAKE_PKGCONFIG_INCDIR").toQString(); - if(includeDir.isEmpty()) - includeDir = prefix + "/include"; - - t << "prefix=" << prefix << endl; - t << "exec_prefix=${prefix}\n" - << "libdir=" << pkgConfigFixPath(libDir) << "\n" - << "includedir=" << pkgConfigFixPath(includeDir) << endl; - t << endl; - - //extra PKGCONFIG variables - const ProStringList &pkgconfig_vars = project->values("QMAKE_PKGCONFIG_VARIABLES"); - for(int i = 0; i < pkgconfig_vars.size(); ++i) { - const ProString &var = project->first(ProKey(pkgconfig_vars.at(i) + ".name")); - QString val = project->values(ProKey(pkgconfig_vars.at(i) + ".value")).join(' '); - if(var.isEmpty()) - continue; - if(val.isEmpty()) { - const ProStringList &var_vars = project->values(ProKey(pkgconfig_vars.at(i) + ".variable")); - for(int v = 0; v < var_vars.size(); ++v) { - const ProStringList &vars = project->values(var_vars.at(v).toKey()); - for(int var = 0; var < vars.size(); ++var) { - if(!val.isEmpty()) - val += " "; - val += pkgConfigFixPath(vars.at(var).toQString()); - } - } - } - if (!val.isEmpty()) - t << var << "=" << val << endl; - } - - t << endl; - - QString name = project->first("QMAKE_PKGCONFIG_NAME").toQString(); - if(name.isEmpty()) { - name = project->first("QMAKE_ORIG_TARGET").toQString().toLower(); - name.replace(0, 1, name[0].toUpper()); - } - t << "Name: " << name << endl; - QString desc = project->values("QMAKE_PKGCONFIG_DESCRIPTION").join(' '); - if(desc.isEmpty()) { - if(name.isEmpty()) { - desc = project->first("QMAKE_ORIG_TARGET").toQString().toLower(); - desc.replace(0, 1, desc[0].toUpper()); - } else { - desc = name; - } - if(project->first("TEMPLATE") == "lib") { - if(project->isActiveConfig("plugin")) - desc += " Plugin"; - else - desc += " Library"; - } else if(project->first("TEMPLATE") == "app") { - desc += " Application"; - } - } - t << "Description: " << desc << endl; - ProString version = project->first("QMAKE_PKGCONFIG_VERSION"); - if (version.isEmpty()) - version = project->first("VERSION"); - if (!version.isEmpty()) - t << "Version: " << version << endl; - - // libs - t << "Libs: "; - QString pkgConfiglibName; - if (target_mode == TARG_MAC_MODE && project->isActiveConfig("lib_bundle")) { - if (libDir != QLatin1String("/System/Library/Frameworks") - && libDir != QLatin1String("/Library/Frameworks")) { - t << "-F${libdir} "; - } - ProString bundle; - if (!project->isEmpty("QMAKE_FRAMEWORK_BUNDLE_NAME")) - bundle = project->first("QMAKE_FRAMEWORK_BUNDLE_NAME"); - else - bundle = project->first("TARGET"); - int suffix = bundle.lastIndexOf(".framework"); - if (suffix != -1) - bundle = bundle.left(suffix); - pkgConfiglibName = "-framework " + bundle + " "; - } else { - if (!project->values("QMAKE_DEFAULT_LIBDIRS").contains(libDir)) - t << "-L${libdir} "; - pkgConfiglibName = "-l" + project->first("QMAKE_ORIG_TARGET"); - if (project->isActiveConfig("shared")) - pkgConfiglibName += project->first("TARGET_VERSION_EXT").toQString(); - } - t << shellQuote(pkgConfiglibName) << " \n"; - - ProStringList libs; - if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS")) { - libs = project->values("QMAKE_INTERNAL_PRL_LIBS"); - } else { - libs << "QMAKE_LIBS"; //obvious one - } - libs << "QMAKE_LIBS_PRIVATE"; - libs << "QMAKE_LFLAGS_THREAD"; //not sure about this one, but what about things like -pthread? - t << "Libs.private: "; - for (ProStringList::ConstIterator it = libs.begin(); it != libs.end(); ++it) { - t << fixLibFlags((*it).toKey()).join(' ') << ' '; - } - t << endl; - - // flags - // ### too many - t << "Cflags: " - // << var("QMAKE_CXXFLAGS") << " " - << varGlue("PRL_EXPORT_DEFINES","-D"," -D"," ") - << varGlue("PRL_EXPORT_CXXFLAGS", "", " ", " ") - << varGlue("QMAKE_PKGCONFIG_CFLAGS", "", " ", " ") - // << varGlue("DEFINES","-D"," -D"," ") - ; - if (!project->values("QMAKE_DEFAULT_INCDIRS").contains(includeDir)) - t << "-I${includedir}"; - t << endl; - - // requires - const QString requires = project->values("QMAKE_PKGCONFIG_REQUIRES").join(' '); - if (!requires.isEmpty()) { - t << "Requires: " << requires << endl; - } - - t << endl; -} - -static QString windowsifyPath(const QString &str) -{ - // The paths are escaped in prl files, so every slash needs to turn into two backslashes. - // Then each backslash needs to be escaped for sed. And another level for C quoting here. - return QString(str).replace('/', "\\\\\\\\"); -} - -QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst) -{ - QString ret; - if (project->isEmpty(replace_rule) - || project->isActiveConfig("no_sed_meta_install")) { - ret += "-$(INSTALL_FILE) " + escapeFilePath(src) + ' ' + escapeFilePath(dst); - } else { - ret += "-$(SED)"; - const ProStringList &replace_rules = project->values(replace_rule); - for (int r = 0; r < replace_rules.size(); ++r) { - const ProString match = project->first(ProKey(replace_rules.at(r) + ".match")), - replace = project->first(ProKey(replace_rules.at(r) + ".replace")); - if (!match.isEmpty() /*&& match != replace*/) { - ret += " -e " + shellQuote("s," + match + "," + replace + ",g"); - if (isWindowsShell() && project->first(ProKey(replace_rules.at(r) + ".CONFIG")).contains("path")) - ret += " -e " + shellQuote("s," + windowsifyPath(match.toQString()) - + "," + windowsifyPath(replace.toQString()) + ",gi"); - } - } - ret += ' ' + escapeFilePath(src) + " > " + escapeFilePath(dst); - } - return ret; -} - -QString MakefileGenerator::shellQuote(const QString &str) -{ - return isWindowsShell() ? QMakeInternal::IoUtils::shellQuoteWin(str) - : QMakeInternal::IoUtils::shellQuoteUnix(str); -} - -QT_END_NAMESPACE diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/3rdparty/pcre/pcre16_valid_utf16.c b/Telegram/_qt_5_5_0_patch/qtbase/src/3rdparty/pcre/pcre16_valid_utf16.c deleted file mode 100644 index 96f6e19f6..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/3rdparty/pcre/pcre16_valid_utf16.c +++ /dev/null @@ -1,137 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* PCRE is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. - - Written by Philip Hazel - Copyright (c) 1997-2013 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - - -/* This module contains an internal function for validating UTF-16 character -strings. */ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -/* Generate code with 16 bit character support. */ -#define COMPILE_PCRE16 - -#include "pcre_internal.h" - - -/************************************************* -* Validate a UTF-16 string * -*************************************************/ - -/* This function is called (optionally) at the start of compile or match, to -check that a supposed UTF-16 string is actually valid. The early check means -that subsequent code can assume it is dealing with a valid string. The check -can be turned off for maximum performance, but the consequences of supplying an -invalid string are then undefined. - -From release 8.21 more information about the details of the error are passed -back in the returned value: - -PCRE_UTF16_ERR0 No error -PCRE_UTF16_ERR1 Missing low surrogate at the end of the string -PCRE_UTF16_ERR2 Invalid low surrogate -PCRE_UTF16_ERR3 Isolated low surrogate -PCRE_UTF16_ERR4 Unused (was non-character) - -Arguments: - string points to the string - length length of string, or -1 if the string is zero-terminated - errp pointer to an error position offset variable - -Returns: = 0 if the string is a valid UTF-16 string - > 0 otherwise, setting the offset of the bad character -*/ - -int -PRIV(valid_utf)(PCRE_PUCHAR string, int length, int *erroroffset) -{ -#ifdef SUPPORT_UTF -register PCRE_PUCHAR p; -register pcre_uint32 c; - -if (length < 0) - { - for (p = string; *p != 0; p++); - length = p - string; - } - -for (p = string; length-- > 0; p++) - { - c = *p; - - if ((c & 0xf800) != 0xd800) - { - /* Normal UTF-16 code point. Neither high nor low surrogate. */ - } - else if ((c & 0xfc00) == 0xd800) - { - /* High surrogate. Must be a followed by a low surrogate. */ - if (length == 0) - { - *erroroffset = p - string; - return PCRE_UTF16_ERR1; - } - p++; - length--; - if ((*p & 0xfc00) != 0xdc00) - { - *erroroffset = p - string; - return PCRE_UTF16_ERR2; - } - } - else - { - /* Isolated low surrogate. Always an error. */ - *erroroffset = p - string; - return PCRE_UTF16_ERR3; - } - } - -#else /* SUPPORT_UTF */ -(void)(string); /* Keep picky compilers happy */ -(void)(length); -(void)(erroroffset); -#endif /* SUPPORT_UTF */ - -return PCRE_UTF16_ERR0; /* This indicates success */ -} - -/* End of pcre16_valid_utf16.c */ diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/corelib/tools/qunicodetables.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/corelib/tools/qunicodetables.cpp deleted file mode 100644 index 76c693360..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/corelib/tools/qunicodetables.cpp +++ /dev/null @@ -1,12111 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/* This file is autogenerated from the Unicode 7.0 database. Do not edit */ - -#include "qunicodetables_p.h" - -QT_BEGIN_NAMESPACE - -namespace QUnicodeTables { - -static const unsigned short uc_property_trie[] = { - // 0 - 0x11000 - - 6256, 6288, 6320, 6352, 6384, 6416, 6448, 6480, - 6512, 6544, 6576, 6608, 6640, 6672, 6704, 6736, - 6768, 6800, 6832, 6864, 6896, 6928, 6960, 6992, - 7024, 7056, 7088, 7120, 7152, 7184, 7216, 7248, - 7280, 7312, 7344, 7376, 7408, 7440, 7472, 7504, - 7536, 7568, 7600, 7632, 7664, 7696, 7728, 7760, - 7792, 7824, 7856, 7888, 7920, 7952, 7984, 8016, - 8048, 8080, 8112, 8144, 8176, 8208, 8240, 8272, - 8304, 8336, 8368, 8400, 8400, 8432, 8464, 8496, - 8528, 8560, 8592, 8624, 8656, 8688, 8720, 8752, - 8784, 8816, 8848, 8880, 8912, 8944, 8976, 9008, - 9040, 9072, 9104, 9136, 9168, 9200, 9232, 9264, - 9296, 9328, 9360, 9392, 9424, 9456, 9488, 9520, - 9552, 9584, 9616, 9648, 9680, 9712, 9744, 9776, - 9808, 9840, 9872, 9904, 9936, 9968, 10000, 9904, - 10032, 10064, 10096, 10128, 10160, 10192, 10224, 9904, - - 10256, 10288, 10320, 10352, 10384, 10416, 10448, 10480, - 10512, 10512, 10544, 10576, 10608, 10640, 10672, 10704, - 10736, 10768, 10800, 10768, 10832, 10864, 10896, 10928, - 10960, 10768, 10992, 11024, 11056, 11088, 11088, 11120, - 11152, 11184, 11184, 11184, 11184, 11184, 11184, 11184, - 11184, 11184, 11184, 11184, 11184, 11184, 11184, 11184, - 11184, 11184, 11184, 11216, 11248, 11280, 11280, 11312, - 11344, 11376, 11408, 11440, 11472, 11504, 11536, 11568, - 11600, 11632, 11664, 11696, 11728, 11760, 11792, 11824, - 11856, 11888, 11920, 11952, 11984, 12016, 12048, 12080, - 12112, 12144, 12176, 12208, 12240, 12272, 9904, 9904, - 12304, 12336, 12368, 12400, 12432, 12464, 12496, 12528, - 12560, 12592, 12624, 12656, 9904, 9904, 12688, 12720, - 12752, 12784, 12816, 12848, 12880, 12912, 12944, 12976, - 13008, 13008, 13008, 13008, 13040, 13008, 13008, 13072, - 13104, 13136, 13168, 13200, 13232, 13264, 13296, 13328, - - 13360, 13392, 13424, 13456, 13488, 13520, 13552, 13584, - 13616, 13648, 13680, 13712, 13744, 13776, 13808, 13840, - 13872, 13904, 13936, 13968, 14000, 14032, 14064, 14096, - 14128, 14160, 14192, 14224, 14256, 14288, 14320, 14352, - 14384, 14416, 14448, 14480, 14512, 14544, 14576, 14608, - 14384, 14384, 14384, 14384, 14640, 14672, 14704, 14736, - 14768, 14800, 14384, 14832, 14864, 14896, 14928, 14960, - 14992, 15024, 15056, 15088, 15120, 15152, 15184, 15216, - 15248, 15248, 15248, 15248, 15248, 15248, 15248, 15248, - 15280, 15280, 15280, 15280, 15312, 15344, 15376, 15408, - 15440, 15472, 15280, 15504, 15536, 15568, 15600, 15632, - 15664, 15696, 15728, 15760, 15792, 15824, 15856, 9904, - 15888, 15920, 15952, 15984, 16016, 16016, 16016, 16048, - 16080, 16112, 16144, 16176, 16208, 16240, 16240, 16272, - 16304, 16336, 16368, 9904, 16400, 16432, 16432, 16464, - 16496, 16496, 16496, 16496, 16496, 16496, 16528, 16560, - - 16592, 16624, 16656, 16688, 16720, 16752, 16784, 16816, - 16848, 16880, 16912, 16912, 16944, 16976, 17008, 17040, - 17072, 17104, 17136, 17168, 17104, 17200, 17232, 17264, - 17296, 17296, 17328, 17360, 17392, 17392, 17424, 17456, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17488, 17488, 17488, - 17488, 17488, 17488, 17488, 17488, 17520, 17552, 17552, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17584, 17584, 17584, - 17584, 17584, 17584, 17584, 17584, 17616, 17648, 17680, - - 17712, 17744, 17744, 17744, 17744, 17744, 17744, 17744, - 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744, - 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744, - 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744, - 17744, 17744, 17744, 17744, 17776, 17808, 17840, 17872, - 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904, - 17936, 17968, 18000, 18032, 18064, 18096, 18096, 18128, - 18160, 18192, 18224, 18256, 18288, 18320, 9904, 18352, - 18384, 18416, 18448, 18480, 18512, 18544, 18576, 18608, - 18640, 18672, 18704, 18736, 18768, 18800, 18832, 18864, - 18896, 18928, 18960, 18992, 19024, 19056, 19088, 19120, - 19152, 19184, 19216, 19248, 9904, 9904, 19280, 19312, - 19344, 19376, 19408, 19440, 19472, 19504, 19536, 19344, - 19376, 19408, 19440, 19472, 19504, 19536, 19344, 19376, - 19408, 19440, 19472, 19504, 19536, 19344, 19376, 19408, - 19440, 19472, 19504, 19536, 19344, 19376, 19408, 19440, - - 19472, 19504, 19536, 19344, 19376, 19408, 19440, 19472, - 19504, 19536, 19344, 19376, 19408, 19440, 19472, 19504, - 19536, 19344, 19376, 19408, 19440, 19472, 19504, 19536, - 19344, 19376, 19408, 19440, 19472, 19504, 19536, 19344, - 19376, 19408, 19440, 19472, 19504, 19536, 19344, 19376, - 19408, 19440, 19472, 19504, 19536, 19344, 19376, 19408, - 19440, 19472, 19504, 19536, 19344, 19376, 19408, 19440, - 19472, 19504, 19536, 19344, 19376, 19408, 19440, 19472, - 19504, 19536, 19344, 19376, 19408, 19440, 19472, 19504, - 19536, 19344, 19376, 19408, 19440, 19472, 19504, 19536, - 19344, 19376, 19408, 19440, 19472, 19504, 19536, 19344, - 19376, 19408, 19440, 19472, 19504, 19536, 19344, 19376, - 19408, 19440, 19472, 19504, 19536, 19344, 19376, 19408, - 19440, 19472, 19504, 19536, 19344, 19376, 19408, 19440, - 19472, 19504, 19536, 19344, 19376, 19408, 19440, 19472, - 19504, 19536, 19344, 19376, 19408, 19440, 19472, 19504, - - 19536, 19344, 19376, 19408, 19440, 19472, 19504, 19536, - 19344, 19376, 19408, 19440, 19472, 19504, 19536, 19344, - 19376, 19408, 19440, 19472, 19504, 19536, 19344, 19376, - 19408, 19440, 19472, 19504, 19536, 19344, 19376, 19408, - 19440, 19472, 19504, 19536, 19344, 19376, 19408, 19440, - 19472, 19504, 19536, 19344, 19376, 19408, 19440, 19472, - 19504, 19536, 19344, 19376, 19408, 19440, 19472, 19504, - 19536, 19344, 19376, 19408, 19440, 19472, 19504, 19536, - 19344, 19376, 19408, 19440, 19472, 19504, 19536, 19344, - 19376, 19408, 19440, 19472, 19504, 19536, 19344, 19376, - 19408, 19440, 19472, 19504, 19536, 19344, 19376, 19408, - 19440, 19472, 19504, 19536, 19344, 19376, 19408, 19440, - 19472, 19504, 19536, 19344, 19376, 19408, 19440, 19472, - 19504, 19536, 19344, 19376, 19408, 19440, 19472, 19504, - 19536, 19344, 19376, 19408, 19440, 19472, 19504, 19536, - 19344, 19376, 19408, 19440, 19472, 19504, 19536, 19344, - - 19376, 19408, 19440, 19472, 19504, 19536, 19344, 19376, - 19408, 19440, 19472, 19504, 19536, 19344, 19376, 19408, - 19440, 19472, 19504, 19536, 19344, 19376, 19408, 19440, - 19472, 19504, 19536, 19344, 19376, 19408, 19440, 19472, - 19504, 19536, 19344, 19376, 19408, 19440, 19472, 19504, - 19536, 19344, 19376, 19408, 19440, 19472, 19504, 19536, - 19344, 19376, 19408, 19440, 19472, 19504, 19536, 19344, - 19376, 19408, 19440, 19472, 19504, 19568, 19600, 19632, - 19664, 19664, 19664, 19664, 19664, 19664, 19664, 19664, - 19664, 19664, 19664, 19664, 19664, 19664, 19664, 19664, - 19664, 19664, 19664, 19664, 19664, 19664, 19664, 19664, - 19664, 19664, 19664, 19664, 19664, 19664, 19664, 19664, - 19664, 19664, 19664, 19664, 19664, 19664, 19664, 19664, - 19664, 19664, 19664, 19664, 19664, 19664, 19664, 19664, - 19664, 19664, 19664, 19664, 19664, 19664, 19664, 19664, - 19664, 19664, 19664, 19664, 19664, 19664, 19664, 19664, - - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19696, 19696, 19696, 19696, 19696, 19696, 19696, 19696, - 19728, 19728, 19728, 19728, 19728, 19728, 19728, 19728, - 19760, 19792, 19824, 19856, 19888, 19888, 19920, 17680, - 19952, 19984, 20016, 20048, 20048, 20080, 20112, 20048, - 20048, 20048, 20048, 20048, 20048, 20048, 20048, 20048, - 20048, 20144, 20176, 20048, 20208, 20048, 20240, 20272, - 20304, 20336, 20368, 20400, 20048, 20048, 20048, 20432, - 20464, 20496, 20528, 20560, 20592, 20624, 20656, 20688, - - 20720, 20752, 20784, 9904, 20816, 20816, 20816, 20848, - 20880, 20912, 20944, 20976, 21008, 21040, 21072, 21104, - 9904, 9904, 9904, 9904, 21136, 21168, 21200, 21232, - 21264, 21296, 21328, 21360, 21392, 21424, 21456, 9904, - 21488, 21520, 21552, 21584, 21616, 21648, 9904, 9904, - 21680, 21712, 21744, 21776, 9904, 9904, 9904, 9904, - 21808, 21808, 21808, 21808, 21808, 21808, 21808, 21808, - 21808, 21840, 21872, 21904, 9904, 9904, 9904, 9904, - 21936, 21968, 22000, 22032, 22064, 22096, 8400, 8400, - 22128, 22160, 8400, 8400, 22192, 22224, 8400, 8400, - 22256, 22288, 22320, 22352, 22384, 8400, 22416, 22448, - 22480, 22512, 22544, 22576, 22608, 22640, 8400, 8400, - 22672, 22672, 22704, 8400, 8400, 8400, 8400, 8400, - 8400, 8400, 8400, 8400, 8400, 8400, 8400, 8400, - 8400, 8400, 8400, 22736, 8400, 8400, 8400, 8400, - 8400, 8400, 8400, 8400, 8400, 8400, 8400, 8400, - - // 0x11000 - 0x110000 - - 22768, 23024, 23280, 23536, 23792, 24048, 24304, 24560, - 24816, 24560, 25072, 24560, 24560, 24560, 24560, 24560, - 25328, 25328, 25328, 25584, 25840, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 26096, 26096, 26352, 26608, 26864, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 27120, 27120, 27376, 27632, 24560, 24560, 24560, 27888, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 28144, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 28400, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 28656, 28912, 29168, 29424, 29680, 29936, 30192, 30448, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 30704, 30960, 30960, 30960, 30960, 30960, 31216, 30960, - 31472, 31728, 31984, 32240, 32496, 32752, 33008, 33264, - 33520, 24560, 24560, 24560, 24560, 24560, 24560, 33776, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34032, 34032, - 34032, 34032, 34032, 34032, 34032, 34032, 34288, 34544, - 34544, 34544, 34544, 34544, 34544, 34544, 34544, 34544, - 34544, 34544, 34544, 34544, 34544, 34544, 34544, 34800, - 35056, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35568, 35568, 35824, 35312, 35312, 35312, 35312, 36080, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 35312, - 35312, 35312, 35312, 35312, 35312, 35312, 35312, 36080, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 33776, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 33776, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 33776, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 33776, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 33776, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 33776, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 33776, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 33776, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 33776, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 33776, - 36336, 36592, 36848, 36848, 36848, 36848, 36848, 36848, - 36848, 36848, 36848, 36848, 36848, 36848, 36848, 36848, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 24560, - 24560, 24560, 24560, 24560, 24560, 24560, 24560, 33776, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37360, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37104, - 37104, 37104, 37104, 37104, 37104, 37104, 37104, 37360, - - - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 6, 7, - - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 14, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 9, - - 14, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 39, 40, 41, 42, 43, - - 42, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 39, 45, 46, 36, 0, - - 0, 0, 0, 0, 0, 47, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - - 48, 49, 50, 12, 12, 12, 51, 14, - 52, 51, 53, 54, 36, 55, 51, 52, - 56, 57, 58, 59, 60, 61, 14, 62, - 52, 63, 53, 64, 65, 65, 65, 49, - - 66, 66, 66, 66, 66, 66, 38, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 38, 66, 66, 66, 66, 66, 66, 36, - 38, 66, 66, 66, 66, 66, 38, 67, - - 68, 68, 68, 68, 68, 68, 44, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 44, 68, 68, 68, 68, 68, 68, 36, - 44, 68, 68, 68, 68, 68, 44, 69, - - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 72, 73, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - - 70, 71, 70, 71, 70, 71, 72, 73, - 70, 71, 70, 71, 70, 71, 70, 71, - 74, 75, 76, 77, 70, 71, 70, 71, - 78, 70, 71, 70, 71, 70, 71, 76, - - 77, 72, 73, 70, 71, 70, 71, 70, - 71, 79, 72, 73, 70, 71, 70, 71, - 70, 71, 72, 73, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - - 70, 71, 70, 71, 70, 71, 72, 73, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 80, 70, 71, 70, 71, 70, 71, 81, - - 82, 83, 72, 73, 72, 73, 84, 72, - 73, 85, 85, 72, 73, 78, 86, 87, - 88, 72, 73, 85, 89, 90, 91, 92, - 72, 73, 93, 78, 91, 94, 95, 96, - - 70, 71, 72, 73, 72, 73, 97, 72, - 73, 97, 78, 78, 72, 73, 97, 70, - 71, 98, 98, 72, 73, 72, 73, 99, - 72, 73, 78, 100, 72, 73, 78, 101, - - 100, 100, 100, 100, 102, 103, 104, 102, - 103, 104, 102, 103, 104, 70, 71, 70, - 71, 70, 71, 70, 71, 70, 71, 70, - 71, 70, 71, 70, 71, 105, 70, 71, - - 70, 71, 70, 71, 72, 73, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 106, 102, 103, 104, 70, 71, 107, 108, - 109, 110, 70, 71, 70, 71, 70, 71, - - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 109, 110, 109, 110, 111, 112, 109, 110, - - 113, 114, 111, 112, 111, 112, 109, 110, - 109, 110, 109, 110, 109, 110, 109, 110, - 109, 110, 109, 110, 114, 114, 114, 115, - 115, 115, 116, 117, 118, 119, 120, 121, - - 122, 117, 123, 124, 125, 126, 127, 123, - 127, 123, 127, 123, 127, 123, 127, 123, - 128, 129, 130, 131, 132, 78, 133, 133, - 78, 134, 78, 135, 136, 78, 78, 78, - - 133, 137, 78, 138, 78, 139, 140, 78, - 141, 142, 78, 143, 144, 78, 78, 142, - 78, 145, 146, 78, 78, 147, 78, 78, - 78, 78, 78, 78, 78, 148, 78, 78, - - 149, 78, 78, 149, 78, 78, 78, 150, - 149, 151, 152, 152, 153, 78, 78, 78, - 78, 78, 154, 78, 100, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 155, 78, - - 78, 78, 78, 78, 78, 78, 78, 78, - 78, 156, 156, 156, 156, 156, 114, 114, - 157, 157, 157, 157, 157, 157, 157, 157, - 157, 158, 158, 159, 159, 159, 159, 159, - - 160, 160, 42, 42, 42, 42, 158, 158, - 161, 158, 158, 158, 161, 158, 158, 158, - 159, 159, 42, 42, 42, 42, 42, 162, - 52, 52, 52, 52, 52, 52, 42, 163, - - 157, 157, 157, 157, 157, 42, 42, 42, - 42, 42, 164, 164, 165, 166, 167, 168, - 168, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 168, 168, - - 169, 169, 169, 169, 169, 170, 169, 169, - 169, 169, 169, 169, 169, 170, 170, 169, - 170, 169, 170, 169, 169, 171, 172, 172, - 172, 172, 171, 173, 172, 172, 172, 172, - - 172, 174, 174, 175, 175, 175, 175, 176, - 176, 172, 172, 172, 172, 175, 175, 172, - 175, 175, 172, 172, 177, 177, 177, 177, - 178, 172, 172, 172, 172, 170, 170, 170, - - 179, 179, 169, 179, 179, 180, 181, 182, - 182, 182, 181, 181, 181, 182, 182, 183, - 184, 184, 184, 185, 185, 185, 185, 184, - 186, 187, 187, 188, 189, 190, 190, 191, - - 192, 192, 193, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 194, 194, - 195, 196, 195, 196, 197, 198, 195, 196, - 199, 199, 200, 201, 201, 201, 202, 203, - - 199, 199, 199, 199, 204, 205, 206, 207, - 208, 208, 208, 199, 209, 199, 210, 210, - 211, 212, 212, 212, 212, 212, 212, 212, - 212, 212, 212, 212, 212, 212, 212, 212, - - 212, 212, 199, 212, 212, 212, 212, 212, - 212, 212, 213, 213, 214, 215, 215, 215, - 216, 217, 217, 217, 217, 217, 217, 217, - 217, 217, 217, 217, 217, 217, 217, 217, - - 217, 217, 218, 217, 217, 217, 217, 217, - 217, 217, 219, 219, 220, 221, 221, 222, - 223, 224, 225, 226, 226, 227, 228, 229, - 230, 231, 232, 233, 232, 233, 232, 233, - - 232, 233, 234, 235, 234, 235, 234, 235, - 234, 235, 234, 235, 234, 235, 234, 235, - 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 243, 244, 246, 247, 247, 247, - - 248, 249, 250, 249, 250, 250, 250, 249, - 250, 250, 250, 250, 249, 248, 249, 250, - 251, 251, 251, 251, 251, 251, 251, 251, - 251, 252, 251, 251, 251, 251, 251, 251, - - 251, 251, 251, 251, 251, 251, 251, 251, - 251, 251, 251, 251, 251, 251, 251, 251, - 253, 253, 253, 253, 253, 253, 253, 253, - 253, 254, 253, 253, 253, 253, 253, 253, - - 253, 253, 253, 253, 253, 253, 253, 253, - 253, 253, 253, 253, 253, 253, 253, 253, - 255, 256, 257, 256, 257, 257, 257, 256, - 257, 257, 257, 257, 256, 255, 256, 257, - - 258, 259, 258, 259, 258, 259, 258, 259, - 258, 259, 258, 259, 258, 259, 258, 259, - 258, 259, 258, 259, 258, 259, 260, 261, - 258, 259, 258, 259, 258, 259, 258, 259, - - 258, 259, 262, 263, 263, 170, 170, 264, - 265, 265, 266, 267, 268, 269, 268, 269, - 258, 259, 258, 259, 258, 259, 258, 259, - 258, 259, 258, 259, 258, 259, 258, 259, - - 258, 259, 258, 259, 258, 259, 258, 259, - 258, 259, 258, 259, 258, 259, 258, 259, - 258, 259, 258, 259, 258, 259, 258, 259, - 258, 259, 258, 259, 258, 259, 258, 259, - - 270, 260, 261, 258, 259, 266, 267, 258, - 259, 266, 267, 258, 259, 266, 267, 271, - 260, 261, 260, 261, 258, 259, 260, 261, - 258, 259, 260, 261, 260, 261, 260, 261, - - 258, 259, 260, 261, 260, 261, 260, 261, - 258, 259, 260, 261, 272, 273, 260, 261, - 260, 261, 260, 261, 260, 261, 274, 275, - 260, 261, 276, 277, 276, 277, 276, 277, - - 266, 267, 266, 267, 266, 267, 266, 267, - 266, 267, 266, 267, 266, 267, 266, 267, - 276, 277, 276, 277, 278, 279, 278, 279, - 278, 279, 278, 279, 278, 279, 278, 279, - - 278, 279, 278, 279, 280, 281, 282, 283, - 284, 285, 284, 285, 284, 285, 284, 285, - 199, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 286, 286, 286, 286, 199, - 199, 287, 288, 288, 288, 289, 288, 288, - - 199, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 290, 290, 290, 290, 290, 290, - - 290, 290, 290, 290, 290, 290, 290, 291, - 199, 292, 293, 199, 199, 294, 294, 295, - 296, 297, 298, 298, 298, 298, 297, 298, - 298, 298, 299, 297, 298, 298, 298, 298, - - 298, 298, 300, 297, 297, 297, 297, 297, - 298, 298, 297, 298, 298, 299, 301, 298, - 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, - - 318, 319, 320, 318, 298, 300, 321, 322, - 296, 296, 296, 296, 296, 296, 296, 296, - 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 323, 323, 323, 323, 323, - - 323, 323, 323, 323, 323, 323, 323, 323, - 323, 323, 323, 296, 296, 296, 296, 296, - 323, 323, 323, 324, 325, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - - 326, 326, 326, 326, 327, 328, 329, 329, - 330, 331, 331, 332, 19, 333, 334, 334, - 335, 335, 335, 335, 335, 335, 336, 336, - 337, 338, 339, 340, 341, 342, 343, 344, - - 345, 346, 347, 347, 347, 347, 348, 349, - 350, 349, 350, 350, 350, 350, 350, 349, - 349, 349, 349, 350, 350, 350, 350, 350, - 350, 350, 350, 351, 351, 351, 351, 351, - - 352, 350, 350, 350, 350, 350, 350, 350, - 349, 350, 350, 353, 354, 355, 356, 357, - 358, 359, 360, 361, 361, 362, 363, 335, - 335, 364, 364, 364, 365, 364, 364, 366, - - 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 381, - 382, 349, 349, 349, 346, 383, 383, 383, - 384, 350, 350, 350, 350, 350, 350, 350, - - 350, 350, 350, 350, 350, 350, 350, 350, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 349, 349, 349, 349, - 349, 349, 350, 350, 350, 350, 350, 350, - - 350, 350, 350, 350, 350, 350, 350, 350, - 350, 350, 350, 350, 350, 350, 350, 350, - 350, 350, 350, 350, 350, 350, 350, 350, - 385, 385, 350, 350, 350, 350, 350, 385, - - 347, 350, 348, 349, 349, 349, 349, 349, - 349, 349, 349, 349, 350, 349, 350, 386, - 350, 350, 349, 347, 387, 349, 388, 388, - 388, 388, 388, 388, 388, 389, 390, 388, - - 388, 388, 388, 391, 388, 392, 392, 388, - 388, 390, 391, 388, 388, 391, 393, 393, - 394, 395, 396, 397, 398, 399, 400, 401, - 402, 403, 385, 385, 385, 404, 404, 405, - - 406, 406, 406, 407, 407, 407, 407, 407, - 407, 407, 407, 407, 407, 407, 342, 408, - 409, 410, 411, 411, 411, 409, 409, 409, - 409, 409, 411, 411, 411, 411, 409, 411, - - 411, 411, 411, 411, 411, 411, 411, 411, - 409, 411, 409, 411, 409, 412, 412, 413, - 414, 415, 414, 414, 415, 414, 414, 415, - 415, 415, 414, 415, 415, 414, 415, 414, - - 414, 414, 415, 414, 415, 414, 415, 414, - 415, 414, 414, 342, 342, 413, 412, 412, - 416, 416, 416, 416, 416, 416, 416, 416, - 416, 417, 417, 417, 416, 416, 416, 416, - - 416, 416, 416, 416, 416, 416, 416, 416, - 416, 416, 416, 417, 417, 416, 351, 351, - 351, 418, 351, 418, 418, 351, 351, 351, - 418, 418, 351, 351, 351, 351, 351, 351, - - 419, 419, 419, 419, 419, 419, 419, 419, - 419, 419, 419, 419, 419, 419, 419, 419, - 419, 419, 419, 419, 419, 419, 419, 419, - 419, 419, 419, 419, 419, 419, 419, 419, - - 419, 419, 419, 419, 419, 419, 420, 420, - 420, 420, 420, 420, 420, 420, 420, 420, - 420, 421, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - - 422, 423, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 432, 432, 432, 432, 432, - 432, 432, 432, 432, 432, 432, 432, 432, - 432, 432, 432, 432, 432, 432, 432, 432, - - 432, 432, 432, 432, 432, 432, 432, 432, - 432, 432, 432, 433, 433, 433, 433, 433, - 433, 433, 434, 433, 435, 435, 436, 437, - 438, 439, 440, 296, 296, 296, 296, 296, - - 441, 441, 441, 441, 441, 441, 441, 441, - 441, 441, 441, 441, 441, 441, 441, 441, - 441, 441, 441, 441, 441, 441, 442, 442, - 442, 442, 443, 442, 442, 442, 442, 442, - - 442, 442, 442, 442, 443, 442, 442, 442, - 443, 442, 442, 442, 442, 442, 296, 296, - 444, 444, 444, 444, 444, 444, 444, 444, - 444, 444, 444, 444, 444, 444, 444, 296, - - 445, 446, 446, 446, 446, 446, 445, 446, - 446, 445, 446, 446, 446, 446, 446, 445, - 446, 446, 446, 446, 445, 446, 447, 447, - 447, 448, 448, 448, 296, 296, 449, 296, - - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - - 450, 451, 450, 450, 450, 450, 450, 450, - 450, 450, 452, 452, 452, 453, 454, 451, - 451, 454, 454, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - - 342, 342, 342, 342, 455, 455, 456, 455, - 455, 456, 455, 455, 455, 456, 456, 456, - 457, 458, 459, 455, 455, 455, 456, 455, - 455, 456, 456, 455, 455, 455, 455, 460, - - 461, 462, 462, 463, 464, 465, 465, 465, - 465, 465, 465, 465, 465, 465, 465, 465, - 465, 465, 465, 465, 465, 465, 465, 465, - 465, 465, 465, 465, 465, 465, 465, 465, - - 465, 465, 465, 465, 465, 465, 465, 465, - 465, 466, 465, 465, 465, 465, 465, 465, - 465, 466, 465, 465, 466, 465, 465, 465, - 465, 465, 467, 468, 469, 465, 463, 463, - - 463, 462, 462, 462, 462, 462, 462, 462, - 462, 463, 463, 463, 463, 470, 471, 468, - 465, 170, 172, 472, 472, 461, 467, 467, - 473, 473, 473, 473, 473, 473, 473, 473, - - 465, 465, 462, 462, 474, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 488, 488, 488, 488, - 489, 490, 490, 491, 491, 492, 491, 491, - - 493, 494, 495, 495, 199, 496, 496, 496, - 496, 496, 496, 496, 496, 199, 199, 496, - 496, 199, 199, 496, 496, 496, 496, 496, - 496, 496, 496, 496, 496, 496, 496, 496, - - 496, 496, 496, 496, 496, 496, 496, 496, - 496, 199, 496, 496, 496, 496, 496, 496, - 496, 199, 496, 199, 199, 199, 496, 496, - 496, 496, 199, 199, 497, 498, 499, 495, - - 495, 494, 494, 494, 494, 199, 199, 495, - 495, 199, 199, 500, 500, 501, 502, 199, - 199, 199, 199, 199, 199, 199, 199, 499, - 199, 199, 199, 199, 503, 503, 199, 503, - - 496, 496, 494, 494, 199, 199, 504, 505, - 506, 507, 508, 509, 510, 511, 512, 513, - 496, 496, 514, 514, 515, 515, 515, 515, - 515, 516, 517, 518, 199, 199, 199, 199, - - 199, 519, 520, 521, 199, 522, 522, 522, - 522, 522, 522, 199, 199, 199, 199, 522, - 522, 199, 199, 522, 522, 522, 522, 522, - 522, 522, 522, 522, 522, 522, 522, 522, - - 522, 522, 522, 522, 522, 522, 522, 522, - 522, 199, 522, 522, 522, 522, 522, 522, - 522, 199, 522, 523, 199, 522, 523, 199, - 522, 522, 199, 199, 524, 199, 525, 525, - - 525, 520, 520, 199, 199, 199, 199, 520, - 520, 199, 199, 520, 520, 526, 199, 199, - 199, 527, 199, 199, 199, 199, 199, 199, - 199, 523, 523, 523, 522, 199, 523, 199, - - 199, 199, 199, 199, 199, 199, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, - 520, 520, 522, 522, 522, 527, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 538, 538, 539, 199, 540, 540, 540, - 540, 540, 540, 540, 541, 540, 199, 540, - 540, 540, 199, 540, 540, 540, 540, 540, - 540, 540, 540, 540, 540, 540, 540, 540, - - 540, 540, 540, 540, 540, 540, 540, 540, - 540, 199, 540, 540, 540, 540, 540, 540, - 540, 199, 540, 540, 199, 540, 540, 540, - 540, 540, 199, 199, 542, 540, 539, 539, - - 539, 538, 538, 538, 538, 538, 199, 538, - 538, 539, 199, 539, 539, 543, 199, 199, - 540, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 540, 541, 544, 544, 199, 199, 545, 546, - 547, 548, 549, 550, 551, 552, 553, 554, - 555, 556, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 557, 558, 558, 199, 559, 559, 559, - 559, 559, 559, 559, 559, 199, 199, 559, - 559, 199, 199, 559, 559, 559, 559, 559, - 559, 559, 559, 559, 559, 559, 559, 559, - - 559, 559, 559, 559, 559, 559, 559, 559, - 559, 199, 559, 559, 559, 559, 559, 559, - 559, 199, 559, 559, 199, 560, 559, 559, - 559, 559, 199, 199, 561, 559, 562, 557, - - 558, 557, 557, 557, 563, 199, 199, 558, - 564, 199, 199, 564, 564, 565, 199, 199, - 199, 199, 199, 199, 199, 199, 566, 562, - 199, 199, 199, 199, 567, 567, 199, 559, - - 559, 559, 563, 563, 199, 199, 568, 569, - 570, 571, 572, 573, 574, 575, 576, 577, - 578, 560, 579, 579, 579, 579, 579, 579, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 199, 580, 581, 199, 581, 581, 581, - 581, 581, 581, 199, 199, 199, 581, 581, - 581, 199, 581, 581, 582, 581, 199, 199, - 199, 581, 581, 199, 581, 199, 581, 581, - - 199, 199, 199, 581, 581, 199, 199, 199, - 581, 581, 581, 199, 199, 199, 581, 581, - 581, 581, 581, 581, 581, 581, 583, 581, - 581, 581, 199, 199, 199, 199, 584, 585, - - 580, 585, 585, 199, 199, 199, 585, 585, - 585, 199, 586, 586, 586, 587, 199, 199, - 588, 199, 199, 199, 199, 199, 199, 584, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 199, 199, 199, 199, 199, 589, 590, - 591, 592, 593, 594, 595, 596, 597, 598, - 599, 599, 599, 600, 600, 600, 600, 600, - 600, 601, 600, 199, 199, 199, 199, 199, - - 602, 603, 603, 603, 199, 604, 604, 604, - 604, 604, 604, 604, 604, 199, 604, 604, - 604, 199, 604, 604, 604, 604, 604, 604, - 604, 604, 604, 604, 604, 604, 604, 604, - - 604, 604, 604, 604, 604, 604, 604, 604, - 604, 199, 604, 604, 604, 604, 604, 604, - 604, 604, 604, 604, 605, 604, 604, 604, - 604, 604, 199, 199, 199, 606, 607, 607, - - 607, 603, 603, 603, 603, 199, 607, 607, - 608, 199, 607, 607, 607, 609, 199, 199, - 199, 199, 199, 199, 199, 610, 611, 199, - 606, 606, 199, 199, 199, 199, 199, 199, - - 604, 604, 612, 612, 199, 199, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, - 199, 199, 199, 199, 199, 199, 199, 199, - 623, 623, 623, 623, 623, 623, 623, 624, - - 199, 625, 626, 626, 199, 627, 627, 627, - 627, 627, 627, 627, 627, 199, 627, 627, - 627, 199, 627, 627, 627, 627, 627, 627, - 627, 627, 627, 627, 627, 627, 627, 627, - - 627, 627, 627, 627, 627, 627, 627, 627, - 627, 199, 627, 627, 627, 627, 627, 627, - 627, 627, 627, 627, 199, 627, 627, 627, - 627, 627, 199, 199, 628, 629, 626, 630, - - 631, 626, 632, 626, 626, 199, 630, 631, - 631, 199, 631, 631, 633, 634, 199, 199, - 199, 199, 199, 199, 199, 632, 632, 199, - 199, 199, 199, 199, 199, 199, 627, 199, - - 627, 627, 635, 635, 199, 199, 636, 637, - 638, 639, 640, 641, 642, 643, 644, 645, - 199, 646, 646, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 647, 648, 648, 199, 649, 649, 649, - 649, 649, 649, 649, 649, 199, 649, 649, - 649, 199, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, - - 649, 649, 649, 649, 649, 649, 649, 649, - 649, 650, 649, 649, 649, 649, 649, 649, - 649, 649, 649, 649, 649, 649, 649, 649, - 649, 649, 650, 199, 199, 651, 652, 648, - - 648, 653, 653, 653, 654, 199, 648, 648, - 648, 199, 655, 655, 655, 656, 650, 199, - 199, 199, 199, 199, 199, 199, 199, 652, - 199, 199, 199, 199, 199, 199, 199, 199, - - 649, 649, 654, 654, 199, 199, 657, 658, - 659, 660, 661, 662, 663, 664, 665, 666, - 667, 667, 667, 667, 667, 667, 199, 199, - 199, 668, 651, 651, 651, 651, 651, 651, - - 199, 199, 669, 669, 199, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 199, - 199, 199, 670, 670, 670, 670, 670, 670, - - 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 670, 670, 670, 670, - 670, 670, 199, 670, 670, 670, 670, 670, - 670, 670, 670, 670, 199, 670, 199, 199, - - 670, 670, 670, 670, 670, 670, 670, 199, - 199, 199, 671, 199, 199, 199, 199, 672, - 669, 669, 673, 673, 673, 199, 673, 199, - 669, 669, 674, 669, 674, 674, 674, 672, - - 199, 199, 199, 199, 199, 199, 675, 676, - 677, 678, 679, 680, 681, 682, 683, 684, - 199, 199, 669, 669, 685, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, - - 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, - 686, 687, 686, 688, 687, 687, 687, 687, - 689, 689, 690, 199, 199, 199, 199, 12, - - 686, 686, 686, 686, 686, 686, 691, 687, - 692, 692, 692, 692, 687, 687, 687, 693, - 694, 695, 696, 697, 698, 699, 700, 701, - 702, 703, 704, 704, 199, 199, 199, 199, - - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 705, 705, 199, 705, 199, 199, 705, - 705, 199, 705, 199, 199, 705, 199, 199, - 199, 199, 199, 199, 705, 705, 705, 705, - 199, 705, 705, 705, 705, 705, 705, 705, - - 199, 705, 705, 705, 199, 705, 199, 705, - 199, 199, 705, 705, 199, 705, 705, 705, - 705, 706, 705, 707, 706, 706, 706, 706, - 708, 708, 199, 706, 706, 705, 199, 199, - - 705, 705, 705, 705, 705, 199, 709, 199, - 710, 710, 710, 710, 706, 706, 199, 199, - 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 199, 199, 721, 721, 722, 722, - - 723, 724, 724, 724, 725, 726, 725, 725, - 727, 725, 725, 728, 729, 730, 730, 730, - 730, 730, 727, 731, 730, 731, 731, 731, - 732, 732, 731, 731, 731, 731, 731, 731, - - 733, 734, 735, 736, 737, 738, 739, 740, - 741, 742, 743, 743, 743, 743, 743, 743, - 743, 743, 743, 743, 744, 732, 731, 732, - 731, 745, 746, 747, 746, 747, 748, 748, - - 723, 723, 723, 749, 723, 723, 723, 723, - 199, 723, 723, 723, 723, 749, 723, 723, - 723, 723, 749, 723, 723, 723, 723, 749, - 723, 723, 723, 723, 749, 723, 723, 723, - - 723, 723, 723, 723, 723, 723, 723, 723, - 723, 749, 750, 751, 751, 199, 199, 199, - 199, 752, 753, 754, 755, 754, 754, 756, - 754, 756, 753, 753, 753, 753, 757, 758, - - 753, 754, 759, 759, 760, 728, 759, 759, - 723, 723, 723, 723, 761, 762, 762, 762, - 757, 757, 757, 754, 757, 757, 763, 757, - 199, 757, 757, 757, 757, 754, 757, 757, - - 757, 757, 754, 757, 757, 757, 757, 754, - 757, 757, 757, 757, 754, 757, 763, 763, - 763, 757, 757, 757, 757, 757, 757, 757, - 763, 754, 763, 763, 763, 199, 764, 764, - - 765, 765, 765, 765, 765, 765, 766, 765, - 765, 765, 765, 765, 765, 199, 767, 765, - 768, 768, 769, 770, 771, 772, 772, 772, - 772, 773, 773, 199, 199, 199, 199, 199, - - 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, - 774, 774, 774, 774, 774, 774, 774, 774, - - 774, 774, 775, 774, 774, 774, 776, 774, - 775, 774, 774, 777, 778, 779, 780, 779, - 779, 781, 779, 782, 782, 782, 779, 783, - 778, 784, 785, 786, 786, 782, 782, 775, - - 787, 788, 789, 790, 791, 792, 793, 794, - 795, 796, 797, 797, 798, 798, 798, 798, - 774, 774, 774, 774, 774, 774, 781, 781, - 779, 779, 775, 775, 775, 775, 782, 782, - - 782, 775, 777, 777, 777, 775, 775, 777, - 777, 777, 777, 777, 777, 777, 775, 775, - 775, 782, 782, 782, 782, 775, 775, 775, - 775, 775, 775, 775, 775, 775, 775, 775, - - 775, 775, 782, 777, 786, 782, 782, 777, - 777, 777, 777, 777, 777, 799, 775, 777, - 800, 801, 802, 803, 804, 805, 806, 807, - 808, 809, 810, 810, 810, 811, 812, 812, - - 813, 813, 813, 813, 813, 813, 813, 813, - 813, 813, 813, 813, 813, 813, 813, 813, - 813, 813, 813, 813, 813, 813, 813, 813, - 813, 813, 813, 813, 813, 813, 813, 813, - - 813, 813, 813, 813, 813, 813, 199, 814, - 199, 199, 199, 199, 199, 814, 199, 199, - 815, 815, 815, 815, 815, 815, 815, 815, - 815, 815, 815, 815, 815, 815, 815, 815, - - 815, 815, 815, 815, 815, 815, 815, 815, - 815, 815, 815, 815, 815, 815, 815, 815, - 815, 815, 815, 815, 815, 815, 815, 816, - 816, 817, 817, 818, 819, 820, 820, 820, - - 821, 821, 821, 821, 821, 821, 821, 821, - 821, 821, 821, 821, 821, 821, 821, 821, - 821, 821, 821, 821, 821, 821, 821, 821, - 821, 821, 821, 821, 821, 821, 821, 821, - - 821, 821, 821, 821, 821, 821, 821, 821, - 821, 821, 821, 821, 821, 821, 821, 821, - 821, 821, 821, 821, 821, 821, 821, 821, - 821, 821, 822, 822, 822, 822, 822, 821, - - 823, 824, 824, 824, 824, 824, 824, 824, - 824, 824, 824, 824, 824, 824, 824, 824, - 824, 824, 824, 824, 824, 824, 823, 823, - 823, 823, 823, 823, 823, 823, 823, 823, - - 823, 823, 823, 823, 823, 823, 823, 823, - 823, 823, 823, 823, 823, 823, 823, 823, - 823, 823, 823, 823, 823, 823, 823, 823, - 823, 823, 823, 823, 823, 823, 823, 823, - - 823, 823, 823, 825, 825, 825, 825, 825, - 826, 826, 826, 826, 826, 826, 826, 826, - 826, 826, 826, 826, 826, 826, 826, 826, - 826, 826, 826, 826, 826, 826, 826, 826, - - 826, 826, 826, 827, 827, 827, 827, 827, - 827, 827, 827, 827, 827, 827, 827, 827, - 827, 827, 827, 827, 827, 827, 827, 827, - 827, 827, 827, 827, 827, 827, 827, 827, - - 827, 827, 827, 827, 827, 827, 827, 827, - 827, 827, 827, 827, 827, 827, 827, 827, - 827, 827, 827, 827, 827, 827, 827, 827, - 827, 827, 828, 828, 828, 828, 828, 828, - - 829, 829, 829, 829, 829, 829, 829, 830, - 829, 829, 829, 829, 829, 829, 829, 829, - 829, 829, 829, 829, 829, 829, 829, 829, - 829, 829, 829, 829, 829, 829, 829, 829, - - 829, 829, 829, 829, 829, 829, 829, 829, - 829, 829, 829, 829, 829, 829, 829, 829, - 829, 829, 829, 829, 829, 829, 829, 829, - 829, 829, 829, 829, 829, 829, 829, 829, - - 829, 829, 829, 829, 829, 829, 829, 830, - 829, 199, 829, 829, 829, 829, 199, 199, - 829, 829, 829, 829, 829, 829, 829, 199, - 829, 199, 829, 829, 829, 829, 199, 199, - - 829, 829, 829, 829, 829, 829, 829, 830, - 829, 199, 829, 829, 829, 829, 199, 199, - 829, 829, 829, 829, 829, 829, 829, 829, - 829, 829, 829, 829, 829, 829, 829, 829, - - 829, 829, 829, 829, 829, 829, 829, 829, - 829, 829, 829, 829, 829, 829, 829, 830, - 829, 199, 829, 829, 829, 829, 199, 199, - 829, 829, 829, 829, 829, 829, 829, 199, - - 829, 199, 829, 829, 829, 829, 199, 199, - 829, 829, 829, 829, 829, 829, 829, 830, - 829, 829, 829, 829, 829, 829, 829, 199, - 829, 829, 829, 829, 829, 829, 829, 829, - - 829, 829, 829, 829, 829, 829, 829, 829, - 829, 829, 829, 829, 829, 829, 829, 830, - 829, 829, 829, 829, 829, 829, 829, 829, - 829, 829, 829, 829, 829, 829, 829, 829, - - 829, 829, 829, 829, 829, 829, 829, 829, - 829, 829, 829, 829, 829, 829, 829, 830, - 829, 199, 829, 829, 829, 829, 199, 199, - 829, 829, 829, 829, 829, 829, 829, 830, - - 829, 829, 829, 829, 829, 829, 829, 830, - 829, 829, 829, 829, 829, 829, 829, 829, - 829, 829, 829, 829, 829, 829, 829, 829, - 829, 829, 829, 199, 199, 831, 831, 832, - - 833, 834, 835, 836, 836, 836, 836, 835, - 835, 837, 838, 839, 840, 841, 842, 843, - 844, 845, 846, 846, 846, 846, 846, 846, - 846, 846, 846, 846, 846, 199, 199, 199, - - 830, 830, 830, 830, 830, 830, 830, 830, - 830, 830, 830, 830, 830, 830, 830, 830, - 847, 847, 847, 847, 847, 847, 847, 847, - 847, 847, 199, 199, 199, 199, 199, 199, - - 848, 848, 848, 848, 848, 848, 848, 848, - 848, 848, 848, 848, 848, 848, 848, 848, - 848, 848, 848, 848, 848, 848, 848, 848, - 848, 848, 848, 848, 848, 848, 848, 848, - - 848, 848, 848, 848, 848, 848, 848, 848, - 848, 848, 848, 848, 848, 848, 848, 848, - 848, 848, 848, 848, 848, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 849, 850, 850, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 850, 850, 850, - - 850, 850, 850, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 850, 850, 850, - - 850, 850, 850, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 851, 852, 850, - 850, 850, 850, 850, 850, 850, 850, 853, - 853, 853, 853, 853, 853, 853, 853, 853, - - 854, 855, 855, 855, 855, 855, 855, 855, - 855, 855, 855, 855, 855, 855, 855, 855, - 855, 855, 855, 855, 855, 855, 855, 855, - 855, 855, 855, 856, 857, 199, 199, 199, - - 858, 858, 858, 858, 858, 858, 858, 858, - 858, 858, 858, 858, 858, 858, 858, 858, - 858, 858, 858, 858, 858, 858, 858, 858, - 858, 858, 858, 858, 858, 858, 858, 858, - - 858, 858, 858, 858, 858, 858, 858, 858, - 858, 858, 858, 859, 859, 859, 860, 860, - 860, 861, 861, 861, 861, 861, 861, 861, - 861, 199, 199, 199, 199, 199, 199, 199, - - 862, 862, 862, 862, 862, 862, 862, 862, - 862, 862, 862, 862, 862, 199, 862, 862, - 862, 862, 863, 863, 864, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 865, 865, 865, 865, 865, 865, 865, 865, - 865, 865, 865, 865, 865, 865, 865, 865, - 865, 865, 866, 866, 867, 868, 868, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 869, 869, 869, 869, 869, 869, 869, 869, - 869, 869, 869, 869, 869, 869, 869, 869, - 869, 869, 870, 870, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 871, 871, 871, 871, 871, 871, 871, 871, - 871, 871, 871, 871, 871, 199, 871, 871, - 871, 199, 872, 872, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 873, 873, 873, 873, 873, 873, 873, 873, - 873, 873, 873, 873, 873, 873, 873, 873, - 873, 873, 873, 873, 873, 873, 873, 873, - 873, 873, 873, 873, 873, 873, 873, 873, - - 873, 873, 873, 873, 873, 873, 873, 873, - 873, 873, 873, 873, 873, 873, 873, 873, - 873, 873, 873, 873, 874, 874, 875, 874, - 874, 874, 874, 874, 874, 874, 875, 875, - - 875, 875, 875, 875, 875, 875, 874, 875, - 875, 874, 874, 874, 874, 874, 874, 874, - 874, 874, 876, 874, 877, 877, 878, 879, - 877, 880, 877, 881, 873, 882, 199, 199, - - 883, 884, 885, 886, 887, 888, 889, 890, - 891, 892, 199, 199, 199, 199, 199, 199, - 893, 893, 893, 893, 893, 893, 893, 893, - 893, 893, 199, 199, 199, 199, 199, 199, - - 894, 894, 895, 896, 897, 898, 899, 900, - 901, 902, 903, 904, 904, 904, 905, 199, - 906, 907, 908, 909, 910, 911, 912, 913, - 914, 915, 199, 199, 199, 199, 199, 199, - - 916, 916, 916, 916, 916, 916, 916, 916, - 916, 916, 916, 916, 916, 916, 916, 916, - 916, 916, 916, 916, 916, 916, 916, 916, - 916, 916, 916, 916, 916, 916, 916, 916, - - 916, 916, 916, 917, 916, 916, 916, 916, - 916, 916, 916, 916, 916, 916, 916, 916, - 916, 916, 916, 916, 916, 916, 916, 916, - 916, 916, 916, 916, 916, 916, 916, 916, - - 916, 916, 916, 916, 916, 916, 916, 916, - 916, 916, 916, 916, 916, 916, 916, 916, - 916, 916, 916, 916, 916, 916, 916, 916, - 199, 199, 199, 199, 199, 199, 199, 199, - - 918, 918, 918, 918, 918, 918, 918, 916, - 916, 916, 916, 916, 916, 916, 916, 916, - 916, 916, 916, 916, 916, 916, 916, 916, - 916, 916, 916, 916, 916, 916, 916, 916, - - 916, 916, 916, 916, 916, 916, 916, 916, - 916, 919, 920, 199, 199, 199, 199, 199, - 853, 853, 853, 853, 853, 853, 853, 853, - 853, 853, 853, 853, 853, 853, 853, 853, - - 853, 853, 853, 853, 853, 853, 853, 853, - 853, 853, 853, 853, 853, 853, 853, 853, - 853, 853, 853, 853, 853, 853, 853, 853, - 853, 853, 853, 853, 853, 853, 853, 853, - - 853, 853, 853, 853, 853, 853, 853, 853, - 853, 853, 853, 853, 853, 853, 853, 853, - 853, 853, 853, 853, 853, 853, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 921, 921, 921, 921, 921, 921, 921, 921, - 921, 921, 921, 921, 921, 921, 921, 921, - 921, 921, 921, 921, 921, 921, 921, 921, - 921, 921, 921, 921, 921, 922, 922, 199, - - 923, 923, 923, 924, 924, 924, 924, 923, - 923, 924, 924, 924, 199, 199, 199, 199, - 924, 924, 923, 924, 924, 924, 924, 924, - 924, 925, 926, 927, 199, 199, 199, 199, - - 928, 199, 199, 199, 929, 929, 930, 931, - 932, 933, 934, 935, 936, 937, 938, 939, - 940, 940, 940, 940, 940, 940, 940, 940, - 940, 940, 940, 940, 940, 940, 940, 940, - - 940, 940, 940, 940, 940, 940, 940, 940, - 940, 940, 940, 940, 940, 940, 199, 199, - 940, 940, 940, 940, 940, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 941, 941, 941, 941, 941, 941, 941, 941, - 941, 941, 941, 941, 941, 941, 941, 941, - 941, 941, 941, 941, 941, 941, 941, 941, - 941, 941, 941, 941, 941, 941, 941, 941, - - 941, 941, 941, 941, 941, 941, 941, 941, - 941, 941, 942, 942, 199, 199, 199, 199, - 943, 943, 943, 943, 943, 944, 944, 944, - 943, 943, 944, 943, 943, 943, 943, 943, - - 943, 941, 941, 941, 941, 941, 941, 941, - 943, 943, 199, 199, 199, 199, 199, 199, - 945, 946, 947, 948, 949, 950, 951, 952, - 953, 954, 955, 199, 199, 199, 956, 956, - - 957, 957, 957, 957, 957, 957, 957, 957, - 957, 957, 957, 957, 957, 957, 957, 957, - 957, 957, 957, 957, 957, 957, 957, 957, - 957, 957, 957, 957, 957, 957, 957, 957, - - 958, 958, 958, 958, 958, 958, 958, 958, - 958, 958, 958, 958, 958, 958, 958, 958, - 958, 958, 958, 958, 958, 958, 958, 959, - 960, 961, 961, 962, 199, 199, 963, 963, - - 964, 964, 964, 964, 964, 964, 964, 964, - 964, 964, 964, 964, 964, 964, 964, 964, - 964, 964, 964, 964, 964, 964, 964, 964, - 964, 964, 964, 964, 964, 964, 964, 964, - - 964, 964, 964, 964, 964, 964, 964, 964, - 964, 964, 964, 964, 964, 964, 964, 964, - 964, 964, 964, 964, 964, 965, 966, 965, - 966, 966, 966, 966, 966, 966, 966, 199, - - 967, 968, 966, 968, 968, 966, 966, 966, - 966, 966, 966, 966, 966, 965, 965, 965, - 965, 965, 965, 966, 966, 969, 969, 969, - 969, 969, 969, 969, 969, 199, 199, 970, - - 971, 972, 973, 974, 975, 976, 977, 978, - 979, 980, 199, 199, 199, 199, 199, 199, - 971, 972, 973, 974, 975, 976, 977, 978, - 979, 980, 199, 199, 199, 199, 199, 199, - - 981, 981, 981, 981, 981, 981, 981, 982, - 983, 983, 983, 983, 981, 981, 199, 199, - 984, 984, 984, 984, 984, 985, 985, 985, - 985, 985, 985, 984, 984, 985, 986, 199, - - 987, 987, 987, 987, 988, 989, 990, 989, - 990, 989, 990, 989, 990, 989, 990, 989, - 989, 989, 990, 989, 989, 989, 989, 989, - 989, 989, 989, 989, 989, 989, 989, 989, - - 989, 989, 989, 989, 989, 989, 989, 989, - 989, 989, 989, 989, 989, 989, 989, 989, - 989, 989, 989, 989, 991, 992, 987, 987, - 987, 987, 987, 993, 987, 993, 988, 988, - - 993, 993, 987, 993, 994, 989, 989, 989, - 989, 989, 989, 989, 199, 199, 199, 199, - 995, 996, 997, 998, 999, 1000, 1001, 1002, - 1003, 1004, 1005, 1005, 1006, 1007, 1005, 1005, - - 1007, 1008, 1008, 1008, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1009, 1010, 1009, 1009, 1009, - 1009, 1009, 1009, 1009, 1008, 1008, 1008, 1008, - 1008, 1008, 1008, 1008, 1008, 199, 199, 199, - - 1011, 1011, 1012, 1013, 1013, 1013, 1013, 1013, - 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, - 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, - 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, - - 1013, 1012, 1011, 1011, 1011, 1011, 1012, 1012, - 1011, 1011, 1014, 1015, 1016, 1016, 1013, 1013, - 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, - 1025, 1026, 1027, 1027, 1027, 1027, 1027, 1027, - - 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, - 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, - 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, - 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, - - 1028, 1028, 1028, 1028, 1028, 1028, 1029, 1030, - 1031, 1031, 1030, 1030, 1030, 1031, 1030, 1031, - 1031, 1031, 1032, 1032, 199, 199, 199, 199, - 199, 199, 199, 199, 1033, 1033, 1033, 1033, - - 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, - 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, - 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, - 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, - - 1034, 1034, 1034, 1034, 1035, 1035, 1035, 1035, - 1035, 1035, 1035, 1035, 1036, 1036, 1036, 1036, - 1036, 1036, 1036, 1036, 1035, 1035, 1036, 1037, - 199, 199, 199, 1038, 1038, 1039, 1039, 1039, - - 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, - 1048, 1049, 199, 199, 199, 1034, 1034, 1034, - 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, - 1058, 1059, 1060, 1060, 1060, 1060, 1060, 1060, - - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, - 1061, 1061, 1061, 1061, 1061, 1061, 1062, 1062, - - 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, - 199, 199, 199, 199, 199, 199, 199, 199, - 1064, 1064, 1064, 1065, 1066, 1067, 1067, 1067, - 1067, 1067, 1064, 1064, 1067, 1067, 1067, 1067, - - 1064, 1068, 1066, 1066, 1066, 1066, 1066, 1066, - 1066, 1069, 1069, 1069, 1069, 1067, 1069, 1069, - 1069, 1069, 1068, 1070, 1071, 1072, 1072, 199, - 984, 984, 199, 199, 199, 199, 199, 199, - - 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 114, - - 114, 114, 114, 114, 114, 114, 1073, 1073, - 1073, 1073, 1073, 1074, 1075, 1075, 1075, 1076, - 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, - 1075, 1075, 1075, 1076, 1075, 1075, 1075, 1075, - - 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, - 1075, 1075, 1075, 1075, 1075, 1075, 1076, 1075, - 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, - 1075, 1075, 1075, 1075, 1075, 1077, 1077, 1077, - - 1077, 1077, 1075, 1075, 1075, 1075, 1077, 1077, - 1077, 1077, 1077, 114, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, - 1078, 1079, 115, 115, 115, 1080, 115, 115, - - 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 115, 1081, 1081, 1081, 1081, 1081, - - 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, - 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, - 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, - 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1082, - - 188, 188, 187, 188, 1083, 1083, 1083, 1083, - 1083, 1083, 1084, 1085, 1085, 1086, 1087, 1088, - 1089, 1085, 1085, 1085, 1085, 1085, 1085, 1085, - 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, - - 1085, 1085, 1085, 1085, 1085, 1085, 1085, 984, - 984, 984, 984, 984, 984, 984, 984, 984, - 984, 984, 984, 984, 984, 984, 199, 199, - 199, 199, 199, 199, 1090, 1067, 1083, 1084, - - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 1091, 1092, - 1093, 1094, 1095, 1096, 1097, 1097, 1098, 1097, - - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 70, 71, 70, 71, 70, 71, - 70, 71, 1099, 1100, 1099, 1100, 1099, 1100, - - 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, - 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, - 1101, 1101, 1101, 1101, 1101, 1101, 199, 199, - 1102, 1102, 1102, 1102, 1102, 1102, 199, 199, - - 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, - 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, - 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, - 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, - - 1101, 1101, 1101, 1101, 1101, 1101, 199, 199, - 1102, 1102, 1102, 1102, 1102, 1102, 199, 199, - 1103, 1101, 1104, 1101, 1105, 1101, 1106, 1101, - 199, 1102, 199, 1102, 199, 1102, 199, 1102, - - 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, - 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, - 1107, 1108, 1109, 1110, 1109, 1110, 1111, 1112, - 1113, 1114, 1115, 1116, 1117, 1118, 199, 199, - - 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, - 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, - 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, - 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, - - 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, - 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, - 1101, 1101, 1167, 1168, 1169, 199, 1170, 1171, - 1102, 1102, 1172, 1173, 1174, 204, 1175, 204, - - 204, 1176, 1177, 1178, 1179, 199, 1180, 1181, - 1182, 1183, 1182, 1183, 1184, 1176, 1176, 1176, - 1101, 1101, 1185, 1186, 199, 199, 1187, 1188, - 1102, 1102, 1189, 1190, 199, 1176, 1176, 1176, - - 1101, 1101, 1191, 1192, 1193, 1194, 1195, 1196, - 1102, 1102, 1197, 1198, 1199, 1176, 1200, 1200, - 199, 199, 1201, 1202, 1203, 199, 1204, 1205, - 1206, 1207, 1208, 1209, 1210, 1211, 204, 199, - - 1212, 1212, 1213, 1213, 1213, 1213, 1213, 1214, - 1213, 1213, 1213, 1215, 1216, 1217, 1218, 1219, - 1220, 1221, 1220, 1222, 1223, 1224, 14, 1225, - 1226, 1227, 1228, 1229, 1229, 1230, 1228, 1229, - - 14, 14, 14, 14, 1231, 1232, 1232, 1233, - 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, - 13, 13, 13, 1242, 1242, 1243, 1244, 1244, - 14, 1245, 1246, 14, 1247, 1248, 1225, 43, - - 43, 14, 14, 14, 1249, 16, 1250, 1251, - 1252, 1252, 1253, 1253, 1253, 1253, 1254, 1254, - 1254, 1254, 1255, 1256, 1257, 1258, 1259, 1260, - 1259, 1259, 1259, 1259, 1258, 1259, 1259, 1261, - - 1262, 1263, 1263, 1263, 1264, 1265, 1266, 1267, - 1268, 1269, 1270, 1270, 1270, 1270, 1270, 1270, - 1271, 1272, 199, 199, 1273, 1274, 1275, 1276, - 1277, 1278, 1279, 1279, 1280, 1281, 1282, 157, - - 1271, 63, 58, 59, 1273, 1274, 1275, 1276, - 1277, 1278, 1279, 1279, 1280, 1281, 1282, 199, - 1081, 1081, 1081, 1081, 1081, 1283, 1283, 1283, - 1283, 1283, 1283, 1283, 1283, 199, 199, 199, - - 12, 12, 12, 12, 12, 12, 12, 50, - 1284, 12, 12, 1285, 1286, 1287, 1287, 1287, - 1288, 1288, 1289, 1289, 1289, 1289, 1290, 1291, - 1291, 1292, 1293, 1294, 1295, 1295, 1296, 1296, - - 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, - 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, - 170, 170, 177, 177, 170, 170, 170, 170, - 177, 177, 177, 170, 170, 1297, 1297, 1297, - - 1297, 170, 1298, 1298, 1299, 1300, 1300, 194, - 1301, 194, 1300, 1302, 1084, 1084, 1084, 1084, - 1085, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1303, 1303, 1304, 1305, 51, 1303, 1303, 1304, - 51, 1305, 1306, 1304, 1304, 1304, 1306, 1306, - 1304, 1304, 1304, 1306, 51, 1304, 1307, 51, - 36, 1304, 1304, 1304, 1304, 1304, 51, 51, - - 1303, 1303, 1303, 51, 1304, 51, 1308, 51, - 1304, 51, 1309, 1310, 1304, 1304, 1311, 1306, - 1304, 1304, 1312, 1304, 1306, 1313, 1313, 1313, - 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1319, - - 1320, 1255, 1255, 1255, 1255, 1319, 1318, 1318, - 1318, 1318, 1321, 1255, 1322, 1323, 1324, 1325, - 1326, 1326, 1326, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, - - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, - 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, - - 1329, 1329, 1329, 111, 123, 1330, 1330, 1330, - 1330, 1326, 199, 199, 199, 199, 199, 199, - 36, 36, 36, 36, 36, 51, 51, 51, - 51, 51, 1331, 1331, 51, 51, 51, 51, - - 36, 51, 51, 36, 51, 51, 36, 51, - 51, 51, 51, 51, 51, 51, 1331, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 1332, 1331, 1331, - 51, 51, 36, 51, 36, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - - 36, 36, 36, 36, 1331, 36, 36, 36, - 1333, 1334, 1333, 1335, 1336, 1335, 36, 36, - 36, 36, 18, 57, 36, 1337, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - - 36, 36, 36, 36, 1331, 36, 1331, 36, - 36, 36, 36, 36, 1280, 1280, 36, 1280, - 1280, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 1338, 1339, 36, 36, - - 36, 1331, 36, 1340, 1331, 36, 36, 1331, - 36, 1331, 36, 36, 36, 36, 36, 36, - 36, 36, 1338, 1339, 1338, 1339, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - - 1331, 36, 1331, 36, 1338, 1339, 1338, 1339, - 1338, 1339, 1338, 1339, 36, 1331, 1341, 1342, - 1341, 1342, 1338, 1339, 1341, 1342, 1338, 1339, - 1341, 1342, 1338, 1339, 1338, 1339, 1338, 1339, - - 1341, 1342, 1338, 1339, 1341, 1342, 1338, 1339, - 1341, 1342, 1338, 1339, 36, 36, 36, 1338, - 1339, 1338, 1339, 36, 36, 36, 36, 36, - 1343, 36, 36, 36, 36, 36, 36, 36, - - 36, 36, 1338, 1339, 36, 36, 1344, 36, - 1345, 1346, 36, 1346, 1331, 1331, 1331, 1331, - 1338, 1339, 1338, 1339, 1338, 1339, 1338, 1339, - 36, 36, 36, 36, 36, 36, 36, 36, - - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 1338, 1339, 1338, 1339, 1347, 36, 36, - 1338, 1339, 36, 36, 36, 36, 1338, 1339, - 1338, 1339, 1338, 1339, 1338, 1339, 1338, 1339, - - 1341, 1342, 1341, 1342, 1338, 1339, 1338, 1339, - 1338, 1339, 1341, 1342, 1341, 1342, 36, 36, - 1338, 1339, 1348, 1348, 1348, 1255, 1349, 1349, - 1255, 1255, 1350, 1350, 1350, 1351, 1351, 1255, - - 51, 1315, 51, 51, 51, 51, 51, 51, - 16, 1250, 16, 1250, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 1352, 1352, 51, 51, 51, 51, - - 36, 36, 51, 51, 51, 51, 51, 51, - 51, 1353, 1354, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 1355, 1355, - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, - - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, - - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, - 1355, 1355, 1355, 1315, 1255, 1315, 1315, 1315, - - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1356, 1315, 1315, - 1315, 1315, 1315, 1255, 1255, 1255, 1255, 1255, - - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1321, 1321, 1321, 1321, - 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, - - 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, - 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1357, - 1357, 1322, 1322, 1322, 1322, 1322, 1322, 1322, - 1322, 1322, 1322, 1322, 1358, 1358, 1358, 1358, - - 1358, 1358, 1323, 1323, 1323, 1323, 1323, 1323, - 1359, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1361, 1361, 1361, 1361, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 199, 199, 199, 199, 199, - - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - - 51, 51, 51, 51, 51, 1315, 1315, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, - 1371, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 1363, 1364, 1365, 1366, - 1367, 1368, 1369, 1370, 1371, 65, 65, 65, - - 65, 65, 65, 65, 65, 65, 65, 65, - 63, 58, 59, 1273, 1274, 1275, 1276, 1277, - 1278, 1372, 1372, 1372, 1372, 1372, 1372, 1372, - 1372, 1372, 1372, 1372, 1373, 1373, 1373, 1373, - - 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, - 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, - 1373, 1373, 1373, 1373, 1373, 1373, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, - 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, - 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, - - 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, - 1375, 1375, 1376, 1377, 1377, 1377, 1377, 1377, - 1377, 1377, 1377, 1377, 1377, 1378, 1379, 1380, - 1381, 1382, 1383, 1384, 1385, 1386, 1377, 1387, - - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 1321, 1321, - 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, - - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 36, - 51, 51, 51, 51, 51, 51, 51, 51, - - 51, 36, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - - 1352, 1352, 1352, 1352, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 1388, 1388, 1321, 1321, - 1389, 1315, 1352, 1352, 1352, 1352, 1352, 1352, - - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 1352, 1352, 1352, 51, 51, 51, 51, - - 51, 51, 51, 51, 51, 51, 51, 51, - 1352, 51, 51, 51, 51, 51, 51, 36, - 1315, 1315, 1321, 1321, 1321, 1321, 1321, 1321, - 1321, 1321, 1321, 1321, 1321, 1321, 1322, 1389, - - 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, - 1321, 1321, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1322, 1322, 1322, 1322, 1322, 1322, - 1322, 1322, 1322, 1322, 1322, 1390, 1359, 1359, - - 1357, 1357, 1322, 1322, 1322, 1322, 1322, 1322, - 1322, 1322, 1322, 1322, 1391, 1322, 1322, 1322, - 1322, 1322, 1323, 1390, 1390, 1390, 1390, 1390, - 1390, 1390, 1390, 1390, 1390, 1392, 1392, 1392, - - 1393, 1393, 1393, 1393, 1392, 1392, 1392, 1392, - 1392, 1359, 1359, 1359, 1359, 1392, 1360, 1392, - 1392, 1392, 1359, 1392, 1392, 1359, 1359, 1359, - 1392, 1392, 1359, 1359, 1392, 1359, 1359, 1392, - - 1392, 1392, 1360, 1359, 1360, 1360, 1360, 1360, - 1359, 1359, 1392, 1359, 1359, 1359, 1359, 1359, - 1359, 1392, 1392, 1392, 1392, 1392, 1359, 1392, - 1392, 1392, 1392, 1359, 1359, 1392, 1392, 1392, - - 1394, 1352, 1352, 1352, 1352, 1360, 51, 51, - 1352, 1352, 1361, 1361, 1352, 1352, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - - 51, 51, 51, 51, 51, 51, 51, 51, - 1360, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 1360, 51, 1360, 51, - 51, 51, 51, 1360, 1360, 1360, 51, 1359, - 51, 51, 51, 1395, 1395, 1395, 1395, 1396, - - 1396, 51, 1397, 1397, 51, 51, 51, 51, - 1398, 1399, 1398, 1399, 1398, 1399, 1398, 1399, - 1398, 1399, 1398, 1399, 1398, 1399, 1400, 1401, - 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, - - 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, - 1408, 1409, 1400, 1401, 1402, 1403, 1404, 1405, - 1406, 1407, 1408, 1409, 51, 1360, 1360, 1360, - 51, 51, 51, 51, 51, 51, 51, 51, - - 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, - 1360, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 1360, - - 1410, 1410, 1410, 1411, 1412, 1413, 1414, 1358, - 1415, 1416, 1358, 1417, 1418, 1419, 1420, 1420, - 1255, 1255, 1255, 1255, 1255, 1421, 1422, 1255, - 1255, 1255, 1255, 1255, 1255, 1421, 1422, 1255, - - 1255, 1255, 1421, 1422, 1421, 1422, 1398, 1399, - 1398, 1399, 1398, 1399, 1423, 1424, 1423, 1424, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - - 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, - 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, - 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, - 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, - - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - - 1255, 1255, 1255, 1398, 1399, 1398, 1399, 1398, - 1399, 1398, 1399, 1398, 1399, 1426, 1427, 1428, - 1429, 1398, 1399, 1398, 1399, 1398, 1399, 1398, - 1399, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1430, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - - 1421, 1422, 1255, 1255, 1421, 1422, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1421, - 1422, 1421, 1422, 1255, 1421, 1422, 1255, 1255, - 1398, 1399, 1398, 1399, 1255, 1255, 1255, 1255, - - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1431, 1255, 1255, - 1421, 1422, 1255, 1255, 1398, 1399, 1255, 1255, - - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1320, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1421, 1422, 1421, 1422, 1255, - 1255, 1255, 1255, 1255, 1421, 1422, 1255, 1255, - 1255, 1255, 1255, 1255, 1421, 1422, 1255, 1255, - - 1255, 1255, 1255, 1255, 1421, 1422, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, - 1255, 1255, 1255, 1255, 1320, 1320, 1320, 1255, - 1255, 1421, 1422, 1255, 1255, 1421, 1422, 1421, - - 1422, 1421, 1422, 1421, 1422, 1255, 1255, 1255, - 1255, 1255, 1255, 1421, 1422, 1255, 1255, 1255, - 1255, 1421, 1422, 1421, 1422, 1421, 1422, 1421, - 1422, 1421, 1422, 1421, 1422, 1255, 1255, 1255, - - 1255, 1421, 1422, 1255, 1255, 1255, 1421, 1422, - 1421, 1422, 1421, 1422, 1421, 1422, 1255, 1421, - 1422, 1255, 1255, 1421, 1422, 1255, 1255, 1255, - 1255, 1255, 1255, 1421, 1422, 1421, 1422, 1421, - - 1422, 1421, 1422, 1421, 1422, 1421, 1422, 1255, - 1255, 1255, 1255, 1255, 1255, 1421, 1422, 1421, - 1422, 1421, 1422, 1421, 1422, 1421, 1422, 1255, - 1255, 1255, 1255, 1255, 1432, 1255, 1433, 1255, - - 1255, 1255, 1255, 1434, 1435, 1434, 1255, 1255, - 1255, 1255, 1255, 1255, 1421, 1422, 1255, 1255, - 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1421, - 1422, 1421, 1422, 1255, 1255, 1255, 1255, 1255, - - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1322, 1322, - 1322, 1322, 1322, 1322, 1323, 1323, 1323, 1323, - 1323, 1323, 1323, 1390, 1390, 1390, 1390, 1390, - - 1323, 1323, 1323, 1323, 1390, 1390, 1390, 1390, - 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, - - 1418, 1418, 1418, 1418, 1418, 1390, 1390, 1418, - 1418, 1418, 1418, 1418, 1418, 1362, 1362, 1362, - 1390, 1390, 1390, 1390, 1390, 1359, 1359, 1359, - 1359, 1359, 1362, 1362, 1362, 1362, 1362, 1362, - - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 199, 199, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 199, 199, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 199, 199, 199, 1362, 1362, 1362, - - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 199, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, - 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, - 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, - 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, - - 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, - 1436, 1436, 1436, 1436, 1436, 1436, 1436, 199, - 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, - 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, - - 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, - 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, - 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, - 1437, 1437, 1437, 1437, 1437, 1437, 1437, 199, - - 127, 123, 1438, 1439, 1440, 1441, 1442, 127, - 123, 127, 123, 127, 123, 1443, 1444, 1445, - 1446, 1097, 1099, 1100, 1447, 127, 123, 1447, - 1097, 1097, 1097, 1097, 1448, 1448, 1449, 1450, - - 1451, 1452, 1451, 1452, 1451, 1452, 1451, 1452, - 1451, 1452, 1451, 1452, 1451, 1452, 1451, 1452, - 1451, 1452, 1451, 1452, 1451, 1452, 1451, 1452, - 1451, 1452, 1451, 1452, 1451, 1452, 1451, 1452, - - 1451, 1452, 1451, 1452, 1453, 1454, 1454, 1454, - 1454, 1454, 1454, 1455, 1456, 1455, 1456, 1457, - 1457, 1457, 1458, 1459, 199, 199, 199, 199, - 199, 1460, 1461, 1461, 1461, 1462, 1460, 1461, - - 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, - 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, - 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, - 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, - - 1463, 1463, 1463, 1463, 1463, 1463, 199, 1464, - 199, 199, 199, 199, 199, 1464, 199, 199, - 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, - 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, - - 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, - 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, - 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, - 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, - - 1465, 1465, 1465, 1465, 1465, 1465, 1466, 1466, - 199, 199, 199, 199, 199, 199, 199, 1467, - 1468, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 1469, - - 830, 830, 830, 830, 830, 830, 830, 830, - 830, 830, 830, 830, 830, 830, 830, 830, - 830, 830, 830, 830, 830, 830, 830, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 830, 830, 830, 830, 830, 830, 830, 199, - 830, 830, 830, 830, 830, 830, 830, 199, - 830, 830, 830, 830, 830, 830, 830, 199, - 830, 830, 830, 830, 830, 830, 830, 199, - - 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, - 264, 264, 264, 264, 264, 264, 264, 264, - - 1470, 1470, 1471, 1472, 1471, 1472, 1470, 1470, - 1470, 1471, 1472, 1470, 1471, 1472, 1259, 1259, - 1259, 1259, 1259, 1259, 1259, 1259, 1258, 1473, - 1474, 1475, 1476, 1477, 1471, 1472, 1477, 1477, - - 1478, 1479, 1423, 1424, 1423, 1424, 1423, 1424, - 1423, 1424, 1475, 1475, 1475, 1475, 1480, 1481, - 1475, 1482, 1483, 1484, 1484, 1483, 1483, 1483, - 1483, 1483, 1485, 1485, 1486, 1487, 1487, 1488, - - 1489, 1487, 1490, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, - 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, - 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, - 1491, 1491, 199, 1491, 1491, 1491, 1491, 1492, - - 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, - 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, - 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, - 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, - - 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, - 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, - 1491, 1491, 1491, 1492, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, - 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, - 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, - 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, - - 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, - 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, - 1492, 1492, 1492, 1492, 1492, 1492, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, - 1493, 1493, 1493, 1493, 199, 199, 199, 199, - - 1213, 1494, 1495, 1496, 1352, 1497, 1498, 1499, - 16, 1250, 16, 1250, 16, 1250, 16, 1250, - 16, 1250, 1352, 1352, 16, 1250, 16, 1250, - 16, 1250, 16, 1250, 1500, 1228, 1501, 1501, - - 1352, 1499, 1499, 1499, 1499, 1499, 1499, 1499, - 1499, 1499, 1502, 1503, 171, 1504, 1505, 1505, - 1506, 1507, 1507, 1507, 1507, 1508, 1509, 1352, - 1510, 1510, 1510, 1511, 1512, 1513, 1493, 1352, - - 199, 1514, 1515, 1514, 1515, 1514, 1515, 1514, - 1515, 1514, 1515, 1515, 1516, 1515, 1516, 1515, - 1516, 1515, 1516, 1515, 1516, 1515, 1516, 1515, - 1516, 1515, 1516, 1515, 1516, 1515, 1516, 1515, - - 1516, 1515, 1516, 1514, 1515, 1516, 1515, 1516, - 1515, 1516, 1515, 1515, 1515, 1515, 1515, 1515, - 1516, 1516, 1515, 1516, 1516, 1515, 1516, 1516, - 1515, 1516, 1516, 1515, 1516, 1516, 1515, 1515, - - 1515, 1515, 1515, 1514, 1515, 1514, 1515, 1514, - 1515, 1515, 1515, 1515, 1515, 1515, 1514, 1515, - 1515, 1515, 1515, 1515, 1516, 1517, 1517, 199, - 199, 1518, 1518, 1519, 1519, 1520, 1521, 1522, - - 1523, 1524, 1525, 1524, 1525, 1524, 1525, 1524, - 1525, 1524, 1525, 1525, 1526, 1525, 1526, 1525, - 1526, 1525, 1526, 1525, 1526, 1525, 1526, 1525, - 1526, 1525, 1526, 1525, 1526, 1525, 1526, 1525, - - 1526, 1525, 1526, 1524, 1525, 1526, 1525, 1526, - 1525, 1526, 1525, 1525, 1525, 1525, 1525, 1525, - 1526, 1526, 1525, 1526, 1526, 1525, 1526, 1526, - 1525, 1526, 1526, 1525, 1526, 1526, 1525, 1525, - - 1525, 1525, 1525, 1524, 1525, 1524, 1525, 1524, - 1525, 1525, 1525, 1525, 1525, 1525, 1524, 1525, - 1525, 1525, 1525, 1525, 1526, 1524, 1524, 1526, - 1526, 1526, 1526, 1527, 1528, 1529, 1530, 1531, - - 199, 199, 199, 199, 199, 1532, 1532, 1532, - 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, - 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, - 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, - - 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, - 1532, 1532, 1532, 1532, 1532, 1533, 199, 199, - 199, 1534, 1534, 1534, 1534, 1534, 1534, 1534, - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, - - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, - - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 199, - 1535, 1535, 1536, 1536, 1536, 1536, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - - 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, - 1539, 1539, 1539, 199, 199, 199, 199, 199, - - 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, - 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - - 1393, 1393, 1393, 1393, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, - 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, - - 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, - 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, - 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, - 1541, 1541, 1541, 1541, 1541, 1542, 1542, 199, - - 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, - 1536, 1536, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - - 1537, 1537, 1537, 1537, 1543, 1543, 1543, 1543, - 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, - 1545, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - - 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, - 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, - 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, - 1541, 1541, 1541, 1541, 1542, 1542, 1547, 1535, - - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, - - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1545, 1545, 1545, 1545, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 199, - - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1545, - 1545, 1545, 1545, 1537, 1537, 1537, 1537, 1537, - - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1545, 1545, - - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, - 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1545, - - 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, - 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, - 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, - 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, - - 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, - 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, - 1549, 1549, 1549, 1549, 1549, 1549, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - - 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, - 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, - 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, - 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, - - 1551, 1551, 1551, 1551, 1551, 1551, 1552, 1552, - 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, - 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, - 1552, 1552, 1552, 1552, 1553, 1553, 1553, 1553, - - 1553, 1553, 1553, 1553, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1555, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - - 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, - 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, - 1556, 1556, 1556, 1556, 1556, 1557, 1556, 1556, - 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, - - 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, - 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, - 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, - 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, - - 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, - 1556, 1556, 1556, 1556, 1556, 199, 199, 199, - 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, - 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, - - 1558, 1558, 1559, 1559, 1558, 1558, 1558, 1558, - 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, - 1558, 1558, 1558, 1558, 1559, 1558, 1558, 1558, - 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, - - 1558, 1559, 1558, 1558, 1558, 1559, 1558, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, - 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, - - 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, - 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, - 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, - 1561, 1561, 1561, 1561, 1561, 1561, 1562, 1563, - - 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, - 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, - 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, - 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, - - 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, - 1564, 1564, 1564, 1564, 1565, 1566, 1567, 1568, - 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, - 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, - - 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, - 1577, 1578, 1564, 1564, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 278, 279, 278, 279, 278, 279, 278, 279, - 278, 279, 278, 279, 278, 279, 278, 279, - 278, 279, 278, 279, 278, 279, 278, 279, - 278, 279, 278, 279, 278, 279, 278, 279, - - 282, 283, 278, 279, 278, 279, 278, 279, - 278, 279, 278, 279, 278, 279, 1579, 264, - 1580, 1580, 1580, 1581, 1582, 1582, 1582, 1582, - 1582, 1582, 1582, 1582, 264, 264, 1581, 1583, - - 278, 279, 278, 279, 278, 279, 278, 279, - 278, 279, 278, 279, 278, 279, 278, 279, - 278, 279, 278, 279, 278, 279, 278, 279, - 284, 285, 284, 285, 1584, 1584, 199, 1582, - - 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, - 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, - 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, - 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, - - 1585, 1585, 1585, 1585, 1585, 1585, 1586, 1586, - 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, - 1587, 1587, 1588, 1589, 1590, 1590, 1590, 1589, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, - 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, - 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1592, - 1592, 1592, 1592, 1481, 1481, 1481, 1481, 1481, - - 1593, 1593, 1099, 1100, 1099, 1100, 1099, 1100, - 1099, 1100, 1099, 1100, 1099, 1100, 1099, 1100, - 1097, 1097, 1099, 1100, 1099, 1100, 1099, 1100, - 1099, 1100, 1099, 1100, 1099, 1100, 1099, 1100, - - 1099, 1100, 1099, 1100, 1099, 1100, 1099, 1100, - 1099, 1100, 1099, 1100, 1099, 1100, 1099, 1100, - 1099, 1100, 1099, 1100, 1099, 1100, 1099, 1100, - 1099, 1100, 1099, 1100, 1099, 1100, 1099, 1100, - - 1099, 1100, 1099, 1100, 1099, 1100, 1099, 1100, - 1099, 1100, 1099, 1100, 1099, 1100, 1099, 1100, - 1448, 1097, 1097, 1097, 1097, 1097, 1097, 1097, - 1097, 1099, 1100, 1099, 1100, 1594, 1099, 1100, - - 1099, 1100, 1099, 1100, 1099, 1100, 1099, 1100, - 1481, 1595, 1595, 1099, 1100, 1596, 1597, 199, - 1598, 1599, 1600, 1601, 1602, 1602, 1603, 1604, - 1603, 1604, 1603, 1604, 1603, 1604, 1603, 1604, - - 1598, 1599, 1598, 1599, 1598, 1599, 1598, 1599, - 1598, 1599, 1605, 1606, 1607, 1608, 199, 199, - 1609, 1610, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 1611, - 1612, 1612, 1597, 1613, 1613, 1613, 1613, 1613, - - 1614, 1614, 1615, 1614, 1614, 1614, 1616, 1614, - 1614, 1614, 1614, 1615, 1614, 1614, 1614, 1614, - 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, - 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, - - 1614, 1614, 1614, 1617, 1617, 1615, 1615, 1617, - 1618, 1618, 1618, 1618, 199, 199, 199, 199, - 1544, 1544, 1544, 1544, 1544, 1544, 772, 772, - 1290, 1619, 199, 199, 199, 199, 199, 199, - - 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, - 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, - 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, - 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, - - 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, - 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, - 1620, 1620, 1621, 1622, 1623, 1623, 1624, 1624, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1625, 1625, 1626, 1626, 1626, 1626, 1626, 1626, - 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, - 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, - 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, - - 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, - 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, - 1626, 1626, 1626, 1626, 1625, 1625, 1625, 1625, - 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, - - 1625, 1625, 1625, 1625, 1627, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 1628, 1628, - 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, - 1637, 1638, 199, 199, 199, 199, 199, 199, - - 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, - 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, - 1639, 1639, 490, 490, 490, 490, 490, 490, - 1640, 1640, 1640, 490, 199, 199, 199, 199, - - 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, - 1649, 1650, 1651, 1651, 1651, 1651, 1651, 1651, - 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, - 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, - - 1651, 1651, 1651, 1651, 1651, 1651, 1652, 1652, - 1652, 1652, 1652, 1653, 1653, 1653, 1654, 1655, - 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, - 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, - - 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1657, - 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, - 1657, 1657, 1658, 1659, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 1660, - - 822, 822, 822, 822, 822, 822, 822, 822, - 822, 822, 822, 822, 822, 822, 822, 822, - 822, 822, 822, 822, 822, 822, 822, 822, - 822, 822, 822, 822, 822, 199, 199, 199, - - 1661, 1661, 1661, 1662, 1663, 1663, 1663, 1663, - 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, - 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, - 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, - - 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, - 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, - 1663, 1663, 1663, 1664, 1662, 1662, 1661, 1661, - 1661, 1661, 1662, 1662, 1661, 1662, 1662, 1662, - - 1665, 1666, 1666, 1666, 1666, 1666, 1666, 1667, - 1668, 1668, 1666, 1666, 1666, 1666, 199, 1669, - 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, - 1678, 1679, 199, 199, 199, 199, 1666, 1666, - - 1680, 1680, 1680, 1680, 1680, 1681, 1682, 1680, - 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, - 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, - 1691, 1692, 1680, 1680, 1680, 1680, 1680, 199, - - 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, - 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, - 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, - 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, - - 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, - 1693, 1694, 1694, 1694, 1694, 1694, 1694, 1695, - 1695, 1694, 1694, 1695, 1695, 1694, 1694, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1693, 1693, 1693, 1694, 1693, 1693, 1693, 1693, - 1693, 1693, 1693, 1693, 1694, 1695, 199, 199, - 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, - 1704, 1705, 199, 199, 1706, 1707, 1707, 1707, - - 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, - 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, - 1709, 1708, 1708, 1708, 1708, 1708, 1708, 1710, - 1710, 1710, 1708, 810, 1681, 1711, 1680, 1680, - - 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - - 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, - 1713, 1712, 1713, 1713, 1714, 1712, 1712, 1713, - 1713, 1712, 1712, 1712, 1712, 1712, 1713, 1713, - - 1712, 1713, 1712, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 1712, 1712, 1715, 1716, 1716, - - 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, - 1717, 1717, 1717, 1718, 1719, 1719, 1718, 1718, - 1720, 1720, 1717, 1721, 1721, 1718, 1722, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 1723, 1723, 1723, 1723, 1723, 1723, 199, - 199, 1723, 1723, 1723, 1723, 1723, 1723, 199, - 199, 1723, 1723, 1723, 1723, 1723, 1723, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1723, 1723, 1723, 1723, 1723, 1723, 1723, 199, - 1723, 1723, 1723, 1723, 1723, 1723, 1723, 199, - 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, - 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, - - 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, - 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, - 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, - 1602, 1602, 1602, 1724, 1725, 1725, 1725, 1725, - - 199, 199, 199, 199, 1602, 1726, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, - 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, - 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, - 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, - - 1727, 1727, 1727, 1728, 1728, 1729, 1728, 1728, - 1729, 1728, 1728, 1730, 1728, 1731, 199, 199, - 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, - 1740, 1741, 199, 199, 199, 199, 199, 199, - - 1742, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1742, 1743, 1743, 1743, - - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1742, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1742, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1742, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1742, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1742, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - - 1743, 1743, 1743, 1743, 1742, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, - - 1743, 1743, 1743, 1743, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 825, 825, 825, 825, 825, 825, 825, 825, - 825, 825, 825, 825, 825, 825, 825, 825, - - 825, 825, 825, 825, 825, 825, 825, 199, - 199, 199, 199, 828, 828, 828, 828, 828, - 828, 828, 828, 828, 828, 828, 828, 828, - 828, 828, 828, 828, 828, 828, 828, 828, - - 828, 828, 828, 828, 828, 828, 828, 828, - 828, 828, 828, 828, 828, 828, 828, 828, - 828, 828, 828, 828, 828, 828, 828, 828, - 828, 828, 828, 828, 199, 199, 199, 199, - - 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, - 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, - 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, - 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, - - 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, - 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, - 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, - 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, - - 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, - 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, - 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, - 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, - - 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, - 1746, 1746, 1746, 1746, 1746, 1746, 1551, 1551, - 1746, 1551, 1746, 1551, 1551, 1746, 1746, 1746, - 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1551, - - 1746, 1551, 1746, 1551, 1551, 1746, 1746, 1551, - 1551, 1551, 1746, 1746, 1746, 1746, 1747, 1747, - 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, - 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, - - 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, - 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, - 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, - 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, - - 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, - 1748, 1748, 1748, 1749, 1749, 1749, 1550, 1550, - 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - - 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - - 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, - 1750, 1750, 1550, 1550, 1550, 1550, 1550, 1550, - - 1751, 1752, 1753, 1754, 1755, 1756, 1756, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 1757, 1758, 1759, 1760, 1761, - 199, 199, 199, 199, 199, 1762, 1763, 1764, - - 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, - 1765, 1766, 1764, 1764, 1764, 1764, 1764, 1764, - 1764, 1764, 1764, 1764, 1764, 1764, 1764, 296, - 1764, 1764, 1764, 1764, 1764, 296, 1764, 296, - - 1764, 1764, 296, 1764, 1764, 296, 1764, 1764, - 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1765, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1768, 1768, 1768, 1768, 1768, 1768, - 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, - - 1768, 1768, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1501, 1228, - - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 342, 342, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 342, 342, 342, 342, 342, 342, 342, 342, - 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, - 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, - - 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, - 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1770, 334, 342, 342, - - 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, - 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, - 1772, 1773, 1774, 1775, 1776, 1777, 1777, 1778, - 1779, 1780, 199, 199, 199, 199, 199, 199, - - 170, 170, 170, 170, 1085, 1085, 1085, 985, - 985, 985, 985, 985, 985, 985, 199, 199, - 1781, 1782, 1782, 1783, 1783, 1784, 1785, 1784, - 1785, 1784, 1785, 1784, 1785, 1784, 1785, 1784, - - 1785, 1784, 1785, 1784, 1785, 1513, 1513, 1786, - 1787, 1781, 1781, 1781, 1781, 1783, 1783, 1783, - 1788, 1789, 1790, 199, 1791, 1792, 1793, 1793, - 1782, 1281, 1282, 1281, 1282, 1281, 1282, 1794, - - 1781, 1781, 1795, 1796, 1797, 1798, 1799, 199, - 1781, 1284, 1242, 1781, 199, 199, 199, 199, - 1767, 1767, 1767, 1800, 1767, 342, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, - 1767, 1767, 1767, 1767, 1767, 342, 342, 1801, - - 199, 1793, 1781, 1794, 1284, 1242, 1781, 1802, - 1281, 1282, 1781, 1795, 1788, 1796, 1790, 1803, - 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, - 1812, 1813, 1792, 1791, 1814, 1799, 1815, 1793, - - 1781, 1816, 1816, 1816, 1816, 1816, 1816, 1816, - 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, - 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, - 1816, 1816, 1816, 1817, 1781, 1818, 1819, 1783, - - 1819, 1820, 1820, 1820, 1820, 1820, 1820, 1820, - 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, - 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, - 1820, 1820, 1820, 1817, 1799, 1818, 1799, 1821, - - 1822, 1823, 1281, 1282, 1824, 1825, 1826, 1827, - 1827, 1827, 1827, 1827, 1827, 1827, 1827, 1827, - 1828, 1826, 1826, 1826, 1826, 1826, 1826, 1826, - 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, - - 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, - 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, - 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826, - 1826, 1826, 1826, 1826, 1826, 1826, 1829, 1829, - - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, - 1830, 1830, 1830, 1830, 1830, 1830, 1830, 199, - - 199, 199, 1830, 1830, 1830, 1830, 1830, 1830, - 199, 199, 1830, 1830, 1830, 1830, 1830, 1830, - 199, 199, 1830, 1830, 1830, 1830, 1830, 1830, - 199, 199, 1830, 1830, 1830, 199, 199, 199, - - 1831, 1284, 1799, 1819, 1509, 1284, 1284, 199, - 1303, 1280, 1280, 1280, 1280, 1303, 1303, 199, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1832, 1832, 1832, 1833, 51, 1834, 1834, - - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - 1835, 1835, 1835, 1835, 199, 1835, 1835, 1835, - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 199, - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - 1835, 1835, 1835, 199, 1835, 1835, 199, 1835, - - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - 1835, 1835, 1835, 1835, 1835, 1835, 199, 199, - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - 1835, 1835, 1835, 1835, 1835, 1835, 199, 199, - - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, - 1835, 1835, 1835, 199, 199, 199, 199, 199, - - 1836, 1837, 1836, 199, 199, 199, 199, 1838, - 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, - 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, - 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, - - 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, - 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, - 1838, 1838, 1838, 1838, 199, 199, 199, 1839, - 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, - - 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, - 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, - 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, - 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, - - 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, - 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, - 1840, 1840, 1840, 1840, 1840, 1841, 1841, 1841, - 1841, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1841, 1843, 1844, 199, 199, 199, - 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, - 1390, 1390, 1390, 1390, 199, 199, 199, 199, - - 1844, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, - 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, - - 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, - 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, - 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, - 1325, 1325, 1325, 1325, 1325, 1088, 199, 199, - - 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, - 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, - 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, - 1845, 1845, 1845, 1845, 1845, 199, 199, 199, - - 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, - 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, - 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, - 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, - - 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, - 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, - 1846, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 985, 1847, 1847, 1847, 1847, 1847, 1847, 1847, - 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, - 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, - 1847, 1847, 1847, 1847, 199, 199, 199, 199, - - 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, - 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, - 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, - 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1849, - - 1850, 1850, 1850, 1850, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, - 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, - - 1851, 1852, 1851, 1851, 1851, 1851, 1851, 1851, - 1851, 1851, 1852, 199, 199, 199, 199, 199, - 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, - 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, - - 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, - 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, - 1853, 1853, 1853, 1853, 1853, 1853, 1854, 1854, - 1854, 1854, 1854, 199, 199, 199, 199, 199, - - 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, - 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, - 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, - 1855, 1855, 1855, 1855, 1855, 1855, 199, 1856, - - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - - 1857, 1857, 1857, 1857, 199, 199, 199, 199, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1858, 1859, 1859, 1859, 1859, 1859, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, - 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, - 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, - 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, - - 1860, 1860, 1860, 1860, 1860, 1860, 1861, 1861, - 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, - 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, - 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, - - 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, - 1862, 1862, 1862, 1862, 1862, 1862, 1863, 1863, - 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, - 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, - - 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, - 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, - 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, - 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, - - 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, - 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, - 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, - 1865, 1865, 1865, 1865, 1865, 1865, 199, 199, - - 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, - 1874, 1875, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, - 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, - 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, - 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, - - 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, - 199, 199, 199, 199, 199, 199, 199, 199, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - - 1877, 1877, 1877, 1877, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 1878, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, - 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, - 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, - 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, - - 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, - 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, - 1879, 1879, 1879, 1879, 1879, 1879, 1879, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, - 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, - 1879, 1879, 1879, 1879, 1879, 1879, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1880, 1880, 1880, 1880, 1880, 1880, 296, 296, - 1880, 296, 1880, 1880, 1880, 1880, 1880, 1880, - 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, - 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, - - 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, - 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, - 1880, 1880, 1880, 1880, 1880, 1880, 296, 1880, - 1880, 296, 296, 296, 1880, 296, 296, 1880, - - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 296, 1882, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - - 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, - 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, - 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1885, - 1885, 1886, 1886, 1886, 1886, 1886, 1886, 1886, - - 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, - 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, - 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, - 1887, 1887, 1887, 1887, 1887, 1887, 1887, 296, - - 296, 296, 296, 296, 296, 296, 296, 1888, - 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - - 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, - 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, - 1889, 1889, 1889, 1889, 1889, 1889, 1890, 1890, - 1890, 1890, 1891, 1891, 296, 296, 296, 1892, - - 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, - 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, - 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, - 1893, 1893, 296, 296, 296, 296, 296, 1894, - - 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, - 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, - 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, - 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, - - 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, - 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, - 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, - 296, 296, 296, 296, 296, 296, 1896, 1896, - - 1897, 1898, 1898, 1898, 296, 1898, 1898, 296, - 296, 296, 296, 296, 1898, 1899, 1898, 1900, - 1897, 1897, 1897, 1897, 296, 1897, 1897, 1897, - 296, 1897, 1897, 1897, 1897, 1897, 1897, 1897, - - 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, - 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, - 1897, 1897, 1897, 1897, 296, 296, 296, 296, - 1900, 1901, 1899, 296, 296, 296, 296, 1902, - - 1903, 1904, 1905, 1906, 1907, 1907, 1907, 1907, - 296, 296, 296, 296, 296, 296, 296, 296, - 1908, 1908, 1908, 1908, 1908, 1908, 1909, 1909, - 1910, 296, 296, 296, 296, 296, 296, 296, - - 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, - 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, - 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, - 1911, 1911, 1911, 1911, 1911, 1912, 1912, 1913, - - 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, - 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, - 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, - 1914, 1914, 1914, 1914, 1914, 1915, 1915, 1915, - - 1916, 1916, 1916, 1916, 1916, 1917, 1918, 1917, - 1919, 1917, 1917, 1918, 1918, 1920, 1917, 1917, - 1917, 1917, 1917, 1916, 1916, 1916, 1916, 1920, - 1916, 1916, 1916, 1916, 1916, 1917, 1916, 1916, - - 1916, 1917, 1918, 1918, 1917, 1921, 1922, 296, - 296, 296, 296, 1923, 1923, 1923, 1923, 1924, - 1925, 1925, 1925, 1925, 1925, 1925, 1926, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - - 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, - 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, - 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, - 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, - - 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, - 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, - 1927, 1927, 1927, 1927, 1927, 1927, 296, 296, - 296, 1928, 1928, 1928, 1928, 1928, 1928, 1928, - - 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, - 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, - 1929, 1929, 1929, 1929, 1929, 1929, 296, 296, - 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, - - 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, - 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, - 1931, 1931, 1931, 296, 296, 296, 296, 296, - 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, - - 1933, 1934, 1933, 1934, 1934, 1934, 1933, 1933, - 1933, 1934, 1933, 1933, 1934, 1933, 1934, 1934, - 1933, 1934, 296, 296, 296, 296, 296, 296, - 296, 1935, 1935, 1935, 1935, 296, 296, 296, - - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 1936, 1936, 1936, 1936, 1937, 1937, 1938, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - - 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, - 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, - 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, - 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, - - 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, - 1939, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - - 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, - 1948, 1949, 1949, 1949, 1949, 1949, 1949, 1949, - 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, - 1949, 1949, 1949, 1949, 1949, 1949, 1949, 296, - - 1950, 1951, 1950, 1952, 1952, 1952, 1952, 1952, - 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, - 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, - 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, - 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, - 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, - 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, - 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, - 1951, 1951, 1951, 1951, 1951, 1951, 1953, 1954, - 1954, 1955, 1955, 1955, 1955, 1955, 199, 199, - 199, 199, 1956, 1957, 1958, 1959, 1960, 1961, - 1962, 1963, 1964, 1965, 1965, 1965, 1965, 1965, - 1965, 1965, 1965, 1965, 1965, 1965, 1966, 1967, - 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 1976, - 1977, 1977, 1978, 1979, 1979, 1979, 1979, 1979, - 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, - 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, - 1979, 1979, 1980, 1979, 1980, 1979, 1979, 1979, - 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, - 1979, 1979, 1979, 1980, 1979, 1979, 1979, 1979, - 1978, 1978, 1978, 1977, 1977, 1977, 1977, 1978, - 1978, 1981, 1982, 1983, 1983, 1984, 1985, 1985, - 1985, 1985, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, - 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, - 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, - 1986, 199, 199, 199, 199, 199, 199, 199, - 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, - 1995, 1996, 199, 199, 199, 199, 199, 199, - - 1997, 1997, 1997, 1998, 1998, 1998, 1998, 1998, - 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, - 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, - 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, - 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1999, - 2000, 2000, 2000, 2000, 2001, 2000, 2002, 2002, - 2000, 2000, 2000, 2003, 2003, 199, 2004, 2005, - 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, - 2014, 2015, 2015, 2015, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, - 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, - 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, - 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, - 2016, 2016, 2016, 2017, 2018, 2019, 2016, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2020, 2020, 2021, 2022, 2022, 2022, 2022, 2022, - 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, - 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, - 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, - 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, - 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, - 2022, 2022, 2022, 2021, 2021, 2021, 2020, 2020, - 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2021, - 2023, 2022, 2022, 2022, 2022, 2024, 2024, 2025, - 2026, 199, 199, 199, 199, 2027, 199, 199, - 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, - 2036, 2037, 2038, 199, 199, 199, 199, 199, - 199, 2039, 2039, 2039, 2039, 2039, 2039, 2039, - 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, - 2039, 2039, 2039, 2039, 2039, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, - 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, - 2040, 2040, 199, 2040, 2040, 2040, 2040, 2040, - 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, - 2040, 2040, 2040, 2040, 2040, 2040, 2040, 2040, - 2040, 2040, 2040, 2040, 2041, 2041, 2041, 2042, - 2042, 2042, 2041, 2041, 2042, 2043, 2044, 2042, - 2045, 2045, 2046, 2045, 2045, 2046, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2048, - 2049, 2049, 2049, 2048, 2048, 2048, 2048, 2048, - 2048, 2050, 2051, 199, 199, 199, 199, 199, - 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, - 2060, 2061, 199, 199, 199, 199, 199, 199, - - 199, 2062, 2063, 2063, 199, 2064, 2064, 2064, - 2064, 2064, 2064, 2064, 2064, 199, 199, 2064, - 2064, 199, 199, 2064, 2064, 2064, 2064, 2064, - 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, - 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, - 2064, 199, 2064, 2064, 2064, 2064, 2064, 2064, - 2064, 199, 2064, 2064, 199, 2064, 2064, 2064, - 2064, 2064, 199, 199, 2065, 2064, 2066, 2063, - 2062, 2063, 2063, 2063, 2063, 199, 199, 2063, - 2063, 199, 199, 2067, 2067, 2068, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 2066, - 199, 199, 199, 199, 199, 2064, 2064, 2064, - 2064, 2064, 2063, 2063, 199, 199, 2069, 2069, - 2069, 2069, 2069, 2069, 2069, 199, 199, 199, - 2069, 2069, 2069, 2069, 2069, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, - 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, - 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, - 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, - 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, - 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, - 2071, 2072, 2072, 2073, 2073, 2073, 2073, 2073, - 2073, 2072, 2074, 2075, 2075, 2071, 2075, 2073, - 2073, 2072, 2076, 2077, 2070, 2070, 2078, 2070, - 199, 199, 199, 199, 199, 199, 199, 199, - 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, - 2087, 2088, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, - 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, - 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, - 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, - 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089, - 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2090, - 2091, 2091, 2092, 2092, 2092, 2092, 199, 199, - 2091, 2091, 2093, 2093, 2092, 2092, 2091, 2094, - 2095, 2096, 2097, 2097, 2098, 2098, 2099, 2099, - 2099, 2097, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, - 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, - 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, - 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, - 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, - 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100, - 2101, 2101, 2101, 2102, 2102, 2102, 2102, 2102, - 2102, 2102, 2102, 2101, 2101, 2102, 2101, 2103, - 2102, 2104, 2104, 2105, 2100, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, - 2114, 2115, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, - 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, - 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, - 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, - 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, - 2116, 2116, 2116, 2117, 2118, 2117, 2118, 2118, - 2117, 2117, 2117, 2117, 2117, 2117, 2119, 2120, - 199, 199, 199, 199, 199, 199, 199, 199, - 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, - 2129, 2130, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, - 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, - 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, - 2131, 2131, 2131, 2131, 2131, 2131, 2131, 2131, - 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, - 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, - 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, - 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132, - 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, - 2141, 2142, 2143, 2143, 2143, 2143, 2143, 2143, - 2143, 2143, 2143, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 2144, - - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, - 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, - 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, - 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, - 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, - 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, - 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, - 2145, 199, 199, 199, 199, 199, 199, 199, - - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, - 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2147, - 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, - 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, - 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, - 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, - 2147, 2147, 2147, 2147, 2147, 2147, 2147, 2147, - 2147, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, - 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, - 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, - 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, - 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, - 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, - 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, - 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, - 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, - 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, - 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, - 2148, 2148, 2148, 2148, 2148, 2148, 2148, 2148, - 2148, 2148, 2148, 2149, 2149, 2149, 2149, 2149, - 2149, 2149, 2149, 2149, 2149, 2149, 2149, 199, - 2150, 2150, 2150, 2150, 2151, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2153, 2153, 2153, 2154, 2154, 2154, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2154, 2152, 2152, 2152, 2153, 2154, - 2153, 2154, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2153, 2154, 2154, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, - 2152, 2152, 2152, 2152, 2152, 2152, 2152, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, - 2155, 199, 199, 199, 199, 199, 199, 199, - 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, - 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, - 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, - 2156, 2156, 2156, 2156, 2156, 2156, 2156, 199, - 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, - 2165, 2166, 199, 199, 199, 199, 2167, 2167, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, - 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, - 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, - 2168, 2168, 2168, 2168, 2168, 2168, 199, 199, - 2169, 2169, 2169, 2169, 2169, 2170, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2173, - 2173, 2174, 2175, 2175, 2176, 2176, 2176, 2176, - 2177, 2177, 2177, 2177, 2173, 2176, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, - 2186, 2187, 199, 2188, 2188, 2188, 2188, 2188, - 2188, 2188, 199, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 199, 199, 199, 199, 199, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, - 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, - 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, - 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, - 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, - 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, - 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, - 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, - 2189, 2189, 2189, 2189, 2189, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2189, 2190, 2190, 2190, 2190, 2190, 2190, 2190, - 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, - 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, - 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, - 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, - 2190, 2190, 2190, 2190, 2190, 2190, 2190, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 2191, - 2191, 2191, 2191, 2192, 2192, 2192, 2192, 2192, - 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2193, 2194, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 199, 199, 199, 199, 199, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 2195, 2195, 2195, 199, 199, 199, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 199, 199, 199, 199, 199, 199, 199, - 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, - 2195, 2195, 199, 199, 2196, 2197, 2198, 2199, - 2200, 2200, 2200, 2200, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 199, - 199, 1325, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2202, 2202, - 2202, 2202, 2202, 2202, 2202, 2203, 2204, 2205, - 2205, 2205, 2201, 2201, 2201, 2206, 2203, 2203, - 2203, 2203, 2203, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2208, 2208, 2208, 2208, 2208, - 2208, 2208, 2208, 2201, 2201, 2209, 2209, 2209, - 2209, 2209, 2208, 2208, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2209, 2209, 2209, 2209, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2202, 2202, 2202, 2202, 2202, - 2202, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, - 2201, 2201, 2201, 2201, 2201, 2201, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, - 1842, 1842, 2210, 2210, 2210, 1842, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, - 1357, 1357, 1357, 1357, 1357, 1357, 1357, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, - 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, - 2211, 2211, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 199, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2212, 199, 2212, 2212, - 199, 199, 2212, 199, 199, 2212, 2212, 199, - 199, 2212, 2212, 2212, 2212, 199, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2213, 2213, - 2213, 2213, 199, 2213, 199, 2213, 2213, 2213, - 2213, 2214, 2213, 2213, 199, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - - 2213, 2213, 2213, 2213, 2212, 2212, 199, 2212, - 2212, 2212, 2212, 199, 199, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 199, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 199, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2212, 2212, 199, 2212, 2212, 2212, 2212, 199, - 2212, 2212, 2212, 2212, 2212, 199, 2212, 199, - 199, 199, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 199, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 1317, 1317, 199, 199, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2215, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2216, 2213, 2213, 2213, 2213, - 2213, 2213, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2215, 2213, 2213, 2213, 2213, - - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2216, 2213, 2213, - 2213, 2213, 2213, 2213, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2215, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2216, - 2213, 2213, 2213, 2213, 2213, 2213, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2215, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2216, 2213, 2213, 2213, 2213, 2213, 2213, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, - 2212, 2215, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, - 2213, 2213, 2213, 2216, 2213, 2213, 2213, 2213, - 2213, 2213, 2217, 2218, 199, 199, 2219, 2220, - 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, - 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, - 2227, 2228, 2219, 2220, 2221, 2222, 2223, 2224, - 2225, 2226, 2227, 2228, 2219, 2220, 2221, 2222, - 2223, 2224, 2225, 2226, 2227, 2228, 2219, 2220, - 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, - - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, - 2229, 2229, 2229, 2229, 2229, 296, 296, 2230, - 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, - 2231, 2231, 2231, 2231, 2231, 2231, 2231, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - 296, 296, 296, 296, 296, 296, 296, 296, - - 2232, 2232, 2232, 2232, 342, 2232, 2232, 2232, - 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, - 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, - 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, - 342, 2232, 2232, 342, 2232, 342, 342, 2232, - 342, 2232, 2232, 2232, 2232, 2232, 2232, 2232, - 2232, 2232, 2232, 342, 2232, 2232, 2232, 2232, - 342, 2232, 342, 2232, 342, 342, 342, 342, - 342, 342, 2232, 342, 342, 342, 342, 2232, - 342, 2232, 342, 2232, 342, 2232, 2232, 2232, - 342, 2232, 2232, 342, 2232, 342, 342, 2232, - 342, 2232, 342, 2232, 342, 2232, 342, 2232, - 342, 2232, 2232, 342, 2232, 342, 342, 2232, - 2232, 2232, 2232, 342, 2232, 2232, 2232, 2232, - 2232, 2232, 2232, 342, 2232, 2232, 2232, 2232, - 342, 2232, 2232, 2232, 2232, 342, 2232, 342, - 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, - 2232, 2232, 342, 2232, 2232, 2232, 2232, 2232, - 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, - 2232, 2232, 2232, 2232, 342, 342, 342, 342, - 342, 2232, 2232, 2232, 342, 2232, 2232, 2232, - 2232, 2232, 342, 2232, 2232, 2232, 2232, 2232, - 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, - 2232, 2232, 2232, 2232, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - 2233, 2233, 342, 342, 342, 342, 342, 342, - 342, 342, 342, 342, 342, 342, 342, 342, - - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 199, 199, 199, 199, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 199, - 199, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1394, - 199, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 199, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 2234, 2234, 2235, 2236, 2237, 2238, 2239, 2240, - 2241, 2242, 2243, 2244, 2244, 199, 199, 199, - 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, - 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, - 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, - 2245, 2245, 2245, 2245, 2245, 2245, 2245, 199, - 2246, 2247, 2246, 2246, 2246, 2246, 2246, 2246, - 2246, 2246, 2246, 2246, 2246, 2247, 2246, 2247, - 2246, 2246, 2247, 2246, 2246, 2246, 2247, 2246, - 2246, 2246, 2245, 2245, 2245, 2245, 2245, 2248, - 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2250, - 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2250, - 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, - 2249, 2249, 2251, 2251, 199, 199, 199, 199, - 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, - 2249, 2250, 2249, 2250, 2250, 2249, 2249, 2250, - 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249, - 2249, 2249, 772, 772, 772, 772, 2252, 2252, - 2245, 2252, 2252, 2252, 2252, 2252, 2252, 2252, - 2252, 2252, 2252, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 2253, 2253, - 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, - 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, - 2253, 2253, 2253, 2253, 2253, 2253, 2253, 2253, - - 2254, 2255, 2255, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - 1543, 1543, 2255, 2255, 2255, 2255, 2255, 2255, - 2255, 2255, 2255, 199, 199, 199, 199, 199, - 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, - 1543, 199, 199, 199, 199, 199, 199, 199, - 2255, 2255, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 199, 199, 199, - 1361, 1361, 1361, 1361, 1361, 1361, 1394, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1394, 199, 199, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1362, 1362, 1394, 1394, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1360, 1360, 1361, - 1361, 1361, 1361, 1361, 1360, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1394, 1361, 1361, - 1361, 1361, 1361, 1394, 1394, 1394, 1394, 199, - 199, 199, 199, 199, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1394, - 1361, 1394, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1360, 1361, 1360, 1361, 1360, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1360, - 1361, 1360, 1360, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1394, 1361, 1361, 1361, 1361, 1394, 1394, 199, - - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1362, 1362, - 2256, 2256, 2256, 2256, 1362, 1362, 1362, 1362, - 1362, 1362, 1394, 199, 199, 199, 199, 199, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 199, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 199, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1362, 1362, 1362, 1362, - 1362, 1362, 1394, 1361, 1361, 1361, 1361, 1361, - - 2257, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 2257, 1361, 1361, 1361, 2257, 1361, 2257, - 1361, 2257, 1361, 2257, 1361, 1361, 1361, 2257, - 1361, 1361, 1361, 1361, 1361, 1361, 2257, 2257, - 1361, 1361, 1361, 1361, 2257, 1361, 2257, 2257, - 1361, 1361, 1361, 1361, 2257, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1394, 1394, 199, 199, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 2258, 2258, - 2258, 2259, 2259, 2259, 1362, 1362, 1362, 1362, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1361, 1361, 1361, 1361, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, - 1394, 1394, 1394, 1394, 1394, 199, 199, 199, - 1394, 1394, 1394, 1394, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, - 1360, 1360, 1360, 1360, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 199, 199, 199, 199, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 199, 199, 199, 199, 199, 199, 199, 199, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 199, 199, 199, 199, 199, 199, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 199, 199, 199, 199, 199, 199, 199, 199, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, - 1362, 1362, 1362, 1362, 1362, 1362, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 199, 199, - 199, 199, 199, 199, 199, 199, 2260, 2260, - - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, - 2261, 2261, 2261, 2261, 2261, 2261, 2261, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, - 1554, 1554, 1554, 1554, 1554, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262, - 2262, 2262, 2262, 2262, 2262, 2262, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 2263, 2263, - 2263, 2263, 2263, 2263, 2263, 2263, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, - 1550, 1550, 1550, 1550, 1550, 1550, 2260, 2260, - - 1265, 2207, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, - - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2265, 2265, - 2265, 2265, 2265, 2265, 2265, 2265, 2260, 2260, -}; - -#define GET_PROP_INDEX(ucs4) \ - (ucs4 < 0x11000 \ - ? (uc_property_trie[uc_property_trie[ucs4>>5] + (ucs4 & 0x1f)]) \ - : (uc_property_trie[uc_property_trie[((ucs4 - 0x11000)>>8) + 0x880] + (ucs4 & 0xff)])) - -#define GET_PROP_INDEX_UCS2(ucs2) \ - (uc_property_trie[uc_property_trie[ucs2>>5] + (ucs2 & 0x1f)]) - -static const Properties uc_properties[] = { - { 9, 18, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 21, 2 }, - { 9, 8, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 5, 17, 2 }, - { 9, 7, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 2, 34, 2 }, - { 9, 8, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 5, 35, 2 }, - { 9, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 5, 35, 2 }, - { 9, 7, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 33, 2 }, - { 9, 7, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 21, 2 }, - { 9, 8, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 21, 2 }, - { 6, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 5, 32, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 6, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 13, 3, 2 }, - { 25, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9, 2 }, - { 25, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9, 13, 3, 2 }, - { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 2, 2 }, - { 26, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9, 2 }, - { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 11, 8, 2 }, - { 20, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 16, 2 }, - { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 10, 8, 2 }, - { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 7, 2 }, - { 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 8, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 0, 8, 2 }, - { 26, 10, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 0, 0, 8, 7, 12, 3 }, - { 21, 10, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9, 2 }, - { 22, 10, 0, 0, -1, -2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 2, 2 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 19, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 15, 0, 12, 2 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 17, 2 }, - { 22, 10, 0, 0, -1, -2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 1, 2 }, - { 9, 7, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 3, 35, 2 }, - { 6, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 5, 4, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 23, 10, 0, 0, -1, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 }, - { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 4, 4, 17, 2 }, - { 29, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 2 }, - { 26, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9, 2 }, - { 5, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 18, 2 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 743, 0, 743, 0, 775, 1, 80, 0, 8, 6, 12, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 12, 0, 12, 2 }, - { 5, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 24, 10, 0, 0, -1, -16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 }, - { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 17, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 80, 1, 77, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 17, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 121, 0, 121, 0, 0, 1, 17, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 17, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 17, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 83, 0, 0, 0, 0, 0, 0, 1, 17, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -232, 0, -232, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 80, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 162, 1, 162, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, -121, 0, 0, 0, 0, 0, -121, 1, 17, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -300, 0, -300, 0, -268, 1, 80, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 195, 0, 195, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 210, 0, 0, 0, 0, 0, 210, 1, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 206, 0, 0, 0, 0, 0, 206, 1, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 205, 0, 0, 0, 0, 0, 205, 1, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 79, 0, 0, 0, 0, 0, 79, 1, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 202, 0, 0, 0, 0, 0, 202, 1, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 203, 0, 0, 0, 0, 0, 203, 1, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 207, 0, 0, 0, 0, 0, 207, 1, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 97, 0, 97, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 211, 0, 0, 0, 0, 0, 211, 1, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 209, 0, 0, 0, 0, 0, 209, 1, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 163, 0, 163, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 213, 0, 0, 0, 0, 0, 213, 1, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 130, 0, 130, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 214, 0, 0, 0, 0, 0, 214, 1, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 218, 0, 0, 0, 0, 0, 218, 1, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 217, 0, 0, 0, 0, 0, 217, 1, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 219, 0, 0, 0, 0, 0, 219, 1, 0, 0, 8, 7, 12, 3 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 56, 0, 56, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 2, 0, 0, 0, 1, 0, 2, 1, 80, 0, 8, 7, 12, 3 }, - { 16, 0, 0, 0, -1, 0, 0, 1, 0, -1, 0, 0, 0, 1, 1, 80, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -2, 0, -1, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -79, 0, -79, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 173, 1, 173, 0, 0, 1, 17, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, -97, 0, 0, 0, 0, 0, -97, 4, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, -56, 0, 0, 0, 0, 0, -56, 4, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 4, 17, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 4, 17, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 4, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 4, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, -130, 0, 0, 0, 0, 0, -130, 6, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 8, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 8, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 8, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, -163, 0, 0, 0, 0, 0, -163, 8, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 3, 0, 0, 0, 0, 1, 3, 8, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 5, 1, 5, 0, 0, 8, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 7, 1, 7, 0, 0, 8, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 9, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, -195, 0, 0, 0, 0, 0, -195, 9, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 69, 0, 0, 0, 0, 0, 69, 9, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 71, 0, 0, 0, 0, 0, 71, 9, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 9, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 9, 1, 9, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 11, 1, 11, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 13, 1, 13, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -210, 0, -210, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -206, 0, -206, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -205, 0, -205, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -202, 0, -202, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -203, 0, -203, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 15, 1, 15, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 17, 1, 17, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -207, 0, -207, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 19, 1, 19, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 21, 1, 21, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -209, 0, -209, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -211, 0, -211, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 23, 1, 23, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 25, 1, 25, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 27, 1, 27, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -213, 0, -213, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -214, 0, -214, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 29, 1, 29, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -218, 0, -218, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 31, 1, 31, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -69, 0, -69, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -217, 0, -217, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -71, 0, -71, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -219, 0, -219, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 33, 1, 33, 0, 0, 1, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 6, 12, 3 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 6, 12, 2 }, - { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 18, 2 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 12, 0, 12, 2 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 18, 2 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 36 }, - { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 2 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 2 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 2 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 1 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 232, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 216, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 1 }, - { 0, 17, 202, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 1 }, - { 0, 17, 202, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 1 }, - { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 1 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 4, 4, 4, 21, 1 }, - { 0, 17, 240, 5, -1, 0, 0, 0, 0, 84, 0, 84, 0, 116, 1, 204, 4, 4, 4, 21, 1 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 4, 1 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 232, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 233, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 4, 1 }, - { 0, 17, 234, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 4, 1 }, - { 0, 17, 233, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 4, 1 }, - { 0, 17, 234, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 4, 1 }, - { 0, 17, 233, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 4, 1 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 1 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 10, 0, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 10, 0, 0, 8, 6, 12, 4 }, - { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 8, 8, 12, 2 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 4 }, - { 13, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 130, 0, 130, 0, 0, 9, 0, 0, 8, 6, 12, 4 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 13, 0, 8, 2 }, - { 14, 0, 0, 0, -1, 0, 0, 116, 0, 0, 0, 0, 0, 116, 16, 0, 0, 8, 7, 12, 4 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 4 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 81, 0, 0, 0, 12, 2 }, - { 14, 0, 0, 0, -1, 0, 0, 38, 0, 0, 0, 0, 0, 38, 1, 17, 0, 8, 7, 12, 4 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 12, 0, 12, 2 }, - { 14, 0, 0, 0, -1, 0, 0, 37, 0, 0, 0, 0, 0, 37, 1, 17, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, 64, 0, 0, 0, 0, 0, 64, 1, 17, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, 63, 0, 0, 0, 0, 0, 63, 1, 17, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 165, 1, 165, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 0, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 17, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -38, 0, -38, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -37, 0, -37, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 169, 1, 169, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 0, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -31, 0, -31, 0, 1, 1, 0, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -64, 0, -64, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -63, 0, -63, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, 8, 0, 0, 0, 0, 0, 8, 10, 0, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -62, 0, -62, 0, -30, 1, 80, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -57, 0, -57, 0, -25, 1, 80, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 81, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -47, 0, -47, 0, -15, 1, 80, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -54, 0, -54, 0, -22, 1, 80, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -8, 0, -8, 0, 0, 4, 0, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 6, 0, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 6, 0, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 4, 0, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 8, 7, 12, 46 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 0, 0, 8, 6, 12, 46 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -86, 0, -86, 0, -54, 1, 80, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -80, 0, -80, 0, -48, 1, 80, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 7, 0, 0, 1, 80, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -116, 0, -116, 0, 0, 1, 0, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -60, 0, 0, 0, 0, 0, -60, 5, 80, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -96, 0, -96, 0, -64, 5, 80, 0, 8, 6, 12, 4 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 7, 0, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 7, 0, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -7, 0, 0, 0, 0, 0, -7, 7, 80, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -130, 0, 0, 0, 0, 0, -130, 8, 0, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, 80, 0, 0, 0, 0, 0, 80, 4, 17, 0, 8, 7, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 80, 0, 0, 0, 0, 0, 80, 1, 17, 0, 8, 7, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 80, 0, 0, 0, 0, 0, 80, 1, 0, 0, 8, 7, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 0, 0, 8, 7, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 17, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 0, 0, 8, 6, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 17, 0, 8, 6, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -80, 0, -80, 0, 0, 4, 17, 0, 8, 6, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -80, 0, -80, 0, 0, 1, 17, 0, 8, 6, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -80, 0, -80, 0, 0, 1, 0, 0, 8, 6, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 0, 0, 8, 6, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 17, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 17, 0, 8, 6, 12, 5 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 5 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 5 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 5 }, - { 2, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 6, 0, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 6, 0, 0, 8, 6, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 4, 0, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 4, 0, 0, 8, 6, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 15, 0, 0, 0, 0, 0, 15, 1, 0, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -15, 0, -15, 0, 0, 9, 0, 0, 8, 6, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 4, 17, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 4, 17, 0, 8, 6, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 8, 0, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 8, 0, 0, 8, 6, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 9, 0, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 9, 0, 0, 8, 6, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 10, 0, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 10, 0, 0, 8, 6, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 11, 0, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 11, 0, 0, 8, 6, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 12, 0, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 12, 0, 0, 8, 6, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 16, 0, 0, 8, 7, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 16, 0, 0, 8, 6, 12, 5 }, - { 14, 0, 0, 0, -1, 0, 0, 48, 0, 0, 0, 0, 0, 48, 1, 0, 0, 8, 7, 12, 6 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 6 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 6 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 12, 6 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -48, 0, -48, 0, 0, 1, 0, 0, 8, 6, 12, 6 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 129, 1, 126, 0, 0, 1, 80, 0, 8, 6, 12, 6 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 12, 8, 2 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 6 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 6 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 9, 6 }, - { 13, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 222, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 228, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 10, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 11, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 12, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 13, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 14, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 15, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 16, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 17, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 18, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 19, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 19, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 20, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 21, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 22, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 20, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 17, 7 }, - { 0, 17, 23, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 7 }, - { 0, 17, 24, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 0, 17, 25, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 6, 7 }, - { 0, 17, 18, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 7 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 7, 8, 13, 7 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 7 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 12, 0, 12, 7 }, - { 10, 5, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 3, 4, 4, 12, 8 }, - { 10, 5, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 3, 4, 4, 12, 8 }, - { 10, 5, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 3, 4, 4, 12, 2 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 8 }, - { 26, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 8 }, - { 25, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 10, 8 }, - { 27, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 10, 8 }, - { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 13, 11, 8, 8 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 8 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 30, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 31, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 32, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 8 }, - { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 6, 2 }, - { 10, 13, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 3, 4, 4, 21, 2 }, - { 13, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0 }, - { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 6, 8 }, - { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 6, 2 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 8 }, - { 17, 13, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 2 }, - { 0, 17, 27, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 28, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 29, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 30, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 31, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 32, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 33, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 34, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 204, 4, 4, 4, 21, 1 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 204, 4, 4, 4, 21, 1 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 8 }, - { 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 5, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 5, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 5, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 5, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 5, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 5, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 3, 5, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 2 }, - { 25, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 8 }, - { 25, 5, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 8 }, - { 25, 5, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 9, 11, 8 }, - { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 8 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 8, 8, 12, 8 }, - { 0, 17, 35, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 8 }, - { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 6, 8 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 8 }, - { 10, 5, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 4, 4, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 8 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 8 }, - { 17, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 8 }, - { 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 8 }, - { 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 8 }, - { 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 8 }, - { 3, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 8 }, - { 3, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 8 }, - { 3, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 8 }, - { 3, 2, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 8 }, - { 3, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 8 }, - { 3, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 8 }, - { 3, 2, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 8 }, - { 29, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 8 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 8 }, - { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 12, 9 }, - { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 9 }, - { 10, 13, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 4, 4, 12, 9 }, - { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 9 }, - { 0, 17, 36, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 9 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 9 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 9 }, - { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 9 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 9 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 9 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 10 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 10 }, - { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 8, 8, 12, 10 }, - { 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 66 }, - { 3, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 66 }, - { 3, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 66 }, - { 3, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 66 }, - { 3, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 66 }, - { 3, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 66 }, - { 3, 1, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 66 }, - { 3, 1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 66 }, - { 3, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 66 }, - { 3, 1, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 66 }, - { 18, 1, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 66 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 66 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 66 }, - { 17, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 66 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 66 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 66 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 13, 11, 8, 66 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 12, 6, 66 }, - { 17, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 66 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 82 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 82 }, - { 17, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 82 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 82 }, - { 18, 1, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 12, 95 }, - { 18, 1, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 12, 95 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 12, 95 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 95 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 95 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 8 }, - { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 8 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 27, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 28, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 29, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 8 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 11 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 11 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 4, 4, 21, 11 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 11 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 11 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 8, 8, 12, 11 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 11 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 7, 4, 4, 21, 11 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 11 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 11 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 7, 4, 4, 21, 11 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 11 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 8, 8, 12, 11 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 17, 11 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 11 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 11 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 11 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 11 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 12, 11 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 11 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 11 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 11 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 11 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 12 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 12 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 4, 4, 21, 12 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 12 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 12 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 12 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 12 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 7, 4, 4, 21, 12 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 12 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 12 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 8, 8, 12, 12 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 12 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 12 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 12 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 12 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 12 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 12 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 12 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 12 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 12 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 12 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 12 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 12 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 12 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 12 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 9, 12 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 13 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 13 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 4, 4, 21, 13 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 13 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 8, 8, 12, 13 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 13 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 4, 4, 21, 13 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 13 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 13 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 13 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 13 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 13 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 13 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 13 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 13 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 13 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 13 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 13 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 13 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 14 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 4, 4, 21, 14 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 14 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 14 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 14 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 14 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 14 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 14 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 14 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 14 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 14 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 14 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 14 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 14 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 14 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 14 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 14 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 14 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 9, 14 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 15 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 4, 4, 21, 15 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 15 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 15 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 15 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 15 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 15 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 7, 4, 4, 21, 15 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 15 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 15 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 8, 8, 12, 15 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 15 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 15 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 15 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 15 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 15 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 15 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 15 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 15 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 15 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 15 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 15 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 15 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 16 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 16 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 8, 8, 12, 16 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 16 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 16 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 4, 4, 21, 16 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 7, 4, 4, 21, 16 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 16 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 16 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 14, 9, 11, 16 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 16 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 16 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 16 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 16 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 16 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 16 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 16 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 16 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 16 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 16 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 16 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 9, 16 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 17 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 4, 4, 21, 17 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 17 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 17 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 17 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 17 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 4, 4, 4, 21, 17 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 17 }, - { 0, 17, 84, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 17 }, - { 0, 17, 91, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 17 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 17 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 17 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 17 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 17 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 17 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 17 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 17 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 17 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 17 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 17 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 17 }, - { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 17 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 17 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 18 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 4, 4, 21, 18 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 18 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 18 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 18 }, - { 0, 0, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 18 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 7, 4, 4, 21, 18 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 18 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 18 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 18 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 18 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 18 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 18 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 18 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 18 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 18 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 18 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 18 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 18 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 18 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 18 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 18 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 19 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 4, 4, 21, 19 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 19 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 12, 19 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 19 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 19 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 19 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 19 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 7, 4, 4, 21, 19 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 19 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 19 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 19 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 19 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 19 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 19 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 19 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 19 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 19 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 19 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 19 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 19 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 10, 19 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 7, 4, 4, 21, 20 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 20 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 204, 4, 4, 4, 21, 20 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 204, 4, 4, 4, 21, 20 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 20 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 7, 4, 4, 21, 20 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 20 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 20 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 20 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 20 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 20 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 20 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 20 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 20 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 20 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 20 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 20 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 30, 21 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 30, 21 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 7, 0, 8, 30, 21 }, - { 0, 17, 103, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 30, 21 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 30, 21 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 30, 21 }, - { 0, 17, 107, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 30, 21 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 21 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 21 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 21 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 21 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 21 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 21 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 21 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 21 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 21 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 21 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 21 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 17, 21 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 30, 22 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 30, 22 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 7, 0, 8, 30, 22 }, - { 0, 17, 118, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 30, 22 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 30, 22 }, - { 0, 17, 122, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 30, 22 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 22 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 22 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 22 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 22 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 22 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 22 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 22 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 22 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 22 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 9, 11, 22 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 8, 30, 22 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 8, 30, 22 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 8, 8, 12, 23 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 18, 23 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 18, 23 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 12, 23 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 23 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 17, 23 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 80, 0, 0, 0, 4, 23 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 6, 23 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 12, 23 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 14, 9, 11, 23 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 14, 9, 11, 23 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 14, 9, 11, 23 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 14, 9, 11, 23 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 14, 9, 11, 23 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 14, 9, 11, 23 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 14, 9, 11, 23 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 14, 9, 11, 23 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 14, 9, 11, 23 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 14, 9, 11, 23 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 12, 23 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 17, 23 }, - { 0, 17, 216, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 }, - { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 13, 0, 23 }, - { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 13, 1, 23 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 7, 4, 4, 21, 23 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 85, 0, 8, 8, 12, 23 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 23 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 23 }, - { 0, 17, 129, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 }, - { 0, 17, 130, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 85, 4, 4, 4, 21, 23 }, - { 0, 17, 132, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 80, 4, 4, 4, 21, 23 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 7, 4, 4, 17, 23 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 12, 23 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 23 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 23 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 23 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 23 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 23 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 23 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 18, 23 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 17, 23 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 18, 23 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 23 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 2 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 4, 23 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 30, 24 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 8, 30, 24 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 0, 0, 8, 30, 24 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 4, 4, 30, 24 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 4, 30, 24 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 30, 24 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 204, 4, 4, 4, 30, 24 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 7, 4, 4, 30, 24 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 30, 24 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 30, 24 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 30, 24 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 30, 24 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 7, 4, 4, 30, 24 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 24 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 17, 24 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 24 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 30, 24 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 24 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 4, 4, 30, 24 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 30, 24 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 30, 24 }, - { 14, 0, 0, 0, -1, 0, 0, 7264, 0, 0, 0, 0, 0, 7264, 1, 0, 0, 8, 7, 12, 25 }, - { 14, 0, 0, 0, -1, 0, 0, 7264, 0, 0, 0, 0, 0, 7264, 13, 0, 0, 8, 7, 12, 25 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 25 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 8, 8, 12, 25 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 25 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 8, 8, 12, 25 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 25 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8, 8, 8, 25, 26 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 8, 8, 8, 25, 26 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9, 8, 8, 26, 26 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 9, 8, 8, 26, 26 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 8, 8, 26, 26 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 10, 8, 8, 27, 26 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 10, 8, 8, 27, 26 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 10, 8, 8, 27, 26 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 27 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 27 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 27 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 27 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 27 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 27 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 12, 27 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 }, - { 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 }, - { 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 }, - { 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 }, - { 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 }, - { 5, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 }, - { 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 }, - { 5, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 }, - { 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 }, - { 5, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 27 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 28 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 29 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 29 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 29 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 12, 29 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 29 }, - { 6, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 17, 30 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 30 }, - { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 13, 0, 30 }, - { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 13, 1, 30 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 31 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 2 }, - { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 31 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 31 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 8, 8, 12, 42 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 42 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 42 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 8, 8, 12, 43 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 43 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 43 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 12, 17, 2 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 8, 8, 12, 44 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 44 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 8, 8, 12, 45 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 45 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 30, 32 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 30, 32 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 7, 4, 4, 30, 32 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 30, 32 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 32 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5, 32 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 30, 32 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 32 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 9, 32 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 30, 32 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 32 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 32 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 32 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 32 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 32 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 32 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 32 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 32 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 32 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 32 }, - { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 32 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 33 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 11, 6, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 6, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 33 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 2 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 18, 33 }, - { 25, 10, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 33 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 11, 6, 33 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 6, 33 }, - { 25, 10, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 33 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 33 }, - { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 4, 4, 4, 33 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 33 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 33 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 33 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 33 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 33 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 33 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 33 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 33 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 33 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 14, 9, 11, 33 }, - { 18, 0, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 33 }, - { 17, 0, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 33 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 12, 33 }, - { 0, 17, 228, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 33 }, - { 18, 0, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 33 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 47 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 47 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 47 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 4, 4, 21, 47 }, - { 0, 17, 222, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 47 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 47 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 47 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 47 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 12, 6, 47 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 47 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 47 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 47 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 47 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 47 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 47 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 47 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 47 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 47 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 47 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 30, 48 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 30, 56 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 30, 56 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 4, 4, 30, 56 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 7, 4, 4, 30, 56 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 14, 9, 11, 56 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 14, 9, 11, 56 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 14, 9, 11, 56 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 14, 9, 11, 56 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 14, 9, 11, 56 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 14, 9, 11, 56 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 14, 9, 11, 56 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 14, 9, 11, 56 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 14, 9, 11, 56 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 14, 9, 11, 56 }, - { 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 30, 56 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 30, 56 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 32 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 55 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 55 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 55 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 7, 4, 4, 21, 55 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 55 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 55 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 30, 78 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 7, 4, 4, 30, 78 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 30, 78 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 30, 78 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 4, 4, 30, 78 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 30, 78 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 78 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 78 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 78 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 78 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 78 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 78 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 78 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 78 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 78 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 78 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 78 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 30, 78 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 30, 78 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 30, 78 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 1 }, - { 2, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 62 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 7, 4, 4, 21, 62 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 62 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 17, 0, 8, 8, 12, 62 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 62 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 204, 7, 4, 4, 21, 62 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 17, 7, 4, 4, 21, 62 }, - { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 7, 4, 4, 21, 62 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 62 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 62 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 62 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 62 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 62 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 62 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 62 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 62 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 62 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 14, 9, 11, 62 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 12, 17, 62 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 62 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 17, 62 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 62 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 62 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 62 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 67 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 7, 4, 4, 21, 67 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 67 }, - { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 7, 4, 4, 21, 67 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 67 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 67 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 67 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 67 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 67 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 67 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 67 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 67 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 67 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 67 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 67 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 67 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 67 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 12, 93 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 93 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 7, 4, 4, 21, 93 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 93 }, - { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 7, 4, 4, 21, 93 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 93 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 68 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 7, 4, 4, 21, 68 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 68 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 68 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 17, 68 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 17, 68 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 68 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 68 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 68 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 68 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 68 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 68 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 68 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 68 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 68 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 68 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 69 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 69 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 69 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 69 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 69 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 69 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 69 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 69 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 69 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 69 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 69 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 69 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 17, 69 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 67 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 1 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 2 }, - { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 1 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 7, 4, 4, 21, 2 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 2 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 7, 4, 4, 21, 2 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 1 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 2 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 6, 12, 5 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 8, 6, 12, 3 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 6, 12, 3 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 8, 6, 12, 4 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 8, 6, 12, 5 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 35, 1, 35, 0, 0, 8, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 3814, 0, 3814, 0, 0, 8, 0, 0, 8, 6, 12, 3 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 8, 6, 12, 3 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 8, 6, 12, 4 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 234, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 214, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 202, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 233, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 1 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 176, 1, 176, 0, 0, 1, 17, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 179, 1, 179, 0, 0, 1, 17, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 182, 1, 182, 0, 0, 1, 17, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 185, 1, 185, 0, 0, 1, 17, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 188, 1, 188, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -59, 0, -59, 0, -58, 2, 81, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, -7615, 0, 0, 0, 0, 0, -7615, 10, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 10, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 10, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 8, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -8, 0, 0, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 191, 1, 191, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 194, 1, 194, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 198, 1, 198, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 202, 1, 202, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 74, 0, 74, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 74, 0, 74, 0, 0, 1, 85, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 86, 0, 86, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 86, 0, 86, 0, 0, 1, 85, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 100, 0, 100, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 100, 0, 100, 0, 0, 1, 85, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 128, 0, 128, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 128, 0, 128, 0, 0, 1, 85, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 112, 0, 112, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 112, 0, 112, 0, 0, 1, 85, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 126, 0, 126, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 126, 0, 126, 0, 0, 1, 85, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 240, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 243, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 246, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 249, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 252, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 255, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 258, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 261, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 240, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 243, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 246, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 249, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 252, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 255, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 258, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 261, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 264, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 267, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 270, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 273, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 276, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 279, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 282, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 285, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 264, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 267, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 270, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 273, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 276, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 279, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 282, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 285, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 288, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 291, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 294, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 297, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 300, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 303, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 306, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 309, 0, 8, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 288, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 291, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 294, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 297, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 300, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 303, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 306, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -8, 1, 309, 0, 0, 0, -8, 1, 17, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 324, 1, 321, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 312, 0, 9, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 330, 1, 327, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 206, 1, 206, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 361, 1, 357, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -74, 0, 0, 0, 0, 0, -74, 1, 17, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -74, 0, 0, 0, 0, 0, -74, 1, 85, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -9, 1, 312, 0, 0, 0, -9, 1, 17, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -7205, 0, -7205, 0, -7173, 1, 85, 0, 8, 6, 12, 4 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 81, 0, 0, 0, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 336, 1, 333, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 315, 0, 9, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 342, 1, 339, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 209, 1, 209, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 369, 1, 365, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -86, 0, 0, 0, 0, 0, -86, 1, 17, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -86, 0, 0, 0, 0, 0, -86, 1, 85, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -9, 1, 315, 0, 0, 0, -9, 1, 17, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 212, 1, 212, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 165, 1, 165, 0, 0, 1, 85, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 216, 1, 216, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 219, 1, 219, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -100, 0, 0, 0, 0, 0, -100, 1, 17, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -100, 0, 0, 0, 0, 0, -100, 1, 85, 0, 8, 7, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 223, 1, 223, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 169, 1, 169, 0, 0, 1, 85, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 227, 1, 227, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 7, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 230, 1, 230, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 233, 1, 233, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -112, 0, 0, 0, 0, 0, -112, 1, 17, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -112, 0, 0, 0, 0, 0, -112, 1, 85, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -7, 0, 0, 0, 0, 0, -7, 1, 17, 0, 8, 7, 12, 4 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 0, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 348, 1, 345, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 318, 0, 9, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 354, 1, 351, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 237, 1, 237, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 377, 1, 373, 0, 0, 1, 17, 0, 8, 6, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -128, 0, 0, 0, 0, 0, -128, 1, 17, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -128, 0, 0, 0, 0, 0, -128, 1, 85, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -126, 0, 0, 0, 0, 0, -126, 1, 17, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 0, -126, 0, 0, 0, 0, 0, -126, 1, 85, 0, 8, 7, 12, 4 }, - { 16, 0, 0, 0, -1, 0, 0, -9, 1, 318, 0, 0, 0, -9, 1, 17, 0, 8, 7, 12, 4 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 0, 18, 4 }, - { 6, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 5, 17, 2 }, - { 6, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 5, 17, 2 }, - { 6, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 5, 4, 2 }, - { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 4, 20, 2 }, - { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 10, 18, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 10, 0, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 4, 4, 21, 2 }, - { 10, 1, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 4, 4, 21, 2 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 17, 2 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 4, 2 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 17, 2 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 19, 2 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 23, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 11, 13, 3, 2 }, - { 24, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 11, 13, 3, 2 }, - { 21, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 2 }, - { 23, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 }, - { 24, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 11, 10, 15, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 15, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 12, 0, 17, 2 }, - { 7, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 3, 35, 2 }, - { 8, 7, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 3, 35, 2 }, - { 10, 11, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 4, 4, 21, 2 }, - { 10, 14, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 4, 4, 21, 2 }, - { 10, 16, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 4, 4, 21, 2 }, - { 10, 12, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 4, 4, 21, 2 }, - { 10, 15, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 4, 4, 21, 2 }, - { 6, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 80, 0, 0, 5, 4, 2 }, - { 25, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 10, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 10, 2 }, - { 23, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 }, - { 24, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 12, 5, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 5, 2 }, - { 26, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 0, 8, 2 }, - { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 1, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 12, 5, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 80, 0, 0, 12, 5, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 2 }, - { 19, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 15, 0, 12, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 17, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 0, 12, 2 }, - { 6, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 5, 17, 2 }, - { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 4, 4, 22, 2 }, - { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 4, 4, 12, 2 }, - { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 3, 4, 4, 12, 2 }, - { 13, 18, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 12, 0 }, - { 10, 19, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 3, 4, 4, 21, 2 }, - { 10, 20, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 3, 4, 4, 21, 2 }, - { 10, 21, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 3, 4, 4, 21, 2 }, - { 10, 22, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 3, 4, 4, 21, 2 }, - { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 4, 4, 21, 2 }, - { 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 8, 6, 12, 3 }, - { 5, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 26, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 13, 1, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 80, 0, 8, 6, 12, 3 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 9, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 9, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 9, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 9, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 9, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 9, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 10, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 9, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 9, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 9, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 10, 2 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 9, 2 }, - { 13, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0 }, - { 2, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 2, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 1 }, - { 2, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 1 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 14, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 7, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 10, 2 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 6, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 9, 2 }, - { 14, 0, 0, 0, -1, 0, 0, -7517, 0, 0, 0, 0, 0, -7517, 1, 85, 0, 8, 7, 12, 4 }, - { 14, 0, 0, 0, -1, 0, 1, 37, 0, 0, 0, 0, 1, 37, 1, 85, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 39, 0, 0, 0, 0, 1, 39, 1, 85, 0, 8, 7, 12, 3 }, - { 29, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 14, 0, 0, 0, -1, 0, 0, 28, 0, 0, 0, 0, 0, 28, 1, 0, 0, 8, 7, 12, 3 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 8, 12, 2 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 80, 0, 8, 6, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 0, 0, 12, 2 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 8, 6, 12, 2 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 8, 6, 12, 2 }, - { 14, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 8, 7, 12, 2 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 2 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -28, 0, -28, 0, 0, 9, 0, 0, 8, 6, 12, 3 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 }, - { 4, 0, 0, 0, -1, 0, 0, 16, 0, 0, 0, 0, 0, 16, 1, 80, 0, 8, 7, 12, 3 }, - { 4, 0, 0, 0, -1, 0, 0, 0, 0, -16, 0, -16, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 12, 3 }, - { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 3 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 2016, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 138, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 1824, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 2104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 2108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 2106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -138, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -8, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -7, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 14, 2 }, - { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 13, 1, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 14, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 26, 0, 0, 0, 0, 0, 26, 1, 80, 0, 8, 7, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, -26, 0, -26, 0, 0, 1, 80, 0, 8, 6, 12, 2 }, - { 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 14, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 14, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 14, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 14, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 14, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 3, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 6, 2 }, - { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 1, 2 }, - { 5, 10, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 }, - { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 13, 1, 2 }, - { 26, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -2, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 13, 1, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 54 }, - { 21, 10, 0, 0, -1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 1, 2 }, - { 21, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, -3, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 1, 2 }, - { 26, 10, 0, 0, -1, -1824, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -2016, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 85, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -2104, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -2106, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, -2108, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 }, - { 14, 0, 0, 0, -1, 0, 0, 48, 0, 0, 0, 0, 0, 48, 8, 0, 0, 8, 7, 12, 57 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -48, 0, -48, 0, 0, 8, 0, 0, 8, 6, 12, 57 }, - { 14, 0, 0, 0, -1, 0, 1, 41, 0, 0, 0, 0, 1, 41, 9, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, -3814, 0, 0, 0, 0, 0, -3814, 9, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 43, 0, 0, 0, 0, 1, 43, 9, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 45, 1, 45, 0, 0, 9, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 47, 1, 47, 0, 0, 9, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 49, 0, 0, 0, 0, 1, 49, 10, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 51, 0, 0, 0, 0, 1, 51, 10, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 53, 0, 0, 0, 0, 1, 53, 10, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 55, 0, 0, 0, 0, 1, 55, 11, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 6, 12, 3 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 80, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 57, 0, 0, 0, 0, 1, 57, 11, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 59, 0, 0, 0, 0, 1, 59, 11, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 8, 0, 0, 8, 7, 12, 46 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 8, 0, 0, 8, 6, 12, 46 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 6, 12, 46 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 46 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 11, 0, 0, 8, 7, 12, 46 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 11, 0, 0, 8, 6, 12, 46 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 46 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 13, 0, 0, 8, 7, 12, 46 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 13, 0, 0, 8, 6, 12, 46 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 6, 46 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 17, 46 }, - { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 46 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -7264, 0, -7264, 0, 0, 8, 0, 0, 8, 6, 12, 25 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -7264, 0, -7264, 0, 0, 13, 0, 0, 8, 6, 12, 25 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 58 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 58 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 8, 8, 12, 58 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 17, 58 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 58 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 13, 3, 2 }, - { 23, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 13, 3, 2 }, - { 24, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 13, 3, 2 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 17, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 17, 2 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 2 }, - { 23, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 13, 3, 2 }, - { 24, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 13, 3, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 6, 2 }, - { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 17, 2 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 19, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 17, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 2 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 17, 2 }, - { 21, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 13, 0, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 14, 37 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 80, 0, 0, 0, 14, 37 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 14, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 1, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 1, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 14, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 5, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 14, 2 }, - { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 14, 37 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 5, 2 }, - { 22, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 1, 2 }, - { 0, 17, 218, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 228, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 222, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 }, - { 1, 0, 224, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 26 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 14, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 6, 8, 14, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 6, 8, 21, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 80, 0, 0, 8, 14, 37 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 8, 8, 5, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 8, 8, 5, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 14, 2 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 5, 34 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 14, 34 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 8, 14, 34 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 8, 5, 34 }, - { 0, 17, 8, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 1 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 6, 0, 5, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 5, 34 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 8, 5, 34 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 8, 14, 34 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 6, 0, 5, 2 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 6, 8, 5, 35 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 6, 8, 14, 35 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 6, 8, 14, 35 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 5, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 6, 8, 5, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 6, 8, 5, 35 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 6, 8, 5, 35 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 6, 8, 14, 35 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 14, 36 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 14, 36 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 8, 14, 26 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 14, 2 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 14, 36 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 14, 36 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 6, 8, 5, 35 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 26 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 0, 0, 14, 26 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 14, 2 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 0, 0, 14, 2 }, - { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 0, 14, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 0, 14, 26 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 6, 0, 14, 35 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 14, 37 }, - { 13, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 14, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 14, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 8, 14, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 14, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 8, 14, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 14, 38 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 8, 5, 38 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 14, 38 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 14, 38 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 83 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 83 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 83 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 17, 83 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 70 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 70 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 17, 70 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 6, 70 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 17, 70 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 70 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 70 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 70 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 70 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 70 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 70 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 70 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 70 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 70 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 70 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 5 }, - { 2, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 5 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 5 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 5 }, - { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 5 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 80, 0, 8, 6, 12, 5 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 84 }, - { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 84 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 84 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 84 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 17, 84 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 84 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 }, - { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 2 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 2 }, - { 14, 0, 0, 0, -1, 0, 1, 61, 0, 0, 0, 0, 1, 61, 10, 0, 0, 8, 7, 12, 3 }, - { 28, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 2 }, - { 14, 0, 0, 0, -1, 0, 1, 63, 0, 0, 0, 0, 1, 63, 12, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 12, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 12, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 13, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 13, 0, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 16, 0, 0, 8, 7, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 16, 0, 0, 8, 6, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 65, 0, 0, 0, 0, 1, 65, 13, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 67, 0, 0, 0, 0, 1, 67, 16, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 69, 0, 0, 0, 0, 1, 69, 16, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 71, 0, 0, 0, 0, 1, 71, 16, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 73, 0, 0, 0, 0, 1, 73, 16, 0, 0, 8, 7, 12, 3 }, - { 14, 0, 0, 0, -1, 0, 1, 75, 0, 0, 0, 0, 1, 75, 16, 0, 0, 8, 7, 12, 3 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 3 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 80, 0, 8, 6, 12, 3 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 3 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 59 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 59 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 59 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 7, 4, 4, 21, 59 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 59 }, - { 29, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 2 }, - { 18, 0, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 65 }, - { 18, 0, 0, 4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 65 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 65 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 18, 65 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 12, 6, 65 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 7, 4, 4, 21, 71 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 71 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 71 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 17, 71 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 71 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 71 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 71 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 71 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 71 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 71 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 71 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 71 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 71 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 71 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 11 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 11 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 72 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 72 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 72 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 72 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 72 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 72 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 72 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 72 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 72 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 72 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 72 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 72 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 72 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 17, 2 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 17, 72 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 73 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 73 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 7, 4, 4, 21, 73 }, - { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 7, 4, 4, 21, 73 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 73 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 85 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 7, 4, 4, 21, 85 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 85 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 85 }, - { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 7, 4, 4, 21, 85 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 85 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 85 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 17, 85 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 2 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 85 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 85 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 85 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 85 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 85 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 85 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 85 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 85 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 85 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 85 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 8, 30, 24 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 30, 24 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 8, 30, 24 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 24 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 24 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 77 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 77 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 7, 4, 4, 21, 77 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 77 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 77 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 77 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 77 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 77 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 77 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 77 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 77 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 77 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 14, 9, 11, 77 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 77 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 17, 77 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 30, 24 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 30, 24 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 30, 24 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 4, 30, 24 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 30, 79 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 30, 79 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 30, 79 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 30, 79 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 30, 79 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 86 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 7, 4, 4, 21, 86 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 86 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 12, 17, 86 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 86 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 86 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 12, 27 }, - { 28, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 80, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 6, 12, 4 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 86 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 7, 4, 4, 21, 86 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 86 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 17, 86 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 86 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 86 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 86 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 86 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 86 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 86 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 86 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 86 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 86 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 86 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 14, 9, 11, 86 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 17, 11, 8, 8, 23, 26 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 17, 12, 8, 8, 24, 26 }, - { 11, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 31, 0 }, - { 12, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 0 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 8, 14, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 85, 0, 0, 8, 14, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 85, 0, 0, 8, 14, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 85, 0, 0, 8, 14, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 85, 0, 0, 8, 14, 37 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 89, 1, 86, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 95, 1, 92, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 101, 1, 98, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 108, 1, 104, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 116, 1, 112, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 123, 1, 120, 0, 0, 1, 80, 0, 8, 6, 12, 3 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 135, 1, 132, 0, 0, 1, 80, 0, 8, 6, 12, 6 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 141, 1, 138, 0, 0, 1, 80, 0, 8, 6, 12, 6 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 147, 1, 144, 0, 0, 1, 80, 0, 8, 6, 12, 6 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 153, 1, 150, 0, 0, 1, 80, 0, 8, 6, 12, 6 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 1, 159, 1, 156, 0, 0, 1, 80, 0, 8, 6, 12, 6 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 85, 0, 7, 8, 13, 7 }, - { 0, 17, 26, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 7, 8, 13, 7 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 7, 8, 13, 7 }, - { 26, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 7 }, - { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 8, 12, 8 }, - { 28, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 8 }, - { 13, 18, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 12, 0 }, - { 27, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 0, 10, 8 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 1 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 13, 11, 8, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 11, 1, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 0, 1, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 12, 11, 8, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 13, 0, 8, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 0, 6, 2 }, - { 21, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 13, 1, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 0, 15, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 11, 14, 2 }, - { 19, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 15, 0, 14, 2 }, - { 21, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 13, 1, 2 }, - { 21, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 0, 13, 1, 2 }, - { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 13, 11, 1, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 11, 14, 2 }, - { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 11, 10, 1, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 13, 0, 5, 2 }, - { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 12, 11, 5, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 12, 6, 2 }, - { 25, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 26, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 20, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 11, 14, 2 }, - { 26, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 26, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 8, 8, 12, 8 }, - { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 4, 4, 22, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 11, 0, 14, 2 }, - { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 3, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 3, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 3, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 3, 2, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 3, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 3, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 3, 2, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 26, 10, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 26, 10, 0, 0, -1, -2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 80, 0, 8, 7, 14, 3 }, - { 21, 10, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, -2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 13, 1, 2 }, - { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 80, 0, 8, 6, 14, 3 }, - { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 13, 0, 2 }, - { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 13, 1, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 12, 1, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 11, 1, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 5, 2 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 6, 8, 12, 35 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 6, 8, 5, 35 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 6, 8, 5, 2 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 4, 4, 4, 5, 2 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 8, 12, 26 }, - { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 10, 2 }, - { 10, 10, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 4, 4, 21, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 29, 2 }, - { 13, 18, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 0 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 49 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 17, 2 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 17, 2 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 2 }, - { 4, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 4 }, - { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 4 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 4 }, - { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 4 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 4 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 74 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 75 }, - { 5, 2, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 2 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 8, 8, 12, 39 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 39 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 12, 39 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 8, 8, 12, 40 }, - { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 8, 8, 12, 40 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 120 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 120 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 50 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 17, 50 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 60 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 17, 60 }, - { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 60 }, - { 14, 0, 0, 0, -1, 0, 0, 40, 0, 0, 0, 0, 0, 40, 5, 0, 0, 8, 7, 12, 41 }, - { 14, 0, 0, 0, -1, 0, 0, 40, 0, 0, 0, 0, 0, 40, 7, 0, 0, 8, 7, 12, 41 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -40, 0, -40, 0, 0, 5, 0, 0, 8, 6, 12, 41 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -40, 0, -40, 0, 0, 7, 0, 0, 8, 6, 12, 41 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 51 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 52 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 52 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 52 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 52 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 52 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 52 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 52 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 52 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 52 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 52 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 14, 9, 11, 52 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 106 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 103 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 103 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 110 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 8, 8, 12, 53 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 87 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 87 }, - { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 87 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 118 }, - { 29, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 118 }, - { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 118 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 117 }, - { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 117 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 64 }, - { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 64 }, - { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 64 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 17, 64 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 8, 8, 12, 76 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 76 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 98 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 97 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 8, 8, 12, 61 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 61 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 61 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 61 }, - { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 61 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 61 }, - { 5, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 61 }, - { 5, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 61 }, - { 5, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 61 }, - { 5, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 61 }, - { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 61 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 17, 61 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 12, 17, 61 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 61 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 88 }, - { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 88 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 88 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 116 }, - { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 116 }, - { 18, 1, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 112 }, - { 18, 1, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 112 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 112 }, - { 29, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 112 }, - { 18, 1, 0, 4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 112 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 112 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 112 }, - { 5, 1, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 112 }, - { 5, 1, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 112 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 17, 112 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 15, 112 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 80 }, - { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 80 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 89 }, - { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 89 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 90 }, - { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 90 }, - { 18, 1, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 121 }, - { 18, 1, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 121 }, - { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 121 }, - { 5, 1, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 121 }, - { 5, 1, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 121 }, - { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 121 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 91 }, - { 5, 5, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 }, - { 5, 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 }, - { 5, 5, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 }, - { 5, 5, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 }, - { 5, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 }, - { 5, 5, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 }, - { 5, 5, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 }, - { 5, 5, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 }, - { 5, 5, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 }, - { 5, 5, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 7, 4, 4, 21, 94 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 94 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 12, 94 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 94 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 12, 17, 94 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 }, - { 5, 10, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 }, - { 5, 10, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 }, - { 5, 10, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 }, - { 5, 10, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 }, - { 5, 10, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 }, - { 5, 10, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 }, - { 5, 10, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 }, - { 5, 10, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 }, - { 5, 10, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 }, - { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 14, 9, 11, 94 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 14, 9, 11, 94 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 14, 9, 11, 94 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 14, 9, 11, 94 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 14, 9, 11, 94 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 14, 9, 11, 94 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 14, 9, 11, 94 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 14, 9, 11, 94 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 14, 9, 11, 94 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 14, 9, 11, 94 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 94 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 92 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 7, 4, 4, 21, 92 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 92 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 17, 0, 8, 8, 12, 92 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 92 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 204, 4, 4, 4, 21, 92 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 92 }, - { 10, 0, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 3, 4, 4, 12, 92 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 17, 92 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 101 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 101 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 101 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 101 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 101 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 101 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 101 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 101 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 101 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 101 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 101 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 96 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 96 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 204, 4, 4, 4, 21, 96 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 96 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 7, 4, 4, 21, 96 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 17, 4, 4, 4, 21, 96 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 96 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 96 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 96 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 96 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 96 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 96 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 96 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 96 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 96 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 96 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 96 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 17, 96 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 12, 17, 96 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 111 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 111 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 111 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 18, 111 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 100 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 7, 4, 4, 21, 100 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 100 }, - { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 7, 4, 4, 21, 100 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 12, 17, 100 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 100 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 17, 100 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 12, 100 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 100 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 100 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 100 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 100 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 100 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 100 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 100 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 100 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 100 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 100 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 100 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 20 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 109 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 7, 4, 4, 21, 109 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 109 }, - { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 7, 4, 4, 21, 109 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 109 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 109 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 109 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 123 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 123 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 7, 4, 4, 21, 123 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 123 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 123 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 123 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 123 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 123 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 123 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 123 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 123 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 123 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 123 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 123 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 123 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 107 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 7, 4, 4, 21, 107 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 107 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 107 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 204, 4, 4, 4, 21, 107 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 17, 7, 4, 4, 21, 107 }, - { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 7, 4, 4, 21, 107 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 107 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 124 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 204, 4, 4, 4, 21, 124 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 7, 4, 4, 21, 124 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 124 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 204, 4, 4, 4, 21, 124 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 17, 7, 4, 4, 21, 124 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 124 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 124 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 124 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 124 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 124 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 124 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 124 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 124 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 124 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 124 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 124 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 124 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 124 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 122 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 204, 4, 4, 4, 21, 122 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 7, 4, 4, 21, 122 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 122 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 17, 7, 4, 4, 21, 122 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 122 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 122 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 18, 122 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 122 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 6, 122 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 122 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 114 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 7, 4, 4, 21, 114 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 114 }, - { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 114 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 114 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 114 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 114 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 114 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 114 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 114 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 114 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 114 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 114 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 114 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 114 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 114 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 102 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 102 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 7, 4, 4, 21, 102 }, - { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 7, 4, 4, 21, 102 }, - { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 102 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 102 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 102 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 102 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 102 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 102 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 102 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 102 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 102 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 102 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, 9, 11, 102 }, - { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 16, 0, 0, 8, 7, 12, 125 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 16, 0, 0, 8, 6, 12, 125 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 125 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 125 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 125 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 125 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 125 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 125 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 125 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 125 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 125 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 125 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 125 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 125 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 119 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 63 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 63 }, - { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 8, 8, 12, 63 }, - { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 63 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 17, 63 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 17, 63 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 12, 81 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 0, 81 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 8, 1, 81 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 12, 84 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 115 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 115 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 115 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 115 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 115 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 115 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 115 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 115 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 115 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 115 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 115 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 115 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 104 }, - { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 104 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 104 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 108 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 108 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 108 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 17, 108 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 108 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 108 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 108 }, - { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 108 }, - { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 108 }, - { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 108 }, - { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 108 }, - { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 108 }, - { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 108 }, - { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 108 }, - { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 108 }, - { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 108 }, - { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 14, 9, 11, 108 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 108 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 99 }, - { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 7, 4, 4, 21, 99 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 99 }, - { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 8, 8, 12, 99 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 6, 8, 14, 35 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 8, 14, 34 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 105 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 105 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 105 }, - { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 105 }, - { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 105 }, - { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 3, 4, 4, 21, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 85, 0, 0, 0, 12, 2 }, - { 1, 0, 216, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 4, 4, 4, 21, 2 }, - { 1, 0, 216, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 7, 4, 4, 21, 2 }, - { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 4, 4, 4, 21, 1 }, - { 1, 0, 226, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 7, 4, 4, 21, 2 }, - { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 3, 4, 4, 21, 2 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 4, 4, 4, 21, 1 }, - { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 4 }, - { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 2 }, - { 14, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 8, 7, 12, 2 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 8, 6, 12, 2 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 8, 6, 12, 2 }, - { 26, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 0, 0, 12, 2 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 0, 0, 12, 2 }, - { 14, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 80, 0, 8, 7, 12, 2 }, - { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 80, 0, 8, 6, 12, 2 }, - { 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 14, 9, 11, 2 }, - { 3, 2, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 14, 9, 11, 2 }, - { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8, 8, 12, 113 }, - { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 113 }, - { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 113 }, - { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 80, 0, 8, 8, 12, 8 }, - { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 8 }, - { 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 }, - { 5, 2, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 }, - { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 80, 0, 8, 7, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 8, 7, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 80, 0, 0, 0, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 7, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 8, 7, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 80, 0, 0, 0, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 5, 5, 0, 28, 2 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 14, 34 }, - { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 80, 0, 0, 0, 14, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 14, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 13, 3, 2 }, - { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 5, 2 }, - { 13, 18, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 12, 0 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 8, 14, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 8, 14, 37 }, - { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 85, 0, 0, 8, 14, 37 }, - { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 1 }, - { 12, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 12, 0 } -}; - -Q_DECL_CONST_FUNCTION static inline const Properties *qGetProp(uint ucs4) Q_DECL_NOTHROW -{ - const int index = GET_PROP_INDEX(ucs4); - return uc_properties + index; -} - -Q_DECL_CONST_FUNCTION static inline const Properties *qGetProp(ushort ucs2) Q_DECL_NOTHROW -{ - const int index = GET_PROP_INDEX_UCS2(ucs2); - return uc_properties + index; -} - -Q_DECL_CONST_FUNCTION Q_CORE_EXPORT const Properties * QT_FASTCALL properties(uint ucs4) Q_DECL_NOTHROW -{ - return qGetProp(ucs4); -} - -Q_DECL_CONST_FUNCTION Q_CORE_EXPORT const Properties * QT_FASTCALL properties(ushort ucs2) Q_DECL_NOTHROW -{ - return qGetProp(ucs2); -} - -Q_CORE_EXPORT GraphemeBreakClass QT_FASTCALL graphemeBreakClass(uint ucs4) Q_DECL_NOTHROW -{ - return (GraphemeBreakClass)qGetProp(ucs4)->graphemeBreakClass; -} - -Q_CORE_EXPORT WordBreakClass QT_FASTCALL wordBreakClass(uint ucs4) Q_DECL_NOTHROW -{ - return (WordBreakClass)qGetProp(ucs4)->wordBreakClass; -} - -Q_CORE_EXPORT SentenceBreakClass QT_FASTCALL sentenceBreakClass(uint ucs4) Q_DECL_NOTHROW -{ - return (SentenceBreakClass)qGetProp(ucs4)->sentenceBreakClass; -} - -Q_CORE_EXPORT LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4) Q_DECL_NOTHROW -{ - return (LineBreakClass)qGetProp(ucs4)->lineBreakClass; -} - - -static const ushort specialCaseMap[] = { - 0x0, // placeholder - 0x1, 0x2c65, - 0x1, 0x2c66, - 0x1, 0x2c7e, - 0x1, 0x2c7f, - 0x1, 0x2c6f, - 0x1, 0x2c6d, - 0x1, 0x2c70, - 0x1, 0xa7ab, - 0x1, 0xa7ac, - 0x1, 0xa78d, - 0x1, 0xa7aa, - 0x1, 0x2c62, - 0x1, 0xa7ad, - 0x1, 0x2c6e, - 0x1, 0x2c64, - 0x1, 0xa7b1, - 0x1, 0xa7b0, - 0x1, 0xa77d, - 0x1, 0x6b, - 0x1, 0xe5, - 0x1, 0x26b, - 0x1, 0x27d, - 0x1, 0x23a, - 0x1, 0x23e, - 0x1, 0x251, - 0x1, 0x271, - 0x1, 0x250, - 0x1, 0x252, - 0x1, 0x23f, - 0x1, 0x240, - 0x1, 0x1d79, - 0x1, 0x265, - 0x1, 0x266, - 0x1, 0x25c, - 0x1, 0x261, - 0x1, 0x26c, - 0x1, 0x29e, - 0x1, 0x287, - 0x2, 0x53, 0x73, - 0x2, 0x53, 0x53, - 0x2, 0x69, 0x307, - 0x2, 0x46, 0x66, - 0x2, 0x46, 0x46, - 0x2, 0x46, 0x69, - 0x2, 0x46, 0x49, - 0x2, 0x46, 0x6c, - 0x2, 0x46, 0x4c, - 0x3, 0x46, 0x66, 0x69, - 0x3, 0x46, 0x46, 0x49, - 0x3, 0x46, 0x66, 0x6c, - 0x3, 0x46, 0x46, 0x4c, - 0x2, 0x53, 0x74, - 0x2, 0x53, 0x54, - 0x2, 0x535, 0x582, - 0x2, 0x535, 0x552, - 0x2, 0x544, 0x576, - 0x2, 0x544, 0x546, - 0x2, 0x544, 0x565, - 0x2, 0x544, 0x535, - 0x2, 0x544, 0x56b, - 0x2, 0x544, 0x53b, - 0x2, 0x54e, 0x576, - 0x2, 0x54e, 0x546, - 0x2, 0x544, 0x56d, - 0x2, 0x544, 0x53d, - 0x2, 0x2bc, 0x4e, - 0x3, 0x399, 0x308, 0x301, - 0x3, 0x3a5, 0x308, 0x301, - 0x2, 0x4a, 0x30c, - 0x2, 0x48, 0x331, - 0x2, 0x54, 0x308, - 0x2, 0x57, 0x30a, - 0x2, 0x59, 0x30a, - 0x2, 0x41, 0x2be, - 0x2, 0x3a5, 0x313, - 0x3, 0x3a5, 0x313, 0x300, - 0x3, 0x3a5, 0x313, 0x301, - 0x3, 0x3a5, 0x313, 0x342, - 0x2, 0x391, 0x342, - 0x2, 0x397, 0x342, - 0x3, 0x399, 0x308, 0x300, - 0x2, 0x399, 0x342, - 0x3, 0x399, 0x308, 0x342, - 0x3, 0x3a5, 0x308, 0x300, - 0x2, 0x3a1, 0x313, - 0x2, 0x3a5, 0x342, - 0x3, 0x3a5, 0x308, 0x342, - 0x2, 0x3a9, 0x342, - 0x2, 0x1f08, 0x399, - 0x2, 0x1f09, 0x399, - 0x2, 0x1f0a, 0x399, - 0x2, 0x1f0b, 0x399, - 0x2, 0x1f0c, 0x399, - 0x2, 0x1f0d, 0x399, - 0x2, 0x1f0e, 0x399, - 0x2, 0x1f0f, 0x399, - 0x2, 0x1f28, 0x399, - 0x2, 0x1f29, 0x399, - 0x2, 0x1f2a, 0x399, - 0x2, 0x1f2b, 0x399, - 0x2, 0x1f2c, 0x399, - 0x2, 0x1f2d, 0x399, - 0x2, 0x1f2e, 0x399, - 0x2, 0x1f2f, 0x399, - 0x2, 0x1f68, 0x399, - 0x2, 0x1f69, 0x399, - 0x2, 0x1f6a, 0x399, - 0x2, 0x1f6b, 0x399, - 0x2, 0x1f6c, 0x399, - 0x2, 0x1f6d, 0x399, - 0x2, 0x1f6e, 0x399, - 0x2, 0x1f6f, 0x399, - 0x2, 0x391, 0x399, - 0x2, 0x397, 0x399, - 0x2, 0x3a9, 0x399, - 0x2, 0x1fba, 0x345, - 0x2, 0x1fba, 0x399, - 0x2, 0x386, 0x345, - 0x2, 0x386, 0x399, - 0x2, 0x1fca, 0x345, - 0x2, 0x1fca, 0x399, - 0x2, 0x389, 0x345, - 0x2, 0x389, 0x399, - 0x2, 0x1ffa, 0x345, - 0x2, 0x1ffa, 0x399, - 0x2, 0x38f, 0x345, - 0x2, 0x38f, 0x399, - 0x3, 0x391, 0x342, 0x345, - 0x3, 0x391, 0x342, 0x399, - 0x3, 0x397, 0x342, 0x345, - 0x3, 0x397, 0x342, 0x399, - 0x3, 0x3a9, 0x342, 0x345, - 0x3, 0x3a9, 0x342, 0x399 -}; - - -static const unsigned short uc_decomposition_trie[] = { - // 0 - 0x3400 - - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1564, 1580, 1596, 1612, 1628, 1644, - 1660, 1676, 1692, 1708, 1724, 1740, 1756, 1772, - 1548, 1548, 1788, 1804, 1820, 1836, 1852, 1868, - 1884, 1900, 1916, 1932, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1948, 1548, 1964, 1980, 1548, - 1548, 1548, 1548, 1548, 1996, 1548, 1548, 2012, - 2028, 2044, 2060, 2076, 2092, 2108, 1548, 2124, - 2140, 2156, 1548, 2172, 1548, 2188, 1548, 2204, - 1548, 1548, 1548, 1548, 2220, 2236, 2252, 2268, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 2284, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 2300, 1548, 1548, 1548, 1548, 2316, - 1548, 1548, 1548, 1548, 2332, 2348, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 2364, 2380, 1548, 2396, 1548, 1548, - 1548, 1548, 1548, 1548, 2412, 2428, 1548, 1548, - 1548, 1548, 1548, 2444, 1548, 2460, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 2476, 2492, 1548, 1548, - 1548, 2508, 1548, 1548, 2524, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 2540, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 2556, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 2572, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 2588, 1548, 1548, - 1548, 1548, 1548, 2604, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 2620, 1548, 2636, 1548, 1548, - 2652, 1548, 1548, 1548, 2668, 2684, 2700, 2716, - 2732, 2748, 2764, 2780, 1548, 1548, 1548, 1548, - - 1548, 1548, 2796, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 2812, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 2828, 2844, 1548, 2860, 2876, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 2892, 2908, 2924, 2940, 2956, 2972, - 1548, 2988, 3004, 3020, 1548, 1548, 1548, 1548, - 3036, 3052, 3068, 3084, 3100, 3116, 3132, 3148, - 3164, 3180, 3196, 3212, 3228, 3244, 3260, 3276, - 3292, 3308, 3324, 3340, 3356, 3372, 3388, 3404, - 3420, 3436, 3452, 3468, 3484, 3500, 3516, 3532, - - 3548, 3564, 3580, 3596, 3612, 3628, 1548, 3644, - 3660, 3676, 3692, 1548, 1548, 1548, 1548, 1548, - 3708, 3724, 3740, 3756, 3772, 3788, 3804, 3820, - 3836, 3852, 3868, 1548, 3884, 1548, 1548, 1548, - 3900, 1548, 3916, 3932, 3948, 1548, 3964, 3980, - 3996, 1548, 4012, 1548, 1548, 1548, 4028, 1548, - 1548, 1548, 4044, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 4060, 4076, - 4092, 4108, 4124, 4140, 4156, 4172, 4188, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 4204, 1548, 1548, 1548, 1548, 1548, 1548, 4220, - 1548, 1548, 1548, 1548, 1548, 4236, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 4252, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 4268, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, - 1548, 4284, 1548, 1548, 1548, 1548, 1548, 4300, - 4316, 4332, 4348, 4364, 4380, 4396, 4412, 4428, - 4444, 4460, 4476, 4492, 4508, 4524, 1548, 1548, - - 4540, 1548, 1548, 4556, 4572, 4588, 4604, 4620, - 1548, 4636, 4652, 4668, 4684, 4700, 1548, 4716, - 1548, 1548, 1548, 4732, 4748, 4764, 4780, 4796, - 4812, 4828, 1548, 1548, 1548, 1548, 1548, 1548, - 4844, 4860, 4876, 4892, 4908, 4924, 4940, 4956, - 4972, 4988, 5004, 5020, 5036, 5052, 5068, 5084, - 5100, 5116, 5132, 5148, 5164, 5180, 5196, 5212, - 5228, 5244, 5260, 5276, 5292, 5308, 5324, 5340, - - // 0x3400 - 0x30000 - - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5612, 5868, 5356, 5356, 5356, 6124, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - - 5356, 5356, 5356, 5356, 5356, 6380, 6636, 6892, - 7148, 7404, 7660, 7916, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 8172, 8428, 5356, 8684, - 8940, 9196, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 9452, 5356, 5356, - 9708, 9964, 10220, 10476, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 10732, 5356, 5356, 10988, 11244, 5356, - - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356, - - 5356, 5356, 5356, 5356, 11500, 11756, 12012, 5356, - 5356, 5356, 5356, 5356, - - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x0, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x2, 0xffff, 0x5, 0xffff, 0xffff, 0xffff, 0xffff, 0x7, - - 0xffff, 0xffff, 0xa, 0xc, 0xe, 0x11, 0xffff, 0xffff, - 0x13, 0x16, 0x18, 0xffff, 0x1a, 0x1e, 0x22, 0xffff, - - 0x26, 0x29, 0x2c, 0x2f, 0x32, 0x35, 0xffff, 0x38, - 0x3b, 0x3e, 0x41, 0x44, 0x47, 0x4a, 0x4d, 0x50, - - 0xffff, 0x53, 0x56, 0x59, 0x5c, 0x5f, 0x62, 0xffff, - 0xffff, 0x65, 0x68, 0x6b, 0x6e, 0x71, 0xffff, 0xffff, - - 0x74, 0x77, 0x7a, 0x7d, 0x80, 0x83, 0xffff, 0x86, - 0x89, 0x8c, 0x8f, 0x92, 0x95, 0x98, 0x9b, 0x9e, - - 0xffff, 0xa1, 0xa4, 0xa7, 0xaa, 0xad, 0xb0, 0xffff, - 0xffff, 0xb3, 0xb6, 0xb9, 0xbc, 0xbf, 0xffff, 0xc2, - - 0xc5, 0xc8, 0xcb, 0xce, 0xd1, 0xd4, 0xd7, 0xda, - 0xdd, 0xe0, 0xe3, 0xe6, 0xe9, 0xec, 0xef, 0xf2, - - 0xffff, 0xffff, 0xf5, 0xf8, 0xfb, 0xfe, 0x101, 0x104, - 0x107, 0x10a, 0x10d, 0x110, 0x113, 0x116, 0x119, 0x11c, - - 0x11f, 0x122, 0x125, 0x128, 0x12b, 0x12e, 0xffff, 0xffff, - 0x131, 0x134, 0x137, 0x13a, 0x13d, 0x140, 0x143, 0x146, - - 0x149, 0xffff, 0x14c, 0x14f, 0x152, 0x155, 0x158, 0x15b, - 0xffff, 0x15e, 0x161, 0x164, 0x167, 0x16a, 0x16d, 0x170, - - 0x173, 0xffff, 0xffff, 0x176, 0x179, 0x17c, 0x17f, 0x182, - 0x185, 0x188, 0xffff, 0xffff, 0x18b, 0x18e, 0x191, 0x194, - - 0x197, 0x19a, 0xffff, 0xffff, 0x19d, 0x1a0, 0x1a3, 0x1a6, - 0x1a9, 0x1ac, 0x1af, 0x1b2, 0x1b5, 0x1b8, 0x1bb, 0x1be, - - 0x1c1, 0x1c4, 0x1c7, 0x1ca, 0x1cd, 0x1d0, 0xffff, 0xffff, - 0x1d3, 0x1d6, 0x1d9, 0x1dc, 0x1df, 0x1e2, 0x1e5, 0x1e8, - - 0x1eb, 0x1ee, 0x1f1, 0x1f4, 0x1f7, 0x1fa, 0x1fd, 0x200, - 0x203, 0x206, 0x209, 0x20c, 0x20f, 0x212, 0x215, 0x218, - - 0x21a, 0x21d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x220, - - 0x223, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0x226, 0x229, 0x22c, 0x22f, - 0x232, 0x235, 0x238, 0x23b, 0x23e, 0x241, 0x244, 0x247, - - 0x24a, 0x24d, 0x250, 0x253, 0x256, 0x259, 0x25c, 0x25f, - 0x262, 0x265, 0x268, 0x26b, 0x26e, 0xffff, 0x271, 0x274, - - 0x277, 0x27a, 0x27d, 0x280, 0xffff, 0xffff, 0x283, 0x286, - 0x289, 0x28c, 0x28f, 0x292, 0x295, 0x298, 0x29b, 0x29e, - - 0x2a1, 0x2a4, 0x2a7, 0x2aa, 0x2ad, 0x2b0, 0xffff, 0xffff, - 0x2b3, 0x2b6, 0x2b9, 0x2bc, 0x2bf, 0x2c2, 0x2c5, 0x2c8, - - 0x2cb, 0x2ce, 0x2d1, 0x2d4, 0x2d7, 0x2da, 0x2dd, 0x2e0, - 0x2e3, 0x2e6, 0x2e9, 0x2ec, 0x2ef, 0x2f2, 0x2f5, 0x2f8, - - 0x2fb, 0x2fe, 0x301, 0x304, 0x307, 0x30a, 0x30d, 0x310, - 0x313, 0x316, 0x319, 0x31c, 0xffff, 0xffff, 0x31f, 0x322, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x325, 0x328, - 0x32b, 0x32e, 0x331, 0x334, 0x337, 0x33a, 0x33d, 0x340, - - 0x343, 0x346, 0x349, 0x34c, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x34f, 0x351, 0x353, 0x355, 0x357, 0x359, 0x35b, 0x35d, - 0x35f, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x361, 0x364, 0x367, 0x36a, 0x36d, 0x370, 0xffff, 0xffff, - - 0x373, 0x375, 0x377, 0x379, 0x37b, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x37d, 0x37f, 0xffff, 0x381, 0x383, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0x386, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x388, 0xffff, 0xffff, 0xffff, 0x38b, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0x38d, 0x390, 0x393, 0x396, - 0x398, 0x39b, 0x39e, 0xffff, 0x3a1, 0xffff, 0x3a4, 0x3a7, - - 0x3aa, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x3ad, 0x3b0, 0x3b3, 0x3b6, 0x3b9, 0x3bc, - - 0x3bf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x3c2, 0x3c5, 0x3c8, 0x3cb, 0x3ce, 0xffff, - - 0x3d1, 0x3d3, 0x3d5, 0x3d7, 0x3da, 0x3dd, 0x3df, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x3e1, 0x3e3, 0x3e5, 0xffff, 0x3e7, 0x3e9, 0xffff, 0xffff, - 0xffff, 0x3eb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x3ed, 0x3f0, 0xffff, 0x3f3, 0xffff, 0xffff, 0xffff, 0x3f6, - 0xffff, 0xffff, 0xffff, 0xffff, 0x3f9, 0x3fc, 0x3ff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0x402, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0x405, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x408, 0x40b, 0xffff, 0x40e, 0xffff, 0xffff, 0xffff, 0x411, - 0xffff, 0xffff, 0xffff, 0xffff, 0x414, 0x417, 0x41a, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x41d, 0x420, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0x423, 0x426, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x429, 0x42c, 0x42f, 0x432, 0xffff, 0xffff, 0x435, 0x438, - 0xffff, 0xffff, 0x43b, 0x43e, 0x441, 0x444, 0x447, 0x44a, - - 0xffff, 0xffff, 0x44d, 0x450, 0x453, 0x456, 0x459, 0x45c, - 0xffff, 0xffff, 0x45f, 0x462, 0x465, 0x468, 0x46b, 0x46e, - - 0x471, 0x474, 0x477, 0x47a, 0x47d, 0x480, 0xffff, 0xffff, - 0x483, 0x486, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x489, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0x48c, 0x48f, 0x492, 0x495, 0x498, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x49b, 0x49e, 0x4a1, - 0x4a4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x4a7, 0xffff, 0x4aa, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0x4ad, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0x4b0, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0x4b3, 0xffff, 0xffff, 0x4b6, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x4b9, 0x4bc, 0x4bf, 0x4c2, 0x4c5, 0x4c8, 0x4cb, 0x4ce, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x4d1, 0x4d4, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0x4d7, 0x4da, 0xffff, 0x4dd, - - 0xffff, 0xffff, 0xffff, 0x4e0, 0xffff, 0xffff, 0x4e3, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0x4e6, 0x4e9, 0x4ec, 0xffff, 0xffff, 0x4ef, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x4f2, 0xffff, 0xffff, 0x4f5, 0x4f8, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0x4fb, 0x4fe, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0x501, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x504, 0x507, 0x50a, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x50d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x510, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x513, - 0x516, 0xffff, 0x519, 0x51c, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x51f, 0x522, 0x525, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x528, 0xffff, 0x52b, 0x52e, 0x531, 0xffff, - - 0xffff, 0xffff, 0xffff, 0x534, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0x537, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0x53a, 0x53d, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0x540, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0x542, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x545, 0xffff, 0xffff, - - 0xffff, 0xffff, 0x548, 0xffff, 0xffff, 0xffff, 0xffff, 0x54b, - 0xffff, 0xffff, 0xffff, 0xffff, 0x54e, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0x551, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0x554, 0xffff, 0x557, 0x55a, 0x55d, - 0x560, 0x563, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0x566, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0x569, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x56c, 0xffff, 0xffff, - - 0xffff, 0xffff, 0x56f, 0xffff, 0xffff, 0xffff, 0xffff, 0x572, - 0xffff, 0xffff, 0xffff, 0xffff, 0x575, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0x578, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x57b, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0x57e, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x580, 0xffff, - 0x583, 0xffff, 0x586, 0xffff, 0x589, 0xffff, 0x58c, 0xffff, - - 0xffff, 0xffff, 0x58f, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x592, 0xffff, 0x595, 0xffff, 0xffff, - - 0x598, 0x59b, 0xffff, 0x59e, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0x5a1, 0x5a3, 0x5a5, 0xffff, - - 0x5a7, 0x5a9, 0x5ab, 0x5ad, 0x5af, 0x5b1, 0x5b3, 0x5b5, - 0x5b7, 0x5b9, 0x5bb, 0xffff, 0x5bd, 0x5bf, 0x5c1, 0x5c3, - - 0x5c5, 0x5c7, 0x5c9, 0x5cb, 0x5cd, 0x5cf, 0x5d1, 0x5d3, - 0x5d5, 0x5d7, 0x5d9, 0x5db, 0x5dd, 0x5df, 0xffff, 0x5e1, - - 0x5e3, 0x5e5, 0x5e7, 0x5e9, 0x5eb, 0x5ed, 0x5ef, 0x5f1, - 0x5f3, 0x5f5, 0x5f7, 0x5f9, 0x5fb, 0x5fd, 0x5ff, 0x601, - - 0x603, 0x605, 0x607, 0x609, 0x60b, 0x60d, 0x60f, 0x611, - 0x613, 0x615, 0x617, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x619, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x61b, 0x61d, 0x61f, 0x621, 0x623, - - 0x625, 0x627, 0x629, 0x62b, 0x62d, 0x62f, 0x631, 0x633, - 0x635, 0x637, 0x639, 0x63b, 0x63d, 0x63f, 0x641, 0x643, - - 0x645, 0x647, 0x649, 0x64b, 0x64d, 0x64f, 0x651, 0x653, - 0x655, 0x657, 0x659, 0x65b, 0x65d, 0x65f, 0x661, 0x663, - - 0x665, 0x668, 0x66b, 0x66e, 0x671, 0x674, 0x677, 0x67a, - 0x67d, 0x680, 0x683, 0x686, 0x689, 0x68c, 0x68f, 0x692, - - 0x695, 0x698, 0x69b, 0x69e, 0x6a1, 0x6a4, 0x6a7, 0x6aa, - 0x6ad, 0x6b0, 0x6b3, 0x6b6, 0x6b9, 0x6bc, 0x6bf, 0x6c2, - - 0x6c5, 0x6c8, 0x6cb, 0x6ce, 0x6d1, 0x6d4, 0x6d7, 0x6da, - 0x6dd, 0x6e0, 0x6e3, 0x6e6, 0x6e9, 0x6ec, 0x6ef, 0x6f2, - - 0x6f5, 0x6f8, 0x6fb, 0x6fe, 0x701, 0x704, 0x707, 0x70a, - 0x70d, 0x710, 0x713, 0x716, 0x719, 0x71c, 0x71f, 0x722, - - 0x725, 0x728, 0x72b, 0x72e, 0x731, 0x734, 0x737, 0x73a, - 0x73d, 0x740, 0x743, 0x746, 0x749, 0x74c, 0x74f, 0x752, - - 0x755, 0x758, 0x75b, 0x75e, 0x761, 0x764, 0x767, 0x76a, - 0x76d, 0x770, 0x773, 0x776, 0x779, 0x77c, 0x77f, 0x782, - - 0x785, 0x788, 0x78b, 0x78e, 0x791, 0x794, 0x797, 0x79a, - 0x79d, 0x7a0, 0x7a3, 0x7a6, 0x7a9, 0x7ac, 0x7af, 0x7b2, - - 0x7b5, 0x7b8, 0x7bb, 0x7be, 0x7c1, 0x7c4, 0x7c7, 0x7ca, - 0x7cd, 0x7d0, 0x7d3, 0x7d6, 0x7d9, 0x7dc, 0x7df, 0x7e2, - - 0x7e5, 0x7e8, 0x7eb, 0x7ee, 0x7f1, 0x7f4, 0x7f7, 0x7fa, - 0x7fd, 0x800, 0x803, 0x806, 0x809, 0x80c, 0x80f, 0x812, - - 0x815, 0x818, 0x81b, 0x81e, 0x821, 0x824, 0x827, 0x82a, - 0x82d, 0x830, 0x833, 0x836, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x839, 0x83c, 0x83f, 0x842, 0x845, 0x848, 0x84b, 0x84e, - 0x851, 0x854, 0x857, 0x85a, 0x85d, 0x860, 0x863, 0x866, - - 0x869, 0x86c, 0x86f, 0x872, 0x875, 0x878, 0x87b, 0x87e, - 0x881, 0x884, 0x887, 0x88a, 0x88d, 0x890, 0x893, 0x896, - - 0x899, 0x89c, 0x89f, 0x8a2, 0x8a5, 0x8a8, 0x8ab, 0x8ae, - 0x8b1, 0x8b4, 0x8b7, 0x8ba, 0x8bd, 0x8c0, 0x8c3, 0x8c6, - - 0x8c9, 0x8cc, 0x8cf, 0x8d2, 0x8d5, 0x8d8, 0x8db, 0x8de, - 0x8e1, 0x8e4, 0x8e7, 0x8ea, 0x8ed, 0x8f0, 0x8f3, 0x8f6, - - 0x8f9, 0x8fc, 0x8ff, 0x902, 0x905, 0x908, 0x90b, 0x90e, - 0x911, 0x914, 0x917, 0x91a, 0x91d, 0x920, 0x923, 0x926, - - 0x929, 0x92c, 0x92f, 0x932, 0x935, 0x938, 0x93b, 0x93e, - 0x941, 0x944, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x947, 0x94a, 0x94d, 0x950, 0x953, 0x956, 0x959, 0x95c, - 0x95f, 0x962, 0x965, 0x968, 0x96b, 0x96e, 0x971, 0x974, - - 0x977, 0x97a, 0x97d, 0x980, 0x983, 0x986, 0xffff, 0xffff, - 0x989, 0x98c, 0x98f, 0x992, 0x995, 0x998, 0xffff, 0xffff, - - 0x99b, 0x99e, 0x9a1, 0x9a4, 0x9a7, 0x9aa, 0x9ad, 0x9b0, - 0x9b3, 0x9b6, 0x9b9, 0x9bc, 0x9bf, 0x9c2, 0x9c5, 0x9c8, - - 0x9cb, 0x9ce, 0x9d1, 0x9d4, 0x9d7, 0x9da, 0x9dd, 0x9e0, - 0x9e3, 0x9e6, 0x9e9, 0x9ec, 0x9ef, 0x9f2, 0x9f5, 0x9f8, - - 0x9fb, 0x9fe, 0xa01, 0xa04, 0xa07, 0xa0a, 0xffff, 0xffff, - 0xa0d, 0xa10, 0xa13, 0xa16, 0xa19, 0xa1c, 0xffff, 0xffff, - - 0xa1f, 0xa22, 0xa25, 0xa28, 0xa2b, 0xa2e, 0xa31, 0xa34, - 0xffff, 0xa37, 0xffff, 0xa3a, 0xffff, 0xa3d, 0xffff, 0xa40, - - 0xa43, 0xa46, 0xa49, 0xa4c, 0xa4f, 0xa52, 0xa55, 0xa58, - 0xa5b, 0xa5e, 0xa61, 0xa64, 0xa67, 0xa6a, 0xa6d, 0xa70, - - 0xa73, 0xa76, 0xa78, 0xa7b, 0xa7d, 0xa80, 0xa82, 0xa85, - 0xa87, 0xa8a, 0xa8c, 0xa8f, 0xa91, 0xa94, 0xffff, 0xffff, - - 0xa96, 0xa99, 0xa9c, 0xa9f, 0xaa2, 0xaa5, 0xaa8, 0xaab, - 0xaae, 0xab1, 0xab4, 0xab7, 0xaba, 0xabd, 0xac0, 0xac3, - - 0xac6, 0xac9, 0xacc, 0xacf, 0xad2, 0xad5, 0xad8, 0xadb, - 0xade, 0xae1, 0xae4, 0xae7, 0xaea, 0xaed, 0xaf0, 0xaf3, - - 0xaf6, 0xaf9, 0xafc, 0xaff, 0xb02, 0xb05, 0xb08, 0xb0b, - 0xb0e, 0xb11, 0xb14, 0xb17, 0xb1a, 0xb1d, 0xb20, 0xb23, - - 0xb26, 0xb29, 0xb2c, 0xb2f, 0xb32, 0xffff, 0xb35, 0xb38, - 0xb3b, 0xb3e, 0xb41, 0xb44, 0xb46, 0xb49, 0xb4c, 0xb4e, - - 0xb51, 0xb54, 0xb57, 0xb5a, 0xb5d, 0xffff, 0xb60, 0xb63, - 0xb66, 0xb69, 0xb6b, 0xb6e, 0xb70, 0xb73, 0xb76, 0xb79, - - 0xb7c, 0xb7f, 0xb82, 0xb85, 0xffff, 0xffff, 0xb87, 0xb8a, - 0xb8d, 0xb90, 0xb93, 0xb96, 0xffff, 0xb98, 0xb9b, 0xb9e, - - 0xba1, 0xba4, 0xba7, 0xbaa, 0xbac, 0xbaf, 0xbb2, 0xbb5, - 0xbb8, 0xbbb, 0xbbe, 0xbc1, 0xbc3, 0xbc6, 0xbc9, 0xbcb, - - 0xffff, 0xffff, 0xbcd, 0xbd0, 0xbd3, 0xffff, 0xbd6, 0xbd9, - 0xbdc, 0xbdf, 0xbe1, 0xbe4, 0xbe6, 0xbe9, 0xbeb, 0xffff, - - 0xbee, 0xbf0, 0xbf2, 0xbf4, 0xbf6, 0xbf8, 0xbfa, 0xbfc, - 0xbfe, 0xc00, 0xc02, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xc04, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xc06, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xc09, 0xc0b, 0xc0e, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xc12, - - 0xffff, 0xffff, 0xffff, 0xc14, 0xc17, 0xffff, 0xc1b, 0xc1e, - 0xffff, 0xffff, 0xffff, 0xffff, 0xc22, 0xffff, 0xc25, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xc28, - 0xc2b, 0xc2e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xc31, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xc36, - - 0xc38, 0xc3a, 0xffff, 0xffff, 0xc3c, 0xc3e, 0xc40, 0xc42, - 0xc44, 0xc46, 0xc48, 0xc4a, 0xc4c, 0xc4e, 0xc50, 0xc52, - - 0xc54, 0xc56, 0xc58, 0xc5a, 0xc5c, 0xc5e, 0xc60, 0xc62, - 0xc64, 0xc66, 0xc68, 0xc6a, 0xc6c, 0xc6e, 0xc70, 0xffff, - - 0xc72, 0xc74, 0xc76, 0xc78, 0xc7a, 0xc7c, 0xc7e, 0xc80, - 0xc82, 0xc84, 0xc86, 0xc88, 0xc8a, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xc8c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xc8f, 0xc93, 0xc97, 0xc99, 0xffff, 0xc9c, 0xca0, 0xca4, - 0xffff, 0xca6, 0xca9, 0xcab, 0xcad, 0xcaf, 0xcb1, 0xcb3, - - 0xcb5, 0xcb7, 0xcb9, 0xcbb, 0xffff, 0xcbd, 0xcbf, 0xffff, - 0xffff, 0xcc2, 0xcc4, 0xcc6, 0xcc8, 0xcca, 0xffff, 0xffff, - - 0xccc, 0xccf, 0xcd3, 0xffff, 0xcd6, 0xffff, 0xcd8, 0xffff, - 0xcda, 0xffff, 0xcdc, 0xcde, 0xce0, 0xce2, 0xffff, 0xce4, - - 0xce6, 0xce8, 0xffff, 0xcea, 0xcec, 0xcee, 0xcf0, 0xcf2, - 0xcf4, 0xcf6, 0xffff, 0xcf8, 0xcfc, 0xcfe, 0xd00, 0xd02, - - 0xd04, 0xffff, 0xffff, 0xffff, 0xffff, 0xd06, 0xd08, 0xd0a, - 0xd0c, 0xd0e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xd10, 0xd14, 0xd18, 0xd1d, 0xd21, 0xd25, 0xd29, 0xd2d, - 0xd31, 0xd35, 0xd39, 0xd3d, 0xd41, 0xd45, 0xd49, 0xd4d, - - 0xd50, 0xd52, 0xd55, 0xd59, 0xd5c, 0xd5e, 0xd61, 0xd65, - 0xd6a, 0xd6d, 0xd6f, 0xd72, 0xd76, 0xd78, 0xd7a, 0xd7c, - - 0xd7e, 0xd80, 0xd83, 0xd87, 0xd8a, 0xd8c, 0xd8f, 0xd93, - 0xd98, 0xd9b, 0xd9d, 0xda0, 0xda4, 0xda6, 0xda8, 0xdaa, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xdac, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xdb0, 0xdb3, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdb6, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdb9, 0xdbc, 0xdbf, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xdc2, 0xffff, 0xffff, 0xffff, - 0xffff, 0xdc5, 0xffff, 0xffff, 0xdc8, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xdcb, 0xffff, 0xdce, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xdd1, 0xdd4, 0xffff, 0xdd8, - - 0xddb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xddf, 0xffff, 0xffff, 0xde2, 0xffff, 0xffff, 0xde5, - 0xffff, 0xde8, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xdeb, 0xffff, 0xdee, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdf1, 0xdf4, 0xdf7, - - 0xdfa, 0xdfd, 0xffff, 0xffff, 0xe00, 0xe03, 0xffff, 0xffff, - 0xe06, 0xe09, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xe0c, 0xe0f, 0xffff, 0xffff, 0xe12, 0xe15, 0xffff, 0xffff, - 0xe18, 0xe1b, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xe1e, 0xe21, 0xe24, 0xe27, - - 0xe2a, 0xe2d, 0xe30, 0xe33, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xe36, 0xe39, 0xe3c, 0xe3f, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xe42, 0xe44, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xe46, 0xe48, 0xe4a, 0xe4c, 0xe4e, 0xe50, 0xe52, 0xe54, - 0xe56, 0xe58, 0xe5b, 0xe5e, 0xe61, 0xe64, 0xe67, 0xe6a, - - 0xe6d, 0xe70, 0xe73, 0xe76, 0xe79, 0xe7d, 0xe81, 0xe85, - 0xe89, 0xe8d, 0xe91, 0xe95, 0xe99, 0xe9d, 0xea2, 0xea7, - - 0xeac, 0xeb1, 0xeb6, 0xebb, 0xec0, 0xec5, 0xeca, 0xecf, - 0xed4, 0xed7, 0xeda, 0xedd, 0xee0, 0xee3, 0xee6, 0xee9, - - 0xeec, 0xeef, 0xef3, 0xef7, 0xefb, 0xeff, 0xf03, 0xf07, - 0xf0b, 0xf0f, 0xf13, 0xf17, 0xf1b, 0xf1f, 0xf23, 0xf27, - - 0xf2b, 0xf2f, 0xf33, 0xf37, 0xf3b, 0xf3f, 0xf43, 0xf47, - 0xf4b, 0xf4f, 0xf53, 0xf57, 0xf5b, 0xf5f, 0xf63, 0xf67, - - 0xf6b, 0xf6f, 0xf73, 0xf77, 0xf7b, 0xf7f, 0xf83, 0xf85, - 0xf87, 0xf89, 0xf8b, 0xf8d, 0xf8f, 0xf91, 0xf93, 0xf95, - - 0xf97, 0xf99, 0xf9b, 0xf9d, 0xf9f, 0xfa1, 0xfa3, 0xfa5, - 0xfa7, 0xfa9, 0xfab, 0xfad, 0xfaf, 0xfb1, 0xfb3, 0xfb5, - - 0xfb7, 0xfb9, 0xfbb, 0xfbd, 0xfbf, 0xfc1, 0xfc3, 0xfc5, - 0xfc7, 0xfc9, 0xfcb, 0xfcd, 0xfcf, 0xfd1, 0xfd3, 0xfd5, - - 0xfd7, 0xfd9, 0xfdb, 0xfdd, 0xfdf, 0xfe1, 0xfe3, 0xfe5, - 0xfe7, 0xfe9, 0xfeb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xfed, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xff2, 0xff6, 0xff9, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffd, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0x1000, 0x1002, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x1004, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x1006, - - 0xffff, 0xffff, 0xffff, 0x1008, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x100a, 0x100c, 0x100e, 0x1010, 0x1012, 0x1014, 0x1016, 0x1018, - 0x101a, 0x101c, 0x101e, 0x1020, 0x1022, 0x1024, 0x1026, 0x1028, - - 0x102a, 0x102c, 0x102e, 0x1030, 0x1032, 0x1034, 0x1036, 0x1038, - 0x103a, 0x103c, 0x103e, 0x1040, 0x1042, 0x1044, 0x1046, 0x1048, - - 0x104a, 0x104c, 0x104e, 0x1050, 0x1052, 0x1054, 0x1056, 0x1058, - 0x105a, 0x105c, 0x105e, 0x1060, 0x1062, 0x1064, 0x1066, 0x1068, - - 0x106a, 0x106c, 0x106e, 0x1070, 0x1072, 0x1074, 0x1076, 0x1078, - 0x107a, 0x107c, 0x107e, 0x1080, 0x1082, 0x1084, 0x1086, 0x1088, - - 0x108a, 0x108c, 0x108e, 0x1090, 0x1092, 0x1094, 0x1096, 0x1098, - 0x109a, 0x109c, 0x109e, 0x10a0, 0x10a2, 0x10a4, 0x10a6, 0x10a8, - - 0x10aa, 0x10ac, 0x10ae, 0x10b0, 0x10b2, 0x10b4, 0x10b6, 0x10b8, - 0x10ba, 0x10bc, 0x10be, 0x10c0, 0x10c2, 0x10c4, 0x10c6, 0x10c8, - - 0x10ca, 0x10cc, 0x10ce, 0x10d0, 0x10d2, 0x10d4, 0x10d6, 0x10d8, - 0x10da, 0x10dc, 0x10de, 0x10e0, 0x10e2, 0x10e4, 0x10e6, 0x10e8, - - 0x10ea, 0x10ec, 0x10ee, 0x10f0, 0x10f2, 0x10f4, 0x10f6, 0x10f8, - 0x10fa, 0x10fc, 0x10fe, 0x1100, 0x1102, 0x1104, 0x1106, 0x1108, - - 0x110a, 0x110c, 0x110e, 0x1110, 0x1112, 0x1114, 0x1116, 0x1118, - 0x111a, 0x111c, 0x111e, 0x1120, 0x1122, 0x1124, 0x1126, 0x1128, - - 0x112a, 0x112c, 0x112e, 0x1130, 0x1132, 0x1134, 0x1136, 0x1138, - 0x113a, 0x113c, 0x113e, 0x1140, 0x1142, 0x1144, 0x1146, 0x1148, - - 0x114a, 0x114c, 0x114e, 0x1150, 0x1152, 0x1154, 0x1156, 0x1158, - 0x115a, 0x115c, 0x115e, 0x1160, 0x1162, 0x1164, 0x1166, 0x1168, - - 0x116a, 0x116c, 0x116e, 0x1170, 0x1172, 0x1174, 0x1176, 0x1178, - 0x117a, 0x117c, 0x117e, 0x1180, 0x1182, 0x1184, 0x1186, 0x1188, - - 0x118a, 0x118c, 0x118e, 0x1190, 0x1192, 0x1194, 0x1196, 0x1198, - 0x119a, 0x119c, 0x119e, 0x11a0, 0x11a2, 0x11a4, 0x11a6, 0x11a8, - - 0x11aa, 0x11ac, 0x11ae, 0x11b0, 0x11b2, 0x11b4, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x11b6, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x11b8, 0xffff, - 0x11ba, 0x11bc, 0x11be, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0x11c0, 0xffff, 0x11c3, 0xffff, - - 0x11c6, 0xffff, 0x11c9, 0xffff, 0x11cc, 0xffff, 0x11cf, 0xffff, - 0x11d2, 0xffff, 0x11d5, 0xffff, 0x11d8, 0xffff, 0x11db, 0xffff, - - 0x11de, 0xffff, 0x11e1, 0xffff, 0xffff, 0x11e4, 0xffff, 0x11e7, - 0xffff, 0x11ea, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x11ed, 0x11f0, 0xffff, 0x11f3, 0x11f6, 0xffff, 0x11f9, 0x11fc, - 0xffff, 0x11ff, 0x1202, 0xffff, 0x1205, 0x1208, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0x120b, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x120e, 0x1211, 0xffff, 0x1214, 0x1217, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0x121a, 0xffff, 0x121d, 0xffff, - - 0x1220, 0xffff, 0x1223, 0xffff, 0x1226, 0xffff, 0x1229, 0xffff, - 0x122c, 0xffff, 0x122f, 0xffff, 0x1232, 0xffff, 0x1235, 0xffff, - - 0x1238, 0xffff, 0x123b, 0xffff, 0xffff, 0x123e, 0xffff, 0x1241, - 0xffff, 0x1244, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x1247, 0x124a, 0xffff, 0x124d, 0x1250, 0xffff, 0x1253, 0x1256, - 0xffff, 0x1259, 0x125c, 0xffff, 0x125f, 0x1262, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0x1265, 0xffff, 0xffff, 0x1268, - 0x126b, 0x126e, 0x1271, 0xffff, 0xffff, 0xffff, 0x1274, 0x1277, - - 0xffff, 0x127a, 0x127c, 0x127e, 0x1280, 0x1282, 0x1284, 0x1286, - 0x1288, 0x128a, 0x128c, 0x128e, 0x1290, 0x1292, 0x1294, 0x1296, - - 0x1298, 0x129a, 0x129c, 0x129e, 0x12a0, 0x12a2, 0x12a4, 0x12a6, - 0x12a8, 0x12aa, 0x12ac, 0x12ae, 0x12b0, 0x12b2, 0x12b4, 0x12b6, - - 0x12b8, 0x12ba, 0x12bc, 0x12be, 0x12c0, 0x12c2, 0x12c4, 0x12c6, - 0x12c8, 0x12ca, 0x12cc, 0x12ce, 0x12d0, 0x12d2, 0x12d4, 0x12d6, - - 0x12d8, 0x12da, 0x12dc, 0x12de, 0x12e0, 0x12e2, 0x12e4, 0x12e6, - 0x12e8, 0x12ea, 0x12ec, 0x12ee, 0x12f0, 0x12f2, 0x12f4, 0x12f6, - - 0x12f8, 0x12fa, 0x12fc, 0x12fe, 0x1300, 0x1302, 0x1304, 0x1306, - 0x1308, 0x130a, 0x130c, 0x130e, 0x1310, 0x1312, 0x1314, 0x1316, - - 0x1318, 0x131a, 0x131c, 0x131e, 0x1320, 0x1322, 0x1324, 0x1326, - 0x1328, 0x132a, 0x132c, 0x132e, 0x1330, 0x1332, 0x1334, 0xffff, - - 0xffff, 0xffff, 0x1336, 0x1338, 0x133a, 0x133c, 0x133e, 0x1340, - 0x1342, 0x1344, 0x1346, 0x1348, 0x134a, 0x134c, 0x134e, 0x1350, - - 0x1352, 0x1356, 0x135a, 0x135e, 0x1362, 0x1366, 0x136a, 0x136e, - 0x1372, 0x1376, 0x137a, 0x137e, 0x1382, 0x1386, 0x138a, 0x138f, - - 0x1394, 0x1399, 0x139e, 0x13a3, 0x13a8, 0x13ad, 0x13b2, 0x13b7, - 0x13bc, 0x13c1, 0x13c6, 0x13cb, 0x13d0, 0x13d5, 0x13dd, 0xffff, - - 0x13e4, 0x13e8, 0x13ec, 0x13f0, 0x13f4, 0x13f8, 0x13fc, 0x1400, - 0x1404, 0x1408, 0x140c, 0x1410, 0x1414, 0x1418, 0x141c, 0x1420, - - 0x1424, 0x1428, 0x142c, 0x1430, 0x1434, 0x1438, 0x143c, 0x1440, - 0x1444, 0x1448, 0x144c, 0x1450, 0x1454, 0x1458, 0x145c, 0x1460, - - 0x1464, 0x1468, 0x146c, 0x1470, 0x1474, 0x1476, 0x1478, 0x147a, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x147c, 0x1480, 0x1483, 0x1486, 0x1489, 0x148c, 0x148f, 0x1492, - 0x1495, 0x1498, 0x149b, 0x149e, 0x14a1, 0x14a4, 0x14a7, 0x14aa, - - 0x14ad, 0x14af, 0x14b1, 0x14b3, 0x14b5, 0x14b7, 0x14b9, 0x14bb, - 0x14bd, 0x14bf, 0x14c1, 0x14c3, 0x14c5, 0x14c7, 0x14c9, 0x14cc, - - 0x14cf, 0x14d2, 0x14d5, 0x14d8, 0x14db, 0x14de, 0x14e1, 0x14e4, - 0x14e7, 0x14ea, 0x14ed, 0x14f0, 0x14f3, 0x14f9, 0x14fe, 0xffff, - - 0x1501, 0x1503, 0x1505, 0x1507, 0x1509, 0x150b, 0x150d, 0x150f, - 0x1511, 0x1513, 0x1515, 0x1517, 0x1519, 0x151b, 0x151d, 0x151f, - - 0x1521, 0x1523, 0x1525, 0x1527, 0x1529, 0x152b, 0x152d, 0x152f, - 0x1531, 0x1533, 0x1535, 0x1537, 0x1539, 0x153b, 0x153d, 0x153f, - - 0x1541, 0x1543, 0x1545, 0x1547, 0x1549, 0x154b, 0x154d, 0x154f, - 0x1551, 0x1553, 0x1555, 0x1557, 0x1559, 0x155b, 0x155d, 0x155f, - - 0x1561, 0x1563, 0x1566, 0x1569, 0x156c, 0x156f, 0x1572, 0x1575, - 0x1578, 0x157b, 0x157e, 0x1581, 0x1584, 0x1587, 0x158a, 0x158d, - - 0x1590, 0x1593, 0x1596, 0x1599, 0x159c, 0x159f, 0x15a2, 0x15a5, - 0x15a8, 0x15ab, 0x15af, 0x15b3, 0x15b7, 0x15ba, 0x15be, 0x15c1, - - 0x15c5, 0x15c7, 0x15c9, 0x15cb, 0x15cd, 0x15cf, 0x15d1, 0x15d3, - 0x15d5, 0x15d7, 0x15d9, 0x15db, 0x15dd, 0x15df, 0x15e1, 0x15e3, - - 0x15e5, 0x15e7, 0x15e9, 0x15eb, 0x15ed, 0x15ef, 0x15f1, 0x15f3, - 0x15f5, 0x15f7, 0x15f9, 0x15fb, 0x15fd, 0x15ff, 0x1601, 0x1603, - - 0x1605, 0x1607, 0x1609, 0x160b, 0x160d, 0x160f, 0x1611, 0x1613, - 0x1615, 0x1617, 0x1619, 0x161b, 0x161d, 0x161f, 0x1621, 0xffff, - - 0x1623, 0x1628, 0x162d, 0x1632, 0x1636, 0x163b, 0x163f, 0x1643, - 0x1649, 0x164e, 0x1652, 0x1656, 0x165a, 0x165f, 0x1664, 0x1668, - - 0x166c, 0x166f, 0x1673, 0x1678, 0x167d, 0x1680, 0x1686, 0x168d, - 0x1693, 0x1697, 0x169d, 0x16a3, 0x16a8, 0x16ac, 0x16b0, 0x16b4, - - 0x16b9, 0x16bf, 0x16c4, 0x16c8, 0x16cc, 0x16d0, 0x16d3, 0x16d6, - 0x16d9, 0x16dc, 0x16e0, 0x16e4, 0x16ea, 0x16ee, 0x16f3, 0x16f9, - - 0x16fd, 0x1700, 0x1703, 0x1709, 0x170e, 0x1714, 0x1718, 0x171e, - 0x1721, 0x1725, 0x1729, 0x172d, 0x1731, 0x1735, 0x173a, 0x173e, - - 0x1741, 0x1745, 0x1749, 0x174d, 0x1752, 0x1756, 0x175a, 0x175e, - 0x1764, 0x1769, 0x176c, 0x1772, 0x1775, 0x177a, 0x177f, 0x1783, - - 0x1787, 0x178b, 0x1790, 0x1793, 0x1797, 0x179c, 0x179f, 0x17a5, - 0x17a9, 0x17ac, 0x17af, 0x17b2, 0x17b5, 0x17b8, 0x17bb, 0x17be, - - 0x17c1, 0x17c4, 0x17c7, 0x17cb, 0x17cf, 0x17d3, 0x17d7, 0x17db, - 0x17df, 0x17e3, 0x17e7, 0x17eb, 0x17ef, 0x17f3, 0x17f7, 0x17fb, - - 0x17ff, 0x1803, 0x1807, 0x180a, 0x180d, 0x1811, 0x1814, 0x1817, - 0x181a, 0x181e, 0x1822, 0x1825, 0x1828, 0x182b, 0x182e, 0x1831, - - 0x1836, 0x1839, 0x183c, 0x183f, 0x1842, 0x1845, 0x1848, 0x184b, - 0x184e, 0x1852, 0x1857, 0x185a, 0x185d, 0x1860, 0x1863, 0x1866, - - 0x1869, 0x186c, 0x1870, 0x1874, 0x1878, 0x187c, 0x187f, 0x1882, - 0x1885, 0x1888, 0x188b, 0x188e, 0x1891, 0x1894, 0x1897, 0x189a, - - 0x189e, 0x18a2, 0x18a5, 0x18a9, 0x18ad, 0x18b1, 0x18b4, 0x18b8, - 0x18bc, 0x18c1, 0x18c4, 0x18c8, 0x18cc, 0x18d0, 0x18d4, 0x18da, - - 0x18e1, 0x18e4, 0x18e7, 0x18ea, 0x18ed, 0x18f0, 0x18f3, 0x18f6, - 0x18f9, 0x18fc, 0x18ff, 0x1902, 0x1905, 0x1908, 0x190b, 0x190e, - - 0x1911, 0x1914, 0x1917, 0x191c, 0x191f, 0x1922, 0x1925, 0x192a, - 0x192e, 0x1931, 0x1934, 0x1937, 0x193a, 0x193d, 0x1940, 0x1943, - - 0x1946, 0x1949, 0x194c, 0x1950, 0x1953, 0x1956, 0x195a, 0x195e, - 0x1961, 0x1966, 0x196a, 0x196d, 0x1970, 0x1973, 0x1976, 0x197a, - - 0x197e, 0x1981, 0x1984, 0x1987, 0x198a, 0x198d, 0x1990, 0x1993, - 0x1996, 0x1999, 0x199d, 0x19a1, 0x19a5, 0x19a9, 0x19ad, 0x19b1, - - 0x19b5, 0x19b9, 0x19bd, 0x19c1, 0x19c5, 0x19c9, 0x19cd, 0x19d1, - 0x19d5, 0x19d9, 0x19dd, 0x19e1, 0x19e5, 0x19e9, 0x19ed, 0x19f1, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0x19f5, 0x19f7, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x19f9, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x19fb, 0x19fd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0x19ff, 0x1a01, 0x1a03, 0x1a05, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x1a07, 0x1a09, 0x1a0b, 0x1a0d, 0x1a0f, 0x1a11, 0x1a13, 0x1a15, - 0x1a17, 0x1a19, 0x1a1b, 0x1a1d, 0x1a1f, 0x1a21, 0x1a23, 0x1a25, - 0x1a27, 0x1a29, 0x1a2b, 0x1a2d, 0x1a2f, 0x1a31, 0x1a33, 0x1a35, - 0x1a37, 0x1a39, 0x1a3b, 0x1a3d, 0x1a3f, 0x1a41, 0x1a43, 0x1a45, - 0x1a47, 0x1a49, 0x1a4b, 0x1a4d, 0x1a4f, 0x1a51, 0x1a53, 0x1a55, - 0x1a57, 0x1a59, 0x1a5b, 0x1a5d, 0x1a5f, 0x1a61, 0x1a63, 0x1a65, - 0x1a67, 0x1a69, 0x1a6b, 0x1a6d, 0x1a6f, 0x1a71, 0x1a73, 0x1a75, - 0x1a77, 0x1a79, 0x1a7b, 0x1a7d, 0x1a7f, 0x1a81, 0x1a83, 0x1a85, - 0x1a87, 0x1a89, 0x1a8b, 0x1a8d, 0x1a8f, 0x1a91, 0x1a93, 0x1a95, - 0x1a97, 0x1a99, 0x1a9b, 0x1a9d, 0x1a9f, 0x1aa1, 0x1aa3, 0x1aa5, - 0x1aa7, 0x1aa9, 0x1aab, 0x1aad, 0x1aaf, 0x1ab1, 0x1ab3, 0x1ab5, - 0x1ab7, 0x1ab9, 0x1abb, 0x1abd, 0x1abf, 0x1ac1, 0x1ac3, 0x1ac5, - 0x1ac7, 0x1ac9, 0x1acb, 0x1acd, 0x1acf, 0x1ad1, 0x1ad3, 0x1ad5, - 0x1ad7, 0x1ad9, 0x1adb, 0x1add, 0x1adf, 0x1ae1, 0x1ae3, 0x1ae5, - 0x1ae7, 0x1ae9, 0x1aeb, 0x1aed, 0x1aef, 0x1af1, 0x1af3, 0x1af5, - 0x1af7, 0x1af9, 0x1afb, 0x1afd, 0x1aff, 0x1b01, 0x1b03, 0x1b05, - 0x1b07, 0x1b09, 0x1b0b, 0x1b0d, 0x1b0f, 0x1b11, 0x1b13, 0x1b15, - 0x1b17, 0x1b19, 0x1b1b, 0x1b1d, 0x1b1f, 0x1b21, 0x1b23, 0x1b25, - 0x1b27, 0x1b29, 0x1b2b, 0x1b2d, 0x1b2f, 0x1b31, 0x1b33, 0x1b35, - 0x1b37, 0x1b39, 0x1b3b, 0x1b3d, 0x1b3f, 0x1b41, 0x1b43, 0x1b45, - 0x1b47, 0x1b49, 0x1b4b, 0x1b4d, 0x1b4f, 0x1b51, 0x1b53, 0x1b55, - 0x1b57, 0x1b59, 0x1b5b, 0x1b5d, 0x1b5f, 0x1b61, 0x1b63, 0x1b65, - 0x1b67, 0x1b69, 0x1b6b, 0x1b6d, 0x1b6f, 0x1b71, 0x1b73, 0x1b75, - 0x1b77, 0x1b79, 0x1b7b, 0x1b7d, 0x1b7f, 0x1b81, 0x1b83, 0x1b85, - 0x1b87, 0x1b89, 0x1b8b, 0x1b8d, 0x1b8f, 0x1b91, 0x1b93, 0x1b95, - 0x1b97, 0x1b99, 0x1b9b, 0x1b9d, 0x1b9f, 0x1ba1, 0x1ba3, 0x1ba5, - 0x1ba7, 0x1ba9, 0x1bab, 0x1bad, 0x1baf, 0x1bb1, 0x1bb3, 0x1bb5, - 0x1bb7, 0x1bb9, 0x1bbb, 0x1bbd, 0x1bbf, 0x1bc1, 0x1bc3, 0x1bc5, - 0x1bc7, 0x1bc9, 0x1bcb, 0x1bcd, 0x1bcf, 0x1bd1, 0x1bd3, 0x1bd5, - 0x1bd7, 0x1bd9, 0x1bdb, 0x1bdd, 0x1bdf, 0x1be1, 0x1be3, 0x1be5, - 0x1be7, 0x1be9, 0x1beb, 0x1bed, 0x1bef, 0x1bf1, 0x1bf3, 0x1bf5, - 0x1bf7, 0x1bf9, 0x1bfb, 0x1bfd, 0x1bff, 0x1c01, 0x1c03, 0x1c05, - - 0x1c07, 0x1c09, 0x1c0b, 0x1c0d, 0x1c0f, 0x1c11, 0x1c13, 0x1c15, - 0x1c17, 0x1c19, 0x1c1b, 0x1c1d, 0x1c1f, 0x1c21, 0xffff, 0xffff, - 0x1c23, 0xffff, 0x1c25, 0xffff, 0xffff, 0x1c27, 0x1c29, 0x1c2b, - 0x1c2d, 0x1c2f, 0x1c31, 0x1c33, 0x1c35, 0x1c37, 0x1c39, 0xffff, - 0x1c3b, 0xffff, 0x1c3d, 0xffff, 0xffff, 0x1c3f, 0x1c41, 0xffff, - 0xffff, 0xffff, 0x1c43, 0x1c45, 0x1c47, 0x1c49, 0x1c4b, 0x1c4d, - 0x1c4f, 0x1c51, 0x1c53, 0x1c55, 0x1c57, 0x1c59, 0x1c5b, 0x1c5d, - 0x1c5f, 0x1c61, 0x1c63, 0x1c65, 0x1c67, 0x1c69, 0x1c6b, 0x1c6d, - 0x1c6f, 0x1c71, 0x1c73, 0x1c75, 0x1c77, 0x1c79, 0x1c7b, 0x1c7d, - 0x1c7f, 0x1c81, 0x1c83, 0x1c85, 0x1c87, 0x1c89, 0x1c8b, 0x1c8d, - 0x1c8f, 0x1c91, 0x1c93, 0x1c95, 0x1c97, 0x1c99, 0x1c9b, 0x1c9d, - 0x1c9f, 0x1ca1, 0x1ca3, 0x1ca5, 0x1ca7, 0x1ca9, 0x1cab, 0x1cad, - 0x1caf, 0x1cb1, 0x1cb3, 0x1cb5, 0x1cb7, 0x1cb9, 0x1cbb, 0x1cbd, - 0x1cbf, 0x1cc1, 0x1cc3, 0x1cc5, 0x1cc7, 0x1cca, 0xffff, 0xffff, - 0x1ccc, 0x1cce, 0x1cd0, 0x1cd2, 0x1cd4, 0x1cd6, 0x1cd8, 0x1cda, - 0x1cdc, 0x1cde, 0x1ce0, 0x1ce2, 0x1ce4, 0x1ce6, 0x1ce8, 0x1cea, - 0x1cec, 0x1cee, 0x1cf0, 0x1cf2, 0x1cf4, 0x1cf6, 0x1cf8, 0x1cfa, - 0x1cfc, 0x1cfe, 0x1d00, 0x1d02, 0x1d04, 0x1d06, 0x1d08, 0x1d0a, - 0x1d0c, 0x1d0e, 0x1d10, 0x1d12, 0x1d14, 0x1d16, 0x1d18, 0x1d1a, - 0x1d1c, 0x1d1e, 0x1d20, 0x1d22, 0x1d24, 0x1d26, 0x1d28, 0x1d2a, - 0x1d2c, 0x1d2e, 0x1d30, 0x1d32, 0x1d34, 0x1d36, 0x1d38, 0x1d3a, - 0x1d3c, 0x1d3e, 0x1d40, 0x1d42, 0x1d44, 0x1d46, 0x1d48, 0x1d4a, - 0x1d4c, 0x1d4e, 0x1d50, 0x1d52, 0x1d54, 0x1d56, 0x1d58, 0x1d5a, - 0x1d5c, 0x1d5e, 0x1d60, 0x1d62, 0x1d64, 0x1d66, 0x1d68, 0x1d6a, - 0x1d6c, 0x1d6e, 0x1d70, 0x1d72, 0x1d74, 0x1d76, 0x1d78, 0x1d7a, - 0x1d7c, 0x1d7e, 0x1d80, 0x1d82, 0x1d84, 0x1d86, 0x1d88, 0x1d8a, - 0x1d8d, 0x1d90, 0x1d93, 0x1d95, 0x1d97, 0x1d99, 0x1d9c, 0x1d9f, - 0x1da2, 0x1da4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x1da6, 0x1da9, 0x1dac, 0x1daf, 0x1db3, 0x1db7, 0x1dba, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x1dbd, 0x1dc0, 0x1dc3, 0x1dc6, 0x1dc9, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x1dcc, 0xffff, 0x1dcf, - 0x1dd2, 0x1dd4, 0x1dd6, 0x1dd8, 0x1dda, 0x1ddc, 0x1dde, 0x1de0, - 0x1de2, 0x1de4, 0x1de6, 0x1de9, 0x1dec, 0x1def, 0x1df2, 0x1df5, - 0x1df8, 0x1dfb, 0x1dfe, 0x1e01, 0x1e04, 0x1e07, 0x1e0a, 0xffff, - 0x1e0d, 0x1e10, 0x1e13, 0x1e16, 0x1e19, 0xffff, 0x1e1c, 0xffff, - 0x1e1f, 0x1e22, 0xffff, 0x1e25, 0x1e28, 0xffff, 0x1e2b, 0x1e2e, - 0x1e31, 0x1e34, 0x1e37, 0x1e3a, 0x1e3d, 0x1e40, 0x1e43, 0x1e46, - 0x1e49, 0x1e4b, 0x1e4d, 0x1e4f, 0x1e51, 0x1e53, 0x1e55, 0x1e57, - 0x1e59, 0x1e5b, 0x1e5d, 0x1e5f, 0x1e61, 0x1e63, 0x1e65, 0x1e67, - 0x1e69, 0x1e6b, 0x1e6d, 0x1e6f, 0x1e71, 0x1e73, 0x1e75, 0x1e77, - 0x1e79, 0x1e7b, 0x1e7d, 0x1e7f, 0x1e81, 0x1e83, 0x1e85, 0x1e87, - 0x1e89, 0x1e8b, 0x1e8d, 0x1e8f, 0x1e91, 0x1e93, 0x1e95, 0x1e97, - 0x1e99, 0x1e9b, 0x1e9d, 0x1e9f, 0x1ea1, 0x1ea3, 0x1ea5, 0x1ea7, - 0x1ea9, 0x1eab, 0x1ead, 0x1eaf, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eb7, - 0x1eb9, 0x1ebb, 0x1ebd, 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7, - 0x1ec9, 0x1ecb, 0x1ecd, 0x1ecf, 0x1ed1, 0x1ed3, 0x1ed5, 0x1ed7, - 0x1ed9, 0x1edb, 0x1edd, 0x1edf, 0x1ee1, 0x1ee3, 0x1ee5, 0x1ee7, - 0x1ee9, 0x1eeb, 0x1eed, 0x1eef, 0x1ef1, 0x1ef3, 0x1ef5, 0x1ef7, - 0x1ef9, 0x1efb, 0x1efd, 0x1eff, 0x1f01, 0x1f03, 0x1f05, 0x1f07, - 0x1f09, 0x1f0b, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x1f0d, 0x1f0f, 0x1f11, 0x1f13, 0x1f15, - 0x1f17, 0x1f19, 0x1f1b, 0x1f1d, 0x1f1f, 0x1f21, 0x1f23, 0x1f25, - 0x1f27, 0x1f29, 0x1f2b, 0x1f2d, 0x1f2f, 0x1f31, 0x1f33, 0x1f35, - 0x1f37, 0x1f39, 0x1f3b, 0x1f3e, 0x1f41, 0x1f44, 0x1f47, 0x1f4a, - 0x1f4d, 0x1f50, 0x1f53, 0x1f56, 0x1f59, 0x1f5c, 0x1f5f, 0x1f62, - 0x1f65, 0x1f68, 0x1f6b, 0x1f6e, 0x1f71, 0x1f73, 0x1f75, 0x1f77, - - 0x1f79, 0x1f7c, 0x1f7f, 0x1f82, 0x1f85, 0x1f88, 0x1f8b, 0x1f8e, - 0x1f91, 0x1f94, 0x1f97, 0x1f9a, 0x1f9d, 0x1fa0, 0x1fa3, 0x1fa6, - 0x1fa9, 0x1fac, 0x1faf, 0x1fb2, 0x1fb5, 0x1fb8, 0x1fbb, 0x1fbe, - 0x1fc1, 0x1fc4, 0x1fc7, 0x1fca, 0x1fcd, 0x1fd0, 0x1fd3, 0x1fd6, - 0x1fd9, 0x1fdc, 0x1fdf, 0x1fe2, 0x1fe5, 0x1fe8, 0x1feb, 0x1fee, - 0x1ff1, 0x1ff4, 0x1ff7, 0x1ffa, 0x1ffd, 0x2000, 0x2003, 0x2006, - 0x2009, 0x200c, 0x200f, 0x2012, 0x2015, 0x2018, 0x201b, 0x201e, - 0x2021, 0x2024, 0x2027, 0x202a, 0x202d, 0x2030, 0x2033, 0x2036, - 0x2039, 0x203c, 0x203f, 0x2042, 0x2045, 0x2048, 0x204b, 0x204e, - 0x2051, 0x2054, 0x2057, 0x205a, 0x205d, 0x2060, 0x2063, 0x2066, - 0x2069, 0x206c, 0x206f, 0x2072, 0x2075, 0x2078, 0x207b, 0x207e, - 0x2081, 0x2084, 0x2087, 0x208a, 0x208d, 0x2090, 0x2093, 0x2097, - 0x209b, 0x209f, 0x20a3, 0x20a7, 0x20ab, 0x20ae, 0x20b1, 0x20b4, - 0x20b7, 0x20ba, 0x20bd, 0x20c0, 0x20c3, 0x20c6, 0x20c9, 0x20cc, - 0x20cf, 0x20d2, 0x20d5, 0x20d8, 0x20db, 0x20de, 0x20e1, 0x20e4, - 0x20e7, 0x20ea, 0x20ed, 0x20f0, 0x20f3, 0x20f6, 0x20f9, 0x20fc, - 0x20ff, 0x2102, 0x2105, 0x2108, 0x210b, 0x210e, 0x2111, 0x2114, - 0x2117, 0x211a, 0x211d, 0x2120, 0x2123, 0x2126, 0x2129, 0x212c, - 0x212f, 0x2132, 0x2135, 0x2138, 0x213b, 0x213e, 0x2141, 0x2144, - 0x2147, 0x214a, 0x214d, 0x2150, 0x2153, 0x2156, 0x2159, 0x215c, - 0x215f, 0x2162, 0x2165, 0x2168, 0x216b, 0x216e, 0x2171, 0x2174, - 0x2177, 0x217a, 0x217d, 0x2180, 0x2183, 0x2186, 0x2189, 0x218c, - 0x218f, 0x2192, 0x2195, 0x2198, 0x219b, 0x219e, 0x21a1, 0x21a4, - 0x21a7, 0x21aa, 0x21ad, 0x21b0, 0x21b3, 0x21b6, 0x21b9, 0x21bc, - 0x21bf, 0x21c2, 0x21c5, 0x21c8, 0x21cb, 0x21ce, 0x21d1, 0x21d4, - 0x21d7, 0x21da, 0x21dd, 0x21e0, 0x21e3, 0x21e6, 0x21e9, 0x21ec, - 0x21ef, 0x21f2, 0x21f5, 0x21f8, 0x21fb, 0x21fe, 0x2201, 0x2204, - 0x2207, 0x220a, 0x220d, 0x2210, 0x2213, 0x2216, 0x2219, 0x221c, - 0x221f, 0x2222, 0x2225, 0x2228, 0x222b, 0x222e, 0x2231, 0x2234, - 0x2237, 0x223a, 0x223d, 0x2240, 0x2243, 0x2246, 0x2249, 0x224c, - 0x224f, 0x2252, 0x2255, 0x2259, 0x225d, 0x2261, 0x2264, 0x2267, - 0x226a, 0x226d, 0x2270, 0x2273, 0x2276, 0x2279, 0x227c, 0x227f, - - 0x2282, 0x2285, 0x2288, 0x228b, 0x228e, 0x2291, 0x2294, 0x2297, - 0x229a, 0x229d, 0x22a0, 0x22a3, 0x22a6, 0x22a9, 0x22ac, 0x22af, - 0x22b2, 0x22b5, 0x22b8, 0x22bb, 0x22be, 0x22c1, 0x22c4, 0x22c7, - 0x22ca, 0x22cd, 0x22d0, 0x22d3, 0x22d6, 0x22d9, 0x22dc, 0x22df, - 0x22e2, 0x22e5, 0x22e8, 0x22eb, 0x22ee, 0x22f1, 0x22f4, 0x22f7, - 0x22fa, 0x22fd, 0x2300, 0x2303, 0x2306, 0x2309, 0x230c, 0x230f, - 0x2312, 0x2315, 0x2318, 0x231b, 0x231e, 0x2321, 0x2324, 0x2327, - 0x232a, 0x232d, 0x2330, 0x2333, 0x2336, 0x2339, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x233c, 0x2340, 0x2344, 0x2348, 0x234c, 0x2350, 0x2354, 0x2358, - 0x235c, 0x2360, 0x2364, 0x2368, 0x236c, 0x2370, 0x2374, 0x2378, - 0x237c, 0x2380, 0x2384, 0x2388, 0x238c, 0x2390, 0x2394, 0x2398, - 0x239c, 0x23a0, 0x23a4, 0x23a8, 0x23ac, 0x23b0, 0x23b4, 0x23b8, - 0x23bc, 0x23c0, 0x23c4, 0x23c8, 0x23cc, 0x23d0, 0x23d4, 0x23d8, - 0x23dc, 0x23e0, 0x23e4, 0x23e8, 0x23ec, 0x23f0, 0x23f4, 0x23f8, - 0x23fc, 0x2400, 0x2404, 0x2408, 0x240c, 0x2410, 0x2414, 0x2418, - 0x241c, 0x2420, 0x2424, 0x2428, 0x242c, 0x2430, 0x2434, 0x2438, - 0xffff, 0xffff, 0x243c, 0x2440, 0x2444, 0x2448, 0x244c, 0x2450, - 0x2454, 0x2458, 0x245c, 0x2460, 0x2464, 0x2468, 0x246c, 0x2470, - 0x2474, 0x2478, 0x247c, 0x2480, 0x2484, 0x2488, 0x248c, 0x2490, - 0x2494, 0x2498, 0x249c, 0x24a0, 0x24a4, 0x24a8, 0x24ac, 0x24b0, - 0x24b4, 0x24b8, 0x24bc, 0x24c0, 0x24c4, 0x24c8, 0x24cc, 0x24d0, - 0x24d4, 0x24d8, 0x24dc, 0x24e0, 0x24e4, 0x24e8, 0x24ec, 0x24f0, - 0x24f4, 0x24f8, 0x24fc, 0x2500, 0x2504, 0x2508, 0x250c, 0x2510, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x2514, 0x2518, 0x251c, 0x2521, 0x2526, 0x252b, 0x2530, 0x2535, - 0x253a, 0x253f, 0x2543, 0x2556, 0x255f, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x2564, 0x2566, 0x2568, 0x256a, 0x256c, 0x256e, 0x2570, 0x2572, - 0x2574, 0x2576, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x2578, 0x257a, 0x257c, 0x257e, 0x2580, 0x2582, 0x2584, 0x2586, - 0x2588, 0x258a, 0x258c, 0x258e, 0x2590, 0x2592, 0x2594, 0x2596, - 0x2598, 0x259a, 0x259c, 0x259e, 0x25a0, 0xffff, 0xffff, 0x25a2, - 0x25a4, 0x25a6, 0x25a8, 0x25aa, 0x25ac, 0x25ae, 0x25b0, 0x25b2, - 0x25b4, 0x25b6, 0x25b8, 0xffff, 0x25ba, 0x25bc, 0x25be, 0x25c0, - 0x25c2, 0x25c4, 0x25c6, 0x25c8, 0x25ca, 0x25cc, 0x25ce, 0x25d0, - 0x25d2, 0x25d4, 0x25d6, 0x25d8, 0x25da, 0x25dc, 0x25de, 0xffff, - 0x25e0, 0x25e2, 0x25e4, 0x25e6, 0xffff, 0xffff, 0xffff, 0xffff, - 0x25e8, 0x25eb, 0x25ee, 0xffff, 0x25f1, 0xffff, 0x25f4, 0x25f7, - 0x25fa, 0x25fd, 0x2600, 0x2603, 0x2606, 0x2609, 0x260c, 0x260f, - 0x2612, 0x2614, 0x2616, 0x2618, 0x261a, 0x261c, 0x261e, 0x2620, - 0x2622, 0x2624, 0x2626, 0x2628, 0x262a, 0x262c, 0x262e, 0x2630, - 0x2632, 0x2634, 0x2636, 0x2638, 0x263a, 0x263c, 0x263e, 0x2640, - 0x2642, 0x2644, 0x2646, 0x2648, 0x264a, 0x264c, 0x264e, 0x2650, - 0x2652, 0x2654, 0x2656, 0x2658, 0x265a, 0x265c, 0x265e, 0x2660, - 0x2662, 0x2664, 0x2666, 0x2668, 0x266a, 0x266c, 0x266e, 0x2670, - 0x2672, 0x2674, 0x2676, 0x2678, 0x267a, 0x267c, 0x267e, 0x2680, - 0x2682, 0x2684, 0x2686, 0x2688, 0x268a, 0x268c, 0x268e, 0x2690, - 0x2692, 0x2694, 0x2696, 0x2698, 0x269a, 0x269c, 0x269e, 0x26a0, - 0x26a2, 0x26a4, 0x26a6, 0x26a8, 0x26aa, 0x26ac, 0x26ae, 0x26b0, - 0x26b2, 0x26b4, 0x26b6, 0x26b8, 0x26ba, 0x26bc, 0x26be, 0x26c0, - 0x26c2, 0x26c4, 0x26c6, 0x26c8, 0x26ca, 0x26cc, 0x26ce, 0x26d0, - 0x26d2, 0x26d4, 0x26d6, 0x26d8, 0x26da, 0x26dc, 0x26de, 0x26e0, - 0x26e2, 0x26e4, 0x26e6, 0x26e8, 0x26ea, 0x26ec, 0x26ee, 0x26f0, - 0x26f2, 0x26f4, 0x26f6, 0x26f8, 0x26fa, 0x26fc, 0x26ff, 0x2702, - 0x2705, 0x2708, 0x270b, 0x270e, 0x2711, 0xffff, 0xffff, 0xffff, - - 0xffff, 0x2714, 0x2716, 0x2718, 0x271a, 0x271c, 0x271e, 0x2720, - 0x2722, 0x2724, 0x2726, 0x2728, 0x272a, 0x272c, 0x272e, 0x2730, - 0x2732, 0x2734, 0x2736, 0x2738, 0x273a, 0x273c, 0x273e, 0x2740, - 0x2742, 0x2744, 0x2746, 0x2748, 0x274a, 0x274c, 0x274e, 0x2750, - 0x2752, 0x2754, 0x2756, 0x2758, 0x275a, 0x275c, 0x275e, 0x2760, - 0x2762, 0x2764, 0x2766, 0x2768, 0x276a, 0x276c, 0x276e, 0x2770, - 0x2772, 0x2774, 0x2776, 0x2778, 0x277a, 0x277c, 0x277e, 0x2780, - 0x2782, 0x2784, 0x2786, 0x2788, 0x278a, 0x278c, 0x278e, 0x2790, - 0x2792, 0x2794, 0x2796, 0x2798, 0x279a, 0x279c, 0x279e, 0x27a0, - 0x27a2, 0x27a4, 0x27a6, 0x27a8, 0x27aa, 0x27ac, 0x27ae, 0x27b0, - 0x27b2, 0x27b4, 0x27b6, 0x27b8, 0x27ba, 0x27bc, 0x27be, 0x27c0, - 0x27c2, 0x27c4, 0x27c6, 0x27c8, 0x27ca, 0x27cc, 0x27ce, 0x27d0, - 0x27d2, 0x27d4, 0x27d6, 0x27d8, 0x27da, 0x27dc, 0x27de, 0x27e0, - 0x27e2, 0x27e4, 0x27e6, 0x27e8, 0x27ea, 0x27ec, 0x27ee, 0x27f0, - 0x27f2, 0x27f4, 0x27f6, 0x27f8, 0x27fa, 0x27fc, 0x27fe, 0x2800, - 0x2802, 0x2804, 0x2806, 0x2808, 0x280a, 0x280c, 0x280e, 0x2810, - 0x2812, 0x2814, 0x2816, 0x2818, 0x281a, 0x281c, 0x281e, 0x2820, - 0x2822, 0x2824, 0x2826, 0x2828, 0x282a, 0x282c, 0x282e, 0x2830, - 0x2832, 0x2834, 0x2836, 0x2838, 0x283a, 0x283c, 0x283e, 0x2840, - 0x2842, 0x2844, 0x2846, 0x2848, 0x284a, 0x284c, 0x284e, 0x2850, - 0x2852, 0x2854, 0x2856, 0x2858, 0x285a, 0x285c, 0x285e, 0x2860, - 0x2862, 0x2864, 0x2866, 0x2868, 0x286a, 0x286c, 0x286e, 0x2870, - 0x2872, 0x2874, 0x2876, 0x2878, 0x287a, 0x287c, 0x287e, 0x2880, - 0x2882, 0x2884, 0x2886, 0x2888, 0x288a, 0x288c, 0x288e, 0xffff, - 0xffff, 0xffff, 0x2890, 0x2892, 0x2894, 0x2896, 0x2898, 0x289a, - 0xffff, 0xffff, 0x289c, 0x289e, 0x28a0, 0x28a2, 0x28a4, 0x28a6, - 0xffff, 0xffff, 0x28a8, 0x28aa, 0x28ac, 0x28ae, 0x28b0, 0x28b2, - 0xffff, 0xffff, 0x28b4, 0x28b6, 0x28b8, 0xffff, 0xffff, 0xffff, - 0x28ba, 0x28bc, 0x28be, 0x28c0, 0x28c2, 0x28c4, 0x28c6, 0xffff, - 0x28c8, 0x28ca, 0x28cc, 0x28ce, 0x28d0, 0x28d2, 0x28d4, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x28d6, 0xffff, 0x28db, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x28e0, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x28e5, 0x28ea, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x28ef, 0x28f4, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x28f9, 0x28fe, 0xffff, 0x2903, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x2908, 0x290d, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x2912, 0x2917, - 0x291c, 0x2921, 0x2926, 0x292b, 0x2930, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x2935, 0x293a, 0x293f, 0x2944, 0x2949, - 0x294e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x2953, 0x2955, 0x2957, 0x2959, 0x295b, 0x295d, 0x295f, 0x2961, - 0x2963, 0x2965, 0x2967, 0x2969, 0x296b, 0x296d, 0x296f, 0x2971, - 0x2973, 0x2975, 0x2977, 0x2979, 0x297b, 0x297d, 0x297f, 0x2981, - 0x2983, 0x2985, 0x2987, 0x2989, 0x298b, 0x298d, 0x298f, 0x2991, - 0x2993, 0x2995, 0x2997, 0x2999, 0x299b, 0x299d, 0x299f, 0x29a1, - 0x29a3, 0x29a5, 0x29a7, 0x29a9, 0x29ab, 0x29ad, 0x29af, 0x29b1, - 0x29b3, 0x29b5, 0x29b7, 0x29b9, 0x29bb, 0x29bd, 0x29bf, 0x29c1, - 0x29c3, 0x29c5, 0x29c7, 0x29c9, 0x29cb, 0x29cd, 0x29cf, 0x29d1, - 0x29d3, 0x29d5, 0x29d7, 0x29d9, 0x29db, 0x29dd, 0x29df, 0x29e1, - 0x29e3, 0x29e5, 0x29e7, 0x29e9, 0x29eb, 0x29ed, 0x29ef, 0x29f1, - 0x29f3, 0x29f5, 0x29f7, 0x29f9, 0x29fb, 0xffff, 0x29fd, 0x29ff, - 0x2a01, 0x2a03, 0x2a05, 0x2a07, 0x2a09, 0x2a0b, 0x2a0d, 0x2a0f, - 0x2a11, 0x2a13, 0x2a15, 0x2a17, 0x2a19, 0x2a1b, 0x2a1d, 0x2a1f, - 0x2a21, 0x2a23, 0x2a25, 0x2a27, 0x2a29, 0x2a2b, 0x2a2d, 0x2a2f, - 0x2a31, 0x2a33, 0x2a35, 0x2a37, 0x2a39, 0x2a3b, 0x2a3d, 0x2a3f, - 0x2a41, 0x2a43, 0x2a45, 0x2a47, 0x2a49, 0x2a4b, 0x2a4d, 0x2a4f, - 0x2a51, 0x2a53, 0x2a55, 0x2a57, 0x2a59, 0x2a5b, 0x2a5d, 0x2a5f, - 0x2a61, 0x2a63, 0x2a65, 0x2a67, 0x2a69, 0x2a6b, 0x2a6d, 0x2a6f, - 0x2a71, 0x2a73, 0x2a75, 0x2a77, 0x2a79, 0x2a7b, 0x2a7d, 0x2a7f, - 0x2a81, 0x2a83, 0x2a85, 0x2a87, 0x2a89, 0xffff, 0x2a8b, 0x2a8d, - 0xffff, 0xffff, 0x2a8f, 0xffff, 0xffff, 0x2a91, 0x2a93, 0xffff, - 0xffff, 0x2a95, 0x2a97, 0x2a99, 0x2a9b, 0xffff, 0x2a9d, 0x2a9f, - 0x2aa1, 0x2aa3, 0x2aa5, 0x2aa7, 0x2aa9, 0x2aab, 0x2aad, 0x2aaf, - 0x2ab1, 0x2ab3, 0xffff, 0x2ab5, 0xffff, 0x2ab7, 0x2ab9, 0x2abb, - 0x2abd, 0x2abf, 0x2ac1, 0x2ac3, 0xffff, 0x2ac5, 0x2ac7, 0x2ac9, - 0x2acb, 0x2acd, 0x2acf, 0x2ad1, 0x2ad3, 0x2ad5, 0x2ad7, 0x2ad9, - 0x2adb, 0x2add, 0x2adf, 0x2ae1, 0x2ae3, 0x2ae5, 0x2ae7, 0x2ae9, - 0x2aeb, 0x2aed, 0x2aef, 0x2af1, 0x2af3, 0x2af5, 0x2af7, 0x2af9, - 0x2afb, 0x2afd, 0x2aff, 0x2b01, 0x2b03, 0x2b05, 0x2b07, 0x2b09, - 0x2b0b, 0x2b0d, 0x2b0f, 0x2b11, 0x2b13, 0x2b15, 0x2b17, 0x2b19, - 0x2b1b, 0x2b1d, 0x2b1f, 0x2b21, 0x2b23, 0x2b25, 0x2b27, 0x2b29, - 0x2b2b, 0x2b2d, 0x2b2f, 0x2b31, 0x2b33, 0x2b35, 0x2b37, 0x2b39, - - 0x2b3b, 0x2b3d, 0x2b3f, 0x2b41, 0x2b43, 0x2b45, 0xffff, 0x2b47, - 0x2b49, 0x2b4b, 0x2b4d, 0xffff, 0xffff, 0x2b4f, 0x2b51, 0x2b53, - 0x2b55, 0x2b57, 0x2b59, 0x2b5b, 0x2b5d, 0xffff, 0x2b5f, 0x2b61, - 0x2b63, 0x2b65, 0x2b67, 0x2b69, 0x2b6b, 0xffff, 0x2b6d, 0x2b6f, - 0x2b71, 0x2b73, 0x2b75, 0x2b77, 0x2b79, 0x2b7b, 0x2b7d, 0x2b7f, - 0x2b81, 0x2b83, 0x2b85, 0x2b87, 0x2b89, 0x2b8b, 0x2b8d, 0x2b8f, - 0x2b91, 0x2b93, 0x2b95, 0x2b97, 0x2b99, 0x2b9b, 0x2b9d, 0x2b9f, - 0x2ba1, 0x2ba3, 0xffff, 0x2ba5, 0x2ba7, 0x2ba9, 0x2bab, 0xffff, - 0x2bad, 0x2baf, 0x2bb1, 0x2bb3, 0x2bb5, 0xffff, 0x2bb7, 0xffff, - 0xffff, 0xffff, 0x2bb9, 0x2bbb, 0x2bbd, 0x2bbf, 0x2bc1, 0x2bc3, - 0x2bc5, 0xffff, 0x2bc7, 0x2bc9, 0x2bcb, 0x2bcd, 0x2bcf, 0x2bd1, - 0x2bd3, 0x2bd5, 0x2bd7, 0x2bd9, 0x2bdb, 0x2bdd, 0x2bdf, 0x2be1, - 0x2be3, 0x2be5, 0x2be7, 0x2be9, 0x2beb, 0x2bed, 0x2bef, 0x2bf1, - 0x2bf3, 0x2bf5, 0x2bf7, 0x2bf9, 0x2bfb, 0x2bfd, 0x2bff, 0x2c01, - 0x2c03, 0x2c05, 0x2c07, 0x2c09, 0x2c0b, 0x2c0d, 0x2c0f, 0x2c11, - 0x2c13, 0x2c15, 0x2c17, 0x2c19, 0x2c1b, 0x2c1d, 0x2c1f, 0x2c21, - 0x2c23, 0x2c25, 0x2c27, 0x2c29, 0x2c2b, 0x2c2d, 0x2c2f, 0x2c31, - 0x2c33, 0x2c35, 0x2c37, 0x2c39, 0x2c3b, 0x2c3d, 0x2c3f, 0x2c41, - 0x2c43, 0x2c45, 0x2c47, 0x2c49, 0x2c4b, 0x2c4d, 0x2c4f, 0x2c51, - 0x2c53, 0x2c55, 0x2c57, 0x2c59, 0x2c5b, 0x2c5d, 0x2c5f, 0x2c61, - 0x2c63, 0x2c65, 0x2c67, 0x2c69, 0x2c6b, 0x2c6d, 0x2c6f, 0x2c71, - 0x2c73, 0x2c75, 0x2c77, 0x2c79, 0x2c7b, 0x2c7d, 0x2c7f, 0x2c81, - 0x2c83, 0x2c85, 0x2c87, 0x2c89, 0x2c8b, 0x2c8d, 0x2c8f, 0x2c91, - 0x2c93, 0x2c95, 0x2c97, 0x2c99, 0x2c9b, 0x2c9d, 0x2c9f, 0x2ca1, - 0x2ca3, 0x2ca5, 0x2ca7, 0x2ca9, 0x2cab, 0x2cad, 0x2caf, 0x2cb1, - 0x2cb3, 0x2cb5, 0x2cb7, 0x2cb9, 0x2cbb, 0x2cbd, 0x2cbf, 0x2cc1, - 0x2cc3, 0x2cc5, 0x2cc7, 0x2cc9, 0x2ccb, 0x2ccd, 0x2ccf, 0x2cd1, - 0x2cd3, 0x2cd5, 0x2cd7, 0x2cd9, 0x2cdb, 0x2cdd, 0x2cdf, 0x2ce1, - 0x2ce3, 0x2ce5, 0x2ce7, 0x2ce9, 0x2ceb, 0x2ced, 0x2cef, 0x2cf1, - 0x2cf3, 0x2cf5, 0x2cf7, 0x2cf9, 0x2cfb, 0x2cfd, 0x2cff, 0x2d01, - 0x2d03, 0x2d05, 0x2d07, 0x2d09, 0x2d0b, 0x2d0d, 0x2d0f, 0x2d11, - 0x2d13, 0x2d15, 0x2d17, 0x2d19, 0x2d1b, 0x2d1d, 0x2d1f, 0x2d21, - - 0x2d23, 0x2d25, 0x2d27, 0x2d29, 0x2d2b, 0x2d2d, 0x2d2f, 0x2d31, - 0x2d33, 0x2d35, 0x2d37, 0x2d39, 0x2d3b, 0x2d3d, 0x2d3f, 0x2d41, - 0x2d43, 0x2d45, 0x2d47, 0x2d49, 0x2d4b, 0x2d4d, 0x2d4f, 0x2d51, - 0x2d53, 0x2d55, 0x2d57, 0x2d59, 0x2d5b, 0x2d5d, 0x2d5f, 0x2d61, - 0x2d63, 0x2d65, 0x2d67, 0x2d69, 0x2d6b, 0x2d6d, 0x2d6f, 0x2d71, - 0x2d73, 0x2d75, 0x2d77, 0x2d79, 0x2d7b, 0x2d7d, 0x2d7f, 0x2d81, - 0x2d83, 0x2d85, 0x2d87, 0x2d89, 0x2d8b, 0x2d8d, 0x2d8f, 0x2d91, - 0x2d93, 0x2d95, 0x2d97, 0x2d99, 0x2d9b, 0x2d9d, 0x2d9f, 0x2da1, - 0x2da3, 0x2da5, 0x2da7, 0x2da9, 0x2dab, 0x2dad, 0x2daf, 0x2db1, - 0x2db3, 0x2db5, 0x2db7, 0x2db9, 0x2dbb, 0x2dbd, 0x2dbf, 0x2dc1, - 0x2dc3, 0x2dc5, 0x2dc7, 0x2dc9, 0x2dcb, 0x2dcd, 0x2dcf, 0x2dd1, - 0x2dd3, 0x2dd5, 0x2dd7, 0x2dd9, 0x2ddb, 0x2ddd, 0x2ddf, 0x2de1, - 0x2de3, 0x2de5, 0x2de7, 0x2de9, 0x2deb, 0x2ded, 0x2def, 0x2df1, - 0x2df3, 0x2df5, 0x2df7, 0x2df9, 0x2dfb, 0x2dfd, 0x2dff, 0x2e01, - 0x2e03, 0x2e05, 0x2e07, 0x2e09, 0x2e0b, 0x2e0d, 0x2e0f, 0x2e11, - 0x2e13, 0x2e15, 0x2e17, 0x2e19, 0x2e1b, 0x2e1d, 0x2e1f, 0x2e21, - 0x2e23, 0x2e25, 0x2e27, 0x2e29, 0x2e2b, 0x2e2d, 0x2e2f, 0x2e31, - 0x2e33, 0x2e35, 0x2e37, 0x2e39, 0x2e3b, 0x2e3d, 0x2e3f, 0x2e41, - 0x2e43, 0x2e45, 0x2e47, 0x2e49, 0x2e4b, 0x2e4d, 0x2e4f, 0x2e51, - 0x2e53, 0x2e55, 0x2e57, 0x2e59, 0x2e5b, 0x2e5d, 0x2e5f, 0x2e61, - 0x2e63, 0x2e65, 0x2e67, 0x2e69, 0x2e6b, 0x2e6d, 0xffff, 0xffff, - 0x2e6f, 0x2e71, 0x2e73, 0x2e75, 0x2e77, 0x2e79, 0x2e7b, 0x2e7d, - 0x2e7f, 0x2e81, 0x2e83, 0x2e85, 0x2e87, 0x2e89, 0x2e8b, 0x2e8d, - 0x2e8f, 0x2e91, 0x2e93, 0x2e95, 0x2e97, 0x2e99, 0x2e9b, 0x2e9d, - 0x2e9f, 0x2ea1, 0x2ea3, 0x2ea5, 0x2ea7, 0x2ea9, 0x2eab, 0x2ead, - 0x2eaf, 0x2eb1, 0x2eb3, 0x2eb5, 0x2eb7, 0x2eb9, 0x2ebb, 0x2ebd, - 0x2ebf, 0x2ec1, 0x2ec3, 0x2ec5, 0x2ec7, 0x2ec9, 0x2ecb, 0x2ecd, - 0x2ecf, 0x2ed1, 0x2ed3, 0x2ed5, 0x2ed7, 0x2ed9, 0x2edb, 0x2edd, - 0x2edf, 0x2ee1, 0x2ee3, 0x2ee5, 0x2ee7, 0x2ee9, 0x2eeb, 0x2eed, - 0x2eef, 0x2ef1, 0x2ef3, 0x2ef5, 0x2ef7, 0x2ef9, 0x2efb, 0x2efd, - 0x2eff, 0x2f01, 0x2f03, 0x2f05, 0x2f07, 0x2f09, 0x2f0b, 0x2f0d, - 0x2f0f, 0x2f11, 0x2f13, 0x2f15, 0x2f17, 0x2f19, 0x2f1b, 0x2f1d, - - 0x2f1f, 0x2f21, 0x2f23, 0x2f25, 0x2f27, 0x2f29, 0x2f2b, 0x2f2d, - 0x2f2f, 0x2f31, 0x2f33, 0x2f35, 0x2f37, 0x2f39, 0x2f3b, 0x2f3d, - 0x2f3f, 0x2f41, 0x2f43, 0x2f45, 0x2f47, 0x2f49, 0x2f4b, 0x2f4d, - 0x2f4f, 0x2f51, 0x2f53, 0x2f55, 0x2f57, 0x2f59, 0x2f5b, 0x2f5d, - 0x2f5f, 0x2f61, 0x2f63, 0x2f65, 0x2f67, 0x2f69, 0x2f6b, 0x2f6d, - 0x2f6f, 0x2f71, 0x2f73, 0x2f75, 0x2f77, 0x2f79, 0x2f7b, 0x2f7d, - 0x2f7f, 0x2f81, 0x2f83, 0x2f85, 0x2f87, 0x2f89, 0x2f8b, 0x2f8d, - 0x2f8f, 0x2f91, 0x2f93, 0x2f95, 0x2f97, 0x2f99, 0x2f9b, 0x2f9d, - 0x2f9f, 0x2fa1, 0x2fa3, 0x2fa5, 0x2fa7, 0x2fa9, 0x2fab, 0x2fad, - 0x2faf, 0x2fb1, 0x2fb3, 0x2fb5, 0x2fb7, 0x2fb9, 0x2fbb, 0x2fbd, - 0x2fbf, 0x2fc1, 0x2fc3, 0x2fc5, 0x2fc7, 0x2fc9, 0x2fcb, 0x2fcd, - 0x2fcf, 0x2fd1, 0x2fd3, 0x2fd5, 0x2fd7, 0x2fd9, 0x2fdb, 0x2fdd, - 0x2fdf, 0x2fe1, 0x2fe3, 0x2fe5, 0x2fe7, 0x2fe9, 0x2feb, 0x2fed, - 0x2fef, 0x2ff1, 0x2ff3, 0x2ff5, 0x2ff7, 0x2ff9, 0x2ffb, 0x2ffd, - 0x2fff, 0x3001, 0x3003, 0x3005, 0x3007, 0x3009, 0x300b, 0x300d, - 0x300f, 0x3011, 0x3013, 0x3015, 0x3017, 0x3019, 0x301b, 0x301d, - 0x301f, 0x3021, 0x3023, 0x3025, 0x3027, 0x3029, 0x302b, 0x302d, - 0x302f, 0x3031, 0x3033, 0x3035, 0x3037, 0x3039, 0x303b, 0x303d, - 0x303f, 0x3041, 0x3043, 0x3045, 0x3047, 0x3049, 0x304b, 0x304d, - 0x304f, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305b, 0x305d, - 0x305f, 0x3061, 0x3063, 0x3065, 0x3067, 0x3069, 0x306b, 0x306d, - 0x306f, 0x3071, 0x3073, 0x3075, 0x3077, 0x3079, 0x307b, 0x307d, - 0x307f, 0x3081, 0x3083, 0x3085, 0x3087, 0x3089, 0x308b, 0x308d, - 0x308f, 0x3091, 0x3093, 0x3095, 0x3097, 0x3099, 0x309b, 0x309d, - 0x309f, 0x30a1, 0x30a3, 0x30a5, 0x30a7, 0x30a9, 0x30ab, 0x30ad, - 0x30af, 0x30b1, 0x30b3, 0x30b5, 0xffff, 0xffff, 0x30b7, 0x30b9, - 0x30bb, 0x30bd, 0x30bf, 0x30c1, 0x30c3, 0x30c5, 0x30c7, 0x30c9, - 0x30cb, 0x30cd, 0x30cf, 0x30d1, 0x30d3, 0x30d5, 0x30d7, 0x30d9, - 0x30db, 0x30dd, 0x30df, 0x30e1, 0x30e3, 0x30e5, 0x30e7, 0x30e9, - 0x30eb, 0x30ed, 0x30ef, 0x30f1, 0x30f3, 0x30f5, 0x30f7, 0x30f9, - 0x30fb, 0x30fd, 0x30ff, 0x3101, 0x3103, 0x3105, 0x3107, 0x3109, - 0x310b, 0x310d, 0x310f, 0x3111, 0x3113, 0x3115, 0x3117, 0x3119, - - 0x311b, 0x311d, 0x311f, 0x3121, 0xffff, 0x3123, 0x3125, 0x3127, - 0x3129, 0x312b, 0x312d, 0x312f, 0x3131, 0x3133, 0x3135, 0x3137, - 0x3139, 0x313b, 0x313d, 0x313f, 0x3141, 0x3143, 0x3145, 0x3147, - 0x3149, 0x314b, 0x314d, 0x314f, 0x3151, 0x3153, 0x3155, 0x3157, - 0xffff, 0x3159, 0x315b, 0xffff, 0x315d, 0xffff, 0xffff, 0x315f, - 0xffff, 0x3161, 0x3163, 0x3165, 0x3167, 0x3169, 0x316b, 0x316d, - 0x316f, 0x3171, 0x3173, 0xffff, 0x3175, 0x3177, 0x3179, 0x317b, - 0xffff, 0x317d, 0xffff, 0x317f, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x3181, 0xffff, 0xffff, 0xffff, 0xffff, 0x3183, - 0xffff, 0x3185, 0xffff, 0x3187, 0xffff, 0x3189, 0x318b, 0x318d, - 0xffff, 0x318f, 0x3191, 0xffff, 0x3193, 0xffff, 0xffff, 0x3195, - 0xffff, 0x3197, 0xffff, 0x3199, 0xffff, 0x319b, 0xffff, 0x319d, - 0xffff, 0x319f, 0x31a1, 0xffff, 0x31a3, 0xffff, 0xffff, 0x31a5, - 0x31a7, 0x31a9, 0x31ab, 0xffff, 0x31ad, 0x31af, 0x31b1, 0x31b3, - 0x31b5, 0x31b7, 0x31b9, 0xffff, 0x31bb, 0x31bd, 0x31bf, 0x31c1, - 0xffff, 0x31c3, 0x31c5, 0x31c7, 0x31c9, 0xffff, 0x31cb, 0xffff, - 0x31cd, 0x31cf, 0x31d1, 0x31d3, 0x31d5, 0x31d7, 0x31d9, 0x31db, - 0x31dd, 0x31df, 0xffff, 0x31e1, 0x31e3, 0x31e5, 0x31e7, 0x31e9, - 0x31eb, 0x31ed, 0x31ef, 0x31f1, 0x31f3, 0x31f5, 0x31f7, 0x31f9, - 0x31fb, 0x31fd, 0x31ff, 0x3201, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0x3203, 0x3205, 0x3207, 0xffff, 0x3209, 0x320b, 0x320d, - 0x320f, 0x3211, 0xffff, 0x3213, 0x3215, 0x3217, 0x3219, 0x321b, - 0x321d, 0x321f, 0x3221, 0x3223, 0x3225, 0x3227, 0x3229, 0x322b, - 0x322d, 0x322f, 0x3231, 0x3233, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x3235, 0x3238, 0x323b, 0x323e, 0x3241, 0x3244, 0x3247, 0x324a, - 0x324d, 0x3250, 0x3253, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x3256, 0x325a, 0x325e, 0x3262, 0x3266, 0x326a, 0x326e, 0x3272, - 0x3276, 0x327a, 0x327e, 0x3282, 0x3286, 0x328a, 0x328e, 0x3292, - 0x3296, 0x329a, 0x329e, 0x32a2, 0x32a6, 0x32aa, 0x32ae, 0x32b2, - 0x32b6, 0x32ba, 0x32be, 0x32c2, 0x32c4, 0x32c6, 0x32c9, 0xffff, - 0x32cc, 0x32ce, 0x32d0, 0x32d2, 0x32d4, 0x32d6, 0x32d8, 0x32da, - 0x32dc, 0x32de, 0x32e0, 0x32e2, 0x32e4, 0x32e6, 0x32e8, 0x32ea, - 0x32ec, 0x32ee, 0x32f0, 0x32f2, 0x32f4, 0x32f6, 0x32f8, 0x32fa, - 0x32fc, 0x32fe, 0x3300, 0x3303, 0x3306, 0x3309, 0x330c, 0x3310, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x3313, 0x3316, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x3319, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x331c, 0x331f, 0x3322, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x3324, 0x3326, 0x3328, 0x332a, 0x332c, 0x332e, 0x3330, 0x3332, - 0x3334, 0x3336, 0x3338, 0x333a, 0x333c, 0x333e, 0x3340, 0x3342, - 0x3344, 0x3346, 0x3348, 0x334a, 0x334c, 0x334e, 0x3350, 0x3352, - 0x3354, 0x3356, 0x3358, 0x335a, 0x335c, 0x335e, 0x3360, 0x3362, - 0x3364, 0x3366, 0x3368, 0x336a, 0x336c, 0x336e, 0x3370, 0x3372, - 0x3374, 0x3376, 0x3378, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x337a, 0x337e, 0x3382, 0x3386, 0x338a, 0x338e, 0x3392, 0x3396, - 0x339a, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x339e, 0x33a0, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x33a2, 0x33a4, 0x33a6, 0x33a8, 0x33ab, 0x33ad, 0x33af, 0x33b1, - 0x33b3, 0x33b5, 0x33b7, 0x33b9, 0x33bb, 0x33bd, 0x33c0, 0x33c2, - 0x33c4, 0x33c6, 0x33c8, 0x33cb, 0x33cd, 0x33cf, 0x33d1, 0x33d4, - 0x33d6, 0x33d8, 0x33da, 0x33dc, 0x33de, 0x33e1, 0x33e3, 0x33e5, - 0x33e7, 0x33e9, 0x33eb, 0x33ed, 0x33ef, 0x33f1, 0x33f3, 0x33f5, - 0x33f7, 0x33f9, 0x33fb, 0x33fd, 0x33ff, 0x3401, 0x3403, 0x3405, - 0x3407, 0x3409, 0x340b, 0x340d, 0x340f, 0x3412, 0x3414, 0x3416, - 0x3418, 0x341b, 0x341d, 0x341f, 0x3421, 0x3423, 0x3425, 0x3427, - 0x3429, 0x342b, 0x342d, 0x342f, 0x3431, 0x3433, 0x3435, 0x3437, - 0x3439, 0x343b, 0x343d, 0x343f, 0x3441, 0x3443, 0x3445, 0x3447, - 0x3449, 0x344b, 0x344d, 0x344f, 0x3451, 0x3453, 0x3455, 0x3457, - 0x3459, 0x345b, 0x345e, 0x3460, 0x3462, 0x3464, 0x3466, 0x3468, - 0x346a, 0x346d, 0x3470, 0x3472, 0x3474, 0x3476, 0x3478, 0x347a, - 0x347c, 0x347e, 0x3480, 0x3482, 0x3484, 0x3487, 0x3489, 0x348b, - 0x348d, 0x348f, 0x3492, 0x3494, 0x3496, 0x3498, 0x349a, 0x349c, - 0x349e, 0x34a0, 0x34a2, 0x34a4, 0x34a7, 0x34a9, 0x34ac, 0x34ae, - 0x34b0, 0x34b2, 0x34b4, 0x34b6, 0x34b8, 0x34ba, 0x34bc, 0x34be, - 0x34c0, 0x34c2, 0x34c5, 0x34c7, 0x34c9, 0x34cb, 0x34cd, 0x34cf, - 0x34d2, 0x34d4, 0x34d7, 0x34da, 0x34dc, 0x34de, 0x34e0, 0x34e2, - 0x34e5, 0x34e8, 0x34ea, 0x34ec, 0x34ee, 0x34f0, 0x34f2, 0x34f4, - 0x34f6, 0x34f8, 0x34fa, 0x34fc, 0x34fe, 0x3501, 0x3503, 0x3505, - 0x3507, 0x3509, 0x350b, 0x350d, 0x350f, 0x3511, 0x3513, 0x3515, - 0x3517, 0x3519, 0x351b, 0x351d, 0x351f, 0x3521, 0x3523, 0x3525, - 0x3527, 0x352a, 0x352c, 0x352e, 0x3530, 0x3532, 0x3534, 0x3537, - 0x3539, 0x353b, 0x353d, 0x353f, 0x3541, 0x3543, 0x3545, 0x3547, - 0x3549, 0x354b, 0x354d, 0x3550, 0x3552, 0x3554, 0x3556, 0x3558, - 0x355a, 0x355c, 0x355e, 0x3560, 0x3562, 0x3564, 0x3566, 0x3568, - 0x356a, 0x356c, 0x356e, 0x3570, 0x3572, 0x3574, 0x3577, 0x3579, - 0x357b, 0x357d, 0x357f, 0x3581, 0x3584, 0x3586, 0x3588, 0x358a, - 0x358c, 0x358e, 0x3590, 0x3592, 0x3594, 0x3597, 0x3599, 0x359b, - 0x359d, 0x35a0, 0x35a2, 0x35a4, 0x35a6, 0x35a8, 0x35aa, 0x35ac, - 0x35af, 0x35b2, 0x35b5, 0x35b7, 0x35ba, 0x35bc, 0x35be, 0x35c0, - - 0x35c2, 0x35c4, 0x35c6, 0x35c8, 0x35ca, 0x35cc, 0x35ce, 0x35d1, - 0x35d3, 0x35d5, 0x35d7, 0x35d9, 0x35db, 0x35dd, 0x35e0, 0x35e2, - 0x35e4, 0x35e7, 0x35ea, 0x35ec, 0x35ee, 0x35f0, 0x35f2, 0x35f4, - 0x35f6, 0x35f8, 0x35fa, 0x35fc, 0x35ff, 0x3601, 0x3604, 0x3606, - 0x3609, 0x360b, 0x360d, 0x360f, 0x3612, 0x3614, 0x3616, 0x3619, - 0x361c, 0x361e, 0x3620, 0x3622, 0x3624, 0x3626, 0x3628, 0x362a, - 0x362c, 0x362e, 0x3630, 0x3632, 0x3634, 0x3636, 0x3639, 0x363b, - 0x363e, 0x3640, 0x3643, 0x3645, 0x3648, 0x364b, 0x364e, 0x3650, - 0x3652, 0x3654, 0x3657, 0x365a, 0x365d, 0x3660, 0x3662, 0x3664, - 0x3666, 0x3668, 0x366a, 0x366c, 0x366e, 0x3670, 0x3673, 0x3675, - 0x3677, 0x3679, 0x367b, 0x367e, 0x3680, 0x3683, 0x3686, 0x3688, - 0x368a, 0x368c, 0x368e, 0x3690, 0x3692, 0x3695, 0x3698, 0x369b, - 0x369d, 0x369f, 0x36a2, 0x36a4, 0x36a6, 0x36a8, 0x36ab, 0x36ad, - 0x36af, 0x36b1, 0x36b3, 0x36b5, 0x36b8, 0x36ba, 0x36bc, 0x36be, - 0x36c0, 0x36c2, 0x36c4, 0x36c7, 0x36ca, 0x36cc, 0x36cf, 0x36d1, - 0x36d4, 0x36d6, 0x36d8, 0x36da, 0x36dd, 0x36e0, 0x36e2, 0x36e5, - 0x36e7, 0x36ea, 0x36ec, 0x36ee, 0x36f0, 0x36f2, 0x36f4, 0x36f6, - 0x36f9, 0x36fc, 0x36ff, 0x3702, 0x3704, 0x3706, 0x3708, 0x370a, - 0x370c, 0x370e, 0x3710, 0x3712, 0x3714, 0x3716, 0x3718, 0x371a, - 0x371d, 0x371f, 0x3721, 0x3723, 0x3725, 0x3727, 0x3729, 0x372b, - 0x372d, 0x372f, 0x3731, 0x3733, 0x3735, 0x3738, 0x373b, 0x373e, - 0x3740, 0x3742, 0x3744, 0x3746, 0x3749, 0x374b, 0x374e, 0x3750, - 0x3752, 0x3755, 0x3758, 0x375a, 0x375c, 0x375e, 0x3760, 0x3762, - 0x3764, 0x3766, 0x3768, 0x376a, 0x376c, 0x376e, 0x3770, 0x3772, - 0x3774, 0x3776, 0x3778, 0x377a, 0x377c, 0x377e, 0x3781, 0x3783, - 0x3785, 0x3787, 0x3789, 0x378b, 0x378e, 0x3791, 0x3793, 0x3795, - 0x3797, 0x3799, 0x379b, 0x379d, 0x37a0, 0x37a2, 0x37a4, 0x37a6, - 0x37a8, 0x37ab, 0x37ae, 0x37b0, 0x37b2, 0x37b4, 0x37b7, 0x37b9, - 0x37bb, 0x37be, 0x37c1, 0x37c3, 0x37c5, 0x37c7, 0x37ca, 0x37cc, - 0x37ce, 0x37d0, 0x37d2, 0x37d4, 0x37d6, 0x37d8, 0x37db, 0x37dd, - 0x37df, 0x37e1, 0x37e4, 0x37e6, 0x37e8, 0x37ea, 0x37ec, 0x37ef, - 0x37f2, 0x37f4, 0x37f6, 0x37f8, 0x37fb, 0x37fd, 0x3800, 0x3802, - - 0x3804, 0x3806, 0x3809, 0x380b, 0x380d, 0x380f, 0x3811, 0x3813, - 0x3815, 0x3817, 0x381a, 0x381c, 0x381e, 0x3820, 0x3822, 0x3824, - 0x3826, 0x3829, 0x382b, 0x382e, 0x3831, 0x3834, 0x3836, 0x3838, - 0x383a, 0x383c, 0x383e, 0x3840, 0x3842, 0x3844, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff -}; - -#define GET_DECOMPOSITION_INDEX(ucs4) \ - (ucs4 < 0x3400 \ - ? (uc_decomposition_trie[uc_decomposition_trie[ucs4>>4] + (ucs4 & 0xf)]) \ - : (ucs4 < 0x30000\ - ? uc_decomposition_trie[uc_decomposition_trie[((ucs4 - 0x3400)>>8) + 0x340] + (ucs4 & 0xff)]\ - : 0xffff)) - -static const unsigned short uc_decomposition_map[] = { - 0x103, 0x20, 0x210, 0x20, 0x308, 0x109, 0x61, 0x210, - 0x20, 0x304, 0x109, 0x32, 0x109, 0x33, 0x210, 0x20, - 0x301, 0x110, 0x3bc, 0x210, 0x20, 0x327, 0x109, 0x31, - 0x109, 0x6f, 0x311, 0x31, 0x2044, 0x34, 0x311, 0x31, - 0x2044, 0x32, 0x311, 0x33, 0x2044, 0x34, 0x201, 0x41, - 0x300, 0x201, 0x41, 0x301, 0x201, 0x41, 0x302, 0x201, - 0x41, 0x303, 0x201, 0x41, 0x308, 0x201, 0x41, 0x30a, - 0x201, 0x43, 0x327, 0x201, 0x45, 0x300, 0x201, 0x45, - 0x301, 0x201, 0x45, 0x302, 0x201, 0x45, 0x308, 0x201, - 0x49, 0x300, 0x201, 0x49, 0x301, 0x201, 0x49, 0x302, - 0x201, 0x49, 0x308, 0x201, 0x4e, 0x303, 0x201, 0x4f, - 0x300, 0x201, 0x4f, 0x301, 0x201, 0x4f, 0x302, 0x201, - 0x4f, 0x303, 0x201, 0x4f, 0x308, 0x201, 0x55, 0x300, - 0x201, 0x55, 0x301, 0x201, 0x55, 0x302, 0x201, 0x55, - 0x308, 0x201, 0x59, 0x301, 0x201, 0x61, 0x300, 0x201, - 0x61, 0x301, 0x201, 0x61, 0x302, 0x201, 0x61, 0x303, - 0x201, 0x61, 0x308, 0x201, 0x61, 0x30a, 0x201, 0x63, - 0x327, 0x201, 0x65, 0x300, 0x201, 0x65, 0x301, 0x201, - 0x65, 0x302, 0x201, 0x65, 0x308, 0x201, 0x69, 0x300, - 0x201, 0x69, 0x301, 0x201, 0x69, 0x302, 0x201, 0x69, - 0x308, 0x201, 0x6e, 0x303, 0x201, 0x6f, 0x300, 0x201, - 0x6f, 0x301, 0x201, 0x6f, 0x302, 0x201, 0x6f, 0x303, - 0x201, 0x6f, 0x308, 0x201, 0x75, 0x300, 0x201, 0x75, - 0x301, 0x201, 0x75, 0x302, 0x201, 0x75, 0x308, 0x201, - 0x79, 0x301, 0x201, 0x79, 0x308, 0x201, 0x41, 0x304, - 0x201, 0x61, 0x304, 0x201, 0x41, 0x306, 0x201, 0x61, - 0x306, 0x201, 0x41, 0x328, 0x201, 0x61, 0x328, 0x201, - 0x43, 0x301, 0x201, 0x63, 0x301, 0x201, 0x43, 0x302, - 0x201, 0x63, 0x302, 0x201, 0x43, 0x307, 0x201, 0x63, - 0x307, 0x201, 0x43, 0x30c, 0x201, 0x63, 0x30c, 0x201, - 0x44, 0x30c, 0x201, 0x64, 0x30c, 0x201, 0x45, 0x304, - 0x201, 0x65, 0x304, 0x201, 0x45, 0x306, 0x201, 0x65, - 0x306, 0x201, 0x45, 0x307, 0x201, 0x65, 0x307, 0x201, - 0x45, 0x328, 0x201, 0x65, 0x328, 0x201, 0x45, 0x30c, - 0x201, 0x65, 0x30c, 0x201, 0x47, 0x302, 0x201, 0x67, - 0x302, 0x201, 0x47, 0x306, 0x201, 0x67, 0x306, 0x201, - 0x47, 0x307, 0x201, 0x67, 0x307, 0x201, 0x47, 0x327, - 0x201, 0x67, 0x327, 0x201, 0x48, 0x302, 0x201, 0x68, - 0x302, 0x201, 0x49, 0x303, 0x201, 0x69, 0x303, 0x201, - 0x49, 0x304, 0x201, 0x69, 0x304, 0x201, 0x49, 0x306, - 0x201, 0x69, 0x306, 0x201, 0x49, 0x328, 0x201, 0x69, - 0x328, 0x201, 0x49, 0x307, 0x210, 0x49, 0x4a, 0x210, - 0x69, 0x6a, 0x201, 0x4a, 0x302, 0x201, 0x6a, 0x302, - 0x201, 0x4b, 0x327, 0x201, 0x6b, 0x327, 0x201, 0x4c, - 0x301, 0x201, 0x6c, 0x301, 0x201, 0x4c, 0x327, 0x201, - 0x6c, 0x327, 0x201, 0x4c, 0x30c, 0x201, 0x6c, 0x30c, - 0x210, 0x4c, 0xb7, 0x210, 0x6c, 0xb7, 0x201, 0x4e, - 0x301, 0x201, 0x6e, 0x301, 0x201, 0x4e, 0x327, 0x201, - 0x6e, 0x327, 0x201, 0x4e, 0x30c, 0x201, 0x6e, 0x30c, - 0x210, 0x2bc, 0x6e, 0x201, 0x4f, 0x304, 0x201, 0x6f, - 0x304, 0x201, 0x4f, 0x306, 0x201, 0x6f, 0x306, 0x201, - 0x4f, 0x30b, 0x201, 0x6f, 0x30b, 0x201, 0x52, 0x301, - 0x201, 0x72, 0x301, 0x201, 0x52, 0x327, 0x201, 0x72, - 0x327, 0x201, 0x52, 0x30c, 0x201, 0x72, 0x30c, 0x201, - 0x53, 0x301, 0x201, 0x73, 0x301, 0x201, 0x53, 0x302, - 0x201, 0x73, 0x302, 0x201, 0x53, 0x327, 0x201, 0x73, - 0x327, 0x201, 0x53, 0x30c, 0x201, 0x73, 0x30c, 0x201, - 0x54, 0x327, 0x201, 0x74, 0x327, 0x201, 0x54, 0x30c, - 0x201, 0x74, 0x30c, 0x201, 0x55, 0x303, 0x201, 0x75, - 0x303, 0x201, 0x55, 0x304, 0x201, 0x75, 0x304, 0x201, - 0x55, 0x306, 0x201, 0x75, 0x306, 0x201, 0x55, 0x30a, - 0x201, 0x75, 0x30a, 0x201, 0x55, 0x30b, 0x201, 0x75, - 0x30b, 0x201, 0x55, 0x328, 0x201, 0x75, 0x328, 0x201, - 0x57, 0x302, 0x201, 0x77, 0x302, 0x201, 0x59, 0x302, - 0x201, 0x79, 0x302, 0x201, 0x59, 0x308, 0x201, 0x5a, - 0x301, 0x201, 0x7a, 0x301, 0x201, 0x5a, 0x307, 0x201, - 0x7a, 0x307, 0x201, 0x5a, 0x30c, 0x201, 0x7a, 0x30c, - 0x110, 0x73, 0x201, 0x4f, 0x31b, 0x201, 0x6f, 0x31b, - 0x201, 0x55, 0x31b, 0x201, 0x75, 0x31b, 0x210, 0x44, - 0x17d, 0x210, 0x44, 0x17e, 0x210, 0x64, 0x17e, 0x210, - 0x4c, 0x4a, 0x210, 0x4c, 0x6a, 0x210, 0x6c, 0x6a, - 0x210, 0x4e, 0x4a, 0x210, 0x4e, 0x6a, 0x210, 0x6e, - 0x6a, 0x201, 0x41, 0x30c, 0x201, 0x61, 0x30c, 0x201, - 0x49, 0x30c, 0x201, 0x69, 0x30c, 0x201, 0x4f, 0x30c, - 0x201, 0x6f, 0x30c, 0x201, 0x55, 0x30c, 0x201, 0x75, - 0x30c, 0x201, 0xdc, 0x304, 0x201, 0xfc, 0x304, 0x201, - 0xdc, 0x301, 0x201, 0xfc, 0x301, 0x201, 0xdc, 0x30c, - 0x201, 0xfc, 0x30c, 0x201, 0xdc, 0x300, 0x201, 0xfc, - 0x300, 0x201, 0xc4, 0x304, 0x201, 0xe4, 0x304, 0x201, - 0x226, 0x304, 0x201, 0x227, 0x304, 0x201, 0xc6, 0x304, - 0x201, 0xe6, 0x304, 0x201, 0x47, 0x30c, 0x201, 0x67, - 0x30c, 0x201, 0x4b, 0x30c, 0x201, 0x6b, 0x30c, 0x201, - 0x4f, 0x328, 0x201, 0x6f, 0x328, 0x201, 0x1ea, 0x304, - 0x201, 0x1eb, 0x304, 0x201, 0x1b7, 0x30c, 0x201, 0x292, - 0x30c, 0x201, 0x6a, 0x30c, 0x210, 0x44, 0x5a, 0x210, - 0x44, 0x7a, 0x210, 0x64, 0x7a, 0x201, 0x47, 0x301, - 0x201, 0x67, 0x301, 0x201, 0x4e, 0x300, 0x201, 0x6e, - 0x300, 0x201, 0xc5, 0x301, 0x201, 0xe5, 0x301, 0x201, - 0xc6, 0x301, 0x201, 0xe6, 0x301, 0x201, 0xd8, 0x301, - 0x201, 0xf8, 0x301, 0x201, 0x41, 0x30f, 0x201, 0x61, - 0x30f, 0x201, 0x41, 0x311, 0x201, 0x61, 0x311, 0x201, - 0x45, 0x30f, 0x201, 0x65, 0x30f, 0x201, 0x45, 0x311, - 0x201, 0x65, 0x311, 0x201, 0x49, 0x30f, 0x201, 0x69, - 0x30f, 0x201, 0x49, 0x311, 0x201, 0x69, 0x311, 0x201, - 0x4f, 0x30f, 0x201, 0x6f, 0x30f, 0x201, 0x4f, 0x311, - 0x201, 0x6f, 0x311, 0x201, 0x52, 0x30f, 0x201, 0x72, - 0x30f, 0x201, 0x52, 0x311, 0x201, 0x72, 0x311, 0x201, - 0x55, 0x30f, 0x201, 0x75, 0x30f, 0x201, 0x55, 0x311, - 0x201, 0x75, 0x311, 0x201, 0x53, 0x326, 0x201, 0x73, - 0x326, 0x201, 0x54, 0x326, 0x201, 0x74, 0x326, 0x201, - 0x48, 0x30c, 0x201, 0x68, 0x30c, 0x201, 0x41, 0x307, - 0x201, 0x61, 0x307, 0x201, 0x45, 0x327, 0x201, 0x65, - 0x327, 0x201, 0xd6, 0x304, 0x201, 0xf6, 0x304, 0x201, - 0xd5, 0x304, 0x201, 0xf5, 0x304, 0x201, 0x4f, 0x307, - 0x201, 0x6f, 0x307, 0x201, 0x22e, 0x304, 0x201, 0x22f, - 0x304, 0x201, 0x59, 0x304, 0x201, 0x79, 0x304, 0x109, - 0x68, 0x109, 0x266, 0x109, 0x6a, 0x109, 0x72, 0x109, - 0x279, 0x109, 0x27b, 0x109, 0x281, 0x109, 0x77, 0x109, - 0x79, 0x210, 0x20, 0x306, 0x210, 0x20, 0x307, 0x210, - 0x20, 0x30a, 0x210, 0x20, 0x328, 0x210, 0x20, 0x303, - 0x210, 0x20, 0x30b, 0x109, 0x263, 0x109, 0x6c, 0x109, - 0x73, 0x109, 0x78, 0x109, 0x295, 0x101, 0x300, 0x101, - 0x301, 0x101, 0x313, 0x201, 0x308, 0x301, 0x101, 0x2b9, - 0x210, 0x20, 0x345, 0x101, 0x3b, 0x210, 0x20, 0x301, - 0x201, 0xa8, 0x301, 0x201, 0x391, 0x301, 0x101, 0xb7, - 0x201, 0x395, 0x301, 0x201, 0x397, 0x301, 0x201, 0x399, - 0x301, 0x201, 0x39f, 0x301, 0x201, 0x3a5, 0x301, 0x201, - 0x3a9, 0x301, 0x201, 0x3ca, 0x301, 0x201, 0x399, 0x308, - 0x201, 0x3a5, 0x308, 0x201, 0x3b1, 0x301, 0x201, 0x3b5, - 0x301, 0x201, 0x3b7, 0x301, 0x201, 0x3b9, 0x301, 0x201, - 0x3cb, 0x301, 0x201, 0x3b9, 0x308, 0x201, 0x3c5, 0x308, - 0x201, 0x3bf, 0x301, 0x201, 0x3c5, 0x301, 0x201, 0x3c9, - 0x301, 0x110, 0x3b2, 0x110, 0x3b8, 0x110, 0x3a5, 0x201, - 0x3d2, 0x301, 0x201, 0x3d2, 0x308, 0x110, 0x3c6, 0x110, - 0x3c0, 0x110, 0x3ba, 0x110, 0x3c1, 0x110, 0x3c2, 0x110, - 0x398, 0x110, 0x3b5, 0x110, 0x3a3, 0x201, 0x415, 0x300, - 0x201, 0x415, 0x308, 0x201, 0x413, 0x301, 0x201, 0x406, - 0x308, 0x201, 0x41a, 0x301, 0x201, 0x418, 0x300, 0x201, - 0x423, 0x306, 0x201, 0x418, 0x306, 0x201, 0x438, 0x306, - 0x201, 0x435, 0x300, 0x201, 0x435, 0x308, 0x201, 0x433, - 0x301, 0x201, 0x456, 0x308, 0x201, 0x43a, 0x301, 0x201, - 0x438, 0x300, 0x201, 0x443, 0x306, 0x201, 0x474, 0x30f, - 0x201, 0x475, 0x30f, 0x201, 0x416, 0x306, 0x201, 0x436, - 0x306, 0x201, 0x410, 0x306, 0x201, 0x430, 0x306, 0x201, - 0x410, 0x308, 0x201, 0x430, 0x308, 0x201, 0x415, 0x306, - 0x201, 0x435, 0x306, 0x201, 0x4d8, 0x308, 0x201, 0x4d9, - 0x308, 0x201, 0x416, 0x308, 0x201, 0x436, 0x308, 0x201, - 0x417, 0x308, 0x201, 0x437, 0x308, 0x201, 0x418, 0x304, - 0x201, 0x438, 0x304, 0x201, 0x418, 0x308, 0x201, 0x438, - 0x308, 0x201, 0x41e, 0x308, 0x201, 0x43e, 0x308, 0x201, - 0x4e8, 0x308, 0x201, 0x4e9, 0x308, 0x201, 0x42d, 0x308, - 0x201, 0x44d, 0x308, 0x201, 0x423, 0x304, 0x201, 0x443, - 0x304, 0x201, 0x423, 0x308, 0x201, 0x443, 0x308, 0x201, - 0x423, 0x30b, 0x201, 0x443, 0x30b, 0x201, 0x427, 0x308, - 0x201, 0x447, 0x308, 0x201, 0x42b, 0x308, 0x201, 0x44b, - 0x308, 0x210, 0x565, 0x582, 0x201, 0x627, 0x653, 0x201, - 0x627, 0x654, 0x201, 0x648, 0x654, 0x201, 0x627, 0x655, - 0x201, 0x64a, 0x654, 0x210, 0x627, 0x674, 0x210, 0x648, - 0x674, 0x210, 0x6c7, 0x674, 0x210, 0x64a, 0x674, 0x201, - 0x6d5, 0x654, 0x201, 0x6c1, 0x654, 0x201, 0x6d2, 0x654, - 0x201, 0x928, 0x93c, 0x201, 0x930, 0x93c, 0x201, 0x933, - 0x93c, 0x201, 0x915, 0x93c, 0x201, 0x916, 0x93c, 0x201, - 0x917, 0x93c, 0x201, 0x91c, 0x93c, 0x201, 0x921, 0x93c, - 0x201, 0x922, 0x93c, 0x201, 0x92b, 0x93c, 0x201, 0x92f, - 0x93c, 0x201, 0x9c7, 0x9be, 0x201, 0x9c7, 0x9d7, 0x201, - 0x9a1, 0x9bc, 0x201, 0x9a2, 0x9bc, 0x201, 0x9af, 0x9bc, - 0x201, 0xa32, 0xa3c, 0x201, 0xa38, 0xa3c, 0x201, 0xa16, - 0xa3c, 0x201, 0xa17, 0xa3c, 0x201, 0xa1c, 0xa3c, 0x201, - 0xa2b, 0xa3c, 0x201, 0xb47, 0xb56, 0x201, 0xb47, 0xb3e, - 0x201, 0xb47, 0xb57, 0x201, 0xb21, 0xb3c, 0x201, 0xb22, - 0xb3c, 0x201, 0xb92, 0xbd7, 0x201, 0xbc6, 0xbbe, 0x201, - 0xbc7, 0xbbe, 0x201, 0xbc6, 0xbd7, 0x201, 0xc46, 0xc56, - 0x201, 0xcbf, 0xcd5, 0x201, 0xcc6, 0xcd5, 0x201, 0xcc6, - 0xcd6, 0x201, 0xcc6, 0xcc2, 0x201, 0xcca, 0xcd5, 0x201, - 0xd46, 0xd3e, 0x201, 0xd47, 0xd3e, 0x201, 0xd46, 0xd57, - 0x201, 0xdd9, 0xdca, 0x201, 0xdd9, 0xdcf, 0x201, 0xddc, - 0xdca, 0x201, 0xdd9, 0xddf, 0x210, 0xe4d, 0xe32, 0x210, - 0xecd, 0xeb2, 0x210, 0xeab, 0xe99, 0x210, 0xeab, 0xea1, - 0x103, 0xf0b, 0x201, 0xf42, 0xfb7, 0x201, 0xf4c, 0xfb7, - 0x201, 0xf51, 0xfb7, 0x201, 0xf56, 0xfb7, 0x201, 0xf5b, - 0xfb7, 0x201, 0xf40, 0xfb5, 0x201, 0xf71, 0xf72, 0x201, - 0xf71, 0xf74, 0x201, 0xfb2, 0xf80, 0x210, 0xfb2, 0xf81, - 0x201, 0xfb3, 0xf80, 0x210, 0xfb3, 0xf81, 0x201, 0xf71, - 0xf80, 0x201, 0xf92, 0xfb7, 0x201, 0xf9c, 0xfb7, 0x201, - 0xfa1, 0xfb7, 0x201, 0xfa6, 0xfb7, 0x201, 0xfab, 0xfb7, - 0x201, 0xf90, 0xfb5, 0x201, 0x1025, 0x102e, 0x109, 0x10dc, - 0x201, 0x1b05, 0x1b35, 0x201, 0x1b07, 0x1b35, 0x201, 0x1b09, - 0x1b35, 0x201, 0x1b0b, 0x1b35, 0x201, 0x1b0d, 0x1b35, 0x201, - 0x1b11, 0x1b35, 0x201, 0x1b3a, 0x1b35, 0x201, 0x1b3c, 0x1b35, - 0x201, 0x1b3e, 0x1b35, 0x201, 0x1b3f, 0x1b35, 0x201, 0x1b42, - 0x1b35, 0x109, 0x41, 0x109, 0xc6, 0x109, 0x42, 0x109, - 0x44, 0x109, 0x45, 0x109, 0x18e, 0x109, 0x47, 0x109, - 0x48, 0x109, 0x49, 0x109, 0x4a, 0x109, 0x4b, 0x109, - 0x4c, 0x109, 0x4d, 0x109, 0x4e, 0x109, 0x4f, 0x109, - 0x222, 0x109, 0x50, 0x109, 0x52, 0x109, 0x54, 0x109, - 0x55, 0x109, 0x57, 0x109, 0x61, 0x109, 0x250, 0x109, - 0x251, 0x109, 0x1d02, 0x109, 0x62, 0x109, 0x64, 0x109, - 0x65, 0x109, 0x259, 0x109, 0x25b, 0x109, 0x25c, 0x109, - 0x67, 0x109, 0x6b, 0x109, 0x6d, 0x109, 0x14b, 0x109, - 0x6f, 0x109, 0x254, 0x109, 0x1d16, 0x109, 0x1d17, 0x109, - 0x70, 0x109, 0x74, 0x109, 0x75, 0x109, 0x1d1d, 0x109, - 0x26f, 0x109, 0x76, 0x109, 0x1d25, 0x109, 0x3b2, 0x109, - 0x3b3, 0x109, 0x3b4, 0x109, 0x3c6, 0x109, 0x3c7, 0x10a, - 0x69, 0x10a, 0x72, 0x10a, 0x75, 0x10a, 0x76, 0x10a, - 0x3b2, 0x10a, 0x3b3, 0x10a, 0x3c1, 0x10a, 0x3c6, 0x10a, - 0x3c7, 0x109, 0x43d, 0x109, 0x252, 0x109, 0x63, 0x109, - 0x255, 0x109, 0xf0, 0x109, 0x25c, 0x109, 0x66, 0x109, - 0x25f, 0x109, 0x261, 0x109, 0x265, 0x109, 0x268, 0x109, - 0x269, 0x109, 0x26a, 0x109, 0x1d7b, 0x109, 0x29d, 0x109, - 0x26d, 0x109, 0x1d85, 0x109, 0x29f, 0x109, 0x271, 0x109, - 0x270, 0x109, 0x272, 0x109, 0x273, 0x109, 0x274, 0x109, - 0x275, 0x109, 0x278, 0x109, 0x282, 0x109, 0x283, 0x109, - 0x1ab, 0x109, 0x289, 0x109, 0x28a, 0x109, 0x1d1c, 0x109, - 0x28b, 0x109, 0x28c, 0x109, 0x7a, 0x109, 0x290, 0x109, - 0x291, 0x109, 0x292, 0x109, 0x3b8, 0x201, 0x41, 0x325, - 0x201, 0x61, 0x325, 0x201, 0x42, 0x307, 0x201, 0x62, - 0x307, 0x201, 0x42, 0x323, 0x201, 0x62, 0x323, 0x201, - 0x42, 0x331, 0x201, 0x62, 0x331, 0x201, 0xc7, 0x301, - 0x201, 0xe7, 0x301, 0x201, 0x44, 0x307, 0x201, 0x64, - 0x307, 0x201, 0x44, 0x323, 0x201, 0x64, 0x323, 0x201, - 0x44, 0x331, 0x201, 0x64, 0x331, 0x201, 0x44, 0x327, - 0x201, 0x64, 0x327, 0x201, 0x44, 0x32d, 0x201, 0x64, - 0x32d, 0x201, 0x112, 0x300, 0x201, 0x113, 0x300, 0x201, - 0x112, 0x301, 0x201, 0x113, 0x301, 0x201, 0x45, 0x32d, - 0x201, 0x65, 0x32d, 0x201, 0x45, 0x330, 0x201, 0x65, - 0x330, 0x201, 0x228, 0x306, 0x201, 0x229, 0x306, 0x201, - 0x46, 0x307, 0x201, 0x66, 0x307, 0x201, 0x47, 0x304, - 0x201, 0x67, 0x304, 0x201, 0x48, 0x307, 0x201, 0x68, - 0x307, 0x201, 0x48, 0x323, 0x201, 0x68, 0x323, 0x201, - 0x48, 0x308, 0x201, 0x68, 0x308, 0x201, 0x48, 0x327, - 0x201, 0x68, 0x327, 0x201, 0x48, 0x32e, 0x201, 0x68, - 0x32e, 0x201, 0x49, 0x330, 0x201, 0x69, 0x330, 0x201, - 0xcf, 0x301, 0x201, 0xef, 0x301, 0x201, 0x4b, 0x301, - 0x201, 0x6b, 0x301, 0x201, 0x4b, 0x323, 0x201, 0x6b, - 0x323, 0x201, 0x4b, 0x331, 0x201, 0x6b, 0x331, 0x201, - 0x4c, 0x323, 0x201, 0x6c, 0x323, 0x201, 0x1e36, 0x304, - 0x201, 0x1e37, 0x304, 0x201, 0x4c, 0x331, 0x201, 0x6c, - 0x331, 0x201, 0x4c, 0x32d, 0x201, 0x6c, 0x32d, 0x201, - 0x4d, 0x301, 0x201, 0x6d, 0x301, 0x201, 0x4d, 0x307, - 0x201, 0x6d, 0x307, 0x201, 0x4d, 0x323, 0x201, 0x6d, - 0x323, 0x201, 0x4e, 0x307, 0x201, 0x6e, 0x307, 0x201, - 0x4e, 0x323, 0x201, 0x6e, 0x323, 0x201, 0x4e, 0x331, - 0x201, 0x6e, 0x331, 0x201, 0x4e, 0x32d, 0x201, 0x6e, - 0x32d, 0x201, 0xd5, 0x301, 0x201, 0xf5, 0x301, 0x201, - 0xd5, 0x308, 0x201, 0xf5, 0x308, 0x201, 0x14c, 0x300, - 0x201, 0x14d, 0x300, 0x201, 0x14c, 0x301, 0x201, 0x14d, - 0x301, 0x201, 0x50, 0x301, 0x201, 0x70, 0x301, 0x201, - 0x50, 0x307, 0x201, 0x70, 0x307, 0x201, 0x52, 0x307, - 0x201, 0x72, 0x307, 0x201, 0x52, 0x323, 0x201, 0x72, - 0x323, 0x201, 0x1e5a, 0x304, 0x201, 0x1e5b, 0x304, 0x201, - 0x52, 0x331, 0x201, 0x72, 0x331, 0x201, 0x53, 0x307, - 0x201, 0x73, 0x307, 0x201, 0x53, 0x323, 0x201, 0x73, - 0x323, 0x201, 0x15a, 0x307, 0x201, 0x15b, 0x307, 0x201, - 0x160, 0x307, 0x201, 0x161, 0x307, 0x201, 0x1e62, 0x307, - 0x201, 0x1e63, 0x307, 0x201, 0x54, 0x307, 0x201, 0x74, - 0x307, 0x201, 0x54, 0x323, 0x201, 0x74, 0x323, 0x201, - 0x54, 0x331, 0x201, 0x74, 0x331, 0x201, 0x54, 0x32d, - 0x201, 0x74, 0x32d, 0x201, 0x55, 0x324, 0x201, 0x75, - 0x324, 0x201, 0x55, 0x330, 0x201, 0x75, 0x330, 0x201, - 0x55, 0x32d, 0x201, 0x75, 0x32d, 0x201, 0x168, 0x301, - 0x201, 0x169, 0x301, 0x201, 0x16a, 0x308, 0x201, 0x16b, - 0x308, 0x201, 0x56, 0x303, 0x201, 0x76, 0x303, 0x201, - 0x56, 0x323, 0x201, 0x76, 0x323, 0x201, 0x57, 0x300, - 0x201, 0x77, 0x300, 0x201, 0x57, 0x301, 0x201, 0x77, - 0x301, 0x201, 0x57, 0x308, 0x201, 0x77, 0x308, 0x201, - 0x57, 0x307, 0x201, 0x77, 0x307, 0x201, 0x57, 0x323, - 0x201, 0x77, 0x323, 0x201, 0x58, 0x307, 0x201, 0x78, - 0x307, 0x201, 0x58, 0x308, 0x201, 0x78, 0x308, 0x201, - 0x59, 0x307, 0x201, 0x79, 0x307, 0x201, 0x5a, 0x302, - 0x201, 0x7a, 0x302, 0x201, 0x5a, 0x323, 0x201, 0x7a, - 0x323, 0x201, 0x5a, 0x331, 0x201, 0x7a, 0x331, 0x201, - 0x68, 0x331, 0x201, 0x74, 0x308, 0x201, 0x77, 0x30a, - 0x201, 0x79, 0x30a, 0x210, 0x61, 0x2be, 0x201, 0x17f, - 0x307, 0x201, 0x41, 0x323, 0x201, 0x61, 0x323, 0x201, - 0x41, 0x309, 0x201, 0x61, 0x309, 0x201, 0xc2, 0x301, - 0x201, 0xe2, 0x301, 0x201, 0xc2, 0x300, 0x201, 0xe2, - 0x300, 0x201, 0xc2, 0x309, 0x201, 0xe2, 0x309, 0x201, - 0xc2, 0x303, 0x201, 0xe2, 0x303, 0x201, 0x1ea0, 0x302, - 0x201, 0x1ea1, 0x302, 0x201, 0x102, 0x301, 0x201, 0x103, - 0x301, 0x201, 0x102, 0x300, 0x201, 0x103, 0x300, 0x201, - 0x102, 0x309, 0x201, 0x103, 0x309, 0x201, 0x102, 0x303, - 0x201, 0x103, 0x303, 0x201, 0x1ea0, 0x306, 0x201, 0x1ea1, - 0x306, 0x201, 0x45, 0x323, 0x201, 0x65, 0x323, 0x201, - 0x45, 0x309, 0x201, 0x65, 0x309, 0x201, 0x45, 0x303, - 0x201, 0x65, 0x303, 0x201, 0xca, 0x301, 0x201, 0xea, - 0x301, 0x201, 0xca, 0x300, 0x201, 0xea, 0x300, 0x201, - 0xca, 0x309, 0x201, 0xea, 0x309, 0x201, 0xca, 0x303, - 0x201, 0xea, 0x303, 0x201, 0x1eb8, 0x302, 0x201, 0x1eb9, - 0x302, 0x201, 0x49, 0x309, 0x201, 0x69, 0x309, 0x201, - 0x49, 0x323, 0x201, 0x69, 0x323, 0x201, 0x4f, 0x323, - 0x201, 0x6f, 0x323, 0x201, 0x4f, 0x309, 0x201, 0x6f, - 0x309, 0x201, 0xd4, 0x301, 0x201, 0xf4, 0x301, 0x201, - 0xd4, 0x300, 0x201, 0xf4, 0x300, 0x201, 0xd4, 0x309, - 0x201, 0xf4, 0x309, 0x201, 0xd4, 0x303, 0x201, 0xf4, - 0x303, 0x201, 0x1ecc, 0x302, 0x201, 0x1ecd, 0x302, 0x201, - 0x1a0, 0x301, 0x201, 0x1a1, 0x301, 0x201, 0x1a0, 0x300, - 0x201, 0x1a1, 0x300, 0x201, 0x1a0, 0x309, 0x201, 0x1a1, - 0x309, 0x201, 0x1a0, 0x303, 0x201, 0x1a1, 0x303, 0x201, - 0x1a0, 0x323, 0x201, 0x1a1, 0x323, 0x201, 0x55, 0x323, - 0x201, 0x75, 0x323, 0x201, 0x55, 0x309, 0x201, 0x75, - 0x309, 0x201, 0x1af, 0x301, 0x201, 0x1b0, 0x301, 0x201, - 0x1af, 0x300, 0x201, 0x1b0, 0x300, 0x201, 0x1af, 0x309, - 0x201, 0x1b0, 0x309, 0x201, 0x1af, 0x303, 0x201, 0x1b0, - 0x303, 0x201, 0x1af, 0x323, 0x201, 0x1b0, 0x323, 0x201, - 0x59, 0x300, 0x201, 0x79, 0x300, 0x201, 0x59, 0x323, - 0x201, 0x79, 0x323, 0x201, 0x59, 0x309, 0x201, 0x79, - 0x309, 0x201, 0x59, 0x303, 0x201, 0x79, 0x303, 0x201, - 0x3b1, 0x313, 0x201, 0x3b1, 0x314, 0x201, 0x1f00, 0x300, - 0x201, 0x1f01, 0x300, 0x201, 0x1f00, 0x301, 0x201, 0x1f01, - 0x301, 0x201, 0x1f00, 0x342, 0x201, 0x1f01, 0x342, 0x201, - 0x391, 0x313, 0x201, 0x391, 0x314, 0x201, 0x1f08, 0x300, - 0x201, 0x1f09, 0x300, 0x201, 0x1f08, 0x301, 0x201, 0x1f09, - 0x301, 0x201, 0x1f08, 0x342, 0x201, 0x1f09, 0x342, 0x201, - 0x3b5, 0x313, 0x201, 0x3b5, 0x314, 0x201, 0x1f10, 0x300, - 0x201, 0x1f11, 0x300, 0x201, 0x1f10, 0x301, 0x201, 0x1f11, - 0x301, 0x201, 0x395, 0x313, 0x201, 0x395, 0x314, 0x201, - 0x1f18, 0x300, 0x201, 0x1f19, 0x300, 0x201, 0x1f18, 0x301, - 0x201, 0x1f19, 0x301, 0x201, 0x3b7, 0x313, 0x201, 0x3b7, - 0x314, 0x201, 0x1f20, 0x300, 0x201, 0x1f21, 0x300, 0x201, - 0x1f20, 0x301, 0x201, 0x1f21, 0x301, 0x201, 0x1f20, 0x342, - 0x201, 0x1f21, 0x342, 0x201, 0x397, 0x313, 0x201, 0x397, - 0x314, 0x201, 0x1f28, 0x300, 0x201, 0x1f29, 0x300, 0x201, - 0x1f28, 0x301, 0x201, 0x1f29, 0x301, 0x201, 0x1f28, 0x342, - 0x201, 0x1f29, 0x342, 0x201, 0x3b9, 0x313, 0x201, 0x3b9, - 0x314, 0x201, 0x1f30, 0x300, 0x201, 0x1f31, 0x300, 0x201, - 0x1f30, 0x301, 0x201, 0x1f31, 0x301, 0x201, 0x1f30, 0x342, - 0x201, 0x1f31, 0x342, 0x201, 0x399, 0x313, 0x201, 0x399, - 0x314, 0x201, 0x1f38, 0x300, 0x201, 0x1f39, 0x300, 0x201, - 0x1f38, 0x301, 0x201, 0x1f39, 0x301, 0x201, 0x1f38, 0x342, - 0x201, 0x1f39, 0x342, 0x201, 0x3bf, 0x313, 0x201, 0x3bf, - 0x314, 0x201, 0x1f40, 0x300, 0x201, 0x1f41, 0x300, 0x201, - 0x1f40, 0x301, 0x201, 0x1f41, 0x301, 0x201, 0x39f, 0x313, - 0x201, 0x39f, 0x314, 0x201, 0x1f48, 0x300, 0x201, 0x1f49, - 0x300, 0x201, 0x1f48, 0x301, 0x201, 0x1f49, 0x301, 0x201, - 0x3c5, 0x313, 0x201, 0x3c5, 0x314, 0x201, 0x1f50, 0x300, - 0x201, 0x1f51, 0x300, 0x201, 0x1f50, 0x301, 0x201, 0x1f51, - 0x301, 0x201, 0x1f50, 0x342, 0x201, 0x1f51, 0x342, 0x201, - 0x3a5, 0x314, 0x201, 0x1f59, 0x300, 0x201, 0x1f59, 0x301, - 0x201, 0x1f59, 0x342, 0x201, 0x3c9, 0x313, 0x201, 0x3c9, - 0x314, 0x201, 0x1f60, 0x300, 0x201, 0x1f61, 0x300, 0x201, - 0x1f60, 0x301, 0x201, 0x1f61, 0x301, 0x201, 0x1f60, 0x342, - 0x201, 0x1f61, 0x342, 0x201, 0x3a9, 0x313, 0x201, 0x3a9, - 0x314, 0x201, 0x1f68, 0x300, 0x201, 0x1f69, 0x300, 0x201, - 0x1f68, 0x301, 0x201, 0x1f69, 0x301, 0x201, 0x1f68, 0x342, - 0x201, 0x1f69, 0x342, 0x201, 0x3b1, 0x300, 0x101, 0x3ac, - 0x201, 0x3b5, 0x300, 0x101, 0x3ad, 0x201, 0x3b7, 0x300, - 0x101, 0x3ae, 0x201, 0x3b9, 0x300, 0x101, 0x3af, 0x201, - 0x3bf, 0x300, 0x101, 0x3cc, 0x201, 0x3c5, 0x300, 0x101, - 0x3cd, 0x201, 0x3c9, 0x300, 0x101, 0x3ce, 0x201, 0x1f00, - 0x345, 0x201, 0x1f01, 0x345, 0x201, 0x1f02, 0x345, 0x201, - 0x1f03, 0x345, 0x201, 0x1f04, 0x345, 0x201, 0x1f05, 0x345, - 0x201, 0x1f06, 0x345, 0x201, 0x1f07, 0x345, 0x201, 0x1f08, - 0x345, 0x201, 0x1f09, 0x345, 0x201, 0x1f0a, 0x345, 0x201, - 0x1f0b, 0x345, 0x201, 0x1f0c, 0x345, 0x201, 0x1f0d, 0x345, - 0x201, 0x1f0e, 0x345, 0x201, 0x1f0f, 0x345, 0x201, 0x1f20, - 0x345, 0x201, 0x1f21, 0x345, 0x201, 0x1f22, 0x345, 0x201, - 0x1f23, 0x345, 0x201, 0x1f24, 0x345, 0x201, 0x1f25, 0x345, - 0x201, 0x1f26, 0x345, 0x201, 0x1f27, 0x345, 0x201, 0x1f28, - 0x345, 0x201, 0x1f29, 0x345, 0x201, 0x1f2a, 0x345, 0x201, - 0x1f2b, 0x345, 0x201, 0x1f2c, 0x345, 0x201, 0x1f2d, 0x345, - 0x201, 0x1f2e, 0x345, 0x201, 0x1f2f, 0x345, 0x201, 0x1f60, - 0x345, 0x201, 0x1f61, 0x345, 0x201, 0x1f62, 0x345, 0x201, - 0x1f63, 0x345, 0x201, 0x1f64, 0x345, 0x201, 0x1f65, 0x345, - 0x201, 0x1f66, 0x345, 0x201, 0x1f67, 0x345, 0x201, 0x1f68, - 0x345, 0x201, 0x1f69, 0x345, 0x201, 0x1f6a, 0x345, 0x201, - 0x1f6b, 0x345, 0x201, 0x1f6c, 0x345, 0x201, 0x1f6d, 0x345, - 0x201, 0x1f6e, 0x345, 0x201, 0x1f6f, 0x345, 0x201, 0x3b1, - 0x306, 0x201, 0x3b1, 0x304, 0x201, 0x1f70, 0x345, 0x201, - 0x3b1, 0x345, 0x201, 0x3ac, 0x345, 0x201, 0x3b1, 0x342, - 0x201, 0x1fb6, 0x345, 0x201, 0x391, 0x306, 0x201, 0x391, - 0x304, 0x201, 0x391, 0x300, 0x101, 0x386, 0x201, 0x391, - 0x345, 0x210, 0x20, 0x313, 0x101, 0x3b9, 0x210, 0x20, - 0x313, 0x210, 0x20, 0x342, 0x201, 0xa8, 0x342, 0x201, - 0x1f74, 0x345, 0x201, 0x3b7, 0x345, 0x201, 0x3ae, 0x345, - 0x201, 0x3b7, 0x342, 0x201, 0x1fc6, 0x345, 0x201, 0x395, - 0x300, 0x101, 0x388, 0x201, 0x397, 0x300, 0x101, 0x389, - 0x201, 0x397, 0x345, 0x201, 0x1fbf, 0x300, 0x201, 0x1fbf, - 0x301, 0x201, 0x1fbf, 0x342, 0x201, 0x3b9, 0x306, 0x201, - 0x3b9, 0x304, 0x201, 0x3ca, 0x300, 0x101, 0x390, 0x201, - 0x3b9, 0x342, 0x201, 0x3ca, 0x342, 0x201, 0x399, 0x306, - 0x201, 0x399, 0x304, 0x201, 0x399, 0x300, 0x101, 0x38a, - 0x201, 0x1ffe, 0x300, 0x201, 0x1ffe, 0x301, 0x201, 0x1ffe, - 0x342, 0x201, 0x3c5, 0x306, 0x201, 0x3c5, 0x304, 0x201, - 0x3cb, 0x300, 0x101, 0x3b0, 0x201, 0x3c1, 0x313, 0x201, - 0x3c1, 0x314, 0x201, 0x3c5, 0x342, 0x201, 0x3cb, 0x342, - 0x201, 0x3a5, 0x306, 0x201, 0x3a5, 0x304, 0x201, 0x3a5, - 0x300, 0x101, 0x38e, 0x201, 0x3a1, 0x314, 0x201, 0xa8, - 0x300, 0x101, 0x385, 0x101, 0x60, 0x201, 0x1f7c, 0x345, - 0x201, 0x3c9, 0x345, 0x201, 0x3ce, 0x345, 0x201, 0x3c9, - 0x342, 0x201, 0x1ff6, 0x345, 0x201, 0x39f, 0x300, 0x101, - 0x38c, 0x201, 0x3a9, 0x300, 0x101, 0x38f, 0x201, 0x3a9, - 0x345, 0x101, 0xb4, 0x210, 0x20, 0x314, 0x101, 0x2002, - 0x101, 0x2003, 0x110, 0x20, 0x110, 0x20, 0x110, 0x20, - 0x110, 0x20, 0x110, 0x20, 0x103, 0x20, 0x110, 0x20, - 0x110, 0x20, 0x110, 0x20, 0x103, 0x2010, 0x210, 0x20, - 0x333, 0x110, 0x2e, 0x210, 0x2e, 0x2e, 0x310, 0x2e, - 0x2e, 0x2e, 0x103, 0x20, 0x210, 0x2032, 0x2032, 0x310, - 0x2032, 0x2032, 0x2032, 0x210, 0x2035, 0x2035, 0x310, 0x2035, - 0x2035, 0x2035, 0x210, 0x21, 0x21, 0x210, 0x20, 0x305, - 0x210, 0x3f, 0x3f, 0x210, 0x3f, 0x21, 0x210, 0x21, - 0x3f, 0x410, 0x2032, 0x2032, 0x2032, 0x2032, 0x110, 0x20, - 0x109, 0x30, 0x109, 0x69, 0x109, 0x34, 0x109, 0x35, - 0x109, 0x36, 0x109, 0x37, 0x109, 0x38, 0x109, 0x39, - 0x109, 0x2b, 0x109, 0x2212, 0x109, 0x3d, 0x109, 0x28, - 0x109, 0x29, 0x109, 0x6e, 0x10a, 0x30, 0x10a, 0x31, - 0x10a, 0x32, 0x10a, 0x33, 0x10a, 0x34, 0x10a, 0x35, - 0x10a, 0x36, 0x10a, 0x37, 0x10a, 0x38, 0x10a, 0x39, - 0x10a, 0x2b, 0x10a, 0x2212, 0x10a, 0x3d, 0x10a, 0x28, - 0x10a, 0x29, 0x10a, 0x61, 0x10a, 0x65, 0x10a, 0x6f, - 0x10a, 0x78, 0x10a, 0x259, 0x10a, 0x68, 0x10a, 0x6b, - 0x10a, 0x6c, 0x10a, 0x6d, 0x10a, 0x6e, 0x10a, 0x70, - 0x10a, 0x73, 0x10a, 0x74, 0x210, 0x52, 0x73, 0x310, - 0x61, 0x2f, 0x63, 0x310, 0x61, 0x2f, 0x73, 0x102, - 0x43, 0x210, 0xb0, 0x43, 0x310, 0x63, 0x2f, 0x6f, - 0x310, 0x63, 0x2f, 0x75, 0x110, 0x190, 0x210, 0xb0, - 0x46, 0x102, 0x67, 0x102, 0x48, 0x102, 0x48, 0x102, - 0x48, 0x102, 0x68, 0x102, 0x127, 0x102, 0x49, 0x102, - 0x49, 0x102, 0x4c, 0x102, 0x6c, 0x102, 0x4e, 0x210, - 0x4e, 0x6f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, - 0x102, 0x52, 0x102, 0x52, 0x209, 0x53, 0x4d, 0x310, - 0x54, 0x45, 0x4c, 0x209, 0x54, 0x4d, 0x102, 0x5a, - 0x101, 0x3a9, 0x102, 0x5a, 0x101, 0x4b, 0x101, 0xc5, - 0x102, 0x42, 0x102, 0x43, 0x102, 0x65, 0x102, 0x45, - 0x102, 0x46, 0x102, 0x4d, 0x102, 0x6f, 0x110, 0x5d0, - 0x110, 0x5d1, 0x110, 0x5d2, 0x110, 0x5d3, 0x102, 0x69, - 0x310, 0x46, 0x41, 0x58, 0x102, 0x3c0, 0x102, 0x3b3, - 0x102, 0x393, 0x102, 0x3a0, 0x102, 0x2211, 0x102, 0x44, - 0x102, 0x64, 0x102, 0x65, 0x102, 0x69, 0x102, 0x6a, - 0x311, 0x31, 0x2044, 0x37, 0x311, 0x31, 0x2044, 0x39, - 0x411, 0x31, 0x2044, 0x31, 0x30, 0x311, 0x31, 0x2044, - 0x33, 0x311, 0x32, 0x2044, 0x33, 0x311, 0x31, 0x2044, - 0x35, 0x311, 0x32, 0x2044, 0x35, 0x311, 0x33, 0x2044, - 0x35, 0x311, 0x34, 0x2044, 0x35, 0x311, 0x31, 0x2044, - 0x36, 0x311, 0x35, 0x2044, 0x36, 0x311, 0x31, 0x2044, - 0x38, 0x311, 0x33, 0x2044, 0x38, 0x311, 0x35, 0x2044, - 0x38, 0x311, 0x37, 0x2044, 0x38, 0x211, 0x31, 0x2044, - 0x110, 0x49, 0x210, 0x49, 0x49, 0x310, 0x49, 0x49, - 0x49, 0x210, 0x49, 0x56, 0x110, 0x56, 0x210, 0x56, - 0x49, 0x310, 0x56, 0x49, 0x49, 0x410, 0x56, 0x49, - 0x49, 0x49, 0x210, 0x49, 0x58, 0x110, 0x58, 0x210, - 0x58, 0x49, 0x310, 0x58, 0x49, 0x49, 0x110, 0x4c, - 0x110, 0x43, 0x110, 0x44, 0x110, 0x4d, 0x110, 0x69, - 0x210, 0x69, 0x69, 0x310, 0x69, 0x69, 0x69, 0x210, - 0x69, 0x76, 0x110, 0x76, 0x210, 0x76, 0x69, 0x310, - 0x76, 0x69, 0x69, 0x410, 0x76, 0x69, 0x69, 0x69, - 0x210, 0x69, 0x78, 0x110, 0x78, 0x210, 0x78, 0x69, - 0x310, 0x78, 0x69, 0x69, 0x110, 0x6c, 0x110, 0x63, - 0x110, 0x64, 0x110, 0x6d, 0x311, 0x30, 0x2044, 0x33, - 0x201, 0x2190, 0x338, 0x201, 0x2192, 0x338, 0x201, 0x2194, - 0x338, 0x201, 0x21d0, 0x338, 0x201, 0x21d4, 0x338, 0x201, - 0x21d2, 0x338, 0x201, 0x2203, 0x338, 0x201, 0x2208, 0x338, - 0x201, 0x220b, 0x338, 0x201, 0x2223, 0x338, 0x201, 0x2225, - 0x338, 0x210, 0x222b, 0x222b, 0x310, 0x222b, 0x222b, 0x222b, - 0x210, 0x222e, 0x222e, 0x310, 0x222e, 0x222e, 0x222e, 0x201, - 0x223c, 0x338, 0x201, 0x2243, 0x338, 0x201, 0x2245, 0x338, - 0x201, 0x2248, 0x338, 0x201, 0x3d, 0x338, 0x201, 0x2261, - 0x338, 0x201, 0x224d, 0x338, 0x201, 0x3c, 0x338, 0x201, - 0x3e, 0x338, 0x201, 0x2264, 0x338, 0x201, 0x2265, 0x338, - 0x201, 0x2272, 0x338, 0x201, 0x2273, 0x338, 0x201, 0x2276, - 0x338, 0x201, 0x2277, 0x338, 0x201, 0x227a, 0x338, 0x201, - 0x227b, 0x338, 0x201, 0x2282, 0x338, 0x201, 0x2283, 0x338, - 0x201, 0x2286, 0x338, 0x201, 0x2287, 0x338, 0x201, 0x22a2, - 0x338, 0x201, 0x22a8, 0x338, 0x201, 0x22a9, 0x338, 0x201, - 0x22ab, 0x338, 0x201, 0x227c, 0x338, 0x201, 0x227d, 0x338, - 0x201, 0x2291, 0x338, 0x201, 0x2292, 0x338, 0x201, 0x22b2, - 0x338, 0x201, 0x22b3, 0x338, 0x201, 0x22b4, 0x338, 0x201, - 0x22b5, 0x338, 0x101, 0x3008, 0x101, 0x3009, 0x108, 0x31, - 0x108, 0x32, 0x108, 0x33, 0x108, 0x34, 0x108, 0x35, - 0x108, 0x36, 0x108, 0x37, 0x108, 0x38, 0x108, 0x39, - 0x208, 0x31, 0x30, 0x208, 0x31, 0x31, 0x208, 0x31, - 0x32, 0x208, 0x31, 0x33, 0x208, 0x31, 0x34, 0x208, - 0x31, 0x35, 0x208, 0x31, 0x36, 0x208, 0x31, 0x37, - 0x208, 0x31, 0x38, 0x208, 0x31, 0x39, 0x208, 0x32, - 0x30, 0x310, 0x28, 0x31, 0x29, 0x310, 0x28, 0x32, - 0x29, 0x310, 0x28, 0x33, 0x29, 0x310, 0x28, 0x34, - 0x29, 0x310, 0x28, 0x35, 0x29, 0x310, 0x28, 0x36, - 0x29, 0x310, 0x28, 0x37, 0x29, 0x310, 0x28, 0x38, - 0x29, 0x310, 0x28, 0x39, 0x29, 0x410, 0x28, 0x31, - 0x30, 0x29, 0x410, 0x28, 0x31, 0x31, 0x29, 0x410, - 0x28, 0x31, 0x32, 0x29, 0x410, 0x28, 0x31, 0x33, - 0x29, 0x410, 0x28, 0x31, 0x34, 0x29, 0x410, 0x28, - 0x31, 0x35, 0x29, 0x410, 0x28, 0x31, 0x36, 0x29, - 0x410, 0x28, 0x31, 0x37, 0x29, 0x410, 0x28, 0x31, - 0x38, 0x29, 0x410, 0x28, 0x31, 0x39, 0x29, 0x410, - 0x28, 0x32, 0x30, 0x29, 0x210, 0x31, 0x2e, 0x210, - 0x32, 0x2e, 0x210, 0x33, 0x2e, 0x210, 0x34, 0x2e, - 0x210, 0x35, 0x2e, 0x210, 0x36, 0x2e, 0x210, 0x37, - 0x2e, 0x210, 0x38, 0x2e, 0x210, 0x39, 0x2e, 0x310, - 0x31, 0x30, 0x2e, 0x310, 0x31, 0x31, 0x2e, 0x310, - 0x31, 0x32, 0x2e, 0x310, 0x31, 0x33, 0x2e, 0x310, - 0x31, 0x34, 0x2e, 0x310, 0x31, 0x35, 0x2e, 0x310, - 0x31, 0x36, 0x2e, 0x310, 0x31, 0x37, 0x2e, 0x310, - 0x31, 0x38, 0x2e, 0x310, 0x31, 0x39, 0x2e, 0x310, - 0x32, 0x30, 0x2e, 0x310, 0x28, 0x61, 0x29, 0x310, - 0x28, 0x62, 0x29, 0x310, 0x28, 0x63, 0x29, 0x310, - 0x28, 0x64, 0x29, 0x310, 0x28, 0x65, 0x29, 0x310, - 0x28, 0x66, 0x29, 0x310, 0x28, 0x67, 0x29, 0x310, - 0x28, 0x68, 0x29, 0x310, 0x28, 0x69, 0x29, 0x310, - 0x28, 0x6a, 0x29, 0x310, 0x28, 0x6b, 0x29, 0x310, - 0x28, 0x6c, 0x29, 0x310, 0x28, 0x6d, 0x29, 0x310, - 0x28, 0x6e, 0x29, 0x310, 0x28, 0x6f, 0x29, 0x310, - 0x28, 0x70, 0x29, 0x310, 0x28, 0x71, 0x29, 0x310, - 0x28, 0x72, 0x29, 0x310, 0x28, 0x73, 0x29, 0x310, - 0x28, 0x74, 0x29, 0x310, 0x28, 0x75, 0x29, 0x310, - 0x28, 0x76, 0x29, 0x310, 0x28, 0x77, 0x29, 0x310, - 0x28, 0x78, 0x29, 0x310, 0x28, 0x79, 0x29, 0x310, - 0x28, 0x7a, 0x29, 0x108, 0x41, 0x108, 0x42, 0x108, - 0x43, 0x108, 0x44, 0x108, 0x45, 0x108, 0x46, 0x108, - 0x47, 0x108, 0x48, 0x108, 0x49, 0x108, 0x4a, 0x108, - 0x4b, 0x108, 0x4c, 0x108, 0x4d, 0x108, 0x4e, 0x108, - 0x4f, 0x108, 0x50, 0x108, 0x51, 0x108, 0x52, 0x108, - 0x53, 0x108, 0x54, 0x108, 0x55, 0x108, 0x56, 0x108, - 0x57, 0x108, 0x58, 0x108, 0x59, 0x108, 0x5a, 0x108, - 0x61, 0x108, 0x62, 0x108, 0x63, 0x108, 0x64, 0x108, - 0x65, 0x108, 0x66, 0x108, 0x67, 0x108, 0x68, 0x108, - 0x69, 0x108, 0x6a, 0x108, 0x6b, 0x108, 0x6c, 0x108, - 0x6d, 0x108, 0x6e, 0x108, 0x6f, 0x108, 0x70, 0x108, - 0x71, 0x108, 0x72, 0x108, 0x73, 0x108, 0x74, 0x108, - 0x75, 0x108, 0x76, 0x108, 0x77, 0x108, 0x78, 0x108, - 0x79, 0x108, 0x7a, 0x108, 0x30, 0x410, 0x222b, 0x222b, - 0x222b, 0x222b, 0x310, 0x3a, 0x3a, 0x3d, 0x210, 0x3d, - 0x3d, 0x310, 0x3d, 0x3d, 0x3d, 0x201, 0x2add, 0x338, - 0x10a, 0x6a, 0x109, 0x56, 0x109, 0x2d61, 0x110, 0x6bcd, - 0x110, 0x9f9f, 0x110, 0x4e00, 0x110, 0x4e28, 0x110, 0x4e36, - 0x110, 0x4e3f, 0x110, 0x4e59, 0x110, 0x4e85, 0x110, 0x4e8c, - 0x110, 0x4ea0, 0x110, 0x4eba, 0x110, 0x513f, 0x110, 0x5165, - 0x110, 0x516b, 0x110, 0x5182, 0x110, 0x5196, 0x110, 0x51ab, - 0x110, 0x51e0, 0x110, 0x51f5, 0x110, 0x5200, 0x110, 0x529b, - 0x110, 0x52f9, 0x110, 0x5315, 0x110, 0x531a, 0x110, 0x5338, - 0x110, 0x5341, 0x110, 0x535c, 0x110, 0x5369, 0x110, 0x5382, - 0x110, 0x53b6, 0x110, 0x53c8, 0x110, 0x53e3, 0x110, 0x56d7, - 0x110, 0x571f, 0x110, 0x58eb, 0x110, 0x5902, 0x110, 0x590a, - 0x110, 0x5915, 0x110, 0x5927, 0x110, 0x5973, 0x110, 0x5b50, - 0x110, 0x5b80, 0x110, 0x5bf8, 0x110, 0x5c0f, 0x110, 0x5c22, - 0x110, 0x5c38, 0x110, 0x5c6e, 0x110, 0x5c71, 0x110, 0x5ddb, - 0x110, 0x5de5, 0x110, 0x5df1, 0x110, 0x5dfe, 0x110, 0x5e72, - 0x110, 0x5e7a, 0x110, 0x5e7f, 0x110, 0x5ef4, 0x110, 0x5efe, - 0x110, 0x5f0b, 0x110, 0x5f13, 0x110, 0x5f50, 0x110, 0x5f61, - 0x110, 0x5f73, 0x110, 0x5fc3, 0x110, 0x6208, 0x110, 0x6236, - 0x110, 0x624b, 0x110, 0x652f, 0x110, 0x6534, 0x110, 0x6587, - 0x110, 0x6597, 0x110, 0x65a4, 0x110, 0x65b9, 0x110, 0x65e0, - 0x110, 0x65e5, 0x110, 0x66f0, 0x110, 0x6708, 0x110, 0x6728, - 0x110, 0x6b20, 0x110, 0x6b62, 0x110, 0x6b79, 0x110, 0x6bb3, - 0x110, 0x6bcb, 0x110, 0x6bd4, 0x110, 0x6bdb, 0x110, 0x6c0f, - 0x110, 0x6c14, 0x110, 0x6c34, 0x110, 0x706b, 0x110, 0x722a, - 0x110, 0x7236, 0x110, 0x723b, 0x110, 0x723f, 0x110, 0x7247, - 0x110, 0x7259, 0x110, 0x725b, 0x110, 0x72ac, 0x110, 0x7384, - 0x110, 0x7389, 0x110, 0x74dc, 0x110, 0x74e6, 0x110, 0x7518, - 0x110, 0x751f, 0x110, 0x7528, 0x110, 0x7530, 0x110, 0x758b, - 0x110, 0x7592, 0x110, 0x7676, 0x110, 0x767d, 0x110, 0x76ae, - 0x110, 0x76bf, 0x110, 0x76ee, 0x110, 0x77db, 0x110, 0x77e2, - 0x110, 0x77f3, 0x110, 0x793a, 0x110, 0x79b8, 0x110, 0x79be, - 0x110, 0x7a74, 0x110, 0x7acb, 0x110, 0x7af9, 0x110, 0x7c73, - 0x110, 0x7cf8, 0x110, 0x7f36, 0x110, 0x7f51, 0x110, 0x7f8a, - 0x110, 0x7fbd, 0x110, 0x8001, 0x110, 0x800c, 0x110, 0x8012, - 0x110, 0x8033, 0x110, 0x807f, 0x110, 0x8089, 0x110, 0x81e3, - 0x110, 0x81ea, 0x110, 0x81f3, 0x110, 0x81fc, 0x110, 0x820c, - 0x110, 0x821b, 0x110, 0x821f, 0x110, 0x826e, 0x110, 0x8272, - 0x110, 0x8278, 0x110, 0x864d, 0x110, 0x866b, 0x110, 0x8840, - 0x110, 0x884c, 0x110, 0x8863, 0x110, 0x897e, 0x110, 0x898b, - 0x110, 0x89d2, 0x110, 0x8a00, 0x110, 0x8c37, 0x110, 0x8c46, - 0x110, 0x8c55, 0x110, 0x8c78, 0x110, 0x8c9d, 0x110, 0x8d64, - 0x110, 0x8d70, 0x110, 0x8db3, 0x110, 0x8eab, 0x110, 0x8eca, - 0x110, 0x8f9b, 0x110, 0x8fb0, 0x110, 0x8fb5, 0x110, 0x9091, - 0x110, 0x9149, 0x110, 0x91c6, 0x110, 0x91cc, 0x110, 0x91d1, - 0x110, 0x9577, 0x110, 0x9580, 0x110, 0x961c, 0x110, 0x96b6, - 0x110, 0x96b9, 0x110, 0x96e8, 0x110, 0x9751, 0x110, 0x975e, - 0x110, 0x9762, 0x110, 0x9769, 0x110, 0x97cb, 0x110, 0x97ed, - 0x110, 0x97f3, 0x110, 0x9801, 0x110, 0x98a8, 0x110, 0x98db, - 0x110, 0x98df, 0x110, 0x9996, 0x110, 0x9999, 0x110, 0x99ac, - 0x110, 0x9aa8, 0x110, 0x9ad8, 0x110, 0x9adf, 0x110, 0x9b25, - 0x110, 0x9b2f, 0x110, 0x9b32, 0x110, 0x9b3c, 0x110, 0x9b5a, - 0x110, 0x9ce5, 0x110, 0x9e75, 0x110, 0x9e7f, 0x110, 0x9ea5, - 0x110, 0x9ebb, 0x110, 0x9ec3, 0x110, 0x9ecd, 0x110, 0x9ed1, - 0x110, 0x9ef9, 0x110, 0x9efd, 0x110, 0x9f0e, 0x110, 0x9f13, - 0x110, 0x9f20, 0x110, 0x9f3b, 0x110, 0x9f4a, 0x110, 0x9f52, - 0x110, 0x9f8d, 0x110, 0x9f9c, 0x110, 0x9fa0, 0x10c, 0x20, - 0x110, 0x3012, 0x110, 0x5341, 0x110, 0x5344, 0x110, 0x5345, - 0x201, 0x304b, 0x3099, 0x201, 0x304d, 0x3099, 0x201, 0x304f, - 0x3099, 0x201, 0x3051, 0x3099, 0x201, 0x3053, 0x3099, 0x201, - 0x3055, 0x3099, 0x201, 0x3057, 0x3099, 0x201, 0x3059, 0x3099, - 0x201, 0x305b, 0x3099, 0x201, 0x305d, 0x3099, 0x201, 0x305f, - 0x3099, 0x201, 0x3061, 0x3099, 0x201, 0x3064, 0x3099, 0x201, - 0x3066, 0x3099, 0x201, 0x3068, 0x3099, 0x201, 0x306f, 0x3099, - 0x201, 0x306f, 0x309a, 0x201, 0x3072, 0x3099, 0x201, 0x3072, - 0x309a, 0x201, 0x3075, 0x3099, 0x201, 0x3075, 0x309a, 0x201, - 0x3078, 0x3099, 0x201, 0x3078, 0x309a, 0x201, 0x307b, 0x3099, - 0x201, 0x307b, 0x309a, 0x201, 0x3046, 0x3099, 0x210, 0x20, - 0x3099, 0x210, 0x20, 0x309a, 0x201, 0x309d, 0x3099, 0x20b, - 0x3088, 0x308a, 0x201, 0x30ab, 0x3099, 0x201, 0x30ad, 0x3099, - 0x201, 0x30af, 0x3099, 0x201, 0x30b1, 0x3099, 0x201, 0x30b3, - 0x3099, 0x201, 0x30b5, 0x3099, 0x201, 0x30b7, 0x3099, 0x201, - 0x30b9, 0x3099, 0x201, 0x30bb, 0x3099, 0x201, 0x30bd, 0x3099, - 0x201, 0x30bf, 0x3099, 0x201, 0x30c1, 0x3099, 0x201, 0x30c4, - 0x3099, 0x201, 0x30c6, 0x3099, 0x201, 0x30c8, 0x3099, 0x201, - 0x30cf, 0x3099, 0x201, 0x30cf, 0x309a, 0x201, 0x30d2, 0x3099, - 0x201, 0x30d2, 0x309a, 0x201, 0x30d5, 0x3099, 0x201, 0x30d5, - 0x309a, 0x201, 0x30d8, 0x3099, 0x201, 0x30d8, 0x309a, 0x201, - 0x30db, 0x3099, 0x201, 0x30db, 0x309a, 0x201, 0x30a6, 0x3099, - 0x201, 0x30ef, 0x3099, 0x201, 0x30f0, 0x3099, 0x201, 0x30f1, - 0x3099, 0x201, 0x30f2, 0x3099, 0x201, 0x30fd, 0x3099, 0x20b, - 0x30b3, 0x30c8, 0x110, 0x1100, 0x110, 0x1101, 0x110, 0x11aa, - 0x110, 0x1102, 0x110, 0x11ac, 0x110, 0x11ad, 0x110, 0x1103, - 0x110, 0x1104, 0x110, 0x1105, 0x110, 0x11b0, 0x110, 0x11b1, - 0x110, 0x11b2, 0x110, 0x11b3, 0x110, 0x11b4, 0x110, 0x11b5, - 0x110, 0x111a, 0x110, 0x1106, 0x110, 0x1107, 0x110, 0x1108, - 0x110, 0x1121, 0x110, 0x1109, 0x110, 0x110a, 0x110, 0x110b, - 0x110, 0x110c, 0x110, 0x110d, 0x110, 0x110e, 0x110, 0x110f, - 0x110, 0x1110, 0x110, 0x1111, 0x110, 0x1112, 0x110, 0x1161, - 0x110, 0x1162, 0x110, 0x1163, 0x110, 0x1164, 0x110, 0x1165, - 0x110, 0x1166, 0x110, 0x1167, 0x110, 0x1168, 0x110, 0x1169, - 0x110, 0x116a, 0x110, 0x116b, 0x110, 0x116c, 0x110, 0x116d, - 0x110, 0x116e, 0x110, 0x116f, 0x110, 0x1170, 0x110, 0x1171, - 0x110, 0x1172, 0x110, 0x1173, 0x110, 0x1174, 0x110, 0x1175, - 0x110, 0x1160, 0x110, 0x1114, 0x110, 0x1115, 0x110, 0x11c7, - 0x110, 0x11c8, 0x110, 0x11cc, 0x110, 0x11ce, 0x110, 0x11d3, - 0x110, 0x11d7, 0x110, 0x11d9, 0x110, 0x111c, 0x110, 0x11dd, - 0x110, 0x11df, 0x110, 0x111d, 0x110, 0x111e, 0x110, 0x1120, - 0x110, 0x1122, 0x110, 0x1123, 0x110, 0x1127, 0x110, 0x1129, - 0x110, 0x112b, 0x110, 0x112c, 0x110, 0x112d, 0x110, 0x112e, - 0x110, 0x112f, 0x110, 0x1132, 0x110, 0x1136, 0x110, 0x1140, - 0x110, 0x1147, 0x110, 0x114c, 0x110, 0x11f1, 0x110, 0x11f2, - 0x110, 0x1157, 0x110, 0x1158, 0x110, 0x1159, 0x110, 0x1184, - 0x110, 0x1185, 0x110, 0x1188, 0x110, 0x1191, 0x110, 0x1192, - 0x110, 0x1194, 0x110, 0x119e, 0x110, 0x11a1, 0x109, 0x4e00, - 0x109, 0x4e8c, 0x109, 0x4e09, 0x109, 0x56db, 0x109, 0x4e0a, - 0x109, 0x4e2d, 0x109, 0x4e0b, 0x109, 0x7532, 0x109, 0x4e59, - 0x109, 0x4e19, 0x109, 0x4e01, 0x109, 0x5929, 0x109, 0x5730, - 0x109, 0x4eba, 0x310, 0x28, 0x1100, 0x29, 0x310, 0x28, - 0x1102, 0x29, 0x310, 0x28, 0x1103, 0x29, 0x310, 0x28, - 0x1105, 0x29, 0x310, 0x28, 0x1106, 0x29, 0x310, 0x28, - 0x1107, 0x29, 0x310, 0x28, 0x1109, 0x29, 0x310, 0x28, - 0x110b, 0x29, 0x310, 0x28, 0x110c, 0x29, 0x310, 0x28, - 0x110e, 0x29, 0x310, 0x28, 0x110f, 0x29, 0x310, 0x28, - 0x1110, 0x29, 0x310, 0x28, 0x1111, 0x29, 0x310, 0x28, - 0x1112, 0x29, 0x410, 0x28, 0x1100, 0x1161, 0x29, 0x410, - 0x28, 0x1102, 0x1161, 0x29, 0x410, 0x28, 0x1103, 0x1161, - 0x29, 0x410, 0x28, 0x1105, 0x1161, 0x29, 0x410, 0x28, - 0x1106, 0x1161, 0x29, 0x410, 0x28, 0x1107, 0x1161, 0x29, - 0x410, 0x28, 0x1109, 0x1161, 0x29, 0x410, 0x28, 0x110b, - 0x1161, 0x29, 0x410, 0x28, 0x110c, 0x1161, 0x29, 0x410, - 0x28, 0x110e, 0x1161, 0x29, 0x410, 0x28, 0x110f, 0x1161, - 0x29, 0x410, 0x28, 0x1110, 0x1161, 0x29, 0x410, 0x28, - 0x1111, 0x1161, 0x29, 0x410, 0x28, 0x1112, 0x1161, 0x29, - 0x410, 0x28, 0x110c, 0x116e, 0x29, 0x710, 0x28, 0x110b, - 0x1169, 0x110c, 0x1165, 0x11ab, 0x29, 0x610, 0x28, 0x110b, - 0x1169, 0x1112, 0x116e, 0x29, 0x310, 0x28, 0x4e00, 0x29, - 0x310, 0x28, 0x4e8c, 0x29, 0x310, 0x28, 0x4e09, 0x29, - 0x310, 0x28, 0x56db, 0x29, 0x310, 0x28, 0x4e94, 0x29, - 0x310, 0x28, 0x516d, 0x29, 0x310, 0x28, 0x4e03, 0x29, - 0x310, 0x28, 0x516b, 0x29, 0x310, 0x28, 0x4e5d, 0x29, - 0x310, 0x28, 0x5341, 0x29, 0x310, 0x28, 0x6708, 0x29, - 0x310, 0x28, 0x706b, 0x29, 0x310, 0x28, 0x6c34, 0x29, - 0x310, 0x28, 0x6728, 0x29, 0x310, 0x28, 0x91d1, 0x29, - 0x310, 0x28, 0x571f, 0x29, 0x310, 0x28, 0x65e5, 0x29, - 0x310, 0x28, 0x682a, 0x29, 0x310, 0x28, 0x6709, 0x29, - 0x310, 0x28, 0x793e, 0x29, 0x310, 0x28, 0x540d, 0x29, - 0x310, 0x28, 0x7279, 0x29, 0x310, 0x28, 0x8ca1, 0x29, - 0x310, 0x28, 0x795d, 0x29, 0x310, 0x28, 0x52b4, 0x29, - 0x310, 0x28, 0x4ee3, 0x29, 0x310, 0x28, 0x547c, 0x29, - 0x310, 0x28, 0x5b66, 0x29, 0x310, 0x28, 0x76e3, 0x29, - 0x310, 0x28, 0x4f01, 0x29, 0x310, 0x28, 0x8cc7, 0x29, - 0x310, 0x28, 0x5354, 0x29, 0x310, 0x28, 0x796d, 0x29, - 0x310, 0x28, 0x4f11, 0x29, 0x310, 0x28, 0x81ea, 0x29, - 0x310, 0x28, 0x81f3, 0x29, 0x108, 0x554f, 0x108, 0x5e7c, - 0x108, 0x6587, 0x108, 0x7b8f, 0x30f, 0x50, 0x54, 0x45, - 0x208, 0x32, 0x31, 0x208, 0x32, 0x32, 0x208, 0x32, - 0x33, 0x208, 0x32, 0x34, 0x208, 0x32, 0x35, 0x208, - 0x32, 0x36, 0x208, 0x32, 0x37, 0x208, 0x32, 0x38, - 0x208, 0x32, 0x39, 0x208, 0x33, 0x30, 0x208, 0x33, - 0x31, 0x208, 0x33, 0x32, 0x208, 0x33, 0x33, 0x208, - 0x33, 0x34, 0x208, 0x33, 0x35, 0x108, 0x1100, 0x108, - 0x1102, 0x108, 0x1103, 0x108, 0x1105, 0x108, 0x1106, 0x108, - 0x1107, 0x108, 0x1109, 0x108, 0x110b, 0x108, 0x110c, 0x108, - 0x110e, 0x108, 0x110f, 0x108, 0x1110, 0x108, 0x1111, 0x108, - 0x1112, 0x208, 0x1100, 0x1161, 0x208, 0x1102, 0x1161, 0x208, - 0x1103, 0x1161, 0x208, 0x1105, 0x1161, 0x208, 0x1106, 0x1161, - 0x208, 0x1107, 0x1161, 0x208, 0x1109, 0x1161, 0x208, 0x110b, - 0x1161, 0x208, 0x110c, 0x1161, 0x208, 0x110e, 0x1161, 0x208, - 0x110f, 0x1161, 0x208, 0x1110, 0x1161, 0x208, 0x1111, 0x1161, - 0x208, 0x1112, 0x1161, 0x508, 0x110e, 0x1161, 0x11b7, 0x1100, - 0x1169, 0x408, 0x110c, 0x116e, 0x110b, 0x1174, 0x208, 0x110b, - 0x116e, 0x108, 0x4e00, 0x108, 0x4e8c, 0x108, 0x4e09, 0x108, - 0x56db, 0x108, 0x4e94, 0x108, 0x516d, 0x108, 0x4e03, 0x108, - 0x516b, 0x108, 0x4e5d, 0x108, 0x5341, 0x108, 0x6708, 0x108, - 0x706b, 0x108, 0x6c34, 0x108, 0x6728, 0x108, 0x91d1, 0x108, - 0x571f, 0x108, 0x65e5, 0x108, 0x682a, 0x108, 0x6709, 0x108, - 0x793e, 0x108, 0x540d, 0x108, 0x7279, 0x108, 0x8ca1, 0x108, - 0x795d, 0x108, 0x52b4, 0x108, 0x79d8, 0x108, 0x7537, 0x108, - 0x5973, 0x108, 0x9069, 0x108, 0x512a, 0x108, 0x5370, 0x108, - 0x6ce8, 0x108, 0x9805, 0x108, 0x4f11, 0x108, 0x5199, 0x108, - 0x6b63, 0x108, 0x4e0a, 0x108, 0x4e2d, 0x108, 0x4e0b, 0x108, - 0x5de6, 0x108, 0x53f3, 0x108, 0x533b, 0x108, 0x5b97, 0x108, - 0x5b66, 0x108, 0x76e3, 0x108, 0x4f01, 0x108, 0x8cc7, 0x108, - 0x5354, 0x108, 0x591c, 0x208, 0x33, 0x36, 0x208, 0x33, - 0x37, 0x208, 0x33, 0x38, 0x208, 0x33, 0x39, 0x208, - 0x34, 0x30, 0x208, 0x34, 0x31, 0x208, 0x34, 0x32, - 0x208, 0x34, 0x33, 0x208, 0x34, 0x34, 0x208, 0x34, - 0x35, 0x208, 0x34, 0x36, 0x208, 0x34, 0x37, 0x208, - 0x34, 0x38, 0x208, 0x34, 0x39, 0x208, 0x35, 0x30, - 0x210, 0x31, 0x6708, 0x210, 0x32, 0x6708, 0x210, 0x33, - 0x6708, 0x210, 0x34, 0x6708, 0x210, 0x35, 0x6708, 0x210, - 0x36, 0x6708, 0x210, 0x37, 0x6708, 0x210, 0x38, 0x6708, - 0x210, 0x39, 0x6708, 0x310, 0x31, 0x30, 0x6708, 0x310, - 0x31, 0x31, 0x6708, 0x310, 0x31, 0x32, 0x6708, 0x20f, - 0x48, 0x67, 0x30f, 0x65, 0x72, 0x67, 0x20f, 0x65, - 0x56, 0x30f, 0x4c, 0x54, 0x44, 0x108, 0x30a2, 0x108, - 0x30a4, 0x108, 0x30a6, 0x108, 0x30a8, 0x108, 0x30aa, 0x108, - 0x30ab, 0x108, 0x30ad, 0x108, 0x30af, 0x108, 0x30b1, 0x108, - 0x30b3, 0x108, 0x30b5, 0x108, 0x30b7, 0x108, 0x30b9, 0x108, - 0x30bb, 0x108, 0x30bd, 0x108, 0x30bf, 0x108, 0x30c1, 0x108, - 0x30c4, 0x108, 0x30c6, 0x108, 0x30c8, 0x108, 0x30ca, 0x108, - 0x30cb, 0x108, 0x30cc, 0x108, 0x30cd, 0x108, 0x30ce, 0x108, - 0x30cf, 0x108, 0x30d2, 0x108, 0x30d5, 0x108, 0x30d8, 0x108, - 0x30db, 0x108, 0x30de, 0x108, 0x30df, 0x108, 0x30e0, 0x108, - 0x30e1, 0x108, 0x30e2, 0x108, 0x30e4, 0x108, 0x30e6, 0x108, - 0x30e8, 0x108, 0x30e9, 0x108, 0x30ea, 0x108, 0x30eb, 0x108, - 0x30ec, 0x108, 0x30ed, 0x108, 0x30ef, 0x108, 0x30f0, 0x108, - 0x30f1, 0x108, 0x30f2, 0x40f, 0x30a2, 0x30d1, 0x30fc, 0x30c8, - 0x40f, 0x30a2, 0x30eb, 0x30d5, 0x30a1, 0x40f, 0x30a2, 0x30f3, - 0x30da, 0x30a2, 0x30f, 0x30a2, 0x30fc, 0x30eb, 0x40f, 0x30a4, - 0x30cb, 0x30f3, 0x30b0, 0x30f, 0x30a4, 0x30f3, 0x30c1, 0x30f, - 0x30a6, 0x30a9, 0x30f3, 0x50f, 0x30a8, 0x30b9, 0x30af, 0x30fc, - 0x30c9, 0x40f, 0x30a8, 0x30fc, 0x30ab, 0x30fc, 0x30f, 0x30aa, - 0x30f3, 0x30b9, 0x30f, 0x30aa, 0x30fc, 0x30e0, 0x30f, 0x30ab, - 0x30a4, 0x30ea, 0x40f, 0x30ab, 0x30e9, 0x30c3, 0x30c8, 0x40f, - 0x30ab, 0x30ed, 0x30ea, 0x30fc, 0x30f, 0x30ac, 0x30ed, 0x30f3, - 0x30f, 0x30ac, 0x30f3, 0x30de, 0x20f, 0x30ae, 0x30ac, 0x30f, - 0x30ae, 0x30cb, 0x30fc, 0x40f, 0x30ad, 0x30e5, 0x30ea, 0x30fc, - 0x40f, 0x30ae, 0x30eb, 0x30c0, 0x30fc, 0x20f, 0x30ad, 0x30ed, - 0x50f, 0x30ad, 0x30ed, 0x30b0, 0x30e9, 0x30e0, 0x60f, 0x30ad, - 0x30ed, 0x30e1, 0x30fc, 0x30c8, 0x30eb, 0x50f, 0x30ad, 0x30ed, - 0x30ef, 0x30c3, 0x30c8, 0x30f, 0x30b0, 0x30e9, 0x30e0, 0x50f, - 0x30b0, 0x30e9, 0x30e0, 0x30c8, 0x30f3, 0x50f, 0x30af, 0x30eb, - 0x30bc, 0x30a4, 0x30ed, 0x40f, 0x30af, 0x30ed, 0x30fc, 0x30cd, - 0x30f, 0x30b1, 0x30fc, 0x30b9, 0x30f, 0x30b3, 0x30eb, 0x30ca, - 0x30f, 0x30b3, 0x30fc, 0x30dd, 0x40f, 0x30b5, 0x30a4, 0x30af, - 0x30eb, 0x50f, 0x30b5, 0x30f3, 0x30c1, 0x30fc, 0x30e0, 0x40f, - 0x30b7, 0x30ea, 0x30f3, 0x30b0, 0x30f, 0x30bb, 0x30f3, 0x30c1, - 0x30f, 0x30bb, 0x30f3, 0x30c8, 0x30f, 0x30c0, 0x30fc, 0x30b9, - 0x20f, 0x30c7, 0x30b7, 0x20f, 0x30c9, 0x30eb, 0x20f, 0x30c8, - 0x30f3, 0x20f, 0x30ca, 0x30ce, 0x30f, 0x30ce, 0x30c3, 0x30c8, - 0x30f, 0x30cf, 0x30a4, 0x30c4, 0x50f, 0x30d1, 0x30fc, 0x30bb, - 0x30f3, 0x30c8, 0x30f, 0x30d1, 0x30fc, 0x30c4, 0x40f, 0x30d0, - 0x30fc, 0x30ec, 0x30eb, 0x50f, 0x30d4, 0x30a2, 0x30b9, 0x30c8, - 0x30eb, 0x30f, 0x30d4, 0x30af, 0x30eb, 0x20f, 0x30d4, 0x30b3, - 0x20f, 0x30d3, 0x30eb, 0x50f, 0x30d5, 0x30a1, 0x30e9, 0x30c3, - 0x30c9, 0x40f, 0x30d5, 0x30a3, 0x30fc, 0x30c8, 0x50f, 0x30d6, - 0x30c3, 0x30b7, 0x30a7, 0x30eb, 0x30f, 0x30d5, 0x30e9, 0x30f3, - 0x50f, 0x30d8, 0x30af, 0x30bf, 0x30fc, 0x30eb, 0x20f, 0x30da, - 0x30bd, 0x30f, 0x30da, 0x30cb, 0x30d2, 0x30f, 0x30d8, 0x30eb, - 0x30c4, 0x30f, 0x30da, 0x30f3, 0x30b9, 0x30f, 0x30da, 0x30fc, - 0x30b8, 0x30f, 0x30d9, 0x30fc, 0x30bf, 0x40f, 0x30dd, 0x30a4, - 0x30f3, 0x30c8, 0x30f, 0x30dc, 0x30eb, 0x30c8, 0x20f, 0x30db, - 0x30f3, 0x30f, 0x30dd, 0x30f3, 0x30c9, 0x30f, 0x30db, 0x30fc, - 0x30eb, 0x30f, 0x30db, 0x30fc, 0x30f3, 0x40f, 0x30de, 0x30a4, - 0x30af, 0x30ed, 0x30f, 0x30de, 0x30a4, 0x30eb, 0x30f, 0x30de, - 0x30c3, 0x30cf, 0x30f, 0x30de, 0x30eb, 0x30af, 0x50f, 0x30de, - 0x30f3, 0x30b7, 0x30e7, 0x30f3, 0x40f, 0x30df, 0x30af, 0x30ed, - 0x30f3, 0x20f, 0x30df, 0x30ea, 0x50f, 0x30df, 0x30ea, 0x30d0, - 0x30fc, 0x30eb, 0x20f, 0x30e1, 0x30ac, 0x40f, 0x30e1, 0x30ac, - 0x30c8, 0x30f3, 0x40f, 0x30e1, 0x30fc, 0x30c8, 0x30eb, 0x30f, - 0x30e4, 0x30fc, 0x30c9, 0x30f, 0x30e4, 0x30fc, 0x30eb, 0x30f, - 0x30e6, 0x30a2, 0x30f3, 0x40f, 0x30ea, 0x30c3, 0x30c8, 0x30eb, - 0x20f, 0x30ea, 0x30e9, 0x30f, 0x30eb, 0x30d4, 0x30fc, 0x40f, - 0x30eb, 0x30fc, 0x30d6, 0x30eb, 0x20f, 0x30ec, 0x30e0, 0x50f, - 0x30ec, 0x30f3, 0x30c8, 0x30b2, 0x30f3, 0x30f, 0x30ef, 0x30c3, - 0x30c8, 0x210, 0x30, 0x70b9, 0x210, 0x31, 0x70b9, 0x210, - 0x32, 0x70b9, 0x210, 0x33, 0x70b9, 0x210, 0x34, 0x70b9, - 0x210, 0x35, 0x70b9, 0x210, 0x36, 0x70b9, 0x210, 0x37, - 0x70b9, 0x210, 0x38, 0x70b9, 0x210, 0x39, 0x70b9, 0x310, - 0x31, 0x30, 0x70b9, 0x310, 0x31, 0x31, 0x70b9, 0x310, - 0x31, 0x32, 0x70b9, 0x310, 0x31, 0x33, 0x70b9, 0x310, - 0x31, 0x34, 0x70b9, 0x310, 0x31, 0x35, 0x70b9, 0x310, - 0x31, 0x36, 0x70b9, 0x310, 0x31, 0x37, 0x70b9, 0x310, - 0x31, 0x38, 0x70b9, 0x310, 0x31, 0x39, 0x70b9, 0x310, - 0x32, 0x30, 0x70b9, 0x310, 0x32, 0x31, 0x70b9, 0x310, - 0x32, 0x32, 0x70b9, 0x310, 0x32, 0x33, 0x70b9, 0x310, - 0x32, 0x34, 0x70b9, 0x30f, 0x68, 0x50, 0x61, 0x20f, - 0x64, 0x61, 0x20f, 0x41, 0x55, 0x30f, 0x62, 0x61, - 0x72, 0x20f, 0x6f, 0x56, 0x20f, 0x70, 0x63, 0x20f, - 0x64, 0x6d, 0x30f, 0x64, 0x6d, 0xb2, 0x30f, 0x64, - 0x6d, 0xb3, 0x20f, 0x49, 0x55, 0x20f, 0x5e73, 0x6210, - 0x20f, 0x662d, 0x548c, 0x20f, 0x5927, 0x6b63, 0x20f, 0x660e, - 0x6cbb, 0x40f, 0x682a, 0x5f0f, 0x4f1a, 0x793e, 0x20f, 0x70, - 0x41, 0x20f, 0x6e, 0x41, 0x20f, 0x3bc, 0x41, 0x20f, - 0x6d, 0x41, 0x20f, 0x6b, 0x41, 0x20f, 0x4b, 0x42, - 0x20f, 0x4d, 0x42, 0x20f, 0x47, 0x42, 0x30f, 0x63, - 0x61, 0x6c, 0x40f, 0x6b, 0x63, 0x61, 0x6c, 0x20f, - 0x70, 0x46, 0x20f, 0x6e, 0x46, 0x20f, 0x3bc, 0x46, - 0x20f, 0x3bc, 0x67, 0x20f, 0x6d, 0x67, 0x20f, 0x6b, - 0x67, 0x20f, 0x48, 0x7a, 0x30f, 0x6b, 0x48, 0x7a, - 0x30f, 0x4d, 0x48, 0x7a, 0x30f, 0x47, 0x48, 0x7a, - 0x30f, 0x54, 0x48, 0x7a, 0x20f, 0x3bc, 0x2113, 0x20f, - 0x6d, 0x2113, 0x20f, 0x64, 0x2113, 0x20f, 0x6b, 0x2113, - 0x20f, 0x66, 0x6d, 0x20f, 0x6e, 0x6d, 0x20f, 0x3bc, - 0x6d, 0x20f, 0x6d, 0x6d, 0x20f, 0x63, 0x6d, 0x20f, - 0x6b, 0x6d, 0x30f, 0x6d, 0x6d, 0xb2, 0x30f, 0x63, - 0x6d, 0xb2, 0x20f, 0x6d, 0xb2, 0x30f, 0x6b, 0x6d, - 0xb2, 0x30f, 0x6d, 0x6d, 0xb3, 0x30f, 0x63, 0x6d, - 0xb3, 0x20f, 0x6d, 0xb3, 0x30f, 0x6b, 0x6d, 0xb3, - 0x30f, 0x6d, 0x2215, 0x73, 0x40f, 0x6d, 0x2215, 0x73, - 0xb2, 0x20f, 0x50, 0x61, 0x30f, 0x6b, 0x50, 0x61, - 0x30f, 0x4d, 0x50, 0x61, 0x30f, 0x47, 0x50, 0x61, - 0x30f, 0x72, 0x61, 0x64, 0x50f, 0x72, 0x61, 0x64, - 0x2215, 0x73, 0x60f, 0x72, 0x61, 0x64, 0x2215, 0x73, - 0xb2, 0x20f, 0x70, 0x73, 0x20f, 0x6e, 0x73, 0x20f, - 0x3bc, 0x73, 0x20f, 0x6d, 0x73, 0x20f, 0x70, 0x56, - 0x20f, 0x6e, 0x56, 0x20f, 0x3bc, 0x56, 0x20f, 0x6d, - 0x56, 0x20f, 0x6b, 0x56, 0x20f, 0x4d, 0x56, 0x20f, - 0x70, 0x57, 0x20f, 0x6e, 0x57, 0x20f, 0x3bc, 0x57, - 0x20f, 0x6d, 0x57, 0x20f, 0x6b, 0x57, 0x20f, 0x4d, - 0x57, 0x20f, 0x6b, 0x3a9, 0x20f, 0x4d, 0x3a9, 0x40f, - 0x61, 0x2e, 0x6d, 0x2e, 0x20f, 0x42, 0x71, 0x20f, - 0x63, 0x63, 0x20f, 0x63, 0x64, 0x40f, 0x43, 0x2215, - 0x6b, 0x67, 0x30f, 0x43, 0x6f, 0x2e, 0x20f, 0x64, - 0x42, 0x20f, 0x47, 0x79, 0x20f, 0x68, 0x61, 0x20f, - 0x48, 0x50, 0x20f, 0x69, 0x6e, 0x20f, 0x4b, 0x4b, - 0x20f, 0x4b, 0x4d, 0x20f, 0x6b, 0x74, 0x20f, 0x6c, - 0x6d, 0x20f, 0x6c, 0x6e, 0x30f, 0x6c, 0x6f, 0x67, - 0x20f, 0x6c, 0x78, 0x20f, 0x6d, 0x62, 0x30f, 0x6d, - 0x69, 0x6c, 0x30f, 0x6d, 0x6f, 0x6c, 0x20f, 0x50, - 0x48, 0x40f, 0x70, 0x2e, 0x6d, 0x2e, 0x30f, 0x50, - 0x50, 0x4d, 0x20f, 0x50, 0x52, 0x20f, 0x73, 0x72, - 0x20f, 0x53, 0x76, 0x20f, 0x57, 0x62, 0x30f, 0x56, - 0x2215, 0x6d, 0x30f, 0x41, 0x2215, 0x6d, 0x210, 0x31, - 0x65e5, 0x210, 0x32, 0x65e5, 0x210, 0x33, 0x65e5, 0x210, - 0x34, 0x65e5, 0x210, 0x35, 0x65e5, 0x210, 0x36, 0x65e5, - 0x210, 0x37, 0x65e5, 0x210, 0x38, 0x65e5, 0x210, 0x39, - 0x65e5, 0x310, 0x31, 0x30, 0x65e5, 0x310, 0x31, 0x31, - 0x65e5, 0x310, 0x31, 0x32, 0x65e5, 0x310, 0x31, 0x33, - 0x65e5, 0x310, 0x31, 0x34, 0x65e5, 0x310, 0x31, 0x35, - 0x65e5, 0x310, 0x31, 0x36, 0x65e5, 0x310, 0x31, 0x37, - 0x65e5, 0x310, 0x31, 0x38, 0x65e5, 0x310, 0x31, 0x39, - 0x65e5, 0x310, 0x32, 0x30, 0x65e5, 0x310, 0x32, 0x31, - 0x65e5, 0x310, 0x32, 0x32, 0x65e5, 0x310, 0x32, 0x33, - 0x65e5, 0x310, 0x32, 0x34, 0x65e5, 0x310, 0x32, 0x35, - 0x65e5, 0x310, 0x32, 0x36, 0x65e5, 0x310, 0x32, 0x37, - 0x65e5, 0x310, 0x32, 0x38, 0x65e5, 0x310, 0x32, 0x39, - 0x65e5, 0x310, 0x33, 0x30, 0x65e5, 0x310, 0x33, 0x31, - 0x65e5, 0x30f, 0x67, 0x61, 0x6c, 0x109, 0x44a, 0x109, - 0x44c, 0x109, 0xa76f, 0x109, 0x126, 0x109, 0x153, 0x109, - 0xa727, 0x109, 0xab37, 0x109, 0x26b, 0x109, 0xab52, 0x101, - 0x8c48, 0x101, 0x66f4, 0x101, 0x8eca, 0x101, 0x8cc8, 0x101, - 0x6ed1, 0x101, 0x4e32, 0x101, 0x53e5, 0x101, 0x9f9c, 0x101, - 0x9f9c, 0x101, 0x5951, 0x101, 0x91d1, 0x101, 0x5587, 0x101, - 0x5948, 0x101, 0x61f6, 0x101, 0x7669, 0x101, 0x7f85, 0x101, - 0x863f, 0x101, 0x87ba, 0x101, 0x88f8, 0x101, 0x908f, 0x101, - 0x6a02, 0x101, 0x6d1b, 0x101, 0x70d9, 0x101, 0x73de, 0x101, - 0x843d, 0x101, 0x916a, 0x101, 0x99f1, 0x101, 0x4e82, 0x101, - 0x5375, 0x101, 0x6b04, 0x101, 0x721b, 0x101, 0x862d, 0x101, - 0x9e1e, 0x101, 0x5d50, 0x101, 0x6feb, 0x101, 0x85cd, 0x101, - 0x8964, 0x101, 0x62c9, 0x101, 0x81d8, 0x101, 0x881f, 0x101, - 0x5eca, 0x101, 0x6717, 0x101, 0x6d6a, 0x101, 0x72fc, 0x101, - 0x90ce, 0x101, 0x4f86, 0x101, 0x51b7, 0x101, 0x52de, 0x101, - 0x64c4, 0x101, 0x6ad3, 0x101, 0x7210, 0x101, 0x76e7, 0x101, - 0x8001, 0x101, 0x8606, 0x101, 0x865c, 0x101, 0x8def, 0x101, - 0x9732, 0x101, 0x9b6f, 0x101, 0x9dfa, 0x101, 0x788c, 0x101, - 0x797f, 0x101, 0x7da0, 0x101, 0x83c9, 0x101, 0x9304, 0x101, - 0x9e7f, 0x101, 0x8ad6, 0x101, 0x58df, 0x101, 0x5f04, 0x101, - 0x7c60, 0x101, 0x807e, 0x101, 0x7262, 0x101, 0x78ca, 0x101, - 0x8cc2, 0x101, 0x96f7, 0x101, 0x58d8, 0x101, 0x5c62, 0x101, - 0x6a13, 0x101, 0x6dda, 0x101, 0x6f0f, 0x101, 0x7d2f, 0x101, - 0x7e37, 0x101, 0x964b, 0x101, 0x52d2, 0x101, 0x808b, 0x101, - 0x51dc, 0x101, 0x51cc, 0x101, 0x7a1c, 0x101, 0x7dbe, 0x101, - 0x83f1, 0x101, 0x9675, 0x101, 0x8b80, 0x101, 0x62cf, 0x101, - 0x6a02, 0x101, 0x8afe, 0x101, 0x4e39, 0x101, 0x5be7, 0x101, - 0x6012, 0x101, 0x7387, 0x101, 0x7570, 0x101, 0x5317, 0x101, - 0x78fb, 0x101, 0x4fbf, 0x101, 0x5fa9, 0x101, 0x4e0d, 0x101, - 0x6ccc, 0x101, 0x6578, 0x101, 0x7d22, 0x101, 0x53c3, 0x101, - 0x585e, 0x101, 0x7701, 0x101, 0x8449, 0x101, 0x8aaa, 0x101, - 0x6bba, 0x101, 0x8fb0, 0x101, 0x6c88, 0x101, 0x62fe, 0x101, - 0x82e5, 0x101, 0x63a0, 0x101, 0x7565, 0x101, 0x4eae, 0x101, - 0x5169, 0x101, 0x51c9, 0x101, 0x6881, 0x101, 0x7ce7, 0x101, - 0x826f, 0x101, 0x8ad2, 0x101, 0x91cf, 0x101, 0x52f5, 0x101, - 0x5442, 0x101, 0x5973, 0x101, 0x5eec, 0x101, 0x65c5, 0x101, - 0x6ffe, 0x101, 0x792a, 0x101, 0x95ad, 0x101, 0x9a6a, 0x101, - 0x9e97, 0x101, 0x9ece, 0x101, 0x529b, 0x101, 0x66c6, 0x101, - 0x6b77, 0x101, 0x8f62, 0x101, 0x5e74, 0x101, 0x6190, 0x101, - 0x6200, 0x101, 0x649a, 0x101, 0x6f23, 0x101, 0x7149, 0x101, - 0x7489, 0x101, 0x79ca, 0x101, 0x7df4, 0x101, 0x806f, 0x101, - 0x8f26, 0x101, 0x84ee, 0x101, 0x9023, 0x101, 0x934a, 0x101, - 0x5217, 0x101, 0x52a3, 0x101, 0x54bd, 0x101, 0x70c8, 0x101, - 0x88c2, 0x101, 0x8aaa, 0x101, 0x5ec9, 0x101, 0x5ff5, 0x101, - 0x637b, 0x101, 0x6bae, 0x101, 0x7c3e, 0x101, 0x7375, 0x101, - 0x4ee4, 0x101, 0x56f9, 0x101, 0x5be7, 0x101, 0x5dba, 0x101, - 0x601c, 0x101, 0x73b2, 0x101, 0x7469, 0x101, 0x7f9a, 0x101, - 0x8046, 0x101, 0x9234, 0x101, 0x96f6, 0x101, 0x9748, 0x101, - 0x9818, 0x101, 0x4f8b, 0x101, 0x79ae, 0x101, 0x91b4, 0x101, - 0x96b8, 0x101, 0x60e1, 0x101, 0x4e86, 0x101, 0x50da, 0x101, - 0x5bee, 0x101, 0x5c3f, 0x101, 0x6599, 0x101, 0x6a02, 0x101, - 0x71ce, 0x101, 0x7642, 0x101, 0x84fc, 0x101, 0x907c, 0x101, - 0x9f8d, 0x101, 0x6688, 0x101, 0x962e, 0x101, 0x5289, 0x101, - 0x677b, 0x101, 0x67f3, 0x101, 0x6d41, 0x101, 0x6e9c, 0x101, - 0x7409, 0x101, 0x7559, 0x101, 0x786b, 0x101, 0x7d10, 0x101, - 0x985e, 0x101, 0x516d, 0x101, 0x622e, 0x101, 0x9678, 0x101, - 0x502b, 0x101, 0x5d19, 0x101, 0x6dea, 0x101, 0x8f2a, 0x101, - 0x5f8b, 0x101, 0x6144, 0x101, 0x6817, 0x101, 0x7387, 0x101, - 0x9686, 0x101, 0x5229, 0x101, 0x540f, 0x101, 0x5c65, 0x101, - 0x6613, 0x101, 0x674e, 0x101, 0x68a8, 0x101, 0x6ce5, 0x101, - 0x7406, 0x101, 0x75e2, 0x101, 0x7f79, 0x101, 0x88cf, 0x101, - 0x88e1, 0x101, 0x91cc, 0x101, 0x96e2, 0x101, 0x533f, 0x101, - 0x6eba, 0x101, 0x541d, 0x101, 0x71d0, 0x101, 0x7498, 0x101, - 0x85fa, 0x101, 0x96a3, 0x101, 0x9c57, 0x101, 0x9e9f, 0x101, - 0x6797, 0x101, 0x6dcb, 0x101, 0x81e8, 0x101, 0x7acb, 0x101, - 0x7b20, 0x101, 0x7c92, 0x101, 0x72c0, 0x101, 0x7099, 0x101, - 0x8b58, 0x101, 0x4ec0, 0x101, 0x8336, 0x101, 0x523a, 0x101, - 0x5207, 0x101, 0x5ea6, 0x101, 0x62d3, 0x101, 0x7cd6, 0x101, - 0x5b85, 0x101, 0x6d1e, 0x101, 0x66b4, 0x101, 0x8f3b, 0x101, - 0x884c, 0x101, 0x964d, 0x101, 0x898b, 0x101, 0x5ed3, 0x101, - 0x5140, 0x101, 0x55c0, 0x101, 0x585a, 0x101, 0x6674, 0x101, - 0x51de, 0x101, 0x732a, 0x101, 0x76ca, 0x101, 0x793c, 0x101, - 0x795e, 0x101, 0x7965, 0x101, 0x798f, 0x101, 0x9756, 0x101, - 0x7cbe, 0x101, 0x7fbd, 0x101, 0x8612, 0x101, 0x8af8, 0x101, - 0x9038, 0x101, 0x90fd, 0x101, 0x98ef, 0x101, 0x98fc, 0x101, - 0x9928, 0x101, 0x9db4, 0x101, 0x90de, 0x101, 0x96b7, 0x101, - 0x4fae, 0x101, 0x50e7, 0x101, 0x514d, 0x101, 0x52c9, 0x101, - 0x52e4, 0x101, 0x5351, 0x101, 0x559d, 0x101, 0x5606, 0x101, - 0x5668, 0x101, 0x5840, 0x101, 0x58a8, 0x101, 0x5c64, 0x101, - 0x5c6e, 0x101, 0x6094, 0x101, 0x6168, 0x101, 0x618e, 0x101, - 0x61f2, 0x101, 0x654f, 0x101, 0x65e2, 0x101, 0x6691, 0x101, - 0x6885, 0x101, 0x6d77, 0x101, 0x6e1a, 0x101, 0x6f22, 0x101, - 0x716e, 0x101, 0x722b, 0x101, 0x7422, 0x101, 0x7891, 0x101, - 0x793e, 0x101, 0x7949, 0x101, 0x7948, 0x101, 0x7950, 0x101, - 0x7956, 0x101, 0x795d, 0x101, 0x798d, 0x101, 0x798e, 0x101, - 0x7a40, 0x101, 0x7a81, 0x101, 0x7bc0, 0x101, 0x7df4, 0x101, - 0x7e09, 0x101, 0x7e41, 0x101, 0x7f72, 0x101, 0x8005, 0x101, - 0x81ed, 0x101, 0x8279, 0x101, 0x8279, 0x101, 0x8457, 0x101, - 0x8910, 0x101, 0x8996, 0x101, 0x8b01, 0x101, 0x8b39, 0x101, - 0x8cd3, 0x101, 0x8d08, 0x101, 0x8fb6, 0x101, 0x9038, 0x101, - 0x96e3, 0x101, 0x97ff, 0x101, 0x983b, 0x101, 0x6075, 0x201, - 0xd850, 0xdeee, 0x101, 0x8218, 0x101, 0x4e26, 0x101, 0x51b5, - 0x101, 0x5168, 0x101, 0x4f80, 0x101, 0x5145, 0x101, 0x5180, - 0x101, 0x52c7, 0x101, 0x52fa, 0x101, 0x559d, 0x101, 0x5555, - 0x101, 0x5599, 0x101, 0x55e2, 0x101, 0x585a, 0x101, 0x58b3, - 0x101, 0x5944, 0x101, 0x5954, 0x101, 0x5a62, 0x101, 0x5b28, - 0x101, 0x5ed2, 0x101, 0x5ed9, 0x101, 0x5f69, 0x101, 0x5fad, - 0x101, 0x60d8, 0x101, 0x614e, 0x101, 0x6108, 0x101, 0x618e, - 0x101, 0x6160, 0x101, 0x61f2, 0x101, 0x6234, 0x101, 0x63c4, - 0x101, 0x641c, 0x101, 0x6452, 0x101, 0x6556, 0x101, 0x6674, - 0x101, 0x6717, 0x101, 0x671b, 0x101, 0x6756, 0x101, 0x6b79, - 0x101, 0x6bba, 0x101, 0x6d41, 0x101, 0x6edb, 0x101, 0x6ecb, - 0x101, 0x6f22, 0x101, 0x701e, 0x101, 0x716e, 0x101, 0x77a7, - 0x101, 0x7235, 0x101, 0x72af, 0x101, 0x732a, 0x101, 0x7471, - 0x101, 0x7506, 0x101, 0x753b, 0x101, 0x761d, 0x101, 0x761f, - 0x101, 0x76ca, 0x101, 0x76db, 0x101, 0x76f4, 0x101, 0x774a, - 0x101, 0x7740, 0x101, 0x78cc, 0x101, 0x7ab1, 0x101, 0x7bc0, - 0x101, 0x7c7b, 0x101, 0x7d5b, 0x101, 0x7df4, 0x101, 0x7f3e, - 0x101, 0x8005, 0x101, 0x8352, 0x101, 0x83ef, 0x101, 0x8779, - 0x101, 0x8941, 0x101, 0x8986, 0x101, 0x8996, 0x101, 0x8abf, - 0x101, 0x8af8, 0x101, 0x8acb, 0x101, 0x8b01, 0x101, 0x8afe, - 0x101, 0x8aed, 0x101, 0x8b39, 0x101, 0x8b8a, 0x101, 0x8d08, - 0x101, 0x8f38, 0x101, 0x9072, 0x101, 0x9199, 0x101, 0x9276, - 0x101, 0x967c, 0x101, 0x96e3, 0x101, 0x9756, 0x101, 0x97db, - 0x101, 0x97ff, 0x101, 0x980b, 0x101, 0x983b, 0x101, 0x9b12, - 0x101, 0x9f9c, 0x201, 0xd84a, 0xdc4a, 0x201, 0xd84a, 0xdc44, - 0x201, 0xd84c, 0xdfd5, 0x101, 0x3b9d, 0x101, 0x4018, 0x101, - 0x4039, 0x201, 0xd854, 0xde49, 0x201, 0xd857, 0xdcd0, 0x201, - 0xd85f, 0xded3, 0x101, 0x9f43, 0x101, 0x9f8e, 0x210, 0x66, - 0x66, 0x210, 0x66, 0x69, 0x210, 0x66, 0x6c, 0x310, - 0x66, 0x66, 0x69, 0x310, 0x66, 0x66, 0x6c, 0x210, - 0x17f, 0x74, 0x210, 0x73, 0x74, 0x210, 0x574, 0x576, - 0x210, 0x574, 0x565, 0x210, 0x574, 0x56b, 0x210, 0x57e, - 0x576, 0x210, 0x574, 0x56d, 0x201, 0x5d9, 0x5b4, 0x201, - 0x5f2, 0x5b7, 0x102, 0x5e2, 0x102, 0x5d0, 0x102, 0x5d3, - 0x102, 0x5d4, 0x102, 0x5db, 0x102, 0x5dc, 0x102, 0x5dd, - 0x102, 0x5e8, 0x102, 0x5ea, 0x102, 0x2b, 0x201, 0x5e9, - 0x5c1, 0x201, 0x5e9, 0x5c2, 0x201, 0xfb49, 0x5c1, 0x201, - 0xfb49, 0x5c2, 0x201, 0x5d0, 0x5b7, 0x201, 0x5d0, 0x5b8, - 0x201, 0x5d0, 0x5bc, 0x201, 0x5d1, 0x5bc, 0x201, 0x5d2, - 0x5bc, 0x201, 0x5d3, 0x5bc, 0x201, 0x5d4, 0x5bc, 0x201, - 0x5d5, 0x5bc, 0x201, 0x5d6, 0x5bc, 0x201, 0x5d8, 0x5bc, - 0x201, 0x5d9, 0x5bc, 0x201, 0x5da, 0x5bc, 0x201, 0x5db, - 0x5bc, 0x201, 0x5dc, 0x5bc, 0x201, 0x5de, 0x5bc, 0x201, - 0x5e0, 0x5bc, 0x201, 0x5e1, 0x5bc, 0x201, 0x5e3, 0x5bc, - 0x201, 0x5e4, 0x5bc, 0x201, 0x5e6, 0x5bc, 0x201, 0x5e7, - 0x5bc, 0x201, 0x5e8, 0x5bc, 0x201, 0x5e9, 0x5bc, 0x201, - 0x5ea, 0x5bc, 0x201, 0x5d5, 0x5b9, 0x201, 0x5d1, 0x5bf, - 0x201, 0x5db, 0x5bf, 0x201, 0x5e4, 0x5bf, 0x210, 0x5d0, - 0x5dc, 0x107, 0x671, 0x106, 0x671, 0x107, 0x67b, 0x106, - 0x67b, 0x104, 0x67b, 0x105, 0x67b, 0x107, 0x67e, 0x106, - 0x67e, 0x104, 0x67e, 0x105, 0x67e, 0x107, 0x680, 0x106, - 0x680, 0x104, 0x680, 0x105, 0x680, 0x107, 0x67a, 0x106, - 0x67a, 0x104, 0x67a, 0x105, 0x67a, 0x107, 0x67f, 0x106, - 0x67f, 0x104, 0x67f, 0x105, 0x67f, 0x107, 0x679, 0x106, - 0x679, 0x104, 0x679, 0x105, 0x679, 0x107, 0x6a4, 0x106, - 0x6a4, 0x104, 0x6a4, 0x105, 0x6a4, 0x107, 0x6a6, 0x106, - 0x6a6, 0x104, 0x6a6, 0x105, 0x6a6, 0x107, 0x684, 0x106, - 0x684, 0x104, 0x684, 0x105, 0x684, 0x107, 0x683, 0x106, - 0x683, 0x104, 0x683, 0x105, 0x683, 0x107, 0x686, 0x106, - 0x686, 0x104, 0x686, 0x105, 0x686, 0x107, 0x687, 0x106, - 0x687, 0x104, 0x687, 0x105, 0x687, 0x107, 0x68d, 0x106, - 0x68d, 0x107, 0x68c, 0x106, 0x68c, 0x107, 0x68e, 0x106, - 0x68e, 0x107, 0x688, 0x106, 0x688, 0x107, 0x698, 0x106, - 0x698, 0x107, 0x691, 0x106, 0x691, 0x107, 0x6a9, 0x106, - 0x6a9, 0x104, 0x6a9, 0x105, 0x6a9, 0x107, 0x6af, 0x106, - 0x6af, 0x104, 0x6af, 0x105, 0x6af, 0x107, 0x6b3, 0x106, - 0x6b3, 0x104, 0x6b3, 0x105, 0x6b3, 0x107, 0x6b1, 0x106, - 0x6b1, 0x104, 0x6b1, 0x105, 0x6b1, 0x107, 0x6ba, 0x106, - 0x6ba, 0x107, 0x6bb, 0x106, 0x6bb, 0x104, 0x6bb, 0x105, - 0x6bb, 0x107, 0x6c0, 0x106, 0x6c0, 0x107, 0x6c1, 0x106, - 0x6c1, 0x104, 0x6c1, 0x105, 0x6c1, 0x107, 0x6be, 0x106, - 0x6be, 0x104, 0x6be, 0x105, 0x6be, 0x107, 0x6d2, 0x106, - 0x6d2, 0x107, 0x6d3, 0x106, 0x6d3, 0x107, 0x6ad, 0x106, - 0x6ad, 0x104, 0x6ad, 0x105, 0x6ad, 0x107, 0x6c7, 0x106, - 0x6c7, 0x107, 0x6c6, 0x106, 0x6c6, 0x107, 0x6c8, 0x106, - 0x6c8, 0x107, 0x677, 0x107, 0x6cb, 0x106, 0x6cb, 0x107, - 0x6c5, 0x106, 0x6c5, 0x107, 0x6c9, 0x106, 0x6c9, 0x107, - 0x6d0, 0x106, 0x6d0, 0x104, 0x6d0, 0x105, 0x6d0, 0x104, - 0x649, 0x105, 0x649, 0x207, 0x626, 0x627, 0x206, 0x626, - 0x627, 0x207, 0x626, 0x6d5, 0x206, 0x626, 0x6d5, 0x207, - 0x626, 0x648, 0x206, 0x626, 0x648, 0x207, 0x626, 0x6c7, - 0x206, 0x626, 0x6c7, 0x207, 0x626, 0x6c6, 0x206, 0x626, - 0x6c6, 0x207, 0x626, 0x6c8, 0x206, 0x626, 0x6c8, 0x207, - 0x626, 0x6d0, 0x206, 0x626, 0x6d0, 0x204, 0x626, 0x6d0, - 0x207, 0x626, 0x649, 0x206, 0x626, 0x649, 0x204, 0x626, - 0x649, 0x107, 0x6cc, 0x106, 0x6cc, 0x104, 0x6cc, 0x105, - 0x6cc, 0x207, 0x626, 0x62c, 0x207, 0x626, 0x62d, 0x207, - 0x626, 0x645, 0x207, 0x626, 0x649, 0x207, 0x626, 0x64a, - 0x207, 0x628, 0x62c, 0x207, 0x628, 0x62d, 0x207, 0x628, - 0x62e, 0x207, 0x628, 0x645, 0x207, 0x628, 0x649, 0x207, - 0x628, 0x64a, 0x207, 0x62a, 0x62c, 0x207, 0x62a, 0x62d, - 0x207, 0x62a, 0x62e, 0x207, 0x62a, 0x645, 0x207, 0x62a, - 0x649, 0x207, 0x62a, 0x64a, 0x207, 0x62b, 0x62c, 0x207, - 0x62b, 0x645, 0x207, 0x62b, 0x649, 0x207, 0x62b, 0x64a, - 0x207, 0x62c, 0x62d, 0x207, 0x62c, 0x645, 0x207, 0x62d, - 0x62c, 0x207, 0x62d, 0x645, 0x207, 0x62e, 0x62c, 0x207, - 0x62e, 0x62d, 0x207, 0x62e, 0x645, 0x207, 0x633, 0x62c, - 0x207, 0x633, 0x62d, 0x207, 0x633, 0x62e, 0x207, 0x633, - 0x645, 0x207, 0x635, 0x62d, 0x207, 0x635, 0x645, 0x207, - 0x636, 0x62c, 0x207, 0x636, 0x62d, 0x207, 0x636, 0x62e, - 0x207, 0x636, 0x645, 0x207, 0x637, 0x62d, 0x207, 0x637, - 0x645, 0x207, 0x638, 0x645, 0x207, 0x639, 0x62c, 0x207, - 0x639, 0x645, 0x207, 0x63a, 0x62c, 0x207, 0x63a, 0x645, - 0x207, 0x641, 0x62c, 0x207, 0x641, 0x62d, 0x207, 0x641, - 0x62e, 0x207, 0x641, 0x645, 0x207, 0x641, 0x649, 0x207, - 0x641, 0x64a, 0x207, 0x642, 0x62d, 0x207, 0x642, 0x645, - 0x207, 0x642, 0x649, 0x207, 0x642, 0x64a, 0x207, 0x643, - 0x627, 0x207, 0x643, 0x62c, 0x207, 0x643, 0x62d, 0x207, - 0x643, 0x62e, 0x207, 0x643, 0x644, 0x207, 0x643, 0x645, - 0x207, 0x643, 0x649, 0x207, 0x643, 0x64a, 0x207, 0x644, - 0x62c, 0x207, 0x644, 0x62d, 0x207, 0x644, 0x62e, 0x207, - 0x644, 0x645, 0x207, 0x644, 0x649, 0x207, 0x644, 0x64a, - 0x207, 0x645, 0x62c, 0x207, 0x645, 0x62d, 0x207, 0x645, - 0x62e, 0x207, 0x645, 0x645, 0x207, 0x645, 0x649, 0x207, - 0x645, 0x64a, 0x207, 0x646, 0x62c, 0x207, 0x646, 0x62d, - 0x207, 0x646, 0x62e, 0x207, 0x646, 0x645, 0x207, 0x646, - 0x649, 0x207, 0x646, 0x64a, 0x207, 0x647, 0x62c, 0x207, - 0x647, 0x645, 0x207, 0x647, 0x649, 0x207, 0x647, 0x64a, - 0x207, 0x64a, 0x62c, 0x207, 0x64a, 0x62d, 0x207, 0x64a, - 0x62e, 0x207, 0x64a, 0x645, 0x207, 0x64a, 0x649, 0x207, - 0x64a, 0x64a, 0x207, 0x630, 0x670, 0x207, 0x631, 0x670, - 0x207, 0x649, 0x670, 0x307, 0x20, 0x64c, 0x651, 0x307, - 0x20, 0x64d, 0x651, 0x307, 0x20, 0x64e, 0x651, 0x307, - 0x20, 0x64f, 0x651, 0x307, 0x20, 0x650, 0x651, 0x307, - 0x20, 0x651, 0x670, 0x206, 0x626, 0x631, 0x206, 0x626, - 0x632, 0x206, 0x626, 0x645, 0x206, 0x626, 0x646, 0x206, - 0x626, 0x649, 0x206, 0x626, 0x64a, 0x206, 0x628, 0x631, - 0x206, 0x628, 0x632, 0x206, 0x628, 0x645, 0x206, 0x628, - 0x646, 0x206, 0x628, 0x649, 0x206, 0x628, 0x64a, 0x206, - 0x62a, 0x631, 0x206, 0x62a, 0x632, 0x206, 0x62a, 0x645, - 0x206, 0x62a, 0x646, 0x206, 0x62a, 0x649, 0x206, 0x62a, - 0x64a, 0x206, 0x62b, 0x631, 0x206, 0x62b, 0x632, 0x206, - 0x62b, 0x645, 0x206, 0x62b, 0x646, 0x206, 0x62b, 0x649, - 0x206, 0x62b, 0x64a, 0x206, 0x641, 0x649, 0x206, 0x641, - 0x64a, 0x206, 0x642, 0x649, 0x206, 0x642, 0x64a, 0x206, - 0x643, 0x627, 0x206, 0x643, 0x644, 0x206, 0x643, 0x645, - 0x206, 0x643, 0x649, 0x206, 0x643, 0x64a, 0x206, 0x644, - 0x645, 0x206, 0x644, 0x649, 0x206, 0x644, 0x64a, 0x206, - 0x645, 0x627, 0x206, 0x645, 0x645, 0x206, 0x646, 0x631, - 0x206, 0x646, 0x632, 0x206, 0x646, 0x645, 0x206, 0x646, - 0x646, 0x206, 0x646, 0x649, 0x206, 0x646, 0x64a, 0x206, - 0x649, 0x670, 0x206, 0x64a, 0x631, 0x206, 0x64a, 0x632, - 0x206, 0x64a, 0x645, 0x206, 0x64a, 0x646, 0x206, 0x64a, - 0x649, 0x206, 0x64a, 0x64a, 0x204, 0x626, 0x62c, 0x204, - 0x626, 0x62d, 0x204, 0x626, 0x62e, 0x204, 0x626, 0x645, - 0x204, 0x626, 0x647, 0x204, 0x628, 0x62c, 0x204, 0x628, - 0x62d, 0x204, 0x628, 0x62e, 0x204, 0x628, 0x645, 0x204, - 0x628, 0x647, 0x204, 0x62a, 0x62c, 0x204, 0x62a, 0x62d, - 0x204, 0x62a, 0x62e, 0x204, 0x62a, 0x645, 0x204, 0x62a, - 0x647, 0x204, 0x62b, 0x645, 0x204, 0x62c, 0x62d, 0x204, - 0x62c, 0x645, 0x204, 0x62d, 0x62c, 0x204, 0x62d, 0x645, - 0x204, 0x62e, 0x62c, 0x204, 0x62e, 0x645, 0x204, 0x633, - 0x62c, 0x204, 0x633, 0x62d, 0x204, 0x633, 0x62e, 0x204, - 0x633, 0x645, 0x204, 0x635, 0x62d, 0x204, 0x635, 0x62e, - 0x204, 0x635, 0x645, 0x204, 0x636, 0x62c, 0x204, 0x636, - 0x62d, 0x204, 0x636, 0x62e, 0x204, 0x636, 0x645, 0x204, - 0x637, 0x62d, 0x204, 0x638, 0x645, 0x204, 0x639, 0x62c, - 0x204, 0x639, 0x645, 0x204, 0x63a, 0x62c, 0x204, 0x63a, - 0x645, 0x204, 0x641, 0x62c, 0x204, 0x641, 0x62d, 0x204, - 0x641, 0x62e, 0x204, 0x641, 0x645, 0x204, 0x642, 0x62d, - 0x204, 0x642, 0x645, 0x204, 0x643, 0x62c, 0x204, 0x643, - 0x62d, 0x204, 0x643, 0x62e, 0x204, 0x643, 0x644, 0x204, - 0x643, 0x645, 0x204, 0x644, 0x62c, 0x204, 0x644, 0x62d, - 0x204, 0x644, 0x62e, 0x204, 0x644, 0x645, 0x204, 0x644, - 0x647, 0x204, 0x645, 0x62c, 0x204, 0x645, 0x62d, 0x204, - 0x645, 0x62e, 0x204, 0x645, 0x645, 0x204, 0x646, 0x62c, - 0x204, 0x646, 0x62d, 0x204, 0x646, 0x62e, 0x204, 0x646, - 0x645, 0x204, 0x646, 0x647, 0x204, 0x647, 0x62c, 0x204, - 0x647, 0x645, 0x204, 0x647, 0x670, 0x204, 0x64a, 0x62c, - 0x204, 0x64a, 0x62d, 0x204, 0x64a, 0x62e, 0x204, 0x64a, - 0x645, 0x204, 0x64a, 0x647, 0x205, 0x626, 0x645, 0x205, - 0x626, 0x647, 0x205, 0x628, 0x645, 0x205, 0x628, 0x647, - 0x205, 0x62a, 0x645, 0x205, 0x62a, 0x647, 0x205, 0x62b, - 0x645, 0x205, 0x62b, 0x647, 0x205, 0x633, 0x645, 0x205, - 0x633, 0x647, 0x205, 0x634, 0x645, 0x205, 0x634, 0x647, - 0x205, 0x643, 0x644, 0x205, 0x643, 0x645, 0x205, 0x644, - 0x645, 0x205, 0x646, 0x645, 0x205, 0x646, 0x647, 0x205, - 0x64a, 0x645, 0x205, 0x64a, 0x647, 0x305, 0x640, 0x64e, - 0x651, 0x305, 0x640, 0x64f, 0x651, 0x305, 0x640, 0x650, - 0x651, 0x207, 0x637, 0x649, 0x207, 0x637, 0x64a, 0x207, - 0x639, 0x649, 0x207, 0x639, 0x64a, 0x207, 0x63a, 0x649, - 0x207, 0x63a, 0x64a, 0x207, 0x633, 0x649, 0x207, 0x633, - 0x64a, 0x207, 0x634, 0x649, 0x207, 0x634, 0x64a, 0x207, - 0x62d, 0x649, 0x207, 0x62d, 0x64a, 0x207, 0x62c, 0x649, - 0x207, 0x62c, 0x64a, 0x207, 0x62e, 0x649, 0x207, 0x62e, - 0x64a, 0x207, 0x635, 0x649, 0x207, 0x635, 0x64a, 0x207, - 0x636, 0x649, 0x207, 0x636, 0x64a, 0x207, 0x634, 0x62c, - 0x207, 0x634, 0x62d, 0x207, 0x634, 0x62e, 0x207, 0x634, - 0x645, 0x207, 0x634, 0x631, 0x207, 0x633, 0x631, 0x207, - 0x635, 0x631, 0x207, 0x636, 0x631, 0x206, 0x637, 0x649, - 0x206, 0x637, 0x64a, 0x206, 0x639, 0x649, 0x206, 0x639, - 0x64a, 0x206, 0x63a, 0x649, 0x206, 0x63a, 0x64a, 0x206, - 0x633, 0x649, 0x206, 0x633, 0x64a, 0x206, 0x634, 0x649, - 0x206, 0x634, 0x64a, 0x206, 0x62d, 0x649, 0x206, 0x62d, - 0x64a, 0x206, 0x62c, 0x649, 0x206, 0x62c, 0x64a, 0x206, - 0x62e, 0x649, 0x206, 0x62e, 0x64a, 0x206, 0x635, 0x649, - 0x206, 0x635, 0x64a, 0x206, 0x636, 0x649, 0x206, 0x636, - 0x64a, 0x206, 0x634, 0x62c, 0x206, 0x634, 0x62d, 0x206, - 0x634, 0x62e, 0x206, 0x634, 0x645, 0x206, 0x634, 0x631, - 0x206, 0x633, 0x631, 0x206, 0x635, 0x631, 0x206, 0x636, - 0x631, 0x204, 0x634, 0x62c, 0x204, 0x634, 0x62d, 0x204, - 0x634, 0x62e, 0x204, 0x634, 0x645, 0x204, 0x633, 0x647, - 0x204, 0x634, 0x647, 0x204, 0x637, 0x645, 0x205, 0x633, - 0x62c, 0x205, 0x633, 0x62d, 0x205, 0x633, 0x62e, 0x205, - 0x634, 0x62c, 0x205, 0x634, 0x62d, 0x205, 0x634, 0x62e, - 0x205, 0x637, 0x645, 0x205, 0x638, 0x645, 0x206, 0x627, - 0x64b, 0x207, 0x627, 0x64b, 0x304, 0x62a, 0x62c, 0x645, - 0x306, 0x62a, 0x62d, 0x62c, 0x304, 0x62a, 0x62d, 0x62c, - 0x304, 0x62a, 0x62d, 0x645, 0x304, 0x62a, 0x62e, 0x645, - 0x304, 0x62a, 0x645, 0x62c, 0x304, 0x62a, 0x645, 0x62d, - 0x304, 0x62a, 0x645, 0x62e, 0x306, 0x62c, 0x645, 0x62d, - 0x304, 0x62c, 0x645, 0x62d, 0x306, 0x62d, 0x645, 0x64a, - 0x306, 0x62d, 0x645, 0x649, 0x304, 0x633, 0x62d, 0x62c, - 0x304, 0x633, 0x62c, 0x62d, 0x306, 0x633, 0x62c, 0x649, - 0x306, 0x633, 0x645, 0x62d, 0x304, 0x633, 0x645, 0x62d, - 0x304, 0x633, 0x645, 0x62c, 0x306, 0x633, 0x645, 0x645, - 0x304, 0x633, 0x645, 0x645, 0x306, 0x635, 0x62d, 0x62d, - 0x304, 0x635, 0x62d, 0x62d, 0x306, 0x635, 0x645, 0x645, - 0x306, 0x634, 0x62d, 0x645, 0x304, 0x634, 0x62d, 0x645, - 0x306, 0x634, 0x62c, 0x64a, 0x306, 0x634, 0x645, 0x62e, - 0x304, 0x634, 0x645, 0x62e, 0x306, 0x634, 0x645, 0x645, - 0x304, 0x634, 0x645, 0x645, 0x306, 0x636, 0x62d, 0x649, - 0x306, 0x636, 0x62e, 0x645, 0x304, 0x636, 0x62e, 0x645, - 0x306, 0x637, 0x645, 0x62d, 0x304, 0x637, 0x645, 0x62d, - 0x304, 0x637, 0x645, 0x645, 0x306, 0x637, 0x645, 0x64a, - 0x306, 0x639, 0x62c, 0x645, 0x306, 0x639, 0x645, 0x645, - 0x304, 0x639, 0x645, 0x645, 0x306, 0x639, 0x645, 0x649, - 0x306, 0x63a, 0x645, 0x645, 0x306, 0x63a, 0x645, 0x64a, - 0x306, 0x63a, 0x645, 0x649, 0x306, 0x641, 0x62e, 0x645, - 0x304, 0x641, 0x62e, 0x645, 0x306, 0x642, 0x645, 0x62d, - 0x306, 0x642, 0x645, 0x645, 0x306, 0x644, 0x62d, 0x645, - 0x306, 0x644, 0x62d, 0x64a, 0x306, 0x644, 0x62d, 0x649, - 0x304, 0x644, 0x62c, 0x62c, 0x306, 0x644, 0x62c, 0x62c, - 0x306, 0x644, 0x62e, 0x645, 0x304, 0x644, 0x62e, 0x645, - 0x306, 0x644, 0x645, 0x62d, 0x304, 0x644, 0x645, 0x62d, - 0x304, 0x645, 0x62d, 0x62c, 0x304, 0x645, 0x62d, 0x645, - 0x306, 0x645, 0x62d, 0x64a, 0x304, 0x645, 0x62c, 0x62d, - 0x304, 0x645, 0x62c, 0x645, 0x304, 0x645, 0x62e, 0x62c, - 0x304, 0x645, 0x62e, 0x645, 0x304, 0x645, 0x62c, 0x62e, - 0x304, 0x647, 0x645, 0x62c, 0x304, 0x647, 0x645, 0x645, - 0x304, 0x646, 0x62d, 0x645, 0x306, 0x646, 0x62d, 0x649, - 0x306, 0x646, 0x62c, 0x645, 0x304, 0x646, 0x62c, 0x645, - 0x306, 0x646, 0x62c, 0x649, 0x306, 0x646, 0x645, 0x64a, - 0x306, 0x646, 0x645, 0x649, 0x306, 0x64a, 0x645, 0x645, - 0x304, 0x64a, 0x645, 0x645, 0x306, 0x628, 0x62e, 0x64a, - 0x306, 0x62a, 0x62c, 0x64a, 0x306, 0x62a, 0x62c, 0x649, - 0x306, 0x62a, 0x62e, 0x64a, 0x306, 0x62a, 0x62e, 0x649, - 0x306, 0x62a, 0x645, 0x64a, 0x306, 0x62a, 0x645, 0x649, - 0x306, 0x62c, 0x645, 0x64a, 0x306, 0x62c, 0x62d, 0x649, - 0x306, 0x62c, 0x645, 0x649, 0x306, 0x633, 0x62e, 0x649, - 0x306, 0x635, 0x62d, 0x64a, 0x306, 0x634, 0x62d, 0x64a, - 0x306, 0x636, 0x62d, 0x64a, 0x306, 0x644, 0x62c, 0x64a, - 0x306, 0x644, 0x645, 0x64a, 0x306, 0x64a, 0x62d, 0x64a, - 0x306, 0x64a, 0x62c, 0x64a, 0x306, 0x64a, 0x645, 0x64a, - 0x306, 0x645, 0x645, 0x64a, 0x306, 0x642, 0x645, 0x64a, - 0x306, 0x646, 0x62d, 0x64a, 0x304, 0x642, 0x645, 0x62d, - 0x304, 0x644, 0x62d, 0x645, 0x306, 0x639, 0x645, 0x64a, - 0x306, 0x643, 0x645, 0x64a, 0x304, 0x646, 0x62c, 0x62d, - 0x306, 0x645, 0x62e, 0x64a, 0x304, 0x644, 0x62c, 0x645, - 0x306, 0x643, 0x645, 0x645, 0x306, 0x644, 0x62c, 0x645, - 0x306, 0x646, 0x62c, 0x62d, 0x306, 0x62c, 0x62d, 0x64a, - 0x306, 0x62d, 0x62c, 0x64a, 0x306, 0x645, 0x62c, 0x64a, - 0x306, 0x641, 0x645, 0x64a, 0x306, 0x628, 0x62d, 0x64a, - 0x304, 0x643, 0x645, 0x645, 0x304, 0x639, 0x62c, 0x645, - 0x304, 0x635, 0x645, 0x645, 0x306, 0x633, 0x62e, 0x64a, - 0x306, 0x646, 0x62c, 0x64a, 0x307, 0x635, 0x644, 0x6d2, - 0x307, 0x642, 0x644, 0x6d2, 0x407, 0x627, 0x644, 0x644, - 0x647, 0x407, 0x627, 0x643, 0x628, 0x631, 0x407, 0x645, - 0x62d, 0x645, 0x62f, 0x407, 0x635, 0x644, 0x639, 0x645, - 0x407, 0x631, 0x633, 0x648, 0x644, 0x407, 0x639, 0x644, - 0x64a, 0x647, 0x407, 0x648, 0x633, 0x644, 0x645, 0x307, - 0x635, 0x644, 0x649, 0x1207, 0x635, 0x644, 0x649, 0x20, - 0x627, 0x644, 0x644, 0x647, 0x20, 0x639, 0x644, 0x64a, - 0x647, 0x20, 0x648, 0x633, 0x644, 0x645, 0x807, 0x62c, - 0x644, 0x20, 0x62c, 0x644, 0x627, 0x644, 0x647, 0x407, - 0x631, 0x6cc, 0x627, 0x644, 0x10b, 0x2c, 0x10b, 0x3001, - 0x10b, 0x3002, 0x10b, 0x3a, 0x10b, 0x3b, 0x10b, 0x21, - 0x10b, 0x3f, 0x10b, 0x3016, 0x10b, 0x3017, 0x10b, 0x2026, - 0x10b, 0x2025, 0x10b, 0x2014, 0x10b, 0x2013, 0x10b, 0x5f, - 0x10b, 0x5f, 0x10b, 0x28, 0x10b, 0x29, 0x10b, 0x7b, - 0x10b, 0x7d, 0x10b, 0x3014, 0x10b, 0x3015, 0x10b, 0x3010, - 0x10b, 0x3011, 0x10b, 0x300a, 0x10b, 0x300b, 0x10b, 0x3008, - 0x10b, 0x3009, 0x10b, 0x300c, 0x10b, 0x300d, 0x10b, 0x300e, - 0x10b, 0x300f, 0x10b, 0x5b, 0x10b, 0x5d, 0x110, 0x203e, - 0x110, 0x203e, 0x110, 0x203e, 0x110, 0x203e, 0x110, 0x5f, - 0x110, 0x5f, 0x110, 0x5f, 0x10e, 0x2c, 0x10e, 0x3001, - 0x10e, 0x2e, 0x10e, 0x3b, 0x10e, 0x3a, 0x10e, 0x3f, - 0x10e, 0x21, 0x10e, 0x2014, 0x10e, 0x28, 0x10e, 0x29, - 0x10e, 0x7b, 0x10e, 0x7d, 0x10e, 0x3014, 0x10e, 0x3015, - 0x10e, 0x23, 0x10e, 0x26, 0x10e, 0x2a, 0x10e, 0x2b, - 0x10e, 0x2d, 0x10e, 0x3c, 0x10e, 0x3e, 0x10e, 0x3d, - 0x10e, 0x5c, 0x10e, 0x24, 0x10e, 0x25, 0x10e, 0x40, - 0x207, 0x20, 0x64b, 0x205, 0x640, 0x64b, 0x207, 0x20, - 0x64c, 0x207, 0x20, 0x64d, 0x207, 0x20, 0x64e, 0x205, - 0x640, 0x64e, 0x207, 0x20, 0x64f, 0x205, 0x640, 0x64f, - 0x207, 0x20, 0x650, 0x205, 0x640, 0x650, 0x207, 0x20, - 0x651, 0x205, 0x640, 0x651, 0x207, 0x20, 0x652, 0x205, - 0x640, 0x652, 0x107, 0x621, 0x107, 0x622, 0x106, 0x622, - 0x107, 0x623, 0x106, 0x623, 0x107, 0x624, 0x106, 0x624, - 0x107, 0x625, 0x106, 0x625, 0x107, 0x626, 0x106, 0x626, - 0x104, 0x626, 0x105, 0x626, 0x107, 0x627, 0x106, 0x627, - 0x107, 0x628, 0x106, 0x628, 0x104, 0x628, 0x105, 0x628, - 0x107, 0x629, 0x106, 0x629, 0x107, 0x62a, 0x106, 0x62a, - 0x104, 0x62a, 0x105, 0x62a, 0x107, 0x62b, 0x106, 0x62b, - 0x104, 0x62b, 0x105, 0x62b, 0x107, 0x62c, 0x106, 0x62c, - 0x104, 0x62c, 0x105, 0x62c, 0x107, 0x62d, 0x106, 0x62d, - 0x104, 0x62d, 0x105, 0x62d, 0x107, 0x62e, 0x106, 0x62e, - 0x104, 0x62e, 0x105, 0x62e, 0x107, 0x62f, 0x106, 0x62f, - 0x107, 0x630, 0x106, 0x630, 0x107, 0x631, 0x106, 0x631, - 0x107, 0x632, 0x106, 0x632, 0x107, 0x633, 0x106, 0x633, - 0x104, 0x633, 0x105, 0x633, 0x107, 0x634, 0x106, 0x634, - 0x104, 0x634, 0x105, 0x634, 0x107, 0x635, 0x106, 0x635, - 0x104, 0x635, 0x105, 0x635, 0x107, 0x636, 0x106, 0x636, - 0x104, 0x636, 0x105, 0x636, 0x107, 0x637, 0x106, 0x637, - 0x104, 0x637, 0x105, 0x637, 0x107, 0x638, 0x106, 0x638, - 0x104, 0x638, 0x105, 0x638, 0x107, 0x639, 0x106, 0x639, - 0x104, 0x639, 0x105, 0x639, 0x107, 0x63a, 0x106, 0x63a, - 0x104, 0x63a, 0x105, 0x63a, 0x107, 0x641, 0x106, 0x641, - 0x104, 0x641, 0x105, 0x641, 0x107, 0x642, 0x106, 0x642, - 0x104, 0x642, 0x105, 0x642, 0x107, 0x643, 0x106, 0x643, - 0x104, 0x643, 0x105, 0x643, 0x107, 0x644, 0x106, 0x644, - 0x104, 0x644, 0x105, 0x644, 0x107, 0x645, 0x106, 0x645, - 0x104, 0x645, 0x105, 0x645, 0x107, 0x646, 0x106, 0x646, - 0x104, 0x646, 0x105, 0x646, 0x107, 0x647, 0x106, 0x647, - 0x104, 0x647, 0x105, 0x647, 0x107, 0x648, 0x106, 0x648, - 0x107, 0x649, 0x106, 0x649, 0x107, 0x64a, 0x106, 0x64a, - 0x104, 0x64a, 0x105, 0x64a, 0x207, 0x644, 0x622, 0x206, - 0x644, 0x622, 0x207, 0x644, 0x623, 0x206, 0x644, 0x623, - 0x207, 0x644, 0x625, 0x206, 0x644, 0x625, 0x207, 0x644, - 0x627, 0x206, 0x644, 0x627, 0x10c, 0x21, 0x10c, 0x22, - 0x10c, 0x23, 0x10c, 0x24, 0x10c, 0x25, 0x10c, 0x26, - 0x10c, 0x27, 0x10c, 0x28, 0x10c, 0x29, 0x10c, 0x2a, - 0x10c, 0x2b, 0x10c, 0x2c, 0x10c, 0x2d, 0x10c, 0x2e, - 0x10c, 0x2f, 0x10c, 0x30, 0x10c, 0x31, 0x10c, 0x32, - 0x10c, 0x33, 0x10c, 0x34, 0x10c, 0x35, 0x10c, 0x36, - 0x10c, 0x37, 0x10c, 0x38, 0x10c, 0x39, 0x10c, 0x3a, - 0x10c, 0x3b, 0x10c, 0x3c, 0x10c, 0x3d, 0x10c, 0x3e, - 0x10c, 0x3f, 0x10c, 0x40, 0x10c, 0x41, 0x10c, 0x42, - 0x10c, 0x43, 0x10c, 0x44, 0x10c, 0x45, 0x10c, 0x46, - 0x10c, 0x47, 0x10c, 0x48, 0x10c, 0x49, 0x10c, 0x4a, - 0x10c, 0x4b, 0x10c, 0x4c, 0x10c, 0x4d, 0x10c, 0x4e, - 0x10c, 0x4f, 0x10c, 0x50, 0x10c, 0x51, 0x10c, 0x52, - 0x10c, 0x53, 0x10c, 0x54, 0x10c, 0x55, 0x10c, 0x56, - 0x10c, 0x57, 0x10c, 0x58, 0x10c, 0x59, 0x10c, 0x5a, - 0x10c, 0x5b, 0x10c, 0x5c, 0x10c, 0x5d, 0x10c, 0x5e, - 0x10c, 0x5f, 0x10c, 0x60, 0x10c, 0x61, 0x10c, 0x62, - 0x10c, 0x63, 0x10c, 0x64, 0x10c, 0x65, 0x10c, 0x66, - 0x10c, 0x67, 0x10c, 0x68, 0x10c, 0x69, 0x10c, 0x6a, - 0x10c, 0x6b, 0x10c, 0x6c, 0x10c, 0x6d, 0x10c, 0x6e, - 0x10c, 0x6f, 0x10c, 0x70, 0x10c, 0x71, 0x10c, 0x72, - 0x10c, 0x73, 0x10c, 0x74, 0x10c, 0x75, 0x10c, 0x76, - 0x10c, 0x77, 0x10c, 0x78, 0x10c, 0x79, 0x10c, 0x7a, - 0x10c, 0x7b, 0x10c, 0x7c, 0x10c, 0x7d, 0x10c, 0x7e, - 0x10c, 0x2985, 0x10c, 0x2986, 0x10d, 0x3002, 0x10d, 0x300c, - 0x10d, 0x300d, 0x10d, 0x3001, 0x10d, 0x30fb, 0x10d, 0x30f2, - 0x10d, 0x30a1, 0x10d, 0x30a3, 0x10d, 0x30a5, 0x10d, 0x30a7, - 0x10d, 0x30a9, 0x10d, 0x30e3, 0x10d, 0x30e5, 0x10d, 0x30e7, - 0x10d, 0x30c3, 0x10d, 0x30fc, 0x10d, 0x30a2, 0x10d, 0x30a4, - 0x10d, 0x30a6, 0x10d, 0x30a8, 0x10d, 0x30aa, 0x10d, 0x30ab, - 0x10d, 0x30ad, 0x10d, 0x30af, 0x10d, 0x30b1, 0x10d, 0x30b3, - 0x10d, 0x30b5, 0x10d, 0x30b7, 0x10d, 0x30b9, 0x10d, 0x30bb, - 0x10d, 0x30bd, 0x10d, 0x30bf, 0x10d, 0x30c1, 0x10d, 0x30c4, - 0x10d, 0x30c6, 0x10d, 0x30c8, 0x10d, 0x30ca, 0x10d, 0x30cb, - 0x10d, 0x30cc, 0x10d, 0x30cd, 0x10d, 0x30ce, 0x10d, 0x30cf, - 0x10d, 0x30d2, 0x10d, 0x30d5, 0x10d, 0x30d8, 0x10d, 0x30db, - 0x10d, 0x30de, 0x10d, 0x30df, 0x10d, 0x30e0, 0x10d, 0x30e1, - 0x10d, 0x30e2, 0x10d, 0x30e4, 0x10d, 0x30e6, 0x10d, 0x30e8, - 0x10d, 0x30e9, 0x10d, 0x30ea, 0x10d, 0x30eb, 0x10d, 0x30ec, - 0x10d, 0x30ed, 0x10d, 0x30ef, 0x10d, 0x30f3, 0x10d, 0x3099, - 0x10d, 0x309a, 0x10d, 0x3164, 0x10d, 0x3131, 0x10d, 0x3132, - 0x10d, 0x3133, 0x10d, 0x3134, 0x10d, 0x3135, 0x10d, 0x3136, - 0x10d, 0x3137, 0x10d, 0x3138, 0x10d, 0x3139, 0x10d, 0x313a, - 0x10d, 0x313b, 0x10d, 0x313c, 0x10d, 0x313d, 0x10d, 0x313e, - 0x10d, 0x313f, 0x10d, 0x3140, 0x10d, 0x3141, 0x10d, 0x3142, - 0x10d, 0x3143, 0x10d, 0x3144, 0x10d, 0x3145, 0x10d, 0x3146, - 0x10d, 0x3147, 0x10d, 0x3148, 0x10d, 0x3149, 0x10d, 0x314a, - 0x10d, 0x314b, 0x10d, 0x314c, 0x10d, 0x314d, 0x10d, 0x314e, - 0x10d, 0x314f, 0x10d, 0x3150, 0x10d, 0x3151, 0x10d, 0x3152, - 0x10d, 0x3153, 0x10d, 0x3154, 0x10d, 0x3155, 0x10d, 0x3156, - 0x10d, 0x3157, 0x10d, 0x3158, 0x10d, 0x3159, 0x10d, 0x315a, - 0x10d, 0x315b, 0x10d, 0x315c, 0x10d, 0x315d, 0x10d, 0x315e, - 0x10d, 0x315f, 0x10d, 0x3160, 0x10d, 0x3161, 0x10d, 0x3162, - 0x10d, 0x3163, 0x10c, 0xa2, 0x10c, 0xa3, 0x10c, 0xac, - 0x10c, 0xaf, 0x10c, 0xa6, 0x10c, 0xa5, 0x10c, 0x20a9, - 0x10d, 0x2502, 0x10d, 0x2190, 0x10d, 0x2191, 0x10d, 0x2192, - 0x10d, 0x2193, 0x10d, 0x25a0, 0x10d, 0x25cb, 0x401, 0xd804, - 0xdc99, 0xd804, 0xdcba, 0x401, 0xd804, 0xdc9b, 0xd804, 0xdcba, - 0x401, 0xd804, 0xdca5, 0xd804, 0xdcba, 0x401, 0xd804, 0xdd31, - 0xd804, 0xdd27, 0x401, 0xd804, 0xdd32, 0xd804, 0xdd27, 0x401, - 0xd804, 0xdf47, 0xd804, 0xdf3e, 0x401, 0xd804, 0xdf47, 0xd804, - 0xdf57, 0x401, 0xd805, 0xdcb9, 0xd805, 0xdcba, 0x401, 0xd805, - 0xdcb9, 0xd805, 0xdcb0, 0x401, 0xd805, 0xdcb9, 0xd805, 0xdcbd, - 0x401, 0xd805, 0xddb8, 0xd805, 0xddaf, 0x401, 0xd805, 0xddb9, - 0xd805, 0xddaf, 0x401, 0xd834, 0xdd57, 0xd834, 0xdd65, 0x401, - 0xd834, 0xdd58, 0xd834, 0xdd65, 0x401, 0xd834, 0xdd5f, 0xd834, - 0xdd6e, 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd6f, 0x401, 0xd834, - 0xdd5f, 0xd834, 0xdd70, 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd71, - 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd72, 0x401, 0xd834, 0xddb9, - 0xd834, 0xdd65, 0x401, 0xd834, 0xddba, 0xd834, 0xdd65, 0x401, - 0xd834, 0xddbb, 0xd834, 0xdd6e, 0x401, 0xd834, 0xddbc, 0xd834, - 0xdd6e, 0x401, 0xd834, 0xddbb, 0xd834, 0xdd6f, 0x401, 0xd834, - 0xddbc, 0xd834, 0xdd6f, 0x102, 0x41, 0x102, 0x42, 0x102, - 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, - 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, - 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, - 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, - 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, - 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, - 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, - 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, - 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, - 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, - 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, - 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, - 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, - 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, - 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, - 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, - 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, - 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, - 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, - 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, - 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x69, 0x102, - 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102, - 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102, - 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102, - 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102, - 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x43, 0x102, - 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102, - 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102, - 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102, - 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, 0x53, 0x102, - 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102, - 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102, - 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102, - 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102, - 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102, - 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102, - 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102, - 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102, - 0x7a, 0x102, 0x41, 0x102, 0x43, 0x102, 0x44, 0x102, - 0x47, 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4e, 0x102, - 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x53, 0x102, - 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102, - 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102, - 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x66, 0x102, - 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, - 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x70, 0x102, - 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, - 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, - 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, - 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, - 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, - 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, - 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, - 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, - 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, - 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, - 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, - 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, - 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, - 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, - 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, - 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, - 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102, - 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, - 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, - 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, - 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x61, 0x102, - 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102, - 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102, - 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102, - 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102, - 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102, - 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102, - 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x44, 0x102, - 0x45, 0x102, 0x46, 0x102, 0x47, 0x102, 0x49, 0x102, - 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, - 0x4f, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, - 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, - 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, - 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, - 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, - 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, - 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, - 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, - 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, - 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, - 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, - 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, - 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, - 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, - 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, - 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, - 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, - 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, - 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, - 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, - 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, - 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, - 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, - 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, - 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, - 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, - 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, - 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, - 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, - 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, - 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, - 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, - 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, - 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, - 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, - 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, - 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, - 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, - 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, - 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, - 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, - 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, - 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, - 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, - 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, - 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, - 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, - 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, - 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, - 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, - 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, - 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, - 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, - 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, - 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, - 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, - 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, - 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, - 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, - 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, - 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, - 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, - 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, - 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, - 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, - 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, - 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, - 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, - 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, - 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, - 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, - 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, - 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, - 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, - 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, - 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, - 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, - 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, - 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, - 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, - 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, - 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, - 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, - 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, - 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, - 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, - 0x79, 0x102, 0x7a, 0x102, 0x131, 0x102, 0x237, 0x102, - 0x391, 0x102, 0x392, 0x102, 0x393, 0x102, 0x394, 0x102, - 0x395, 0x102, 0x396, 0x102, 0x397, 0x102, 0x398, 0x102, - 0x399, 0x102, 0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102, - 0x39d, 0x102, 0x39e, 0x102, 0x39f, 0x102, 0x3a0, 0x102, - 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3, 0x102, 0x3a4, 0x102, - 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7, 0x102, 0x3a8, 0x102, - 0x3a9, 0x102, 0x2207, 0x102, 0x3b1, 0x102, 0x3b2, 0x102, - 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5, 0x102, 0x3b6, 0x102, - 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9, 0x102, 0x3ba, 0x102, - 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd, 0x102, 0x3be, 0x102, - 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1, 0x102, 0x3c2, 0x102, - 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5, 0x102, 0x3c6, 0x102, - 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9, 0x102, 0x2202, 0x102, - 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0, 0x102, 0x3d5, 0x102, - 0x3f1, 0x102, 0x3d6, 0x102, 0x391, 0x102, 0x392, 0x102, - 0x393, 0x102, 0x394, 0x102, 0x395, 0x102, 0x396, 0x102, - 0x397, 0x102, 0x398, 0x102, 0x399, 0x102, 0x39a, 0x102, - 0x39b, 0x102, 0x39c, 0x102, 0x39d, 0x102, 0x39e, 0x102, - 0x39f, 0x102, 0x3a0, 0x102, 0x3a1, 0x102, 0x3f4, 0x102, - 0x3a3, 0x102, 0x3a4, 0x102, 0x3a5, 0x102, 0x3a6, 0x102, - 0x3a7, 0x102, 0x3a8, 0x102, 0x3a9, 0x102, 0x2207, 0x102, - 0x3b1, 0x102, 0x3b2, 0x102, 0x3b3, 0x102, 0x3b4, 0x102, - 0x3b5, 0x102, 0x3b6, 0x102, 0x3b7, 0x102, 0x3b8, 0x102, - 0x3b9, 0x102, 0x3ba, 0x102, 0x3bb, 0x102, 0x3bc, 0x102, - 0x3bd, 0x102, 0x3be, 0x102, 0x3bf, 0x102, 0x3c0, 0x102, - 0x3c1, 0x102, 0x3c2, 0x102, 0x3c3, 0x102, 0x3c4, 0x102, - 0x3c5, 0x102, 0x3c6, 0x102, 0x3c7, 0x102, 0x3c8, 0x102, - 0x3c9, 0x102, 0x2202, 0x102, 0x3f5, 0x102, 0x3d1, 0x102, - 0x3f0, 0x102, 0x3d5, 0x102, 0x3f1, 0x102, 0x3d6, 0x102, - 0x391, 0x102, 0x392, 0x102, 0x393, 0x102, 0x394, 0x102, - 0x395, 0x102, 0x396, 0x102, 0x397, 0x102, 0x398, 0x102, - 0x399, 0x102, 0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102, - 0x39d, 0x102, 0x39e, 0x102, 0x39f, 0x102, 0x3a0, 0x102, - 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3, 0x102, 0x3a4, 0x102, - 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7, 0x102, 0x3a8, 0x102, - 0x3a9, 0x102, 0x2207, 0x102, 0x3b1, 0x102, 0x3b2, 0x102, - 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5, 0x102, 0x3b6, 0x102, - 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9, 0x102, 0x3ba, 0x102, - 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd, 0x102, 0x3be, 0x102, - 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1, 0x102, 0x3c2, 0x102, - 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5, 0x102, 0x3c6, 0x102, - 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9, 0x102, 0x2202, 0x102, - 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0, 0x102, 0x3d5, 0x102, - 0x3f1, 0x102, 0x3d6, 0x102, 0x391, 0x102, 0x392, 0x102, - 0x393, 0x102, 0x394, 0x102, 0x395, 0x102, 0x396, 0x102, - 0x397, 0x102, 0x398, 0x102, 0x399, 0x102, 0x39a, 0x102, - 0x39b, 0x102, 0x39c, 0x102, 0x39d, 0x102, 0x39e, 0x102, - 0x39f, 0x102, 0x3a0, 0x102, 0x3a1, 0x102, 0x3f4, 0x102, - 0x3a3, 0x102, 0x3a4, 0x102, 0x3a5, 0x102, 0x3a6, 0x102, - 0x3a7, 0x102, 0x3a8, 0x102, 0x3a9, 0x102, 0x2207, 0x102, - 0x3b1, 0x102, 0x3b2, 0x102, 0x3b3, 0x102, 0x3b4, 0x102, - 0x3b5, 0x102, 0x3b6, 0x102, 0x3b7, 0x102, 0x3b8, 0x102, - 0x3b9, 0x102, 0x3ba, 0x102, 0x3bb, 0x102, 0x3bc, 0x102, - 0x3bd, 0x102, 0x3be, 0x102, 0x3bf, 0x102, 0x3c0, 0x102, - 0x3c1, 0x102, 0x3c2, 0x102, 0x3c3, 0x102, 0x3c4, 0x102, - 0x3c5, 0x102, 0x3c6, 0x102, 0x3c7, 0x102, 0x3c8, 0x102, - 0x3c9, 0x102, 0x2202, 0x102, 0x3f5, 0x102, 0x3d1, 0x102, - 0x3f0, 0x102, 0x3d5, 0x102, 0x3f1, 0x102, 0x3d6, 0x102, - 0x391, 0x102, 0x392, 0x102, 0x393, 0x102, 0x394, 0x102, - 0x395, 0x102, 0x396, 0x102, 0x397, 0x102, 0x398, 0x102, - 0x399, 0x102, 0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102, - 0x39d, 0x102, 0x39e, 0x102, 0x39f, 0x102, 0x3a0, 0x102, - 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3, 0x102, 0x3a4, 0x102, - 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7, 0x102, 0x3a8, 0x102, - 0x3a9, 0x102, 0x2207, 0x102, 0x3b1, 0x102, 0x3b2, 0x102, - 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5, 0x102, 0x3b6, 0x102, - 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9, 0x102, 0x3ba, 0x102, - 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd, 0x102, 0x3be, 0x102, - 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1, 0x102, 0x3c2, 0x102, - 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5, 0x102, 0x3c6, 0x102, - 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9, 0x102, 0x2202, 0x102, - 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0, 0x102, 0x3d5, 0x102, - 0x3f1, 0x102, 0x3d6, 0x102, 0x3dc, 0x102, 0x3dd, 0x102, - 0x30, 0x102, 0x31, 0x102, 0x32, 0x102, 0x33, 0x102, - 0x34, 0x102, 0x35, 0x102, 0x36, 0x102, 0x37, 0x102, - 0x38, 0x102, 0x39, 0x102, 0x30, 0x102, 0x31, 0x102, - 0x32, 0x102, 0x33, 0x102, 0x34, 0x102, 0x35, 0x102, - 0x36, 0x102, 0x37, 0x102, 0x38, 0x102, 0x39, 0x102, - 0x30, 0x102, 0x31, 0x102, 0x32, 0x102, 0x33, 0x102, - 0x34, 0x102, 0x35, 0x102, 0x36, 0x102, 0x37, 0x102, - 0x38, 0x102, 0x39, 0x102, 0x30, 0x102, 0x31, 0x102, - 0x32, 0x102, 0x33, 0x102, 0x34, 0x102, 0x35, 0x102, - 0x36, 0x102, 0x37, 0x102, 0x38, 0x102, 0x39, 0x102, - 0x30, 0x102, 0x31, 0x102, 0x32, 0x102, 0x33, 0x102, - 0x34, 0x102, 0x35, 0x102, 0x36, 0x102, 0x37, 0x102, - 0x38, 0x102, 0x39, 0x102, 0x627, 0x102, 0x628, 0x102, - 0x62c, 0x102, 0x62f, 0x102, 0x648, 0x102, 0x632, 0x102, - 0x62d, 0x102, 0x637, 0x102, 0x64a, 0x102, 0x643, 0x102, - 0x644, 0x102, 0x645, 0x102, 0x646, 0x102, 0x633, 0x102, - 0x639, 0x102, 0x641, 0x102, 0x635, 0x102, 0x642, 0x102, - 0x631, 0x102, 0x634, 0x102, 0x62a, 0x102, 0x62b, 0x102, - 0x62e, 0x102, 0x630, 0x102, 0x636, 0x102, 0x638, 0x102, - 0x63a, 0x102, 0x66e, 0x102, 0x6ba, 0x102, 0x6a1, 0x102, - 0x66f, 0x102, 0x628, 0x102, 0x62c, 0x102, 0x647, 0x102, - 0x62d, 0x102, 0x64a, 0x102, 0x643, 0x102, 0x644, 0x102, - 0x645, 0x102, 0x646, 0x102, 0x633, 0x102, 0x639, 0x102, - 0x641, 0x102, 0x635, 0x102, 0x642, 0x102, 0x634, 0x102, - 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102, 0x636, 0x102, - 0x63a, 0x102, 0x62c, 0x102, 0x62d, 0x102, 0x64a, 0x102, - 0x644, 0x102, 0x646, 0x102, 0x633, 0x102, 0x639, 0x102, - 0x635, 0x102, 0x642, 0x102, 0x634, 0x102, 0x62e, 0x102, - 0x636, 0x102, 0x63a, 0x102, 0x6ba, 0x102, 0x66f, 0x102, - 0x628, 0x102, 0x62c, 0x102, 0x647, 0x102, 0x62d, 0x102, - 0x637, 0x102, 0x64a, 0x102, 0x643, 0x102, 0x645, 0x102, - 0x646, 0x102, 0x633, 0x102, 0x639, 0x102, 0x641, 0x102, - 0x635, 0x102, 0x642, 0x102, 0x634, 0x102, 0x62a, 0x102, - 0x62b, 0x102, 0x62e, 0x102, 0x636, 0x102, 0x638, 0x102, - 0x63a, 0x102, 0x66e, 0x102, 0x6a1, 0x102, 0x627, 0x102, - 0x628, 0x102, 0x62c, 0x102, 0x62f, 0x102, 0x647, 0x102, - 0x648, 0x102, 0x632, 0x102, 0x62d, 0x102, 0x637, 0x102, - 0x64a, 0x102, 0x644, 0x102, 0x645, 0x102, 0x646, 0x102, - 0x633, 0x102, 0x639, 0x102, 0x641, 0x102, 0x635, 0x102, - 0x642, 0x102, 0x631, 0x102, 0x634, 0x102, 0x62a, 0x102, - 0x62b, 0x102, 0x62e, 0x102, 0x630, 0x102, 0x636, 0x102, - 0x638, 0x102, 0x63a, 0x102, 0x628, 0x102, 0x62c, 0x102, - 0x62f, 0x102, 0x648, 0x102, 0x632, 0x102, 0x62d, 0x102, - 0x637, 0x102, 0x64a, 0x102, 0x644, 0x102, 0x645, 0x102, - 0x646, 0x102, 0x633, 0x102, 0x639, 0x102, 0x641, 0x102, - 0x635, 0x102, 0x642, 0x102, 0x631, 0x102, 0x634, 0x102, - 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102, 0x630, 0x102, - 0x636, 0x102, 0x638, 0x102, 0x63a, 0x210, 0x30, 0x2e, - 0x210, 0x30, 0x2c, 0x210, 0x31, 0x2c, 0x210, 0x32, - 0x2c, 0x210, 0x33, 0x2c, 0x210, 0x34, 0x2c, 0x210, - 0x35, 0x2c, 0x210, 0x36, 0x2c, 0x210, 0x37, 0x2c, - 0x210, 0x38, 0x2c, 0x210, 0x39, 0x2c, 0x310, 0x28, - 0x41, 0x29, 0x310, 0x28, 0x42, 0x29, 0x310, 0x28, - 0x43, 0x29, 0x310, 0x28, 0x44, 0x29, 0x310, 0x28, - 0x45, 0x29, 0x310, 0x28, 0x46, 0x29, 0x310, 0x28, - 0x47, 0x29, 0x310, 0x28, 0x48, 0x29, 0x310, 0x28, - 0x49, 0x29, 0x310, 0x28, 0x4a, 0x29, 0x310, 0x28, - 0x4b, 0x29, 0x310, 0x28, 0x4c, 0x29, 0x310, 0x28, - 0x4d, 0x29, 0x310, 0x28, 0x4e, 0x29, 0x310, 0x28, - 0x4f, 0x29, 0x310, 0x28, 0x50, 0x29, 0x310, 0x28, - 0x51, 0x29, 0x310, 0x28, 0x52, 0x29, 0x310, 0x28, - 0x53, 0x29, 0x310, 0x28, 0x54, 0x29, 0x310, 0x28, - 0x55, 0x29, 0x310, 0x28, 0x56, 0x29, 0x310, 0x28, - 0x57, 0x29, 0x310, 0x28, 0x58, 0x29, 0x310, 0x28, - 0x59, 0x29, 0x310, 0x28, 0x5a, 0x29, 0x310, 0x3014, - 0x53, 0x3015, 0x108, 0x43, 0x108, 0x52, 0x208, 0x43, - 0x44, 0x208, 0x57, 0x5a, 0x10f, 0x41, 0x10f, 0x42, - 0x10f, 0x43, 0x10f, 0x44, 0x10f, 0x45, 0x10f, 0x46, - 0x10f, 0x47, 0x10f, 0x48, 0x10f, 0x49, 0x10f, 0x4a, - 0x10f, 0x4b, 0x10f, 0x4c, 0x10f, 0x4d, 0x10f, 0x4e, - 0x10f, 0x4f, 0x10f, 0x50, 0x10f, 0x51, 0x10f, 0x52, - 0x10f, 0x53, 0x10f, 0x54, 0x10f, 0x55, 0x10f, 0x56, - 0x10f, 0x57, 0x10f, 0x58, 0x10f, 0x59, 0x10f, 0x5a, - 0x20f, 0x48, 0x56, 0x20f, 0x4d, 0x56, 0x20f, 0x53, - 0x44, 0x20f, 0x53, 0x53, 0x30f, 0x50, 0x50, 0x56, - 0x20f, 0x57, 0x43, 0x209, 0x4d, 0x43, 0x209, 0x4d, - 0x44, 0x20f, 0x44, 0x4a, 0x20f, 0x307b, 0x304b, 0x20f, - 0x30b3, 0x30b3, 0x10f, 0x30b5, 0x10f, 0x624b, 0x10f, 0x5b57, - 0x10f, 0x53cc, 0x10f, 0x30c7, 0x10f, 0x4e8c, 0x10f, 0x591a, - 0x10f, 0x89e3, 0x10f, 0x5929, 0x10f, 0x4ea4, 0x10f, 0x6620, - 0x10f, 0x7121, 0x10f, 0x6599, 0x10f, 0x524d, 0x10f, 0x5f8c, - 0x10f, 0x518d, 0x10f, 0x65b0, 0x10f, 0x521d, 0x10f, 0x7d42, - 0x10f, 0x751f, 0x10f, 0x8ca9, 0x10f, 0x58f0, 0x10f, 0x5439, - 0x10f, 0x6f14, 0x10f, 0x6295, 0x10f, 0x6355, 0x10f, 0x4e00, - 0x10f, 0x4e09, 0x10f, 0x904a, 0x10f, 0x5de6, 0x10f, 0x4e2d, - 0x10f, 0x53f3, 0x10f, 0x6307, 0x10f, 0x8d70, 0x10f, 0x6253, - 0x10f, 0x7981, 0x10f, 0x7a7a, 0x10f, 0x5408, 0x10f, 0x6e80, - 0x10f, 0x6709, 0x10f, 0x6708, 0x10f, 0x7533, 0x10f, 0x5272, - 0x10f, 0x55b6, 0x310, 0x3014, 0x672c, 0x3015, 0x310, 0x3014, - 0x4e09, 0x3015, 0x310, 0x3014, 0x4e8c, 0x3015, 0x310, 0x3014, - 0x5b89, 0x3015, 0x310, 0x3014, 0x70b9, 0x3015, 0x310, 0x3014, - 0x6253, 0x3015, 0x310, 0x3014, 0x76d7, 0x3015, 0x310, 0x3014, - 0x52dd, 0x3015, 0x310, 0x3014, 0x6557, 0x3015, 0x108, 0x5f97, - 0x108, 0x53ef, 0x101, 0x4e3d, 0x101, 0x4e38, 0x101, 0x4e41, - 0x201, 0xd840, 0xdd22, 0x101, 0x4f60, 0x101, 0x4fae, 0x101, - 0x4fbb, 0x101, 0x5002, 0x101, 0x507a, 0x101, 0x5099, 0x101, - 0x50e7, 0x101, 0x50cf, 0x101, 0x349e, 0x201, 0xd841, 0xde3a, - 0x101, 0x514d, 0x101, 0x5154, 0x101, 0x5164, 0x101, 0x5177, - 0x201, 0xd841, 0xdd1c, 0x101, 0x34b9, 0x101, 0x5167, 0x101, - 0x518d, 0x201, 0xd841, 0xdd4b, 0x101, 0x5197, 0x101, 0x51a4, - 0x101, 0x4ecc, 0x101, 0x51ac, 0x101, 0x51b5, 0x201, 0xd864, - 0xdddf, 0x101, 0x51f5, 0x101, 0x5203, 0x101, 0x34df, 0x101, - 0x523b, 0x101, 0x5246, 0x101, 0x5272, 0x101, 0x5277, 0x101, - 0x3515, 0x101, 0x52c7, 0x101, 0x52c9, 0x101, 0x52e4, 0x101, - 0x52fa, 0x101, 0x5305, 0x101, 0x5306, 0x101, 0x5317, 0x101, - 0x5349, 0x101, 0x5351, 0x101, 0x535a, 0x101, 0x5373, 0x101, - 0x537d, 0x101, 0x537f, 0x101, 0x537f, 0x101, 0x537f, 0x201, - 0xd842, 0xde2c, 0x101, 0x7070, 0x101, 0x53ca, 0x101, 0x53df, - 0x201, 0xd842, 0xdf63, 0x101, 0x53eb, 0x101, 0x53f1, 0x101, - 0x5406, 0x101, 0x549e, 0x101, 0x5438, 0x101, 0x5448, 0x101, - 0x5468, 0x101, 0x54a2, 0x101, 0x54f6, 0x101, 0x5510, 0x101, - 0x5553, 0x101, 0x5563, 0x101, 0x5584, 0x101, 0x5584, 0x101, - 0x5599, 0x101, 0x55ab, 0x101, 0x55b3, 0x101, 0x55c2, 0x101, - 0x5716, 0x101, 0x5606, 0x101, 0x5717, 0x101, 0x5651, 0x101, - 0x5674, 0x101, 0x5207, 0x101, 0x58ee, 0x101, 0x57ce, 0x101, - 0x57f4, 0x101, 0x580d, 0x101, 0x578b, 0x101, 0x5832, 0x101, - 0x5831, 0x101, 0x58ac, 0x201, 0xd845, 0xdce4, 0x101, 0x58f2, - 0x101, 0x58f7, 0x101, 0x5906, 0x101, 0x591a, 0x101, 0x5922, - 0x101, 0x5962, 0x201, 0xd845, 0xdea8, 0x201, 0xd845, 0xdeea, - 0x101, 0x59ec, 0x101, 0x5a1b, 0x101, 0x5a27, 0x101, 0x59d8, - 0x101, 0x5a66, 0x101, 0x36ee, 0x101, 0x36fc, 0x101, 0x5b08, - 0x101, 0x5b3e, 0x101, 0x5b3e, 0x201, 0xd846, 0xddc8, 0x101, - 0x5bc3, 0x101, 0x5bd8, 0x101, 0x5be7, 0x101, 0x5bf3, 0x201, - 0xd846, 0xdf18, 0x101, 0x5bff, 0x101, 0x5c06, 0x101, 0x5f53, - 0x101, 0x5c22, 0x101, 0x3781, 0x101, 0x5c60, 0x101, 0x5c6e, - 0x101, 0x5cc0, 0x101, 0x5c8d, 0x201, 0xd847, 0xdde4, 0x101, - 0x5d43, 0x201, 0xd847, 0xdde6, 0x101, 0x5d6e, 0x101, 0x5d6b, - 0x101, 0x5d7c, 0x101, 0x5de1, 0x101, 0x5de2, 0x101, 0x382f, - 0x101, 0x5dfd, 0x101, 0x5e28, 0x101, 0x5e3d, 0x101, 0x5e69, - 0x101, 0x3862, 0x201, 0xd848, 0xdd83, 0x101, 0x387c, 0x101, - 0x5eb0, 0x101, 0x5eb3, 0x101, 0x5eb6, 0x101, 0x5eca, 0x201, - 0xd868, 0xdf92, 0x101, 0x5efe, 0x201, 0xd848, 0xdf31, 0x201, - 0xd848, 0xdf31, 0x101, 0x8201, 0x101, 0x5f22, 0x101, 0x5f22, - 0x101, 0x38c7, 0x201, 0xd84c, 0xdeb8, 0x201, 0xd858, 0xddda, - 0x101, 0x5f62, 0x101, 0x5f6b, 0x101, 0x38e3, 0x101, 0x5f9a, - 0x101, 0x5fcd, 0x101, 0x5fd7, 0x101, 0x5ff9, 0x101, 0x6081, - 0x101, 0x393a, 0x101, 0x391c, 0x101, 0x6094, 0x201, 0xd849, - 0xded4, 0x101, 0x60c7, 0x101, 0x6148, 0x101, 0x614c, 0x101, - 0x614e, 0x101, 0x614c, 0x101, 0x617a, 0x101, 0x618e, 0x101, - 0x61b2, 0x101, 0x61a4, 0x101, 0x61af, 0x101, 0x61de, 0x101, - 0x61f2, 0x101, 0x61f6, 0x101, 0x6210, 0x101, 0x621b, 0x101, - 0x625d, 0x101, 0x62b1, 0x101, 0x62d4, 0x101, 0x6350, 0x201, - 0xd84a, 0xdf0c, 0x101, 0x633d, 0x101, 0x62fc, 0x101, 0x6368, - 0x101, 0x6383, 0x101, 0x63e4, 0x201, 0xd84a, 0xdff1, 0x101, - 0x6422, 0x101, 0x63c5, 0x101, 0x63a9, 0x101, 0x3a2e, 0x101, - 0x6469, 0x101, 0x647e, 0x101, 0x649d, 0x101, 0x6477, 0x101, - 0x3a6c, 0x101, 0x654f, 0x101, 0x656c, 0x201, 0xd84c, 0xdc0a, - 0x101, 0x65e3, 0x101, 0x66f8, 0x101, 0x6649, 0x101, 0x3b19, - 0x101, 0x6691, 0x101, 0x3b08, 0x101, 0x3ae4, 0x101, 0x5192, - 0x101, 0x5195, 0x101, 0x6700, 0x101, 0x669c, 0x101, 0x80ad, - 0x101, 0x43d9, 0x101, 0x6717, 0x101, 0x671b, 0x101, 0x6721, - 0x101, 0x675e, 0x101, 0x6753, 0x201, 0xd84c, 0xdfc3, 0x101, - 0x3b49, 0x101, 0x67fa, 0x101, 0x6785, 0x101, 0x6852, 0x101, - 0x6885, 0x201, 0xd84d, 0xdc6d, 0x101, 0x688e, 0x101, 0x681f, - 0x101, 0x6914, 0x101, 0x3b9d, 0x101, 0x6942, 0x101, 0x69a3, - 0x101, 0x69ea, 0x101, 0x6aa8, 0x201, 0xd84d, 0xdea3, 0x101, - 0x6adb, 0x101, 0x3c18, 0x101, 0x6b21, 0x201, 0xd84e, 0xdca7, - 0x101, 0x6b54, 0x101, 0x3c4e, 0x101, 0x6b72, 0x101, 0x6b9f, - 0x101, 0x6bba, 0x101, 0x6bbb, 0x201, 0xd84e, 0xde8d, 0x201, - 0xd847, 0xdd0b, 0x201, 0xd84e, 0xdefa, 0x101, 0x6c4e, 0x201, - 0xd84f, 0xdcbc, 0x101, 0x6cbf, 0x101, 0x6ccd, 0x101, 0x6c67, - 0x101, 0x6d16, 0x101, 0x6d3e, 0x101, 0x6d77, 0x101, 0x6d41, - 0x101, 0x6d69, 0x101, 0x6d78, 0x101, 0x6d85, 0x201, 0xd84f, - 0xdd1e, 0x101, 0x6d34, 0x101, 0x6e2f, 0x101, 0x6e6e, 0x101, - 0x3d33, 0x101, 0x6ecb, 0x101, 0x6ec7, 0x201, 0xd84f, 0xded1, - 0x101, 0x6df9, 0x101, 0x6f6e, 0x201, 0xd84f, 0xdf5e, 0x201, - 0xd84f, 0xdf8e, 0x101, 0x6fc6, 0x101, 0x7039, 0x101, 0x701e, - 0x101, 0x701b, 0x101, 0x3d96, 0x101, 0x704a, 0x101, 0x707d, - 0x101, 0x7077, 0x101, 0x70ad, 0x201, 0xd841, 0xdd25, 0x101, - 0x7145, 0x201, 0xd850, 0xde63, 0x101, 0x719c, 0x201, 0xd850, - 0xdfab, 0x101, 0x7228, 0x101, 0x7235, 0x101, 0x7250, 0x201, - 0xd851, 0xde08, 0x101, 0x7280, 0x101, 0x7295, 0x201, 0xd851, - 0xdf35, 0x201, 0xd852, 0xdc14, 0x101, 0x737a, 0x101, 0x738b, - 0x101, 0x3eac, 0x101, 0x73a5, 0x101, 0x3eb8, 0x101, 0x3eb8, - 0x101, 0x7447, 0x101, 0x745c, 0x101, 0x7471, 0x101, 0x7485, - 0x101, 0x74ca, 0x101, 0x3f1b, 0x101, 0x7524, 0x201, 0xd853, - 0xdc36, 0x101, 0x753e, 0x201, 0xd853, 0xdc92, 0x101, 0x7570, - 0x201, 0xd848, 0xdd9f, 0x101, 0x7610, 0x201, 0xd853, 0xdfa1, - 0x201, 0xd853, 0xdfb8, 0x201, 0xd854, 0xdc44, 0x101, 0x3ffc, - 0x101, 0x4008, 0x101, 0x76f4, 0x201, 0xd854, 0xdcf3, 0x201, - 0xd854, 0xdcf2, 0x201, 0xd854, 0xdd19, 0x201, 0xd854, 0xdd33, - 0x101, 0x771e, 0x101, 0x771f, 0x101, 0x771f, 0x101, 0x774a, - 0x101, 0x4039, 0x101, 0x778b, 0x101, 0x4046, 0x101, 0x4096, - 0x201, 0xd855, 0xdc1d, 0x101, 0x784e, 0x101, 0x788c, 0x101, - 0x78cc, 0x101, 0x40e3, 0x201, 0xd855, 0xde26, 0x101, 0x7956, - 0x201, 0xd855, 0xde9a, 0x201, 0xd855, 0xdec5, 0x101, 0x798f, - 0x101, 0x79eb, 0x101, 0x412f, 0x101, 0x7a40, 0x101, 0x7a4a, - 0x101, 0x7a4f, 0x201, 0xd856, 0xdd7c, 0x201, 0xd856, 0xdea7, - 0x201, 0xd856, 0xdea7, 0x101, 0x7aee, 0x101, 0x4202, 0x201, - 0xd856, 0xdfab, 0x101, 0x7bc6, 0x101, 0x7bc9, 0x101, 0x4227, - 0x201, 0xd857, 0xdc80, 0x101, 0x7cd2, 0x101, 0x42a0, 0x101, - 0x7ce8, 0x101, 0x7ce3, 0x101, 0x7d00, 0x201, 0xd857, 0xdf86, - 0x101, 0x7d63, 0x101, 0x4301, 0x101, 0x7dc7, 0x101, 0x7e02, - 0x101, 0x7e45, 0x101, 0x4334, 0x201, 0xd858, 0xde28, 0x201, - 0xd858, 0xde47, 0x101, 0x4359, 0x201, 0xd858, 0xded9, 0x101, - 0x7f7a, 0x201, 0xd858, 0xdf3e, 0x101, 0x7f95, 0x101, 0x7ffa, - 0x101, 0x8005, 0x201, 0xd859, 0xdcda, 0x201, 0xd859, 0xdd23, - 0x101, 0x8060, 0x201, 0xd859, 0xdda8, 0x101, 0x8070, 0x201, - 0xd84c, 0xdf5f, 0x101, 0x43d5, 0x101, 0x80b2, 0x101, 0x8103, - 0x101, 0x440b, 0x101, 0x813e, 0x101, 0x5ab5, 0x201, 0xd859, - 0xdfa7, 0x201, 0xd859, 0xdfb5, 0x201, 0xd84c, 0xdf93, 0x201, - 0xd84c, 0xdf9c, 0x101, 0x8201, 0x101, 0x8204, 0x101, 0x8f9e, - 0x101, 0x446b, 0x101, 0x8291, 0x101, 0x828b, 0x101, 0x829d, - 0x101, 0x52b3, 0x101, 0x82b1, 0x101, 0x82b3, 0x101, 0x82bd, - 0x101, 0x82e6, 0x201, 0xd85a, 0xdf3c, 0x101, 0x82e5, 0x101, - 0x831d, 0x101, 0x8363, 0x101, 0x83ad, 0x101, 0x8323, 0x101, - 0x83bd, 0x101, 0x83e7, 0x101, 0x8457, 0x101, 0x8353, 0x101, - 0x83ca, 0x101, 0x83cc, 0x101, 0x83dc, 0x201, 0xd85b, 0xdc36, - 0x201, 0xd85b, 0xdd6b, 0x201, 0xd85b, 0xdcd5, 0x101, 0x452b, - 0x101, 0x84f1, 0x101, 0x84f3, 0x101, 0x8516, 0x201, 0xd85c, - 0xdfca, 0x101, 0x8564, 0x201, 0xd85b, 0xdf2c, 0x101, 0x455d, - 0x101, 0x4561, 0x201, 0xd85b, 0xdfb1, 0x201, 0xd85c, 0xdcd2, - 0x101, 0x456b, 0x101, 0x8650, 0x101, 0x865c, 0x101, 0x8667, - 0x101, 0x8669, 0x101, 0x86a9, 0x101, 0x8688, 0x101, 0x870e, - 0x101, 0x86e2, 0x101, 0x8779, 0x101, 0x8728, 0x101, 0x876b, - 0x101, 0x8786, 0x101, 0x45d7, 0x101, 0x87e1, 0x101, 0x8801, - 0x101, 0x45f9, 0x101, 0x8860, 0x101, 0x8863, 0x201, 0xd85d, - 0xde67, 0x101, 0x88d7, 0x101, 0x88de, 0x101, 0x4635, 0x101, - 0x88fa, 0x101, 0x34bb, 0x201, 0xd85e, 0xdcae, 0x201, 0xd85e, - 0xdd66, 0x101, 0x46be, 0x101, 0x46c7, 0x101, 0x8aa0, 0x101, - 0x8aed, 0x101, 0x8b8a, 0x101, 0x8c55, 0x201, 0xd85f, 0xdca8, - 0x101, 0x8cab, 0x101, 0x8cc1, 0x101, 0x8d1b, 0x101, 0x8d77, - 0x201, 0xd85f, 0xdf2f, 0x201, 0xd842, 0xdc04, 0x101, 0x8dcb, - 0x101, 0x8dbc, 0x101, 0x8df0, 0x201, 0xd842, 0xdcde, 0x101, - 0x8ed4, 0x101, 0x8f38, 0x201, 0xd861, 0xddd2, 0x201, 0xd861, - 0xdded, 0x101, 0x9094, 0x101, 0x90f1, 0x101, 0x9111, 0x201, - 0xd861, 0xdf2e, 0x101, 0x911b, 0x101, 0x9238, 0x101, 0x92d7, - 0x101, 0x92d8, 0x101, 0x927c, 0x101, 0x93f9, 0x101, 0x9415, - 0x201, 0xd862, 0xdffa, 0x101, 0x958b, 0x101, 0x4995, 0x101, - 0x95b7, 0x201, 0xd863, 0xdd77, 0x101, 0x49e6, 0x101, 0x96c3, - 0x101, 0x5db2, 0x101, 0x9723, 0x201, 0xd864, 0xdd45, 0x201, - 0xd864, 0xde1a, 0x101, 0x4a6e, 0x101, 0x4a76, 0x101, 0x97e0, - 0x201, 0xd865, 0xdc0a, 0x101, 0x4ab2, 0x201, 0xd865, 0xdc96, - 0x101, 0x980b, 0x101, 0x980b, 0x101, 0x9829, 0x201, 0xd865, - 0xddb6, 0x101, 0x98e2, 0x101, 0x4b33, 0x101, 0x9929, 0x101, - 0x99a7, 0x101, 0x99c2, 0x101, 0x99fe, 0x101, 0x4bce, 0x201, - 0xd866, 0xdf30, 0x101, 0x9b12, 0x101, 0x9c40, 0x101, 0x9cfd, - 0x101, 0x4cce, 0x101, 0x4ced, 0x101, 0x9d67, 0x201, 0xd868, - 0xdcce, 0x101, 0x4cf8, 0x201, 0xd868, 0xdd05, 0x201, 0xd868, - 0xde0e, 0x201, 0xd868, 0xde91, 0x101, 0x9ebb, 0x101, 0x4d56, - 0x101, 0x9ef9, 0x101, 0x9efe, 0x101, 0x9f05, 0x101, 0x9f0f, - 0x101, 0x9f16, 0x101, 0x9f3b, 0x201, 0xd869, 0xde00 -}; - -static const unsigned short uc_ligature_trie[] = { - // 0 - 0x3100 - - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 663, 695, 727, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 759, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 791, 631, 631, 631, 823, 855, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 887, 919, 631, 631, 951, 983, 631, - 631, 631, 1015, 631, 631, 631, 1047, 631, - 631, 1079, 1111, 631, 631, 631, 1143, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - - 631, 1175, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 1207, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - 631, 631, 631, 631, 631, 631, 631, 631, - - 631, 631, 631, 631, 1239, 631, 631, 631, - - // 0x3100 - 0x12000 - - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1527, - 1783, 1271, 2039, 2295, 2551, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1271, 1271, - - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0x0, 0xa9, 0x194, 0x1d5, 0x20e, 0xffff, 0x267, 0x2a8, - 0x305, 0x372, 0x3a3, 0x3b0, 0x3bd, 0xffff, 0xffff, 0x408, - 0xffff, 0x425, 0xffff, 0x43e, 0x45b, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x47c, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0x485, 0x4da, 0x4df, 0x4e4, 0x4ed, - 0x51a, 0xffff, 0xffff, 0xffff, 0xffff, 0x52f, 0x548, 0xffff, - 0x54d, 0x55a, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x57d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0x5d6, 0xffff, 0xffff, 0x611, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0x690, 0x693, 0x6a0, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0x6a3, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6aa, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6ad, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6b0, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6b3, 0x6b6, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6b9, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6be, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6c3, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0x6c6, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6c9, 0x6d0, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6d3, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6d8, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x6db, 0xffff, 0xffff, 0xffff, 0xffff, 0x6e0, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6e3, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6e6, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6e9, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0x700, 0x761, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x776, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x783, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x78c, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x791, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0x796, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0x79b, 0xffff, 0xffff, 0x7a0, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7a5, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff -}; - -#define GET_LIGATURE_INDEX(ucs4) \ - (ucs4 < 0x3100 \ - ? (uc_ligature_trie[uc_ligature_trie[ucs4>>5] + (ucs4 & 0x1f)]) \ - : (ucs4 < 0x12000\ - ? uc_ligature_trie[uc_ligature_trie[((ucs4 - 0x3100)>>8) + 0x188] + (ucs4 & 0xff)]\ - : 0xffff)) - -static const unsigned short uc_ligature_map[] = { - 0x54, 0x41, 0xc0, 0x45, 0xc8, 0x49, 0xcc, 0x4e, - 0x1f8, 0x4f, 0xd2, 0x55, 0xd9, 0x57, 0x1e80, 0x59, - 0x1ef2, 0x61, 0xe0, 0x65, 0xe8, 0x69, 0xec, 0x6e, - 0x1f9, 0x6f, 0xf2, 0x75, 0xf9, 0x77, 0x1e81, 0x79, - 0x1ef3, 0xa8, 0x1fed, 0xc2, 0x1ea6, 0xca, 0x1ec0, 0xd4, - 0x1ed2, 0xdc, 0x1db, 0xe2, 0x1ea7, 0xea, 0x1ec1, 0xf4, - 0x1ed3, 0xfc, 0x1dc, 0x102, 0x1eb0, 0x103, 0x1eb1, 0x112, - 0x1e14, 0x113, 0x1e15, 0x14c, 0x1e50, 0x14d, 0x1e51, 0x1a0, - 0x1edc, 0x1a1, 0x1edd, 0x1af, 0x1eea, 0x1b0, 0x1eeb, 0x391, - 0x1fba, 0x395, 0x1fc8, 0x397, 0x1fca, 0x399, 0x1fda, 0x39f, - 0x1ff8, 0x3a5, 0x1fea, 0x3a9, 0x1ffa, 0x3b1, 0x1f70, 0x3b5, - 0x1f72, 0x3b7, 0x1f74, 0x3b9, 0x1f76, 0x3bf, 0x1f78, 0x3c5, - 0x1f7a, 0x3c9, 0x1f7c, 0x3ca, 0x1fd2, 0x3cb, 0x1fe2, 0x415, - 0x400, 0x418, 0x40d, 0x435, 0x450, 0x438, 0x45d, 0x1f00, - 0x1f02, 0x1f01, 0x1f03, 0x1f08, 0x1f0a, 0x1f09, 0x1f0b, 0x1f10, - 0x1f12, 0x1f11, 0x1f13, 0x1f18, 0x1f1a, 0x1f19, 0x1f1b, 0x1f20, - 0x1f22, 0x1f21, 0x1f23, 0x1f28, 0x1f2a, 0x1f29, 0x1f2b, 0x1f30, - 0x1f32, 0x1f31, 0x1f33, 0x1f38, 0x1f3a, 0x1f39, 0x1f3b, 0x1f40, - 0x1f42, 0x1f41, 0x1f43, 0x1f48, 0x1f4a, 0x1f49, 0x1f4b, 0x1f50, - 0x1f52, 0x1f51, 0x1f53, 0x1f59, 0x1f5b, 0x1f60, 0x1f62, 0x1f61, - 0x1f63, 0x1f68, 0x1f6a, 0x1f69, 0x1f6b, 0x1fbf, 0x1fcd, 0x1ffe, - 0x1fdd, 0x75, 0x41, 0xc1, 0x43, 0x106, 0x45, 0xc9, - 0x47, 0x1f4, 0x49, 0xcd, 0x4b, 0x1e30, 0x4c, 0x139, - 0x4d, 0x1e3e, 0x4e, 0x143, 0x4f, 0xd3, 0x50, 0x1e54, - 0x52, 0x154, 0x53, 0x15a, 0x55, 0xda, 0x57, 0x1e82, - 0x59, 0xdd, 0x5a, 0x179, 0x61, 0xe1, 0x63, 0x107, - 0x65, 0xe9, 0x67, 0x1f5, 0x69, 0xed, 0x6b, 0x1e31, - 0x6c, 0x13a, 0x6d, 0x1e3f, 0x6e, 0x144, 0x6f, 0xf3, - 0x70, 0x1e55, 0x72, 0x155, 0x73, 0x15b, 0x75, 0xfa, - 0x77, 0x1e83, 0x79, 0xfd, 0x7a, 0x17a, 0xa8, 0x385, - 0xc2, 0x1ea4, 0xc5, 0x1fa, 0xc6, 0x1fc, 0xc7, 0x1e08, - 0xca, 0x1ebe, 0xcf, 0x1e2e, 0xd4, 0x1ed0, 0xd5, 0x1e4c, - 0xd8, 0x1fe, 0xdc, 0x1d7, 0xe2, 0x1ea5, 0xe5, 0x1fb, - 0xe6, 0x1fd, 0xe7, 0x1e09, 0xea, 0x1ebf, 0xef, 0x1e2f, - 0xf4, 0x1ed1, 0xf5, 0x1e4d, 0xf8, 0x1ff, 0xfc, 0x1d8, - 0x102, 0x1eae, 0x103, 0x1eaf, 0x112, 0x1e16, 0x113, 0x1e17, - 0x14c, 0x1e52, 0x14d, 0x1e53, 0x168, 0x1e78, 0x169, 0x1e79, - 0x1a0, 0x1eda, 0x1a1, 0x1edb, 0x1af, 0x1ee8, 0x1b0, 0x1ee9, - 0x391, 0x386, 0x395, 0x388, 0x397, 0x389, 0x399, 0x38a, - 0x39f, 0x38c, 0x3a5, 0x38e, 0x3a9, 0x38f, 0x3b1, 0x3ac, - 0x3b5, 0x3ad, 0x3b7, 0x3ae, 0x3b9, 0x3af, 0x3bf, 0x3cc, - 0x3c5, 0x3cd, 0x3c9, 0x3ce, 0x3ca, 0x390, 0x3cb, 0x3b0, - 0x3d2, 0x3d3, 0x413, 0x403, 0x41a, 0x40c, 0x433, 0x453, - 0x43a, 0x45c, 0x1f00, 0x1f04, 0x1f01, 0x1f05, 0x1f08, 0x1f0c, - 0x1f09, 0x1f0d, 0x1f10, 0x1f14, 0x1f11, 0x1f15, 0x1f18, 0x1f1c, - 0x1f19, 0x1f1d, 0x1f20, 0x1f24, 0x1f21, 0x1f25, 0x1f28, 0x1f2c, - 0x1f29, 0x1f2d, 0x1f30, 0x1f34, 0x1f31, 0x1f35, 0x1f38, 0x1f3c, - 0x1f39, 0x1f3d, 0x1f40, 0x1f44, 0x1f41, 0x1f45, 0x1f48, 0x1f4c, - 0x1f49, 0x1f4d, 0x1f50, 0x1f54, 0x1f51, 0x1f55, 0x1f59, 0x1f5d, - 0x1f60, 0x1f64, 0x1f61, 0x1f65, 0x1f68, 0x1f6c, 0x1f69, 0x1f6d, - 0x1fbf, 0x1fce, 0x1ffe, 0x1fde, 0x20, 0x41, 0xc2, 0x43, - 0x108, 0x45, 0xca, 0x47, 0x11c, 0x48, 0x124, 0x49, - 0xce, 0x4a, 0x134, 0x4f, 0xd4, 0x53, 0x15c, 0x55, - 0xdb, 0x57, 0x174, 0x59, 0x176, 0x5a, 0x1e90, 0x61, - 0xe2, 0x63, 0x109, 0x65, 0xea, 0x67, 0x11d, 0x68, - 0x125, 0x69, 0xee, 0x6a, 0x135, 0x6f, 0xf4, 0x73, - 0x15d, 0x75, 0xfb, 0x77, 0x175, 0x79, 0x177, 0x7a, - 0x1e91, 0x1ea0, 0x1eac, 0x1ea1, 0x1ead, 0x1eb8, 0x1ec6, 0x1eb9, - 0x1ec7, 0x1ecc, 0x1ed8, 0x1ecd, 0x1ed9, 0x1c, 0x41, 0xc3, - 0x45, 0x1ebc, 0x49, 0x128, 0x4e, 0xd1, 0x4f, 0xd5, - 0x55, 0x168, 0x56, 0x1e7c, 0x59, 0x1ef8, 0x61, 0xe3, - 0x65, 0x1ebd, 0x69, 0x129, 0x6e, 0xf1, 0x6f, 0xf5, - 0x75, 0x169, 0x76, 0x1e7d, 0x79, 0x1ef9, 0xc2, 0x1eaa, - 0xca, 0x1ec4, 0xd4, 0x1ed6, 0xe2, 0x1eab, 0xea, 0x1ec5, - 0xf4, 0x1ed7, 0x102, 0x1eb4, 0x103, 0x1eb5, 0x1a0, 0x1ee0, - 0x1a1, 0x1ee1, 0x1af, 0x1eee, 0x1b0, 0x1eef, 0x2c, 0x41, - 0x100, 0x45, 0x112, 0x47, 0x1e20, 0x49, 0x12a, 0x4f, - 0x14c, 0x55, 0x16a, 0x59, 0x232, 0x61, 0x101, 0x65, - 0x113, 0x67, 0x1e21, 0x69, 0x12b, 0x6f, 0x14d, 0x75, - 0x16b, 0x79, 0x233, 0xc4, 0x1de, 0xc6, 0x1e2, 0xd5, - 0x22c, 0xd6, 0x22a, 0xdc, 0x1d5, 0xe4, 0x1df, 0xe6, - 0x1e3, 0xf5, 0x22d, 0xf6, 0x22b, 0xfc, 0x1d6, 0x1ea, - 0x1ec, 0x1eb, 0x1ed, 0x226, 0x1e0, 0x227, 0x1e1, 0x22e, - 0x230, 0x22f, 0x231, 0x391, 0x1fb9, 0x399, 0x1fd9, 0x3a5, - 0x1fe9, 0x3b1, 0x1fb1, 0x3b9, 0x1fd1, 0x3c5, 0x1fe1, 0x418, - 0x4e2, 0x423, 0x4ee, 0x438, 0x4e3, 0x443, 0x4ef, 0x1e36, - 0x1e38, 0x1e37, 0x1e39, 0x1e5a, 0x1e5c, 0x1e5b, 0x1e5d, 0x20, - 0x41, 0x102, 0x45, 0x114, 0x47, 0x11e, 0x49, 0x12c, - 0x4f, 0x14e, 0x55, 0x16c, 0x61, 0x103, 0x65, 0x115, - 0x67, 0x11f, 0x69, 0x12d, 0x6f, 0x14f, 0x75, 0x16d, - 0x228, 0x1e1c, 0x229, 0x1e1d, 0x391, 0x1fb8, 0x399, 0x1fd8, - 0x3a5, 0x1fe8, 0x3b1, 0x1fb0, 0x3b9, 0x1fd0, 0x3c5, 0x1fe0, - 0x410, 0x4d0, 0x415, 0x4d6, 0x416, 0x4c1, 0x418, 0x419, - 0x423, 0x40e, 0x430, 0x4d1, 0x435, 0x4d7, 0x436, 0x4c2, - 0x438, 0x439, 0x443, 0x45e, 0x1ea0, 0x1eb6, 0x1ea1, 0x1eb7, - 0x2e, 0x41, 0x226, 0x42, 0x1e02, 0x43, 0x10a, 0x44, - 0x1e0a, 0x45, 0x116, 0x46, 0x1e1e, 0x47, 0x120, 0x48, - 0x1e22, 0x49, 0x130, 0x4d, 0x1e40, 0x4e, 0x1e44, 0x4f, - 0x22e, 0x50, 0x1e56, 0x52, 0x1e58, 0x53, 0x1e60, 0x54, - 0x1e6a, 0x57, 0x1e86, 0x58, 0x1e8a, 0x59, 0x1e8e, 0x5a, - 0x17b, 0x61, 0x227, 0x62, 0x1e03, 0x63, 0x10b, 0x64, - 0x1e0b, 0x65, 0x117, 0x66, 0x1e1f, 0x67, 0x121, 0x68, - 0x1e23, 0x6d, 0x1e41, 0x6e, 0x1e45, 0x6f, 0x22f, 0x70, - 0x1e57, 0x72, 0x1e59, 0x73, 0x1e61, 0x74, 0x1e6b, 0x77, - 0x1e87, 0x78, 0x1e8b, 0x79, 0x1e8f, 0x7a, 0x17c, 0x15a, - 0x1e64, 0x15b, 0x1e65, 0x160, 0x1e66, 0x161, 0x1e67, 0x17f, - 0x1e9b, 0x1e62, 0x1e68, 0x1e63, 0x1e69, 0x36, 0x41, 0xc4, - 0x45, 0xcb, 0x48, 0x1e26, 0x49, 0xcf, 0x4f, 0xd6, - 0x55, 0xdc, 0x57, 0x1e84, 0x58, 0x1e8c, 0x59, 0x178, - 0x61, 0xe4, 0x65, 0xeb, 0x68, 0x1e27, 0x69, 0xef, - 0x6f, 0xf6, 0x74, 0x1e97, 0x75, 0xfc, 0x77, 0x1e85, - 0x78, 0x1e8d, 0x79, 0xff, 0xd5, 0x1e4e, 0xf5, 0x1e4f, - 0x16a, 0x1e7a, 0x16b, 0x1e7b, 0x399, 0x3aa, 0x3a5, 0x3ab, - 0x3b9, 0x3ca, 0x3c5, 0x3cb, 0x3d2, 0x3d4, 0x406, 0x407, - 0x410, 0x4d2, 0x415, 0x401, 0x416, 0x4dc, 0x417, 0x4de, - 0x418, 0x4e4, 0x41e, 0x4e6, 0x423, 0x4f0, 0x427, 0x4f4, - 0x42b, 0x4f8, 0x42d, 0x4ec, 0x430, 0x4d3, 0x435, 0x451, - 0x436, 0x4dd, 0x437, 0x4df, 0x438, 0x4e5, 0x43e, 0x4e7, - 0x443, 0x4f1, 0x447, 0x4f5, 0x44b, 0x4f9, 0x44d, 0x4ed, - 0x456, 0x457, 0x4d8, 0x4da, 0x4d9, 0x4db, 0x4e8, 0x4ea, - 0x4e9, 0x4eb, 0x18, 0x41, 0x1ea2, 0x45, 0x1eba, 0x49, - 0x1ec8, 0x4f, 0x1ece, 0x55, 0x1ee6, 0x59, 0x1ef6, 0x61, - 0x1ea3, 0x65, 0x1ebb, 0x69, 0x1ec9, 0x6f, 0x1ecf, 0x75, - 0x1ee7, 0x79, 0x1ef7, 0xc2, 0x1ea8, 0xca, 0x1ec2, 0xd4, - 0x1ed4, 0xe2, 0x1ea9, 0xea, 0x1ec3, 0xf4, 0x1ed5, 0x102, - 0x1eb2, 0x103, 0x1eb3, 0x1a0, 0x1ede, 0x1a1, 0x1edf, 0x1af, - 0x1eec, 0x1b0, 0x1eed, 0x6, 0x41, 0xc5, 0x55, 0x16e, - 0x61, 0xe5, 0x75, 0x16f, 0x77, 0x1e98, 0x79, 0x1e99, - 0x6, 0x4f, 0x150, 0x55, 0x170, 0x6f, 0x151, 0x75, - 0x171, 0x423, 0x4f2, 0x443, 0x4f3, 0x25, 0x41, 0x1cd, - 0x43, 0x10c, 0x44, 0x10e, 0x45, 0x11a, 0x47, 0x1e6, - 0x48, 0x21e, 0x49, 0x1cf, 0x4b, 0x1e8, 0x4c, 0x13d, - 0x4e, 0x147, 0x4f, 0x1d1, 0x52, 0x158, 0x53, 0x160, - 0x54, 0x164, 0x55, 0x1d3, 0x5a, 0x17d, 0x61, 0x1ce, - 0x63, 0x10d, 0x64, 0x10f, 0x65, 0x11b, 0x67, 0x1e7, - 0x68, 0x21f, 0x69, 0x1d0, 0x6a, 0x1f0, 0x6b, 0x1e9, - 0x6c, 0x13e, 0x6e, 0x148, 0x6f, 0x1d2, 0x72, 0x159, - 0x73, 0x161, 0x74, 0x165, 0x75, 0x1d4, 0x7a, 0x17e, - 0xdc, 0x1d9, 0xfc, 0x1da, 0x1b7, 0x1ee, 0x292, 0x1ef, - 0xe, 0x41, 0x200, 0x45, 0x204, 0x49, 0x208, 0x4f, - 0x20c, 0x52, 0x210, 0x55, 0x214, 0x61, 0x201, 0x65, - 0x205, 0x69, 0x209, 0x6f, 0x20d, 0x72, 0x211, 0x75, - 0x215, 0x474, 0x476, 0x475, 0x477, 0xc, 0x41, 0x202, - 0x45, 0x206, 0x49, 0x20a, 0x4f, 0x20e, 0x52, 0x212, - 0x55, 0x216, 0x61, 0x203, 0x65, 0x207, 0x69, 0x20b, - 0x6f, 0x20f, 0x72, 0x213, 0x75, 0x217, 0xe, 0x391, - 0x1f08, 0x395, 0x1f18, 0x397, 0x1f28, 0x399, 0x1f38, 0x39f, - 0x1f48, 0x3a9, 0x1f68, 0x3b1, 0x1f00, 0x3b5, 0x1f10, 0x3b7, - 0x1f20, 0x3b9, 0x1f30, 0x3bf, 0x1f40, 0x3c1, 0x1fe4, 0x3c5, - 0x1f50, 0x3c9, 0x1f60, 0x10, 0x391, 0x1f09, 0x395, 0x1f19, - 0x397, 0x1f29, 0x399, 0x1f39, 0x39f, 0x1f49, 0x3a1, 0x1fec, - 0x3a5, 0x1f59, 0x3a9, 0x1f69, 0x3b1, 0x1f01, 0x3b5, 0x1f11, - 0x3b7, 0x1f21, 0x3b9, 0x1f31, 0x3bf, 0x1f41, 0x3c1, 0x1fe5, - 0x3c5, 0x1f51, 0x3c9, 0x1f61, 0x4, 0x4f, 0x1a0, 0x55, - 0x1af, 0x6f, 0x1a1, 0x75, 0x1b0, 0x2a, 0x41, 0x1ea0, - 0x42, 0x1e04, 0x44, 0x1e0c, 0x45, 0x1eb8, 0x48, 0x1e24, - 0x49, 0x1eca, 0x4b, 0x1e32, 0x4c, 0x1e36, 0x4d, 0x1e42, - 0x4e, 0x1e46, 0x4f, 0x1ecc, 0x52, 0x1e5a, 0x53, 0x1e62, - 0x54, 0x1e6c, 0x55, 0x1ee4, 0x56, 0x1e7e, 0x57, 0x1e88, - 0x59, 0x1ef4, 0x5a, 0x1e92, 0x61, 0x1ea1, 0x62, 0x1e05, - 0x64, 0x1e0d, 0x65, 0x1eb9, 0x68, 0x1e25, 0x69, 0x1ecb, - 0x6b, 0x1e33, 0x6c, 0x1e37, 0x6d, 0x1e43, 0x6e, 0x1e47, - 0x6f, 0x1ecd, 0x72, 0x1e5b, 0x73, 0x1e63, 0x74, 0x1e6d, - 0x75, 0x1ee5, 0x76, 0x1e7f, 0x77, 0x1e89, 0x79, 0x1ef5, - 0x7a, 0x1e93, 0x1a0, 0x1ee2, 0x1a1, 0x1ee3, 0x1af, 0x1ef0, - 0x1b0, 0x1ef1, 0x2, 0x55, 0x1e72, 0x75, 0x1e73, 0x2, - 0x41, 0x1e00, 0x61, 0x1e01, 0x4, 0x53, 0x218, 0x54, - 0x21a, 0x73, 0x219, 0x74, 0x21b, 0x16, 0x43, 0xc7, - 0x44, 0x1e10, 0x45, 0x228, 0x47, 0x122, 0x48, 0x1e28, - 0x4b, 0x136, 0x4c, 0x13b, 0x4e, 0x145, 0x52, 0x156, - 0x53, 0x15e, 0x54, 0x162, 0x63, 0xe7, 0x64, 0x1e11, - 0x65, 0x229, 0x67, 0x123, 0x68, 0x1e29, 0x6b, 0x137, - 0x6c, 0x13c, 0x6e, 0x146, 0x72, 0x157, 0x73, 0x15f, - 0x74, 0x163, 0xa, 0x41, 0x104, 0x45, 0x118, 0x49, - 0x12e, 0x4f, 0x1ea, 0x55, 0x172, 0x61, 0x105, 0x65, - 0x119, 0x69, 0x12f, 0x6f, 0x1eb, 0x75, 0x173, 0xc, - 0x44, 0x1e12, 0x45, 0x1e18, 0x4c, 0x1e3c, 0x4e, 0x1e4a, - 0x54, 0x1e70, 0x55, 0x1e76, 0x64, 0x1e13, 0x65, 0x1e19, - 0x6c, 0x1e3d, 0x6e, 0x1e4b, 0x74, 0x1e71, 0x75, 0x1e77, - 0x2, 0x48, 0x1e2a, 0x68, 0x1e2b, 0x6, 0x45, 0x1e1a, - 0x49, 0x1e2c, 0x55, 0x1e74, 0x65, 0x1e1b, 0x69, 0x1e2d, - 0x75, 0x1e75, 0x11, 0x42, 0x1e06, 0x44, 0x1e0e, 0x4b, - 0x1e34, 0x4c, 0x1e3a, 0x4e, 0x1e48, 0x52, 0x1e5e, 0x54, - 0x1e6e, 0x5a, 0x1e94, 0x62, 0x1e07, 0x64, 0x1e0f, 0x68, - 0x1e96, 0x6b, 0x1e35, 0x6c, 0x1e3b, 0x6e, 0x1e49, 0x72, - 0x1e5f, 0x74, 0x1e6f, 0x7a, 0x1e95, 0x2c, 0x3c, 0x226e, - 0x3d, 0x2260, 0x3e, 0x226f, 0x2190, 0x219a, 0x2192, 0x219b, - 0x2194, 0x21ae, 0x21d0, 0x21cd, 0x21d2, 0x21cf, 0x21d4, 0x21ce, - 0x2203, 0x2204, 0x2208, 0x2209, 0x220b, 0x220c, 0x2223, 0x2224, - 0x2225, 0x2226, 0x223c, 0x2241, 0x2243, 0x2244, 0x2245, 0x2247, - 0x2248, 0x2249, 0x224d, 0x226d, 0x2261, 0x2262, 0x2264, 0x2270, - 0x2265, 0x2271, 0x2272, 0x2274, 0x2273, 0x2275, 0x2276, 0x2278, - 0x2277, 0x2279, 0x227a, 0x2280, 0x227b, 0x2281, 0x227c, 0x22e0, - 0x227d, 0x22e1, 0x2282, 0x2284, 0x2283, 0x2285, 0x2286, 0x2288, - 0x2287, 0x2289, 0x2291, 0x22e2, 0x2292, 0x22e3, 0x22a2, 0x22ac, - 0x22a8, 0x22ad, 0x22a9, 0x22ae, 0x22ab, 0x22af, 0x22b2, 0x22ea, - 0x22b3, 0x22eb, 0x22b4, 0x22ec, 0x22b5, 0x22ed, 0x1d, 0xa8, - 0x1fc1, 0x3b1, 0x1fb6, 0x3b7, 0x1fc6, 0x3b9, 0x1fd6, 0x3c5, - 0x1fe6, 0x3c9, 0x1ff6, 0x3ca, 0x1fd7, 0x3cb, 0x1fe7, 0x1f00, - 0x1f06, 0x1f01, 0x1f07, 0x1f08, 0x1f0e, 0x1f09, 0x1f0f, 0x1f20, - 0x1f26, 0x1f21, 0x1f27, 0x1f28, 0x1f2e, 0x1f29, 0x1f2f, 0x1f30, - 0x1f36, 0x1f31, 0x1f37, 0x1f38, 0x1f3e, 0x1f39, 0x1f3f, 0x1f50, - 0x1f56, 0x1f51, 0x1f57, 0x1f59, 0x1f5f, 0x1f60, 0x1f66, 0x1f61, - 0x1f67, 0x1f68, 0x1f6e, 0x1f69, 0x1f6f, 0x1fbf, 0x1fcf, 0x1ffe, - 0x1fdf, 0x3f, 0x391, 0x1fbc, 0x397, 0x1fcc, 0x3a9, 0x1ffc, - 0x3ac, 0x1fb4, 0x3ae, 0x1fc4, 0x3b1, 0x1fb3, 0x3b7, 0x1fc3, - 0x3c9, 0x1ff3, 0x3ce, 0x1ff4, 0x1f00, 0x1f80, 0x1f01, 0x1f81, - 0x1f02, 0x1f82, 0x1f03, 0x1f83, 0x1f04, 0x1f84, 0x1f05, 0x1f85, - 0x1f06, 0x1f86, 0x1f07, 0x1f87, 0x1f08, 0x1f88, 0x1f09, 0x1f89, - 0x1f0a, 0x1f8a, 0x1f0b, 0x1f8b, 0x1f0c, 0x1f8c, 0x1f0d, 0x1f8d, - 0x1f0e, 0x1f8e, 0x1f0f, 0x1f8f, 0x1f20, 0x1f90, 0x1f21, 0x1f91, - 0x1f22, 0x1f92, 0x1f23, 0x1f93, 0x1f24, 0x1f94, 0x1f25, 0x1f95, - 0x1f26, 0x1f96, 0x1f27, 0x1f97, 0x1f28, 0x1f98, 0x1f29, 0x1f99, - 0x1f2a, 0x1f9a, 0x1f2b, 0x1f9b, 0x1f2c, 0x1f9c, 0x1f2d, 0x1f9d, - 0x1f2e, 0x1f9e, 0x1f2f, 0x1f9f, 0x1f60, 0x1fa0, 0x1f61, 0x1fa1, - 0x1f62, 0x1fa2, 0x1f63, 0x1fa3, 0x1f64, 0x1fa4, 0x1f65, 0x1fa5, - 0x1f66, 0x1fa6, 0x1f67, 0x1fa7, 0x1f68, 0x1fa8, 0x1f69, 0x1fa9, - 0x1f6a, 0x1faa, 0x1f6b, 0x1fab, 0x1f6c, 0x1fac, 0x1f6d, 0x1fad, - 0x1f6e, 0x1fae, 0x1f6f, 0x1faf, 0x1f70, 0x1fb2, 0x1f74, 0x1fc2, - 0x1f7c, 0x1ff2, 0x1fb6, 0x1fb7, 0x1fc6, 0x1fc7, 0x1ff6, 0x1ff7, - 0x1, 0x627, 0x622, 0x6, 0x627, 0x623, 0x648, 0x624, - 0x64a, 0x626, 0x6c1, 0x6c2, 0x6d2, 0x6d3, 0x6d5, 0x6c0, - 0x1, 0x627, 0x625, 0x3, 0x928, 0x929, 0x930, 0x931, - 0x933, 0x934, 0x1, 0x9c7, 0x9cb, 0x1, 0x9c7, 0x9cc, - 0x1, 0xb47, 0xb4b, 0x1, 0xb47, 0xb48, 0x1, 0xb47, - 0xb4c, 0x2, 0xbc6, 0xbca, 0xbc7, 0xbcb, 0x2, 0xb92, - 0xb94, 0xbc6, 0xbcc, 0x1, 0xc46, 0xc48, 0x1, 0xcc6, - 0xcca, 0x3, 0xcbf, 0xcc0, 0xcc6, 0xcc7, 0xcca, 0xccb, - 0x1, 0xcc6, 0xcc8, 0x2, 0xd46, 0xd4a, 0xd47, 0xd4b, - 0x1, 0xd46, 0xd4c, 0x2, 0xdd9, 0xdda, 0xddc, 0xddd, - 0x1, 0xdd9, 0xddc, 0x1, 0xdd9, 0xdde, 0x1, 0x1025, - 0x1026, 0xb, 0x1b05, 0x1b06, 0x1b07, 0x1b08, 0x1b09, 0x1b0a, - 0x1b0b, 0x1b0c, 0x1b0d, 0x1b0e, 0x1b11, 0x1b12, 0x1b3a, 0x1b3b, - 0x1b3c, 0x1b3d, 0x1b3e, 0x1b40, 0x1b3f, 0x1b41, 0x1b42, 0x1b43, - 0x30, 0x3046, 0x3094, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, - 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, - 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, - 0x3060, 0x3061, 0x3062, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, - 0x3069, 0x306f, 0x3070, 0x3072, 0x3073, 0x3075, 0x3076, 0x3078, - 0x3079, 0x307b, 0x307c, 0x309d, 0x309e, 0x30a6, 0x30f4, 0x30ab, - 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, - 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, - 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c4, - 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30cf, 0x30d0, 0x30d2, - 0x30d3, 0x30d5, 0x30d6, 0x30d8, 0x30d9, 0x30db, 0x30dc, 0x30ef, - 0x30f7, 0x30f0, 0x30f8, 0x30f1, 0x30f9, 0x30f2, 0x30fa, 0x30fd, - 0x30fe, 0xa, 0x306f, 0x3071, 0x3072, 0x3074, 0x3075, 0x3077, - 0x3078, 0x307a, 0x307b, 0x307d, 0x30cf, 0x30d1, 0x30d2, 0x30d4, - 0x30d5, 0x30d7, 0x30d8, 0x30da, 0x30db, 0x30dd, 0x3, 0xd804, - 0xdc99, 0xd804, 0xdc9a, 0xd804, 0xdc9b, 0xd804, 0xdc9c, 0xd804, - 0xdca5, 0xd804, 0xdcab, 0x2, 0xd804, 0xdd31, 0xd804, 0xdd2e, - 0xd804, 0xdd32, 0xd804, 0xdd2f, 0x1, 0xd804, 0xdf47, 0xd804, - 0xdf4b, 0x1, 0xd804, 0xdf47, 0xd804, 0xdf4c, 0x1, 0xd805, - 0xdcb9, 0xd805, 0xdcbc, 0x1, 0xd805, 0xdcb9, 0xd805, 0xdcbb, - 0x1, 0xd805, 0xdcb9, 0xd805, 0xdcbe, 0x2, 0xd805, 0xddb8, - 0xd805, 0xddba, 0xd805, 0xddb9, 0xd805, 0xddbb -}; - - -struct NormalizationCorrection { - uint ucs4; - uint old_mapping; - int version; -}; - -static const NormalizationCorrection uc_normalization_corrections[] = { - { 0xf951, 0x96fb, 6 }, - { 0x2f868, 0x2136a, 7 }, - { 0x2f874, 0x5f33, 7 }, - { 0x2f91f, 0x43ab, 7 }, - { 0x2f95f, 0x7aae, 7 }, - { 0x2f9bf, 0x4d57, 7 }, -}; - -enum { NumNormalizationCorrections = 6 }; -enum { NormalizationCorrectionsVersionMax = 7 }; - -} // namespace QUnicodeTables - -using namespace QUnicodeTables; - -QT_END_NAMESPACE diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/image/qbmphandler.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/gui/image/qbmphandler.cpp deleted file mode 100644 index eb78a1326..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/image/qbmphandler.cpp +++ /dev/null @@ -1,898 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "private/qbmphandler_p.h" - -#ifndef QT_NO_IMAGEFORMAT_BMP - -#include -#include -#include - -QT_BEGIN_NAMESPACE - -static void swapPixel01(QImage *image) // 1-bpp: swap 0 and 1 pixels -{ - int i; - if (image->depth() == 1 && image->colorCount() == 2) { - uint *p = (uint *)image->bits(); - int nbytes = image->byteCount(); - for (i=0; icolor(0); // swap color 0 and 1 - image->setColor(0, image->color(1)); - image->setColor(1, t); - } -} - -/* - QImageIO::defineIOHandler("BMP", "^BM", 0, - read_bmp_image, write_bmp_image); -*/ - -/***************************************************************************** - BMP (DIB) image read/write functions - *****************************************************************************/ - -const int BMP_FILEHDR_SIZE = 14; // size of BMP_FILEHDR data - -static QDataStream &operator>>(QDataStream &s, BMP_FILEHDR &bf) -{ // read file header - s.readRawData(bf.bfType, 2); - s >> bf.bfSize >> bf.bfReserved1 >> bf.bfReserved2 >> bf.bfOffBits; - return s; -} - -static QDataStream &operator<<(QDataStream &s, const BMP_FILEHDR &bf) -{ // write file header - s.writeRawData(bf.bfType, 2); - s << bf.bfSize << bf.bfReserved1 << bf.bfReserved2 << bf.bfOffBits; - return s; -} - - -const int BMP_OLD = 12; // old Windows/OS2 BMP size -const int BMP_WIN = 40; // Windows BMP v3 size -const int BMP_OS2 = 64; // new OS/2 BMP size -const int BMP_WIN4 = 108; // Windows BMP v4 size -const int BMP_WIN5 = 124; // Windows BMP v5 size - -const int BMP_RGB = 0; // no compression -const int BMP_RLE8 = 1; // run-length encoded, 8 bits -const int BMP_RLE4 = 2; // run-length encoded, 4 bits -const int BMP_BITFIELDS = 3; // RGB values encoded in data as bit-fields - - -static QDataStream &operator>>(QDataStream &s, BMP_INFOHDR &bi) -{ - s >> bi.biSize; - if (bi.biSize == BMP_WIN || bi.biSize == BMP_OS2 || bi.biSize == BMP_WIN4 || bi.biSize == BMP_WIN5) { - s >> bi.biWidth >> bi.biHeight >> bi.biPlanes >> bi.biBitCount; - s >> bi.biCompression >> bi.biSizeImage; - s >> bi.biXPelsPerMeter >> bi.biYPelsPerMeter; - s >> bi.biClrUsed >> bi.biClrImportant; - } - else { // probably old Windows format - qint16 w, h; - s >> w >> h >> bi.biPlanes >> bi.biBitCount; - bi.biWidth = w; - bi.biHeight = h; - bi.biCompression = BMP_RGB; // no compression - bi.biSizeImage = 0; - bi.biXPelsPerMeter = bi.biYPelsPerMeter = 0; - bi.biClrUsed = bi.biClrImportant = 0; - } - return s; -} - -static QDataStream &operator<<(QDataStream &s, const BMP_INFOHDR &bi) -{ - s << bi.biSize; - s << bi.biWidth << bi.biHeight; - s << bi.biPlanes; - s << bi.biBitCount; - s << bi.biCompression; - s << bi.biSizeImage; - s << bi.biXPelsPerMeter << bi.biYPelsPerMeter; - s << bi.biClrUsed << bi.biClrImportant; - return s; -} - -static int calc_shift(uint mask) -{ - int result = 0; - while (mask && !(mask & 1)) { - result++; - mask >>= 1; - } - return result; -} - -static bool read_dib_fileheader(QDataStream &s, BMP_FILEHDR &bf) -{ - // read BMP file header - s >> bf; - if (s.status() != QDataStream::Ok) - return false; - - // check header - if (qstrncmp(bf.bfType,"BM",2) != 0) - return false; - - return true; -} - -static bool read_dib_infoheader(QDataStream &s, BMP_INFOHDR &bi) -{ - s >> bi; // read BMP info header - if (s.status() != QDataStream::Ok) - return false; - - int nbits = bi.biBitCount; - int comp = bi.biCompression; - if (!(nbits == 1 || nbits == 4 || nbits == 8 || nbits == 16 || nbits == 24 || nbits == 32) || - bi.biPlanes != 1 || comp > BMP_BITFIELDS) - return false; // weird BMP image - if (!(comp == BMP_RGB || (nbits == 4 && comp == BMP_RLE4) || - (nbits == 8 && comp == BMP_RLE8) || ((nbits == 16 || nbits == 32) && comp == BMP_BITFIELDS))) - return false; // weird compression type - - return true; -} - -static bool read_dib_body(QDataStream &s, const BMP_INFOHDR &bi, int offset, int startpos, QImage &image) -{ - QIODevice* d = s.device(); - if (d->atEnd()) // end of stream/file - return false; -#if 0 - qDebug("offset...........%d", offset); - qDebug("startpos.........%d", startpos); - qDebug("biSize...........%d", bi.biSize); - qDebug("biWidth..........%d", bi.biWidth); - qDebug("biHeight.........%d", bi.biHeight); - qDebug("biPlanes.........%d", bi.biPlanes); - qDebug("biBitCount.......%d", bi.biBitCount); - qDebug("biCompression....%d", bi.biCompression); - qDebug("biSizeImage......%d", bi.biSizeImage); - qDebug("biXPelsPerMeter..%d", bi.biXPelsPerMeter); - qDebug("biYPelsPerMeter..%d", bi.biYPelsPerMeter); - qDebug("biClrUsed........%d", bi.biClrUsed); - qDebug("biClrImportant...%d", bi.biClrImportant); -#endif - int w = bi.biWidth, h = bi.biHeight, nbits = bi.biBitCount; - int t = bi.biSize, comp = bi.biCompression; - uint red_mask = 0; - uint green_mask = 0; - uint blue_mask = 0; - uint alpha_mask = 0; - int red_shift = 0; - int green_shift = 0; - int blue_shift = 0; - int alpha_shift = 0; - int red_scale = 0; - int green_scale = 0; - int blue_scale = 0; - int alpha_scale = 0; - - if (!d->isSequential()) - d->seek(startpos + BMP_FILEHDR_SIZE + (bi.biSize >= BMP_WIN4 ? BMP_WIN : bi.biSize)); // goto start of colormap - - if (bi.biSize >= BMP_WIN4 || (comp == BMP_BITFIELDS && (nbits == 16 || nbits == 32))) { - if (d->read((char *)&red_mask, sizeof(red_mask)) != sizeof(red_mask)) - return false; - if (d->read((char *)&green_mask, sizeof(green_mask)) != sizeof(green_mask)) - return false; - if (d->read((char *)&blue_mask, sizeof(blue_mask)) != sizeof(blue_mask)) - return false; - - // Read BMP v4+ header - if (bi.biSize >= BMP_WIN4) { - int CSType = 0; - int gamma_red = 0; - int gamma_green = 0; - int gamma_blue = 0; - int endpoints[9]; - - if (d->read((char *)&alpha_mask, sizeof(alpha_mask)) != sizeof(alpha_mask)) - return false; - if (d->read((char *)&CSType, sizeof(CSType)) != sizeof(CSType)) - return false; - if (d->read((char *)&endpoints, sizeof(endpoints)) != sizeof(endpoints)) - return false; - if (d->read((char *)&gamma_red, sizeof(gamma_red)) != sizeof(gamma_red)) - return false; - if (d->read((char *)&gamma_green, sizeof(gamma_green)) != sizeof(gamma_green)) - return false; - if (d->read((char *)&gamma_blue, sizeof(gamma_blue)) != sizeof(gamma_blue)) - return false; - - if (bi.biSize == BMP_WIN5) { - qint32 intent = 0; - qint32 profileData = 0; - qint32 profileSize = 0; - qint32 reserved = 0; - - if (d->read((char *)&intent, sizeof(intent)) != sizeof(intent)) - return false; - if (d->read((char *)&profileData, sizeof(profileData)) != sizeof(profileData)) - return false; - if (d->read((char *)&profileSize, sizeof(profileSize)) != sizeof(profileSize)) - return false; - if (d->read((char *)&reserved, sizeof(reserved)) != sizeof(reserved) || reserved != 0) - return false; - } - } - } - - bool transp = (comp == BMP_BITFIELDS) && alpha_mask; - int ncols = 0; - int depth = 0; - QImage::Format format; - switch (nbits) { - case 32: - case 24: - case 16: - depth = 32; - format = transp ? QImage::Format_ARGB32 : QImage::Format_RGB32; - break; - case 8: - case 4: - depth = 8; - format = QImage::Format_Indexed8; - break; - default: - depth = 1; - format = QImage::Format_Mono; - } - - if (bi.biHeight < 0) - h = -h; // support images with negative height - - if (image.size() != QSize(w, h) || image.format() != format) { - image = QImage(w, h, format); - if (image.isNull()) // could not create image - return false; - } - - if (depth != 32) { - ncols = bi.biClrUsed ? bi.biClrUsed : 1 << nbits; - if (ncols > 256) // sanity check - don't run out of mem if color table is broken - return false; - image.setColorCount(ncols); - } - - image.setDotsPerMeterX(bi.biXPelsPerMeter); - image.setDotsPerMeterY(bi.biYPelsPerMeter); - - if (ncols > 0) { // read color table - uchar rgb[4]; - int rgb_len = t == BMP_OLD ? 3 : 4; - for (int i=0; iread((char *)rgb, rgb_len) != rgb_len) - return false; - image.setColor(i, qRgb(rgb[2],rgb[1],rgb[0])); - if (d->atEnd()) // truncated file - return false; - } - } else if (comp == BMP_BITFIELDS && (nbits == 16 || nbits == 32)) { - red_shift = calc_shift(red_mask); - if (((red_mask >> red_shift) + 1) == 0) - return false; - red_scale = 256 / ((red_mask >> red_shift) + 1); - green_shift = calc_shift(green_mask); - if (((green_mask >> green_shift) + 1) == 0) - return false; - green_scale = 256 / ((green_mask >> green_shift) + 1); - blue_shift = calc_shift(blue_mask); - if (((blue_mask >> blue_shift) + 1) == 0) - return false; - blue_scale = 256 / ((blue_mask >> blue_shift) + 1); - alpha_shift = calc_shift(alpha_mask); - if (((alpha_mask >> alpha_shift) + 1) == 0) - return false; - alpha_scale = 256 / ((alpha_mask >> alpha_shift) + 1); - } else if (comp == BMP_RGB && (nbits == 24 || nbits == 32)) { - blue_mask = 0x000000ff; - green_mask = 0x0000ff00; - red_mask = 0x00ff0000; - blue_shift = 0; - green_shift = 8; - red_shift = 16; - blue_scale = green_scale = red_scale = 1; - } else if (comp == BMP_RGB && nbits == 16) { - blue_mask = 0x001f; - green_mask = 0x03e0; - red_mask = 0x7c00; - blue_shift = 0; - green_shift = 2; - red_shift = 7; - red_scale = 1; - green_scale = 1; - blue_scale = 8; - } - -#if 0 - qDebug("Rmask: %08x Rshift: %08x Rscale:%08x", red_mask, red_shift, red_scale); - qDebug("Gmask: %08x Gshift: %08x Gscale:%08x", green_mask, green_shift, green_scale); - qDebug("Bmask: %08x Bshift: %08x Bscale:%08x", blue_mask, blue_shift, blue_scale); - qDebug("Amask: %08x Ashift: %08x Ascale:%08x", alpha_mask, alpha_shift, alpha_scale); -#endif - - // offset can be bogus, be careful - if (offset>=0 && startpos + offset > d->pos()) { - if (!d->isSequential()) - d->seek(startpos + offset); // start of image data - } - - int bpl = image.bytesPerLine(); - uchar *data = image.bits(); - - if (nbits == 1) { // 1 bit BMP image - while (--h >= 0) { - if (d->read((char*)(data + h*bpl), bpl) != bpl) - break; - } - if (ncols == 2 && qGray(image.color(0)) < qGray(image.color(1))) - swapPixel01(&image); // pixel 0 is white! - } - - else if (nbits == 4) { // 4 bit BMP image - int buflen = ((w+7)/8)*4; - uchar *buf = new uchar[buflen]; - if (comp == BMP_RLE4) { // run length compression - int x=0, y=0, c, i; - quint8 b; - uchar *p = data + (h-1)*bpl; - const uchar *endp = p + w; - while (y < h) { - if (!d->getChar((char *)&b)) - break; - if (b == 0) { // escape code - if (!d->getChar((char *)&b) || b == 1) { - y = h; // exit loop - } else switch (b) { - case 0: // end of line - x = 0; - y++; - p = data + (h-y-1)*bpl; - break; - case 2: // delta (jump) - { - quint8 tmp; - d->getChar((char *)&tmp); - x += tmp; - d->getChar((char *)&tmp); - y += tmp; - } - - // Protection - if ((uint)x >= (uint)w) - x = w-1; - if ((uint)y >= (uint)h) - y = h-1; - - p = data + (h-y-1)*bpl + x; - break; - default: // absolute mode - // Protection - if (p + b > endp) - b = endp-p; - - i = (c = b)/2; - while (i--) { - d->getChar((char *)&b); - *p++ = b >> 4; - *p++ = b & 0x0f; - } - if (c & 1) { - unsigned char tmp; - d->getChar((char *)&tmp); - *p++ = tmp >> 4; - } - if ((((c & 3) + 1) & 2) == 2) - d->getChar(0); // align on word boundary - x += c; - } - } else { // encoded mode - // Protection - if (p + b > endp) - b = endp-p; - - i = (c = b)/2; - d->getChar((char *)&b); // 2 pixels to be repeated - while (i--) { - *p++ = b >> 4; - *p++ = b & 0x0f; - } - if (c & 1) - *p++ = b >> 4; - x += c; - } - } - } else if (comp == BMP_RGB) { // no compression - memset(data, 0, h*bpl); - while (--h >= 0) { - if (d->read((char*)buf,buflen) != buflen) - break; - uchar *p = data + h*bpl; - uchar *b = buf; - for (int i=0; i> 4; - *p++ = *b++ & 0x0f; - } - if (w & 1) // the last nibble - *p = *b >> 4; - } - } - delete [] buf; - } - - else if (nbits == 8) { // 8 bit BMP image - if (comp == BMP_RLE8) { // run length compression - int x=0, y=0; - quint8 b; - uchar *p = data + (h-1)*bpl; - const uchar *endp = p + w; - while (y < h) { - if (!d->getChar((char *)&b)) - break; - if (b == 0) { // escape code - if (!d->getChar((char *)&b) || b == 1) { - y = h; // exit loop - } else switch (b) { - case 0: // end of line - x = 0; - y++; - p = data + (h-y-1)*bpl; - break; - case 2: // delta (jump) - { - quint8 tmp; - d->getChar((char *)&tmp); - x += tmp; - d->getChar((char *)&tmp); - y += tmp; - } - - // Protection - if ((uint)x >= (uint)w) - x = w-1; - if ((uint)y >= (uint)h) - y = h-1; - - p = data + (h-y-1)*bpl + x; - break; - default: // absolute mode - // Protection - if (p + b > endp) - b = endp-p; - - if (d->read((char *)p, b) != b) - return false; - if ((b & 1) == 1) - d->getChar(0); // align on word boundary - x += b; - p += b; - } - } else { // encoded mode - // Protection - if (p + b > endp) - b = endp-p; - - char tmp; - d->getChar(&tmp); - memset(p, tmp, b); // repeat pixel - x += b; - p += b; - } - } - } else if (comp == BMP_RGB) { // uncompressed - while (--h >= 0) { - if (d->read((char *)data + h*bpl, bpl) != bpl) - break; - } - } - } - - else if (nbits == 16 || nbits == 24 || nbits == 32) { // 16,24,32 bit BMP image - QRgb *p; - QRgb *end; - uchar *buf24 = new uchar[bpl]; - int bpl24 = ((w*nbits+31)/32)*4; - uchar *b; - int c; - - while (--h >= 0) { - p = (QRgb *)(data + h*bpl); - end = p + w; - if (d->read((char *)buf24,bpl24) != bpl24) - break; - b = buf24; - while (p < end) { - c = *(uchar*)b | (*(uchar*)(b+1)<<8); - if (nbits > 16) - c |= *(uchar*)(b+2)<<16; - if (nbits > 24) - c |= *(uchar*)(b+3)<<24; - *p++ = qRgba(((c & red_mask) >> red_shift) * red_scale, - ((c & green_mask) >> green_shift) * green_scale, - ((c & blue_mask) >> blue_shift) * blue_scale, - transp ? ((c & alpha_mask) >> alpha_shift) * alpha_scale : 0xff); - b += nbits/8; - } - } - delete[] buf24; - } - - if (bi.biHeight < 0) { - // Flip the image - uchar *buf = new uchar[bpl]; - h = -bi.biHeight; - for (int y = 0; y < h/2; ++y) { - memcpy(buf, data + y*bpl, bpl); - memcpy(data + y*bpl, data + (h-y-1)*bpl, bpl); - memcpy(data + (h-y-1)*bpl, buf, bpl); - } - delete [] buf; - } - - return true; -} - -// this is also used in qmime_win.cpp -bool qt_write_dib(QDataStream &s, QImage image) -{ - int nbits; - int bpl_bmp; - int bpl = image.bytesPerLine(); - - QIODevice* d = s.device(); - if (!d->isWritable()) - return false; - - if (image.depth() == 8 && image.colorCount() <= 16) { - bpl_bmp = (((bpl+1)/2+3)/4)*4; - nbits = 4; - } else if (image.depth() == 32) { - bpl_bmp = ((image.width()*24+31)/32)*4; - nbits = 24; - } else { - bpl_bmp = bpl; - nbits = image.depth(); - } - - BMP_INFOHDR bi; - bi.biSize = BMP_WIN; // build info header - bi.biWidth = image.width(); - bi.biHeight = image.height(); - bi.biPlanes = 1; - bi.biBitCount = nbits; - bi.biCompression = BMP_RGB; - bi.biSizeImage = bpl_bmp*image.height(); - bi.biXPelsPerMeter = image.dotsPerMeterX() ? image.dotsPerMeterX() - : 2834; // 72 dpi default - bi.biYPelsPerMeter = image.dotsPerMeterY() ? image.dotsPerMeterY() : 2834; - bi.biClrUsed = image.colorCount(); - bi.biClrImportant = image.colorCount(); - s << bi; // write info header - if (s.status() != QDataStream::Ok) - return false; - - if (image.depth() != 32) { // write color table - uchar *color_table = new uchar[4*image.colorCount()]; - uchar *rgb = color_table; - QVector c = image.colorTable(); - for (int i=0; iwrite((char *)color_table, 4*image.colorCount()) == -1) { - delete [] color_table; - return false; - } - delete [] color_table; - } - - if (image.format() == QImage::Format_MonoLSB) - image = image.convertToFormat(QImage::Format_Mono); - - int y; - - if (nbits == 1 || nbits == 8) { // direct output - for (y=image.height()-1; y>=0; y--) { - if (d->write((const char*)image.constScanLine(y), bpl) == -1) - return false; - } - return true; - } - - uchar *buf = new uchar[bpl_bmp]; - uchar *b, *end; - const uchar *p; - - memset(buf, 0, bpl_bmp); - for (y=image.height()-1; y>=0; y--) { // write the image bits - if (nbits == 4) { // convert 8 -> 4 bits - p = image.constScanLine(y); - b = buf; - end = b + image.width()/2; - while (b < end) { - *b++ = (*p << 4) | (*(p+1) & 0x0f); - p += 2; - } - if (image.width() & 1) - *b = *p << 4; - } else { // 32 bits - const QRgb *p = (const QRgb *)image.constScanLine(y); - const QRgb *end = p + image.width(); - b = buf; - while (p < end) { - *b++ = qBlue(*p); - *b++ = qGreen(*p); - *b++ = qRed(*p); - p++; - } - } - if (bpl_bmp != d->write((char*)buf, bpl_bmp)) { - delete[] buf; - return false; - } - } - delete[] buf; - return true; -} - -// this is also used in qmime_win.cpp -bool qt_read_dib(QDataStream &s, QImage &image) -{ - BMP_INFOHDR bi; - if (!read_dib_infoheader(s, bi)) - return false; - return read_dib_body(s, bi, -1, -BMP_FILEHDR_SIZE, image); -} - -QBmpHandler::QBmpHandler(InternalFormat fmt) : - m_format(fmt), state(Ready) -{ -} - -QByteArray QBmpHandler::formatName() const -{ - return m_format == BmpFormat ? "bmp" : "dib"; -} - -bool QBmpHandler::readHeader() -{ - state = Error; - - QIODevice *d = device(); - QDataStream s(d); - startpos = d->pos(); - - // Intel byte order - s.setByteOrder(QDataStream::LittleEndian); - - // read BMP file header - if (m_format == BmpFormat && !read_dib_fileheader(s, fileHeader)) - return false; - - // read BMP info header - if (!read_dib_infoheader(s, infoHeader)) - return false; - - state = ReadHeader; - return true; -} - -bool QBmpHandler::canRead() const -{ - if (m_format == BmpFormat && state == Ready && !canRead(device())) - return false; - - if (state != Error) { - setFormat(formatName()); - return true; - } - - return false; -} - -bool QBmpHandler::canRead(QIODevice *device) -{ - if (!device) { - qWarning("QBmpHandler::canRead() called with 0 pointer"); - return false; - } - - char head[2]; - if (device->peek(head, sizeof(head)) != sizeof(head)) - return false; - - return (qstrncmp(head, "BM", 2) == 0); -} - -bool QBmpHandler::read(QImage *image) -{ - if (state == Error) - return false; - - if (!image) { - qWarning("QBmpHandler::read: cannot read into null pointer"); - return false; - } - - if (state == Ready && !readHeader()) { - state = Error; - return false; - } - - QIODevice *d = device(); - QDataStream s(d); - - // Intel byte order - s.setByteOrder(QDataStream::LittleEndian); - - // read image - const bool readSuccess = m_format == BmpFormat ? - read_dib_body(s, infoHeader, fileHeader.bfOffBits, startpos, *image) : - read_dib_body(s, infoHeader, -1, startpos - BMP_FILEHDR_SIZE, *image); - if (!readSuccess) - return false; - - state = Ready; - return true; -} - -bool QBmpHandler::write(const QImage &img) -{ - if (m_format == DibFormat) { - QDataStream dibStream(device()); - dibStream.setByteOrder(QDataStream::LittleEndian); // Intel byte order - return qt_write_dib(dibStream, img); - } - - QImage image; - switch (img.format()) { - case QImage::Format_Mono: - case QImage::Format_MonoLSB: - case QImage::Format_Indexed8: - case QImage::Format_RGB32: - case QImage::Format_ARGB32: - image = img; - break; - case QImage::Format_Alpha8: - case QImage::Format_Grayscale8: - image = img.convertToFormat(QImage::Format_Indexed8); - break; - default: - if (img.hasAlphaChannel()) - image = img.convertToFormat(QImage::Format_ARGB32); - else - image = img.convertToFormat(QImage::Format_RGB32); - break; - } - - QIODevice *d = device(); - QDataStream s(d); - BMP_FILEHDR bf; - int bpl_bmp; - int bpl = image.bytesPerLine(); - - // Code partially repeated in qt_write_dib - if (image.depth() == 8 && image.colorCount() <= 16) { - bpl_bmp = (((bpl+1)/2+3)/4)*4; - } else if (image.depth() == 32) { - bpl_bmp = ((image.width()*24+31)/32)*4; - } else { - bpl_bmp = bpl; - } - - // Intel byte order - s.setByteOrder(QDataStream::LittleEndian); - - // build file header - memcpy(bf.bfType, "BM", 2); - - // write file header - bf.bfReserved1 = 0; - bf.bfReserved2 = 0; - bf.bfOffBits = BMP_FILEHDR_SIZE + BMP_WIN + image.colorCount() * 4; - bf.bfSize = bf.bfOffBits + bpl_bmp*image.height(); - s << bf; - - // write image - return qt_write_dib(s, image); -} - -bool QBmpHandler::supportsOption(ImageOption option) const -{ - return option == Size - || option == ImageFormat; -} - -QVariant QBmpHandler::option(ImageOption option) const -{ - if (option == Size) { - if (state == Error) - return QVariant(); - if (state == Ready && !const_cast(this)->readHeader()) - return QVariant(); - return QSize(infoHeader.biWidth, infoHeader.biHeight); - } else if (option == ImageFormat) { - if (state == Error) - return QVariant(); - if (state == Ready && !const_cast(this)->readHeader()) - return QVariant(); - QImage::Format format; - switch (infoHeader.biBitCount) { - case 32: - case 24: - case 16: - format = QImage::Format_RGB32; - break; - case 8: - case 4: - format = QImage::Format_Indexed8; - break; - default: - format = QImage::Format_Mono; - } - return format; - } - return QVariant(); -} - -void QBmpHandler::setOption(ImageOption option, const QVariant &value) -{ - Q_UNUSED(option); - Q_UNUSED(value); -} - -QByteArray QBmpHandler::name() const -{ - return formatName(); -} - -QT_END_NAMESPACE - -#endif // QT_NO_IMAGEFORMAT_BMP diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/kernel/qplatformdialoghelper.h b/Telegram/_qt_5_5_0_patch/qtbase/src/gui/kernel/qplatformdialoghelper.h deleted file mode 100644 index 2d1cdd90f..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/kernel/qplatformdialoghelper.h +++ /dev/null @@ -1,443 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPLATFORMDIALOGHELPER_H -#define QPLATFORMDIALOGHELPER_H - -// -// W A R N I N G -// ------------- -// -// This file is part of the QPA API and is not meant to be used -// in applications. Usage of this API may make your code -// source and binary incompatible with future versions of Qt. -// - -#include -#include -#include -#include -#include -#include -#include -#include - -QT_BEGIN_NAMESPACE - - -class QString; -class QColor; -class QFont; -class QWindow; -class QVariant; -class QUrl; -class QColorDialogOptionsPrivate; -class QFontDialogOptionsPrivate; -class QFileDialogOptionsPrivate; -class QMessageDialogOptionsPrivate; - -class Q_GUI_EXPORT QPlatformDialogHelper : public QObject -{ - Q_OBJECT -public: - enum StyleHint { - }; - enum DialogCode { Rejected, Accepted }; - - enum StandardButton { - // keep this in sync with QDialogButtonBox::StandardButton and QMessageBox::StandardButton - NoButton = 0x00000000, - Ok = 0x00000400, - Save = 0x00000800, - SaveAll = 0x00001000, - Open = 0x00002000, - Yes = 0x00004000, - YesToAll = 0x00008000, - No = 0x00010000, - NoToAll = 0x00020000, - Abort = 0x00040000, - Retry = 0x00080000, - Ignore = 0x00100000, - Close = 0x00200000, - Cancel = 0x00400000, - Discard = 0x00800000, - Help = 0x01000000, - Apply = 0x02000000, - Reset = 0x04000000, - RestoreDefaults = 0x08000000, - - - FirstButton = Ok, // internal - LastButton = RestoreDefaults, // internal - LowestBit = 10, // internal: log2(FirstButton) - HighestBit = 27 // internal: log2(LastButton) - }; - - Q_DECLARE_FLAGS(StandardButtons, StandardButton) - - enum ButtonRole { - // keep this in sync with QDialogButtonBox::ButtonRole and QMessageBox::ButtonRole - // TODO Qt 6: make the enum copies explicit, and make InvalidRole == 0 so that - // AcceptRole can be or'ed with flags, and EOL can be the same as InvalidRole (null-termination) - InvalidRole = -1, - AcceptRole, - RejectRole, - DestructiveRole, - ActionRole, - HelpRole, - YesRole, - NoRole, - ResetRole, - ApplyRole, - - NRoles, - - RoleMask = 0x0FFFFFFF, - AlternateRole = 0x10000000, - Stretch = 0x20000000, - Reverse = 0x40000000, - EOL = InvalidRole - }; - - enum ButtonLayout { - // keep this in sync with QDialogButtonBox::ButtonLayout and QMessageBox::ButtonLayout - UnknownLayout = -1, - WinLayout, - MacLayout, - KdeLayout, - GnomeLayout, - MacModelessLayout - }; - - QPlatformDialogHelper(); - virtual ~QPlatformDialogHelper(); - - virtual QVariant styleHint(StyleHint hint) const; - - virtual void exec() = 0; - virtual bool show(Qt::WindowFlags windowFlags, - Qt::WindowModality windowModality, - QWindow *parent) = 0; - virtual void hide() = 0; - - static QVariant defaultStyleHint(QPlatformDialogHelper::StyleHint hint); - - static const int *buttonLayout(Qt::Orientation orientation = Qt::Horizontal, ButtonLayout policy = UnknownLayout); - static ButtonRole buttonRole(StandardButton button); - -Q_SIGNALS: - void accept(); - void reject(); -}; - -class Q_GUI_EXPORT QColorDialogOptions -{ -public: - enum ColorDialogOption { - ShowAlphaChannel = 0x00000001, - NoButtons = 0x00000002, - DontUseNativeDialog = 0x00000004 - }; - - Q_DECLARE_FLAGS(ColorDialogOptions, ColorDialogOption) - - QColorDialogOptions(); - QColorDialogOptions(const QColorDialogOptions &rhs); - QColorDialogOptions &operator=(const QColorDialogOptions &rhs); - ~QColorDialogOptions(); - - void swap(QColorDialogOptions &other) { qSwap(d, other.d); } - - QString windowTitle() const; - void setWindowTitle(const QString &); - - void setOption(ColorDialogOption option, bool on = true); - bool testOption(ColorDialogOption option) const; - void setOptions(ColorDialogOptions options); - ColorDialogOptions options() const; - - static int customColorCount(); - static QRgb customColor(int index); - static QRgb *customColors(); - static void setCustomColor(int index, QRgb color); - - static QRgb *standardColors(); - static QRgb standardColor(int index); - static void setStandardColor(int index, QRgb color); - -private: - QSharedDataPointer d; -}; - -Q_DECLARE_SHARED(QColorDialogOptions) - -class Q_GUI_EXPORT QPlatformColorDialogHelper : public QPlatformDialogHelper -{ - Q_OBJECT -public: - const QSharedPointer &options() const; - void setOptions(const QSharedPointer &options); - - virtual void setCurrentColor(const QColor &) = 0; - virtual QColor currentColor() const = 0; - -Q_SIGNALS: - void currentColorChanged(const QColor &color); - void colorSelected(const QColor &color); - -private: - QSharedPointer m_options; -}; - -class Q_GUI_EXPORT QFontDialogOptions -{ -public: - enum FontDialogOption { - NoButtons = 0x00000001, - DontUseNativeDialog = 0x00000002, - ScalableFonts = 0x00000004, - NonScalableFonts = 0x00000008, - MonospacedFonts = 0x00000010, - ProportionalFonts = 0x00000020 - }; - - Q_DECLARE_FLAGS(FontDialogOptions, FontDialogOption) - - QFontDialogOptions(); - QFontDialogOptions(const QFontDialogOptions &rhs); - QFontDialogOptions &operator=(const QFontDialogOptions &rhs); - ~QFontDialogOptions(); - - void swap(QFontDialogOptions &other) { qSwap(d, other.d); } - - QString windowTitle() const; - void setWindowTitle(const QString &); - - void setOption(FontDialogOption option, bool on = true); - bool testOption(FontDialogOption option) const; - void setOptions(FontDialogOptions options); - FontDialogOptions options() const; - -private: - QSharedDataPointer d; -}; - -Q_DECLARE_SHARED(QFontDialogOptions) - -class Q_GUI_EXPORT QPlatformFontDialogHelper : public QPlatformDialogHelper -{ - Q_OBJECT -public: - virtual void setCurrentFont(const QFont &) = 0; - virtual QFont currentFont() const = 0; - - const QSharedPointer &options() const; - void setOptions(const QSharedPointer &options); - -Q_SIGNALS: - void currentFontChanged(const QFont &font); - void fontSelected(const QFont &font); - -private: - QSharedPointer m_options; -}; - -class Q_GUI_EXPORT QFileDialogOptions -{ -public: - enum ViewMode { Detail, List }; - enum FileMode { AnyFile, ExistingFile, Directory, ExistingFiles, DirectoryOnly }; - enum AcceptMode { AcceptOpen, AcceptSave }; - enum DialogLabel { LookIn, FileName, FileType, Accept, Reject, DialogLabelCount }; - - enum FileDialogOption - { - ShowDirsOnly = 0x00000001, - DontResolveSymlinks = 0x00000002, - DontConfirmOverwrite = 0x00000004, - DontUseSheet = 0x00000008, - DontUseNativeDialog = 0x00000010, - ReadOnly = 0x00000020, - HideNameFilterDetails = 0x00000040, - DontUseCustomDirectoryIcons = 0x00000080 - }; - Q_DECLARE_FLAGS(FileDialogOptions, FileDialogOption) - - QFileDialogOptions(); - QFileDialogOptions(const QFileDialogOptions &rhs); - QFileDialogOptions &operator=(const QFileDialogOptions &rhs); - ~QFileDialogOptions(); - - void swap(QFileDialogOptions &other) { qSwap(d, other.d); } - - QString windowTitle() const; - void setWindowTitle(const QString &); - - void setOption(FileDialogOption option, bool on = true); - bool testOption(FileDialogOption option) const; - void setOptions(FileDialogOptions options); - FileDialogOptions options() const; - - QDir::Filters filter() const; - void setFilter(QDir::Filters filters); - - void setViewMode(ViewMode mode); - ViewMode viewMode() const; - - void setFileMode(FileMode mode); - FileMode fileMode() const; - - void setAcceptMode(AcceptMode mode); - AcceptMode acceptMode() const; - - void setSidebarUrls(const QList &urls); - QList sidebarUrls() const; - - void setNameFilters(const QStringList &filters); - QStringList nameFilters() const; - - void setMimeTypeFilters(const QStringList &filters); - QStringList mimeTypeFilters() const; - - void setDefaultSuffix(const QString &suffix); - QString defaultSuffix() const; - - void setHistory(const QStringList &paths); - QStringList history() const; - - void setLabelText(DialogLabel label, const QString &text); - QString labelText(DialogLabel label) const; - bool isLabelExplicitlySet(DialogLabel label); - - QUrl initialDirectory() const; - void setInitialDirectory(const QUrl &); - - QString initiallySelectedNameFilter() const; - void setInitiallySelectedNameFilter(const QString &); - - QList initiallySelectedFiles() const; - void setInitiallySelectedFiles(const QList &); - -private: - QSharedDataPointer d; -}; - -Q_DECLARE_SHARED(QFileDialogOptions) - -class Q_GUI_EXPORT QPlatformFileDialogHelper : public QPlatformDialogHelper -{ - Q_OBJECT -public: - virtual bool defaultNameFilterDisables() const = 0; - virtual void setDirectory(const QUrl &directory) = 0; - virtual QUrl directory() const = 0; - virtual void selectFile(const QUrl &filename) = 0; - virtual QList selectedFiles() const = 0; - virtual QByteArray selectedRemoteContent() const { return QByteArray(); } - virtual void setFilter() = 0; - virtual void selectNameFilter(const QString &filter) = 0; - virtual QString selectedNameFilter() const = 0; - - virtual bool isSupportedUrl(const QUrl &url) const; - - const QSharedPointer &options() const; - void setOptions(const QSharedPointer &options); - - static QStringList cleanFilterList(const QString &filter); - static const char *filterRegExp; - -Q_SIGNALS: - void fileSelected(const QUrl &file); - void filesSelected(const QList &files); - void currentChanged(const QUrl &path); - void directoryEntered(const QUrl &directory); - void filterSelected(const QString &filter); - -private: - QSharedPointer m_options; -}; - -class Q_GUI_EXPORT QMessageDialogOptions -{ -public: - // Keep in sync with QMessageBox::Icon - enum Icon { NoIcon, Information, Warning, Critical, Question }; - - QMessageDialogOptions(); - QMessageDialogOptions(const QMessageDialogOptions &rhs); - QMessageDialogOptions &operator=(const QMessageDialogOptions &rhs); - ~QMessageDialogOptions(); - - void swap(QMessageDialogOptions &other) { qSwap(d, other.d); } - - QString windowTitle() const; - void setWindowTitle(const QString &); - - void setIcon(Icon icon); - Icon icon() const; - - void setText(const QString &text); - QString text() const; - - void setInformativeText(const QString &text); - QString informativeText() const; - - void setDetailedText(const QString &text); - QString detailedText() const; - - void setStandardButtons(QPlatformDialogHelper::StandardButtons buttons); - QPlatformDialogHelper::StandardButtons standardButtons() const; - -private: - QSharedDataPointer d; -}; - -Q_DECLARE_SHARED(QMessageDialogOptions) - -class Q_GUI_EXPORT QPlatformMessageDialogHelper : public QPlatformDialogHelper -{ - Q_OBJECT -public: - const QSharedPointer &options() const; - void setOptions(const QSharedPointer &options); - -Q_SIGNALS: - void clicked(QPlatformDialogHelper::StandardButton button, QPlatformDialogHelper::ButtonRole role); - -private: - QSharedPointer m_options; -}; - -QT_END_NAMESPACE - -#endif // QPLATFORMDIALOGHELPER_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qbackingstore.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qbackingstore.cpp deleted file mode 100644 index c39c6a14c..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qbackingstore.cpp +++ /dev/null @@ -1,285 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -QT_BEGIN_NAMESPACE - -class QBackingStorePrivate -{ -public: - QBackingStorePrivate(QWindow *w) - : window(w) - { - } - - QWindow *window; - QPlatformBackingStore *platformBackingStore; - QRegion staticContents; - QSize size; -}; - -/*! - \class QBackingStore - \since 5.0 - \inmodule QtGui - - \brief The QBackingStore class provides a drawing area for QWindow. - - QBackingStore enables the use of QPainter to paint on a QWindow with type - RasterSurface. The other way of rendering to a QWindow is through the use - of OpenGL with QOpenGLContext. - - A QBackingStore contains a buffered representation of the window contents, - and thus supports partial updates by using QPainter to only update a sub - region of the window contents. - - QBackingStore might be used by an application that wants to use QPainter - without OpenGL acceleration and without the extra overhead of using the - QWidget or QGraphicsView UI stacks. For an example of how to use - QBackingStore see the \l{Raster Window Example}. -*/ - -/*! - Flushes the given \a region from the specified window \a win onto the - screen. - - Note that the \a offset parameter is currently unused. -*/ -void QBackingStore::flush(const QRegion ®ion, QWindow *win, const QPoint &offset) -{ - if (!win) - win = window(); - if (!win->handle()) { - qWarning() << "QBackingStore::flush() called for " - << win << " which does not have a handle."; - return; - } - -#ifdef QBACKINGSTORE_DEBUG - if (win && win->isTopLevel() && !qt_window_private(win)->receivedExpose) { - qWarning().nospace() << "QBackingStore::flush() called with non-exposed window " - << win << ", behavior is undefined"; - } -#endif - - d_ptr->platformBackingStore->flush(win, region, offset); -} - -/*! - \fn QPaintDevice* QBackingStore::paintDevice() - - Implement this function to return the appropriate paint device. -*/ -QPaintDevice *QBackingStore::paintDevice() -{ - return d_ptr->platformBackingStore->paintDevice(); -} - -/*! - Constructs an empty surface for the given top-level \a window. -*/ -QBackingStore::QBackingStore(QWindow *window) - : d_ptr(new QBackingStorePrivate(window)) -{ - d_ptr->platformBackingStore = QGuiApplicationPrivate::platformIntegration()->createPlatformBackingStore(window); -} - -/*! - Destroys this surface. -*/ -QBackingStore::~QBackingStore() -{ - delete d_ptr->platformBackingStore; -} - -/*! - Returns a pointer to the top-level window associated with this - surface. -*/ -QWindow* QBackingStore::window() const -{ - return d_ptr->window; -} - -/*! - This function is called before painting onto the surface begins, - with the \a region in which the painting will occur. - - \sa endPaint(), paintDevice() -*/ - -void QBackingStore::beginPaint(const QRegion ®ion) -{ - d_ptr->platformBackingStore->beginPaint(region); -} - -void QBackingStore::beforeBeginPaint(QWindow *win) -{ - if (!win) - win = window(); - if (!win->handle()) - return; - d_ptr->platformBackingStore->beforeBeginPaint(win); -} - -/*! - This function is called after painting onto the surface has ended. - - \sa beginPaint(), paintDevice() -*/ -void QBackingStore::endPaint() -{ - d_ptr->platformBackingStore->endPaint(); -} - -void QBackingStore::afterEndPaint(QWindow *win) -{ - if (!win) - win = window(); - if (!win->handle()) - return; - d_ptr->platformBackingStore->afterEndPaint(win); -} - -/*! - Sets the size of the windowsurface to be \a size. - - \sa size() -*/ -void QBackingStore::resize(const QSize &size) -{ - d_ptr->size = size; - d_ptr->platformBackingStore->resize(size, d_ptr->staticContents); -} - -/*! - Returns the current size of the windowsurface. -*/ -QSize QBackingStore::size() const -{ - return d_ptr->size; -} - -/*! - Scrolls the given \a area \a dx pixels to the right and \a dy - downward; both \a dx and \a dy may be negative. - - Returns \c true if the area was scrolled successfully; false otherwise. -*/ -bool QBackingStore::scroll(const QRegion &area, int dx, int dy) -{ - Q_UNUSED(area); - Q_UNUSED(dx); - Q_UNUSED(dy); - - return d_ptr->platformBackingStore->scroll(area, dx, dy); -} - -void QBackingStore::setStaticContents(const QRegion ®ion) -{ - d_ptr->staticContents = region; -} - -QRegion QBackingStore::staticContents() const -{ - return d_ptr->staticContents; -} - -bool QBackingStore::hasStaticContents() const -{ - return !d_ptr->staticContents.isEmpty(); -} - -void Q_GUI_EXPORT qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset) -{ - // make sure we don't detach - uchar *mem = const_cast(const_cast(img).bits()); - - int lineskip = img.bytesPerLine(); - int depth = img.depth() >> 3; - - const QRect imageRect(0, 0, img.width(), img.height()); - const QRect r = rect & imageRect & imageRect.translated(-offset); - const QPoint p = rect.topLeft() + offset; - - if (r.isEmpty()) - return; - - const uchar *src; - uchar *dest; - - if (r.top() < p.y()) { - src = mem + r.bottom() * lineskip + r.left() * depth; - dest = mem + (p.y() + r.height() - 1) * lineskip + p.x() * depth; - lineskip = -lineskip; - } else { - src = mem + r.top() * lineskip + r.left() * depth; - dest = mem + p.y() * lineskip + p.x() * depth; - } - - const int w = r.width(); - int h = r.height(); - const int bytes = w * depth; - - // overlapping segments? - if (offset.y() == 0 && qAbs(offset.x()) < w) { - do { - ::memmove(dest, src, bytes); - dest += lineskip; - src += lineskip; - } while (--h); - } else { - do { - ::memcpy(dest, src, bytes); - dest += lineskip; - src += lineskip; - } while (--h); - } -} - -QPlatformBackingStore *QBackingStore::handle() const -{ - return d_ptr->platformBackingStore; -} - -QT_END_NAMESPACE diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qbackingstore.h b/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qbackingstore.h deleted file mode 100644 index faa5fbcde..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qbackingstore.h +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QBACKINGSTORE_H -#define QBACKINGSTORE_H - -#include - -#include -#include - -QT_BEGIN_NAMESPACE - - -class QRegion; -class QRect; -class QPoint; -class QImage; -class QBackingStorePrivate; -class QPlatformBackingStore; - -class Q_GUI_EXPORT QBackingStore -{ -public: - explicit QBackingStore(QWindow *window); - ~QBackingStore(); - - QWindow *window() const; - - QPaintDevice *paintDevice(); - - // 'window' can be a child window, in which case 'region' is in child window coordinates and - // offset is the (child) window's offset in relation to the window surface. - void flush(const QRegion ®ion, QWindow *window = 0, const QPoint &offset = QPoint()); - - void resize(const QSize &size); - QSize size() const; - - bool scroll(const QRegion &area, int dx, int dy); - - void beginPaint(const QRegion &); - void beforeBeginPaint(QWindow *window); - void endPaint(); - void afterEndPaint(QWindow *window); - - void setStaticContents(const QRegion ®ion); - QRegion staticContents() const; - bool hasStaticContents() const; - - QPlatformBackingStore *handle() const; - -private: - QScopedPointer d_ptr; -}; - -QT_END_NAMESPACE - -#endif // QBACKINGSTORE_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qimagescale.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qimagescale.cpp deleted file mode 100644 index a3e0e04c9..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qimagescale.cpp +++ /dev/null @@ -1,748 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include -#include - -#include "qimage.h" -#include "qcolor.h" - -QT_BEGIN_NAMESPACE - -/* - * Copyright (C) 2004, 2005 Daniel M. Duley - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/* OTHER CREDITS: - * - * This is the normal smoothscale method, based on Imlib2's smoothscale. - * - * Originally I took the algorithm used in NetPBM and Qt and added MMX/3dnow - * optimizations. It ran in about 1/2 the time as Qt. Then I ported Imlib's - * C algorithm and it ran at about the same speed as my MMX optimized one... - * Finally I ported Imlib's MMX version and it ran in less than half the - * time as my MMX algorithm, (taking only a quarter of the time Qt does). - * After further optimization it seems to run at around 1/6th. - * - * Changes include formatting, namespaces and other C++'ings, removal of old - * #ifdef'ed code, and removal of unneeded border calculation code. - * - * Imlib2 is (C) Carsten Haitzler and various contributors. The MMX code - * is by Willem Monsuwe . All other modifications are - * (C) Daniel M. Duley. - */ - - -namespace QImageScale { - const unsigned int** qimageCalcYPoints(const unsigned int *src, int sw, int sh, int dh); - int* qimageCalcXPoints(int sw, int dw); - int* qimageCalcApoints(int s, int d, int up); - QImageScaleInfo* qimageFreeScaleInfo(QImageScaleInfo *isi); - QImageScaleInfo *qimageCalcScaleInfo(const QImage &img, int sw, int sh, - int dw, int dh, char aa); -} - -using namespace QImageScale; - -// -// Code ported from Imlib... -// - -const unsigned int** QImageScale::qimageCalcYPoints(const unsigned int *src, - int sw, int sh, int dh) -{ - const unsigned int **p; - int j = 0, rv = 0; - qint64 val, inc; - - if(dh < 0){ - dh = -dh; - rv = 1; - } - p = new const unsigned int* [dh+1]; - - int up = qAbs(dh) >= sh; - val = up ? 0x8000 * sh / dh - 0x8000 : 0; - inc = (((qint64)sh) << 16) / dh; - for (int i = 0; i < dh; i++) { - p[j++] = src + qMax(0LL, val >> 16) * sw; - val += inc; - } - if (rv) { - for (int i = dh / 2; --i >= 0; ) { - const unsigned int *tmp = p[i]; - p[i] = p[dh - i - 1]; - p[dh - i - 1] = tmp; - } - } - return(p); -} - -int* QImageScale::qimageCalcXPoints(int sw, int dw) -{ - int *p, j = 0, rv = 0; - qint64 val, inc; - - if(dw < 0){ - dw = -dw; - rv = 1; - } - p = new int[dw+1]; - - int up = qAbs(dw) >= sw; - val = up ? 0x8000 * sw / dw - 0x8000 : 0; - inc = (((qint64)sw) << 16) / dw; - for (int i = 0; i < dw; i++) { - p[j++] = qMax(0LL, val >> 16); - val += inc; - } - - if (rv) { - for (int i = dw / 2; --i >= 0; ) { - int tmp = p[i]; - p[i] = p[dw - i - 1]; - p[dw - i - 1] = tmp; - } - } - return(p); -} - -int* QImageScale::qimageCalcApoints(int s, int d, int up) -{ - int *p, j = 0, rv = 0; - - if(d < 0){ - rv = 1; - d = -d; - } - p = new int[d]; - - /* scaling up */ - if(up){ - qint64 val, inc; - - val = 0x8000 * s / d - 0x8000; - inc = (((qint64)s) << 16) / d; - for (int i = 0; i < d; i++) { - int pos = val >> 16; - if (pos < 0) - p[j++] = 0; - else if (pos >= (s - 1)) - p[j++] = 0; - else - p[j++] = (val >> 8) - ((val >> 8) & 0xffffff00); - val += inc; - } - } - /* scaling down */ - else { - qint64 val = 0; - qint64 inc = (((qint64)s) << 16) / d; - int Cp = (((d << 14) + s - 1) / s); - for (int i = 0; i < d; i++) { - int ap = ((0x10000 - (val & 0xffff)) * Cp) >> 16; - p[j] = ap | (Cp << 16); - j++; - val += inc; - } - } - if(rv){ - int tmp; - for (int i = d / 2; --i >= 0; ) { - tmp = p[i]; - p[i] = p[d - i - 1]; - p[d - i - 1] = tmp; - } - } - return p; -} - -QImageScaleInfo* QImageScale::qimageFreeScaleInfo(QImageScaleInfo *isi) -{ - if(isi){ - delete[] isi->xpoints; - delete[] isi->ypoints; - delete[] isi->xapoints; - delete[] isi->yapoints; - delete isi; - } - return 0; -} - -QImageScaleInfo* QImageScale::qimageCalcScaleInfo(const QImage &img, - int sw, int sh, - int dw, int dh, char aa) -{ - QImageScaleInfo *isi; - int scw, sch; - - scw = dw * qlonglong(img.width()) / sw; - sch = dh * qlonglong(img.height()) / sh; - - isi = new QImageScaleInfo; - if(!isi) - return 0; - memset(isi, 0, sizeof(QImageScaleInfo)); - - isi->xup_yup = (qAbs(dw) >= sw) + ((qAbs(dh) >= sh) << 1); - - isi->xpoints = qimageCalcXPoints(img.width(), scw); - if(!isi->xpoints) - return(qimageFreeScaleInfo(isi)); - isi->ypoints = qimageCalcYPoints((const unsigned int *)img.scanLine(0), - img.bytesPerLine() / 4, img.height(), sch); - if (!isi->ypoints) - return(qimageFreeScaleInfo(isi)); - if(aa) { - isi->xapoints = qimageCalcApoints(img.width(), scw, isi->xup_yup & 1); - if(!isi->xapoints) - return(qimageFreeScaleInfo(isi)); - isi->yapoints = qimageCalcApoints(img.height(), sch, isi->xup_yup & 2); - if(!isi->yapoints) - return(qimageFreeScaleInfo(isi)); - } - return(isi); -} - - -static void qt_qimageScaleAARGBA_up_x_down_y(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, - int dw, int dh, int dow, int sow); - -static void qt_qimageScaleAARGBA_down_x_up_y(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, - int dw, int dh, int dow, int sow); - -static void qt_qimageScaleAARGBA_down_xy(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, int dw, - int dh, int dow, int sow); - -#if defined(QT_COMPILER_SUPPORTS_SSE4_1) -template -void qt_qimageScaleAARGBA_up_x_down_y_sse4(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, - int dw, int dh, int dow, int sow); -template -void qt_qimageScaleAARGBA_down_x_up_y_sse4(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, - int dw, int dh, int dow, int sow); -template -void qt_qimageScaleAARGBA_down_xy_sse4(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, - int dw, int dh, int dow, int sow); -#endif - -static void qt_qimageScaleAARGBA_up_xy(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, - int dw, int dh, int dow, int sow) -{ - const unsigned int **ypoints = isi->ypoints; - int *xpoints = isi->xpoints; - int *xapoints = isi->xapoints; - int *yapoints = isi->yapoints; - - int end = dxx + dw; - /* go through every scanline in the output buffer */ - for (int y = 0; y < dh; y++) { - /* calculate the source line we'll scan from */ - const unsigned int *sptr = ypoints[dyy + y]; - unsigned int *dptr = dest + dx + ((y + dy) * dow); - const int yap = yapoints[dyy + y]; - if (yap > 0) { - for (int x = dxx; x < end; x++) { - const unsigned int *pix = sptr + xpoints[x]; - const int xap = xapoints[x]; - if (xap > 0) - *dptr = interpolate_4_pixels(pix[0], pix[1], pix[sow], pix[sow + 1], xap, yap); - else - *dptr = INTERPOLATE_PIXEL_256(pix[0], 256 - yap, pix[sow], yap); - dptr++; - } - } else { - for (int x = dxx; x < end; x++) { - const unsigned int *pix = sptr + xpoints[x]; - const int xap = xapoints[x]; - if (xap > 0) - *dptr = INTERPOLATE_PIXEL_256(pix[0], 256 - xap, pix[1], xap); - else - *dptr = pix[0]; - dptr++; - } - } - } -} - -/* scale by area sampling */ -static void qt_qimageScaleAARGBA(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, int dw, - int dh, int dow, int sow) -{ - /* scaling up both ways */ - if (isi->xup_yup == 3){ - qt_qimageScaleAARGBA_up_xy(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - } - /* if we're scaling down vertically */ - else if (isi->xup_yup == 1) { -#ifdef QT_COMPILER_SUPPORTS_SSE4_1 - if (qCpuHasFeature(SSE4_1)) - qt_qimageScaleAARGBA_up_x_down_y_sse4(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - else -#endif - qt_qimageScaleAARGBA_up_x_down_y(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - } - /* if we're scaling down horizontally */ - else if (isi->xup_yup == 2) { -#ifdef QT_COMPILER_SUPPORTS_SSE4_1 - if (qCpuHasFeature(SSE4_1)) - qt_qimageScaleAARGBA_down_x_up_y_sse4(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - else -#endif - qt_qimageScaleAARGBA_down_x_up_y(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - } - /* if we're scaling down horizontally & vertically */ - else { -#ifdef QT_COMPILER_SUPPORTS_SSE4_1 - if (qCpuHasFeature(SSE4_1)) - qt_qimageScaleAARGBA_down_xy_sse4(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - else -#endif - qt_qimageScaleAARGBA_down_xy(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - } -} - -inline static void qt_qimageScaleAARGBA_helper(const unsigned int *pix, int xyap, int Cxy, int step, int &r, int &g, int &b, int &a) -{ - r = qRed(*pix) * xyap; - g = qGreen(*pix) * xyap; - b = qBlue(*pix) * xyap; - a = qAlpha(*pix) * xyap; - int j; - for (j = (1 << 14) - xyap; j > Cxy; j -= Cxy) { - pix += step; - r += qRed(*pix) * Cxy; - g += qGreen(*pix) * Cxy; - b += qBlue(*pix) * Cxy; - a += qAlpha(*pix) * Cxy; - } - pix += step; - r += qRed(*pix) * j; - g += qGreen(*pix) * j; - b += qBlue(*pix) * j; - a += qAlpha(*pix) * j; -} - -static void qt_qimageScaleAARGBA_up_x_down_y(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, - int dw, int dh, int dow, int sow) -{ - const unsigned int **ypoints = isi->ypoints; - int *xpoints = isi->xpoints; - int *xapoints = isi->xapoints; - int *yapoints = isi->yapoints; - - int end = dxx + dw; - - /* go through every scanline in the output buffer */ - for (int y = 0; y < dh; y++) { - int Cy = (yapoints[dyy + y]) >> 16; - int yap = (yapoints[dyy + y]) & 0xffff; - - unsigned int *dptr = dest + dx + ((y + dy) * dow); - for (int x = dxx; x < end; x++) { - const unsigned int *sptr = ypoints[dyy + y] + xpoints[x]; - int r, g, b, a; - qt_qimageScaleAARGBA_helper(sptr, yap, Cy, sow, r, g, b, a); - - int xap = xapoints[x]; - if (xap > 0) { - int rr, gg, bb, aa; - qt_qimageScaleAARGBA_helper(sptr + 1, yap, Cy, sow, rr, gg, bb, aa); - - r = r * (256 - xap); - g = g * (256 - xap); - b = b * (256 - xap); - a = a * (256 - xap); - r = (r + (rr * xap)) >> 8; - g = (g + (gg * xap)) >> 8; - b = (b + (bb * xap)) >> 8; - a = (a + (aa * xap)) >> 8; - } - *dptr++ = qRgba(r >> 14, g >> 14, b >> 14, a >> 14); - } - } -} - -static void qt_qimageScaleAARGBA_down_x_up_y(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, - int dw, int dh, int dow, int sow) -{ - const unsigned int **ypoints = isi->ypoints; - int *xpoints = isi->xpoints; - int *xapoints = isi->xapoints; - int *yapoints = isi->yapoints; - - int end = dxx + dw; - - /* go through every scanline in the output buffer */ - for (int y = 0; y < dh; y++) { - unsigned int *dptr = dest + dx + ((y + dy) * dow); - for (int x = dxx; x < end; x++) { - int Cx = xapoints[x] >> 16; - int xap = xapoints[x] & 0xffff; - - const unsigned int *sptr = ypoints[dyy + y] + xpoints[x]; - int r, g, b, a; - qt_qimageScaleAARGBA_helper(sptr, xap, Cx, 1, r, g, b, a); - - int yap = yapoints[dyy + y]; - if (yap > 0) { - int rr, gg, bb, aa; - qt_qimageScaleAARGBA_helper(sptr + sow, xap, Cx, 1, rr, gg, bb, aa); - - r = r * (256 - yap); - g = g * (256 - yap); - b = b * (256 - yap); - a = a * (256 - yap); - r = (r + (rr * yap)) >> 8; - g = (g + (gg * yap)) >> 8; - b = (b + (bb * yap)) >> 8; - a = (a + (aa * yap)) >> 8; - } - *dptr = qRgba(r >> 14, g >> 14, b >> 14, a >> 14); - dptr++; - } - } -} - -static void qt_qimageScaleAARGBA_down_xy(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, int dw, - int dh, int dow, int sow) -{ - const unsigned int **ypoints = isi->ypoints; - int *xpoints = isi->xpoints; - int *xapoints = isi->xapoints; - int *yapoints = isi->yapoints; - - int end = dxx + dw; - - for (int y = 0; y < dh; y++) { - int Cy = (yapoints[dyy + y]) >> 16; - int yap = (yapoints[dyy + y]) & 0xffff; - - unsigned int *dptr = dest + dx + ((y + dy) * dow); - for (int x = dxx; x < end; x++) { - int Cx = xapoints[x] >> 16; - int xap = xapoints[x] & 0xffff; - - const unsigned int *sptr = ypoints[dyy + y] + xpoints[x]; - int rx, gx, bx, ax; - qt_qimageScaleAARGBA_helper(sptr, xap, Cx, 1, rx, gx, bx, ax); - - int r = ((rx>>4) * yap); - int g = ((gx>>4) * yap); - int b = ((bx>>4) * yap); - int a = ((ax>>4) * yap); - - int j; - for (j = (1 << 14) - yap; j > Cy; j -= Cy) { - sptr += sow; - qt_qimageScaleAARGBA_helper(sptr, xap, Cx, 1, rx, gx, bx, ax); - r += ((rx>>4) * Cy); - g += ((gx>>4) * Cy); - b += ((bx>>4) * Cy); - a += ((ax>>4) * Cy); - } - sptr += sow; - qt_qimageScaleAARGBA_helper(sptr, xap, Cx, 1, rx, gx, bx, ax); - - r += ((rx>>4) * j); - g += ((gx>>4) * j); - b += ((bx>>4) * j); - a += ((ax>>4) * j); - - *dptr = qRgba(r >> 24, g >> 24, b >> 24, a >> 24); - dptr++; - } - } -} - -static void qt_qimageScaleAARGB_up_x_down_y(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, int dw, - int dh, int dow, int sow); - -static void qt_qimageScaleAARGB_down_x_up_y(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, int dw, - int dh, int dow, int sow); - -static void qt_qimageScaleAARGB_down_xy(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, int dw, - int dh, int dow, int sow); - -/* scale by area sampling - IGNORE the ALPHA byte*/ -static void qt_qimageScaleAARGB(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, - int dw, int dh, int dow, int sow) -{ - /* scaling up both ways */ - if (isi->xup_yup == 3) { - qt_qimageScaleAARGBA_up_xy(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - } - /* if we're scaling down vertically */ - else if (isi->xup_yup == 1) { -#ifdef QT_COMPILER_SUPPORTS_SSE4_1 - if (qCpuHasFeature(SSE4_1)) - qt_qimageScaleAARGBA_up_x_down_y_sse4(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - else -#endif - qt_qimageScaleAARGB_up_x_down_y(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - } - /* if we're scaling down horizontally */ - else if (isi->xup_yup == 2) { -#ifdef QT_COMPILER_SUPPORTS_SSE4_1 - if (qCpuHasFeature(SSE4_1)) - qt_qimageScaleAARGBA_down_x_up_y_sse4(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - else -#endif - qt_qimageScaleAARGB_down_x_up_y(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - } - /* if we're scaling down horizontally & vertically */ - else { -#ifdef QT_COMPILER_SUPPORTS_SSE4_1 - if (qCpuHasFeature(SSE4_1)) - qt_qimageScaleAARGBA_down_xy_sse4(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - else -#endif - qt_qimageScaleAARGB_down_xy(isi, dest, dxx, dyy, dx, dy, dw, dh, dow, sow); - } -} - - -inline static void qt_qimageScaleAARGB_helper(const unsigned int *pix, int xyap, int Cxy, int step, int &r, int &g, int &b) -{ - r = qRed(*pix) * xyap; - g = qGreen(*pix) * xyap; - b = qBlue(*pix) * xyap; - int j; - for (j = (1 << 14) - xyap; j > Cxy; j -= Cxy) { - pix += step; - r += qRed(*pix) * Cxy; - g += qGreen(*pix) * Cxy; - b += qBlue(*pix) * Cxy; - } - pix += step; - r += qRed(*pix) * j; - g += qGreen(*pix) * j; - b += qBlue(*pix) * j; -} - -static void qt_qimageScaleAARGB_up_x_down_y(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, int dw, - int dh, int dow, int sow) -{ - const unsigned int **ypoints = isi->ypoints; - int *xpoints = isi->xpoints; - int *xapoints = isi->xapoints; - int *yapoints = isi->yapoints; - - int end = dxx + dw; - - /* go through every scanline in the output buffer */ - for (int y = 0; y < dh; y++) { - int Cy = (yapoints[dyy + y]) >> 16; - int yap = (yapoints[dyy + y]) & 0xffff; - - unsigned int *dptr = dest + dx + ((y + dy) * dow); - for (int x = dxx; x < end; x++) { - const unsigned int *sptr = ypoints[dyy + y] + xpoints[x]; - int r, g, b; - qt_qimageScaleAARGB_helper(sptr, yap, Cy, sow, r, g, b); - - int xap = xapoints[x]; - if (xap > 0) { - int rr, bb, gg; - qt_qimageScaleAARGB_helper(sptr + 1, yap, Cy, sow, rr, gg, bb); - - r = r * (256 - xap); - g = g * (256 - xap); - b = b * (256 - xap); - r = (r + (rr * xap)) >> 8; - g = (g + (gg * xap)) >> 8; - b = (b + (bb * xap)) >> 8; - } - *dptr++ = qRgb(r >> 14, g >> 14, b >> 14); - } - } -} - -static void qt_qimageScaleAARGB_down_x_up_y(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, int dw, - int dh, int dow, int sow) -{ - const unsigned int **ypoints = isi->ypoints; - int *xpoints = isi->xpoints; - int *xapoints = isi->xapoints; - int *yapoints = isi->yapoints; - - int end = dxx + dw; - - /* go through every scanline in the output buffer */ - for (int y = 0; y < dh; y++) { - unsigned int *dptr = dest + dx + ((y + dy) * dow); - for (int x = dxx; x < end; x++) { - int Cx = xapoints[x] >> 16; - int xap = xapoints[x] & 0xffff; - - const unsigned int *sptr = ypoints[dyy + y] + xpoints[x]; - int r, g, b; - qt_qimageScaleAARGB_helper(sptr, xap, Cx, 1, r, g, b); - - int yap = yapoints[dyy + y]; - if (yap > 0) { - int rr, bb, gg; - qt_qimageScaleAARGB_helper(sptr + sow, xap, Cx, 1, rr, gg, bb); - - r = r * (256 - yap); - g = g * (256 - yap); - b = b * (256 - yap); - r = (r + (rr * yap)) >> 8; - g = (g + (gg * yap)) >> 8; - b = (b + (bb * yap)) >> 8; - } - *dptr++ = qRgb(r >> 14, g >> 14, b >> 14); - } - } -} - -static void qt_qimageScaleAARGB_down_xy(QImageScaleInfo *isi, unsigned int *dest, - int dxx, int dyy, int dx, int dy, int dw, - int dh, int dow, int sow) -{ - const unsigned int **ypoints = isi->ypoints; - int *xpoints = isi->xpoints; - int *xapoints = isi->xapoints; - int *yapoints = isi->yapoints; - - int end = dxx + dw; - - for (int y = 0; y < dh; y++) { - int Cy = (yapoints[dyy + y]) >> 16; - int yap = (yapoints[dyy + y]) & 0xffff; - - unsigned int *dptr = dest + dx + ((y + dy) * dow); - for (int x = dxx; x < end; x++) { - int Cx = xapoints[x] >> 16; - int xap = xapoints[x] & 0xffff; - - const unsigned int *sptr = ypoints[dyy + y] + xpoints[x]; - int rx, gx, bx; - qt_qimageScaleAARGB_helper(sptr, xap, Cx, 1, rx, gx, bx); - - int r = (rx >> 4) * yap; - int g = (gx >> 4) * yap; - int b = (bx >> 4) * yap; - - int j; - for (j = (1 << 14) - yap; j > Cy; j -= Cy) { - sptr += sow; - qt_qimageScaleAARGB_helper(sptr, xap, Cx, 1, rx, gx, bx); - - r += (rx >> 4) * Cy; - g += (gx >> 4) * Cy; - b += (bx >> 4) * Cy; - } - sptr += sow; - qt_qimageScaleAARGB_helper(sptr, xap, Cx, 1, rx, gx, bx); - - r += (rx >> 4) * j; - g += (gx >> 4) * j; - b += (bx >> 4) * j; - - *dptr = qRgb(r >> 24, g >> 24, b >> 24); - dptr++; - } - } -} - -QImage qSmoothScaleImage(const QImage &src, int dw, int dh) -{ - QImage buffer; - if (src.isNull() || dw <= 0 || dh <= 0) - return buffer; - - int w = src.width(); - int h = src.height(); - QImageScaleInfo *scaleinfo = - qimageCalcScaleInfo(src, w, h, dw, dh, true); - if (!scaleinfo) - return buffer; - - buffer = QImage(dw, dh, src.format()); - if (buffer.isNull()) { - qWarning("QImage: out of memory, returning null"); - qimageFreeScaleInfo(scaleinfo); - return QImage(); - } - - if (src.hasAlphaChannel()) - qt_qimageScaleAARGBA(scaleinfo, (unsigned int *)buffer.scanLine(0), - 0, 0, 0, 0, dw, dh, dw, src.bytesPerLine() / 4); - else - qt_qimageScaleAARGB(scaleinfo, (unsigned int *)buffer.scanLine(0), - 0, 0, 0, 0, dw, dh, dw, src.bytesPerLine() / 4); - - qimageFreeScaleInfo(scaleinfo); - return buffer; -} - -QT_END_NAMESPACE diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qpaintengine_p.h b/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qpaintengine_p.h deleted file mode 100644 index 468d671c0..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qpaintengine_p.h +++ /dev/null @@ -1,127 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPAINTENGINE_P_H -#define QPAINTENGINE_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of other Qt classes. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "QtGui/qpainter.h" -#include "QtGui/qpaintengine.h" -#include "QtGui/qregion.h" -#include "private/qobject_p.h" - -QT_BEGIN_NAMESPACE - -class QPaintDevice; - -class Q_GUI_EXPORT QPaintEnginePrivate -{ - Q_DECLARE_PUBLIC(QPaintEngine) -public: - QPaintEnginePrivate() : pdev(0), q_ptr(0), currentClipDevice(0), hasSystemTransform(0), - hasSystemViewport(0) {} - virtual ~QPaintEnginePrivate() { } - QPaintDevice *pdev; - QPaintEngine *q_ptr; - QRegion systemClip; - QRect systemRect; - QRegion systemViewport; - QTransform systemTransform; - QPaintDevice *currentClipDevice; - uint hasSystemTransform : 1; - uint hasSystemViewport : 1; - - inline void transformSystemClip() - { - if (systemClip.isEmpty()) - return; - - if (hasSystemTransform) { - if (systemTransform.type() <= QTransform::TxTranslate) - systemClip.translate(qRound(systemTransform.dx()), qRound(systemTransform.dy())); - else { -// Transform the system clip region back from device pixels to device-independent pixels before -// applying systemTransform, which already has transform from device-independent pixels to device pixels -#ifdef Q_OS_MAC - QTransform scaleTransform; - const qreal invDevicePixelRatio = 1. / pdev->devicePixelRatio(); - scaleTransform.scale(invDevicePixelRatio, invDevicePixelRatio); - systemClip = systemTransform.map(scaleTransform.map(systemClip)); -#else - systemClip = systemTransform.map(systemClip); -#endif - } - } - - // Make sure we're inside the viewport. - if (hasSystemViewport) { - systemClip &= systemViewport; - if (systemClip.isEmpty()) { - // We don't want to paint without system clip, so set it to 1 pixel :) - systemClip = QRect(systemViewport.boundingRect().topLeft(), QSize(1, 1)); - } - } - } - - inline void setSystemTransform(const QTransform &xform) - { - systemTransform = xform; - if ((hasSystemTransform = !xform.isIdentity()) || hasSystemViewport) - transformSystemClip(); - systemStateChanged(); - } - - inline void setSystemViewport(const QRegion ®ion) - { - systemViewport = region; - hasSystemViewport = !systemViewport.isEmpty(); - } - - virtual void systemStateChanged() { } - - void drawBoxTextItem(const QPointF &p, const QTextItemInt &ti); -}; - -QT_END_NAMESPACE - -#endif // QPAINTENGINE_P_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qplatformbackingstore.h b/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qplatformbackingstore.h deleted file mode 100644 index 0cb1c9a7f..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/painting/qplatformbackingstore.h +++ /dev/null @@ -1,150 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QPLATFORMBACKINGSTORE_H -#define QPLATFORMBACKINGSTORE_H - -// -// W A R N I N G -// ------------- -// -// This file is part of the QPA API and is not meant to be used -// in applications. Usage of this API may make your code -// source and binary incompatible with future versions of Qt. -// - -#include -#include - -#include -#include -#include - -QT_BEGIN_NAMESPACE - - -class QRegion; -class QRect; -class QPoint; -class QImage; -class QPlatformBackingStorePrivate; -class QPlatformWindow; -class QPlatformTextureList; -class QPlatformTextureListPrivate; -class QOpenGLContext; -class QPlatformGraphicsBuffer; - -#ifndef QT_NO_OPENGL -class Q_GUI_EXPORT QPlatformTextureList : public QObject -{ - Q_OBJECT - Q_DECLARE_PRIVATE(QPlatformTextureList) -public: - enum Flag { - StacksOnTop = 0x01 - }; - Q_DECLARE_FLAGS(Flags, Flag) - - explicit QPlatformTextureList(QObject *parent = 0); - ~QPlatformTextureList(); - - int count() const; - bool isEmpty() const { return count() == 0; } - GLuint textureId(int index) const; - QRect geometry(int index) const; - QRect clipRect(int index) const; - void *source(int index); - Flags flags(int index) const; - void lock(bool on); - bool isLocked() const; - - void appendTexture(void *source, GLuint textureId, const QRect &geometry, - const QRect &clipRect = QRect(), Flags flags = 0); - void clear(); - - Q_SIGNALS: - void locked(bool); -}; -Q_DECLARE_OPERATORS_FOR_FLAGS(QPlatformTextureList::Flags) -#endif - -class Q_GUI_EXPORT QPlatformBackingStore -{ -public: - explicit QPlatformBackingStore(QWindow *window); - virtual ~QPlatformBackingStore(); - - QWindow *window() const; - - virtual QPaintDevice *paintDevice() = 0; - - // 'window' can be a child window, in which case 'region' is in child window coordinates and - // offset is the (child) window's offset in relation to the window surface. - virtual void flush(QWindow *window, const QRegion ®ion, const QPoint &offset) = 0; -#ifndef QT_NO_OPENGL - virtual void composeAndFlush(QWindow *window, const QRegion ®ion, const QPoint &offset, - QPlatformTextureList *textures, QOpenGLContext *context, - bool translucentBackground); - virtual QImage toImage() const; - enum TextureFlag { - TextureSwizzle = 0x01, - TextureFlip = 0x02 - }; - Q_DECLARE_FLAGS(TextureFlags, TextureFlag) - virtual GLuint toTexture(const QRegion &dirtyRegion, QSize *textureSize, TextureFlags *flags) const; -#endif - - virtual QPlatformGraphicsBuffer *graphicsBuffer() const; - - virtual void resize(const QSize &size, const QRegion &staticContents) = 0; - - virtual bool scroll(const QRegion &area, int dx, int dy); - - virtual void beginPaint(const QRegion &); - virtual void beforeBeginPaint(QWindow *window) { - } - virtual void endPaint(); - virtual void afterEndPaint(QWindow *window) { - } - -private: - QPlatformBackingStorePrivate *d_ptr; -}; - -#ifndef QT_NO_OPENGL -Q_DECLARE_OPERATORS_FOR_FLAGS(QPlatformBackingStore::TextureFlags) -#endif - -QT_END_NAMESPACE - -#endif // QPLATFORMBACKINGSTORE_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/text/qtextlayout.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/gui/text/qtextlayout.cpp deleted file mode 100644 index 082925006..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/text/qtextlayout.cpp +++ /dev/null @@ -1,2911 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qtextlayout.h" -#include "qtextengine_p.h" - -#include -#include -#include -#include -#include -#include -#include -#include "qtextdocument_p.h" -#include "qtextformat_p.h" -#include "qpainterpath.h" -#include "qglyphrun.h" -#include "qglyphrun_p.h" -#include "qrawfont.h" -#include "qrawfont_p.h" -#include - -#include - -#include "qfontengine_p.h" -#include - -QT_BEGIN_NAMESPACE - -#define ObjectSelectionBrush (QTextFormat::ForegroundBrush + 1) -#define SuppressText 0x5012 -#define SuppressBackground 0x513 - -/*! - \class QTextLayout::FormatRange - \reentrant - - \brief The QTextLayout::FormatRange structure is used to apply extra formatting information - for a specified area in the text layout's content. - \inmodule QtGui - - \sa QTextLayout::setAdditionalFormats(), QTextLayout::draw() -*/ - -/*! - \variable QTextLayout::FormatRange::start - Specifies the beginning of the format range within the text layout's text. -*/ - -/*! - \variable QTextLayout::FormatRange::length - Specifies the numer of characters the format range spans. -*/ - -/*! - \variable QTextLayout::FormatRange::format - Specifies the format to apply. -*/ - -/*! - \class QTextInlineObject - \reentrant - - \brief The QTextInlineObject class represents an inline object in - a QAbstractTextDocumentLayout and its implementations. - \inmodule QtGui - - \ingroup richtext-processing - - Normally, you do not need to create a QTextInlineObject. It is - used by QAbstractTextDocumentLayout to handle inline objects when - implementing a custom layout. - - The inline object has various attributes that can be set, for - example using, setWidth(), setAscent(), and setDescent(). The - rectangle it occupies is given by rect(), and its direction by - textDirection(). Its position in the text layout is given by - textPosition(), and its format is given by format(). -*/ - -/*! - \fn QTextInlineObject::QTextInlineObject(int i, QTextEngine *e) - \internal - - Creates a new inline object for the item at position \a i in the - text engine \a e. -*/ - -/*! - \fn QTextInlineObject::QTextInlineObject() - - \internal -*/ - -/*! - \fn bool QTextInlineObject::isValid() const - - Returns \c true if this inline object is valid; otherwise returns - false. -*/ - -/*! - Returns the inline object's rectangle. - - \sa ascent(), descent(), width() -*/ -QRectF QTextInlineObject::rect() const -{ - QScriptItem& si = eng->layoutData->items[itm]; - return QRectF(0, -si.ascent.toReal(), si.width.toReal(), si.height().toReal()); -} - -/*! - Returns the inline object's width. - - \sa ascent(), descent(), rect() -*/ -qreal QTextInlineObject::width() const -{ - return eng->layoutData->items[itm].width.toReal(); -} - -/*! - Returns the inline object's ascent. - - \sa descent(), width(), rect() -*/ -qreal QTextInlineObject::ascent() const -{ - return eng->layoutData->items[itm].ascent.toReal(); -} - -/*! - Returns the inline object's descent. - - \sa ascent(), width(), rect() -*/ -qreal QTextInlineObject::descent() const -{ - return eng->layoutData->items[itm].descent.toReal(); -} - -/*! - Returns the inline object's total height. This is equal to - ascent() + descent() + 1. - - \sa ascent(), descent(), width(), rect() -*/ -qreal QTextInlineObject::height() const -{ - return eng->layoutData->items[itm].height().toReal(); -} - -/*! - Sets the inline object's width to \a w. - - \sa width(), ascent(), descent(), rect() -*/ -void QTextInlineObject::setWidth(qreal w) -{ - eng->layoutData->items[itm].width = QFixed::fromReal(w); -} - -/*! - Sets the inline object's ascent to \a a. - - \sa ascent(), setDescent(), width(), rect() -*/ -void QTextInlineObject::setAscent(qreal a) -{ - eng->layoutData->items[itm].ascent = QFixed::fromReal(a); -} - -/*! - Sets the inline object's descent to \a d. - - \sa descent(), setAscent(), width(), rect() -*/ -void QTextInlineObject::setDescent(qreal d) -{ - eng->layoutData->items[itm].descent = QFixed::fromReal(d); -} - -/*! - The position of the inline object within the text layout. -*/ -int QTextInlineObject::textPosition() const -{ - return eng->layoutData->items[itm].position; -} - -/*! - Returns an integer describing the format of the inline object - within the text layout. -*/ -int QTextInlineObject::formatIndex() const -{ - return eng->formatIndex(&eng->layoutData->items[itm]); -} - -/*! - Returns format of the inline object within the text layout. -*/ -QTextFormat QTextInlineObject::format() const -{ - return eng->format(&eng->layoutData->items[itm]); -} - -/*! - Returns if the object should be laid out right-to-left or left-to-right. -*/ -Qt::LayoutDirection QTextInlineObject::textDirection() const -{ - return (eng->layoutData->items[itm].analysis.bidiLevel % 2 ? Qt::RightToLeft : Qt::LeftToRight); -} - -/*! - \class QTextLayout - \reentrant - - \brief The QTextLayout class is used to lay out and render text. - \inmodule QtGui - - \ingroup richtext-processing - - It offers many features expected from a modern text layout - engine, including Unicode compliant rendering, line breaking and - handling of cursor positioning. It can also produce and render - device independent layout, something that is important for WYSIWYG - applications. - - The class has a rather low level API and unless you intend to - implement your own text rendering for some specialized widget, you - probably won't need to use it directly. - - QTextLayout can be used with both plain and rich text. - - QTextLayout can be used to create a sequence of QTextLine - instances with given widths and can position them independently - on the screen. Once the layout is done, these lines can be drawn - on a paint device. - - The text to be laid out can be provided in the constructor or set with - setText(). - - The layout can be seen as a sequence of QTextLine objects; use createLine() - to create a QTextLine instance, and lineAt() or lineForTextPosition() to retrieve - created lines. - - Here is a code snippet that demonstrates the layout phase: - \snippet code/src_gui_text_qtextlayout.cpp 0 - - The text can then be rendered by calling the layout's draw() function: - \snippet code/src_gui_text_qtextlayout.cpp 1 - - For a given position in the text you can find a valid cursor position with - isValidCursorPosition(), nextCursorPosition(), and previousCursorPosition(). - - The QTextLayout itself can be positioned with setPosition(); it has a - boundingRect(), and a minimumWidth() and a maximumWidth(). - - \sa QStaticText -*/ - -/*! - \enum QTextLayout::CursorMode - - \value SkipCharacters - \value SkipWords -*/ - -/*! - \fn QTextEngine *QTextLayout::engine() const - \internal - - Returns the text engine used to render the text layout. -*/ - -/*! - Constructs an empty text layout. - - \sa setText() -*/ -QTextLayout::QTextLayout() -{ d = new QTextEngine(); } - -/*! - Constructs a text layout to lay out the given \a text. -*/ -QTextLayout::QTextLayout(const QString& text) -{ - d = new QTextEngine(); - d->text = text; -} - -/*! - Constructs a text layout to lay out the given \a text with the specified - \a font. - - All the metric and layout calculations will be done in terms of - the paint device, \a paintdevice. If \a paintdevice is 0 the - calculations will be done in screen metrics. -*/ -QTextLayout::QTextLayout(const QString& text, const QFont &font, QPaintDevice *paintdevice) -{ - QFont f(font); - if (paintdevice) - f = QFont(font, paintdevice); - d = new QTextEngine((text.isNull() ? (const QString&)QString::fromLatin1("") : text), f); -} - -/*! - \internal - Constructs a text layout to lay out the given \a block. -*/ -QTextLayout::QTextLayout(const QTextBlock &block) -{ - d = new QTextEngine(); - d->block = block; -} - -/*! - Destructs the layout. -*/ -QTextLayout::~QTextLayout() -{ - if (!d->stackEngine) - delete d; -} - -#ifndef QT_NO_RAWFONT -/*! - \internal - Sets a raw font, to be used with QTextLayout::glyphRuns. - Note that this only supports the needs of WebKit. - Use of this function with e.g. QTextLayout::draw will result - in undefined behaviour. -*/ -void QTextLayout::setRawFont(const QRawFont &rawFont) -{ - d->rawFont = rawFont; - d->useRawFont = true; - d->resetFontEngineCache(); -} -#endif - -/*! - Sets the layout's font to the given \a font. The layout is - invalidated and must be laid out again. - - \sa font() -*/ -void QTextLayout::setFont(const QFont &font) -{ - d->fnt = font; -#ifndef QT_NO_RAWFONT - d->useRawFont = false; -#endif - d->resetFontEngineCache(); -} - -/*! - Returns the current font that is used for the layout, or a default - font if none is set. - - \sa setFont() -*/ -QFont QTextLayout::font() const -{ - return d->font(); -} - -/*! - Sets the layout's text to the given \a string. The layout is - invalidated and must be laid out again. - - Notice that when using this QTextLayout as part of a QTextDocument this - method will have no effect. - - \sa text() -*/ -void QTextLayout::setText(const QString& string) -{ - d->invalidate(); - d->clearLineData(); - d->text = string; -} - -/*! - Returns the layout's text. - - \sa setText() -*/ -QString QTextLayout::text() const -{ - return d->text; -} - -/*! - Sets the text option structure that controls the layout process to the - given \a option. - - \sa textOption() -*/ -void QTextLayout::setTextOption(const QTextOption &option) -{ - d->option = option; -} - -/*! - Returns the current text option used to control the layout process. - - \sa setTextOption() -*/ -const QTextOption &QTextLayout::textOption() const -{ - return d->option; -} - -/*! - Sets the \a position and \a text of the area in the layout that is - processed before editing occurs. The layout is - invalidated and must be laid out again. - - \sa preeditAreaPosition(), preeditAreaText() -*/ -void QTextLayout::setPreeditArea(int position, const QString &text) -{ - if (d->preeditAreaPosition() == position && d->preeditAreaText() == text) - return; - d->setPreeditArea(position, text); - - if (d->block.docHandle()) - d->block.docHandle()->documentChange(d->block.position(), d->block.length()); -} - -/*! - Returns the position of the area in the text layout that will be - processed before editing occurs. - - \sa preeditAreaText() -*/ -int QTextLayout::preeditAreaPosition() const -{ - return d->preeditAreaPosition(); -} - -/*! - Returns the text that is inserted in the layout before editing occurs. - - \sa preeditAreaPosition() -*/ -QString QTextLayout::preeditAreaText() const -{ - return d->preeditAreaText(); -} - - -/*! - Sets the additional formats supported by the text layout to \a formatList. - The formats are applied with preedit area text in place. - - \sa additionalFormats(), clearAdditionalFormats() -*/ -void QTextLayout::setAdditionalFormats(const QList &formatList) -{ - d->setFormats(formatList); - - if (d->block.docHandle()) - d->block.docHandle()->documentChange(d->block.position(), d->block.length()); -} - -/*! - Returns the list of additional formats supported by the text layout. - - \sa setAdditionalFormats(), clearAdditionalFormats() -*/ -QList QTextLayout::additionalFormats() const -{ - return d->formats(); -} - -/*! - Clears the list of additional formats supported by the text layout. - - \sa additionalFormats(), setAdditionalFormats() -*/ -void QTextLayout::clearAdditionalFormats() -{ - setAdditionalFormats(QList()); -} - -/*! - Enables caching of the complete layout information if \a enable is - true; otherwise disables layout caching. Usually - QTextLayout throws most of the layouting information away after a - call to endLayout() to reduce memory consumption. If you however - want to draw the laid out text directly afterwards enabling caching - might speed up drawing significantly. - - \sa cacheEnabled() -*/ -void QTextLayout::setCacheEnabled(bool enable) -{ - d->cacheGlyphs = enable; -} - -/*! - Returns \c true if the complete layout information is cached; otherwise - returns \c false. - - \sa setCacheEnabled() -*/ -bool QTextLayout::cacheEnabled() const -{ - return d->cacheGlyphs; -} - -/*! - Sets the visual cursor movement style to the given \a style. If the - QTextLayout is backed by a document, you can ignore this and use the option - in QTextDocument, this option is for widgets like QLineEdit or custom - widgets without a QTextDocument. Default value is Qt::LogicalMoveStyle. - - \sa cursorMoveStyle() -*/ -void QTextLayout::setCursorMoveStyle(Qt::CursorMoveStyle style) -{ - d->visualMovement = style == Qt::VisualMoveStyle; -} - -/*! - The cursor movement style of this QTextLayout. The default is - Qt::LogicalMoveStyle. - - \sa setCursorMoveStyle() -*/ -Qt::CursorMoveStyle QTextLayout::cursorMoveStyle() const -{ - return d->visualMovement ? Qt::VisualMoveStyle : Qt::LogicalMoveStyle; -} - -/*! - Begins the layout process. - - \sa endLayout() -*/ -void QTextLayout::beginLayout() -{ -#ifndef QT_NO_DEBUG - if (d->layoutData && d->layoutData->layoutState == QTextEngine::InLayout) { - qWarning("QTextLayout::beginLayout: Called while already doing layout"); - return; - } -#endif - d->invalidate(); - d->clearLineData(); - d->itemize(); - d->layoutData->layoutState = QTextEngine::InLayout; -} - -/*! - Ends the layout process. - - \sa beginLayout() -*/ -void QTextLayout::endLayout() -{ -#ifndef QT_NO_DEBUG - if (!d->layoutData || d->layoutData->layoutState == QTextEngine::LayoutEmpty) { - qWarning("QTextLayout::endLayout: Called without beginLayout()"); - return; - } -#endif - int l = d->lines.size(); - if (l && d->lines.at(l-1).length < 0) { - QTextLine(l-1, d).setNumColumns(INT_MAX); - } - d->layoutData->layoutState = QTextEngine::LayoutEmpty; - if (!d->cacheGlyphs) - d->freeMemory(); -} - -/*! - \since 4.4 - - Clears the line information in the layout. After having called - this function, lineCount() returns 0. -*/ -void QTextLayout::clearLayout() -{ - d->clearLineData(); -} - -/*! - Returns the next valid cursor position after \a oldPos that - respects the given cursor \a mode. - Returns value of \a oldPos, if \a oldPos is not a valid cursor position. - - \sa isValidCursorPosition(), previousCursorPosition() -*/ -int QTextLayout::nextCursorPosition(int oldPos, CursorMode mode) const -{ - const QCharAttributes *attributes = d->attributes(); - int len = d->block.isValid() ? d->block.length() - 1 - : d->layoutData->string.length(); - Q_ASSERT(len <= d->layoutData->string.length()); - if (!attributes || oldPos < 0 || oldPos >= len) - return oldPos; - - if (mode == SkipCharacters) { - oldPos++; - while (oldPos < len && !attributes[oldPos].graphemeBoundary) - oldPos++; - } else { - while (oldPos < len && attributes[oldPos].whiteSpace) - oldPos++; - - if (oldPos < len && d->atWordSeparator(oldPos)) { - oldPos++; - while (oldPos < len && d->atWordSeparator(oldPos)) - oldPos++; - } else { - while (oldPos < len && !attributes[oldPos].whiteSpace && !d->atWordSeparator(oldPos)) - oldPos++; - } - } - - return oldPos; -} - -/*! - Returns the first valid cursor position before \a oldPos that - respects the given cursor \a mode. - Returns value of \a oldPos, if \a oldPos is not a valid cursor position. - - \sa isValidCursorPosition(), nextCursorPosition() -*/ -int QTextLayout::previousCursorPosition(int oldPos, CursorMode mode) const -{ - const QCharAttributes *attributes = d->attributes(); - int len = d->block.isValid() ? d->block.length() - 1 - : d->layoutData->string.length(); - Q_ASSERT(len <= d->layoutData->string.length()); - if (!attributes || oldPos <= 0 || oldPos > len) - return oldPos; - - if (mode == SkipCharacters) { - oldPos--; - while (oldPos && !attributes[oldPos].graphemeBoundary) - oldPos--; - } else { - while (oldPos > 0 && attributes[oldPos - 1].whiteSpace) - oldPos--; - - if (oldPos && d->atWordSeparator(oldPos-1)) { - oldPos--; - while (oldPos && d->atWordSeparator(oldPos-1)) - oldPos--; - } else { - while (oldPos > 0 && !attributes[oldPos - 1].whiteSpace && !d->atWordSeparator(oldPos-1)) - oldPos--; - } - } - - return oldPos; -} - -/*! - Returns the cursor position to the right of \a oldPos, next to it. - It's dependent on the visual position of characters, after bi-directional - reordering. - - \sa leftCursorPosition(), nextCursorPosition() -*/ -int QTextLayout::rightCursorPosition(int oldPos) const -{ - int newPos = d->positionAfterVisualMovement(oldPos, QTextCursor::Right); -// qDebug("%d -> %d", oldPos, newPos); - return newPos; -} - -/*! - Returns the cursor position to the left of \a oldPos, next to it. - It's dependent on the visual position of characters, after bi-directional - reordering. - - \sa rightCursorPosition(), previousCursorPosition() -*/ -int QTextLayout::leftCursorPosition(int oldPos) const -{ - int newPos = d->positionAfterVisualMovement(oldPos, QTextCursor::Left); -// qDebug("%d -> %d", oldPos, newPos); - return newPos; -} - -/*!/ - Returns \c true if position \a pos is a valid cursor position. - - In a Unicode context some positions in the text are not valid - cursor positions, because the position is inside a Unicode - surrogate or a grapheme cluster. - - A grapheme cluster is a sequence of two or more Unicode characters - that form one indivisible entity on the screen. For example the - latin character `\unicode{0xC4}' can be represented in Unicode by two - characters, `A' (0x41), and the combining diaresis (0x308). A text - cursor can only validly be positioned before or after these two - characters, never between them since that wouldn't make sense. In - indic languages every syllable forms a grapheme cluster. -*/ -bool QTextLayout::isValidCursorPosition(int pos) const -{ - const QCharAttributes *attributes = d->attributes(); - if (!attributes || pos < 0 || pos > (int)d->layoutData->string.length()) - return false; - return attributes[pos].graphemeBoundary; -} - -/*! - Returns a new text line to be laid out if there is text to be - inserted into the layout; otherwise returns an invalid text line. - - The text layout creates a new line object that starts after the - last line in the layout, or at the beginning if the layout is empty. - The layout maintains an internal cursor, and each line is filled - with text from the cursor position onwards when the - QTextLine::setLineWidth() function is called. - - Once QTextLine::setLineWidth() is called, a new line can be created and - filled with text. Repeating this process will lay out the whole block - of text contained in the QTextLayout. If there is no text left to be - inserted into the layout, the QTextLine returned will not be valid - (isValid() will return false). -*/ -QTextLine QTextLayout::createLine() -{ -#ifndef QT_NO_DEBUG - if (!d->layoutData || d->layoutData->layoutState == QTextEngine::LayoutEmpty) { - qWarning("QTextLayout::createLine: Called without layouting"); - return QTextLine(); - } -#endif - if (d->layoutData->layoutState == QTextEngine::LayoutFailed) - return QTextLine(); - - int l = d->lines.size(); - if (l && d->lines.at(l-1).length < 0) { - QTextLine(l-1, d).setNumColumns(INT_MAX); - } - int from = l > 0 ? d->lines.at(l-1).from + d->lines.at(l-1).length + d->lines.at(l-1).trailingSpaces : 0; - int strlen = d->layoutData->string.length(); - if (l && from >= strlen) { - if (!d->lines.at(l-1).length || d->layoutData->string.at(strlen - 1) != QChar::LineSeparator) - return QTextLine(); - } - - QScriptLine line; - line.from = from; - line.length = -1; - line.justified = false; - line.gridfitted = false; - - d->lines.append(line); - return QTextLine(l, d); -} - -/*! - Returns the number of lines in this text layout. - - \sa lineAt() -*/ -int QTextLayout::lineCount() const -{ - return d->lines.size(); -} - -/*! - Returns the \a{i}-th line of text in this text layout. - - \sa lineCount(), lineForTextPosition() -*/ -QTextLine QTextLayout::lineAt(int i) const -{ - return i < lineCount() ? QTextLine(i, d) : QTextLine(); -} - -/*! - Returns the line that contains the cursor position specified by \a pos. - - \sa isValidCursorPosition(), lineAt() -*/ -QTextLine QTextLayout::lineForTextPosition(int pos) const -{ - int lineNum = d->lineNumberForTextPosition(pos); - return lineNum >= 0 ? lineAt(lineNum) : QTextLine(); -} - -/*! - \since 4.2 - - The global position of the layout. This is independent of the - bounding rectangle and of the layout process. - - \sa setPosition() -*/ -QPointF QTextLayout::position() const -{ - return d->position; -} - -/*! - Moves the text layout to point \a p. - - \sa position() -*/ -void QTextLayout::setPosition(const QPointF &p) -{ - d->position = p; -} - -/*! - The smallest rectangle that contains all the lines in the layout. -*/ -QRectF QTextLayout::boundingRect() const -{ - if (d->lines.isEmpty()) - return QRectF(); - - QFixed xmax, ymax; - QFixed xmin = d->lines.at(0).x; - QFixed ymin = d->lines.at(0).y; - - for (int i = 0; i < d->lines.size(); ++i) { - const QScriptLine &si = d->lines[i]; - xmin = qMin(xmin, si.x); - ymin = qMin(ymin, si.y); - QFixed lineWidth = si.width < QFIXED_MAX ? qMax(si.width, si.textWidth) : si.textWidth; - xmax = qMax(xmax, si.x+lineWidth); - // ### shouldn't the ascent be used in ymin??? - ymax = qMax(ymax, si.y+si.height().ceil()); - } - return QRectF(xmin.toReal(), ymin.toReal(), (xmax-xmin).toReal(), (ymax-ymin).toReal()); -} - -/*! - The minimum width the layout needs. This is the width of the - layout's smallest non-breakable substring. - - \warning This function only returns a valid value after the layout - has been done. - - \sa maximumWidth() -*/ -qreal QTextLayout::minimumWidth() const -{ - return d->minWidth.toReal(); -} - -/*! - The maximum width the layout could expand to; this is essentially - the width of the entire text. - - \warning This function only returns a valid value after the layout - has been done. - - \sa minimumWidth() -*/ -qreal QTextLayout::maximumWidth() const -{ - return d->maxWidth.toReal(); -} - - -/*! - \internal -*/ -void QTextLayout::setFlags(int flags) -{ - if (flags & Qt::TextJustificationForced) { - d->option.setAlignment(Qt::AlignJustify); - d->forceJustification = true; - } - - if (flags & (Qt::TextForceLeftToRight|Qt::TextForceRightToLeft)) { - d->ignoreBidi = true; - d->option.setTextDirection((flags & Qt::TextForceLeftToRight) ? Qt::LeftToRight : Qt::RightToLeft); - } -} - -static void addSelectedRegionsToPath(QTextEngine *eng, int lineNumber, const QPointF &pos, QTextLayout::FormatRange *selection, - QPainterPath *region, QRectF boundingRect) -{ - const QScriptLine &line = eng->lines[lineNumber]; - - QTextLineItemIterator iterator(eng, lineNumber, pos, selection); - - - - const qreal selectionY = pos.y() + line.y.toReal(); - const qreal lineHeight = line.height().toReal(); - - QFixed lastSelectionX = iterator.x; - QFixed lastSelectionWidth; - - while (!iterator.atEnd()) { - iterator.next(); - - QFixed selectionX, selectionWidth; - if (iterator.getSelectionBounds(&selectionX, &selectionWidth)) { - if (selectionX == lastSelectionX + lastSelectionWidth) { - lastSelectionWidth += selectionWidth; - continue; - } - - if (lastSelectionWidth > 0) { - QRectF rect = boundingRect & QRectF(lastSelectionX.toReal(), selectionY, lastSelectionWidth.toReal(), lineHeight); - rect.moveLeft(qFloor(rect.left())); - rect.moveTop(qFloor(rect.top())); - region->addRect(rect); - } - - lastSelectionX = selectionX; - lastSelectionWidth = selectionWidth; - } - } - if (lastSelectionWidth > 0) { - QRectF rect = boundingRect & QRectF(lastSelectionX.toReal(), selectionY, lastSelectionWidth.toReal(), lineHeight); - rect.moveLeft(qFloor(rect.left())); - rect.moveTop(qFloor(rect.top())); - region->addRect(rect); - } -} - -static inline QRectF clipIfValid(const QRectF &rect, const QRectF &clip) -{ - return clip.isValid() ? (rect & clip) : rect; -} - - -/*! - Returns the glyph indexes and positions for all glyphs corresponding to the \a length characters - starting at the position \a from in this QTextLayout. This is an expensive function, and should - not be called in a time sensitive context. - - If \a from is less than zero, then the glyph run will begin at the first character in the - layout. If \a length is less than zero, it will span the entire string from the start position. - - \since 4.8 - - \sa draw(), QPainter::drawGlyphRun() -*/ -#if !defined(QT_NO_RAWFONT) -QList QTextLayout::glyphRuns(int from, int length) const -{ - if (from < 0) - from = 0; - if (length < 0) - length = text().length(); - - QHash, QGlyphRun> glyphRunHash; - for (int i=0; ilines.size(); ++i) { - if (d->lines[i].from > from + length) - break; - else if (d->lines[i].from + d->lines[i].length >= from) { - QList glyphRuns = QTextLine(i, d).glyphRuns(from, length); - - for (int j = 0; j < glyphRuns.size(); j++) { - const QGlyphRun &glyphRun = glyphRuns.at(j); - QRawFont rawFont = glyphRun.rawFont(); - - QFontEngine *fontEngine = rawFont.d->fontEngine; - QGlyphRun::GlyphRunFlags flags = glyphRun.flags(); - QPair key(fontEngine, int(flags)); - // merge the glyph runs using the same font - if (glyphRunHash.contains(key)) { - QGlyphRun &oldGlyphRun = glyphRunHash[key]; - - QVector indexes = oldGlyphRun.glyphIndexes(); - QVector positions = oldGlyphRun.positions(); - - indexes += glyphRun.glyphIndexes(); - positions += glyphRun.positions(); - - oldGlyphRun.setGlyphIndexes(indexes); - oldGlyphRun.setPositions(positions); - } else { - glyphRunHash[key] = glyphRun; - } - } - } - } - - return glyphRunHash.values(); -} -#endif // QT_NO_RAWFONT - -/*! - Draws the whole layout on the painter \a p at the position specified by \a pos. - The rendered layout includes the given \a selections and is clipped within - the rectangle specified by \a clip. -*/ -void QTextLayout::draw(QPainter *p, const QPointF &pos, const QVector &selections, const QRectF &clip) const -{ - if (d->lines.isEmpty()) - return; - - if (!d->layoutData) - d->itemize(); - - QPointF position = pos + d->position; - - QFixed clipy = (INT_MIN/256); - QFixed clipe = (INT_MAX/256); - if (clip.isValid()) { - clipy = QFixed::fromReal(clip.y() - position.y()); - clipe = clipy + QFixed::fromReal(clip.height()); - } - - int firstLine = 0; - int lastLine = d->lines.size(); - for (int i = 0; i < d->lines.size(); ++i) { - QTextLine l(i, d); - const QScriptLine &sl = d->lines[i]; - - if (sl.y > clipe) { - lastLine = i; - break; - } - if ((sl.y + sl.height()) < clipy) { - firstLine = i; - continue; - } - } - - QPainterPath excludedRegion; - QPainterPath textDoneRegion; - for (int i = 0; i < selections.size(); ++i) { - FormatRange selection = selections.at(i); - const QBrush bg = selection.format.background(); - - QPainterPath region; - region.setFillRule(Qt::WindingFill); - - for (int line = firstLine; line < lastLine; ++line) { - const QScriptLine &sl = d->lines[line]; - QTextLine tl(line, d); - - QRectF lineRect(tl.naturalTextRect()); - lineRect.translate(position); - lineRect.adjust(0, 0, d->leadingSpaceWidth(sl).toReal(), 0); - - bool isLastLineInBlock = (line == d->lines.size()-1); - int sl_length = sl.length + (isLastLineInBlock? 1 : 0); // the infamous newline - - - if (sl.from > selection.start + selection.length || sl.from + sl_length <= selection.start) - continue; // no actual intersection - - const bool selectionStartInLine = sl.from <= selection.start; - const bool selectionEndInLine = selection.start + selection.length < sl.from + sl_length; - - if (sl.length && (selectionStartInLine || selectionEndInLine)) { - addSelectedRegionsToPath(d, line, position, &selection, ®ion, clipIfValid(lineRect, clip)); - } else { - region.addRect(clipIfValid(lineRect, clip)); - } - - if (selection.format.boolProperty(QTextFormat::FullWidthSelection)) { - QRectF fullLineRect(tl.rect()); - fullLineRect.translate(position); - fullLineRect.setRight(QFIXED_MAX); - if (!selectionEndInLine) - region.addRect(clipIfValid(QRectF(lineRect.topRight(), fullLineRect.bottomRight()), clip)); - if (!selectionStartInLine) - region.addRect(clipIfValid(QRectF(fullLineRect.topLeft(), lineRect.bottomLeft()), clip)); - } else if (!selectionEndInLine - && isLastLineInBlock - &&!(d->option.flags() & QTextOption::ShowLineAndParagraphSeparators)) { - region.addRect(clipIfValid(QRectF(lineRect.right(), lineRect.top(), - lineRect.height()/4, lineRect.height()), clip)); - } - - } - { - const QPen oldPen = p->pen(); - const QBrush oldBrush = p->brush(); - - p->setPen(selection.format.penProperty(QTextFormat::OutlinePen)); - p->setBrush(selection.format.brushProperty(QTextFormat::BackgroundBrush)); - p->drawPath(region); - - p->setPen(oldPen); - p->setBrush(oldBrush); - } - - - - bool hasText = (selection.format.foreground().style() != Qt::NoBrush); - bool hasBackground= (selection.format.background().style() != Qt::NoBrush); - - if (hasBackground) { - selection.format.setProperty(ObjectSelectionBrush, selection.format.property(QTextFormat::BackgroundBrush)); - // don't just clear the property, set an empty brush that overrides a potential - // background brush specified in the text - selection.format.setProperty(QTextFormat::BackgroundBrush, QBrush()); - selection.format.clearProperty(QTextFormat::OutlinePen); - } - - selection.format.setProperty(SuppressText, !hasText); - - if (hasText && !hasBackground && !(textDoneRegion & region).isEmpty()) - continue; - - p->save(); - p->setClipPath(region, Qt::IntersectClip); - - for (int line = firstLine; line < lastLine; ++line) { - QTextLine l(line, d); - l.draw(p, position, &selection); - } - p->restore(); - - if (hasText) { - textDoneRegion += region; - } else { - if (hasBackground) - textDoneRegion -= region; - } - - excludedRegion += region; - } - - QPainterPath needsTextButNoBackground = excludedRegion - textDoneRegion; - if (!needsTextButNoBackground.isEmpty()){ - p->save(); - p->setClipPath(needsTextButNoBackground, Qt::IntersectClip); - FormatRange selection; - selection.start = 0; - selection.length = INT_MAX; - selection.format.setProperty(SuppressBackground, true); - for (int line = firstLine; line < lastLine; ++line) { - QTextLine l(line, d); - l.draw(p, position, &selection); - } - p->restore(); - } - - if (!excludedRegion.isEmpty()) { - p->save(); - QPainterPath path; - QRectF br = boundingRect().translated(position); - br.setRight(QFIXED_MAX); - if (!clip.isNull()) - br = br.intersected(clip); - path.addRect(br); - path -= excludedRegion; - p->setClipPath(path, Qt::IntersectClip); - } - - for (int i = firstLine; i < lastLine; ++i) { - QTextLine l(i, d); - l.draw(p, position); - } - if (!excludedRegion.isEmpty()) - p->restore(); - - - if (!d->cacheGlyphs) - d->freeMemory(); -} - -/*! - \fn void QTextLayout::drawCursor(QPainter *painter, const QPointF &position, int cursorPosition) const - \overload - - Draws a text cursor with the current pen at the given \a position using the - \a painter specified. - The corresponding position within the text is specified by \a cursorPosition. -*/ -void QTextLayout::drawCursor(QPainter *p, const QPointF &pos, int cursorPosition) const -{ - drawCursor(p, pos, cursorPosition, 1); -} - -/*! - \fn void QTextLayout::drawCursor(QPainter *painter, const QPointF &position, int cursorPosition, int width) const - - Draws a text cursor with the current pen and the specified \a width at the given \a position using the - \a painter specified. - The corresponding position within the text is specified by \a cursorPosition. -*/ -void QTextLayout::drawCursor(QPainter *p, const QPointF &pos, int cursorPosition, int width) const -{ - if (d->lines.isEmpty()) - return; - - if (!d->layoutData) - d->itemize(); - - QPointF position = pos + d->position; - - cursorPosition = qBound(0, cursorPosition, d->layoutData->string.length()); - int line = d->lineNumberForTextPosition(cursorPosition); - if (line < 0) - line = 0; - if (line >= d->lines.size()) - return; - - QTextLine l(line, d); - const QScriptLine &sl = d->lines[line]; - - qreal x = position.x() + l.cursorToX(cursorPosition); - - int itm; - - if (d->visualCursorMovement()) { - if (cursorPosition == sl.from + sl.length) - cursorPosition--; - itm = d->findItem(cursorPosition); - } else - itm = d->findItem(cursorPosition - 1); - - QFixed base = sl.base(); - QFixed descent = sl.descent; - bool rightToLeft = d->isRightToLeft(); - if (itm >= 0) { - const QScriptItem &si = d->layoutData->items.at(itm); - if (si.ascent > 0) - base = si.ascent; - if (si.descent > 0) - descent = si.descent; - rightToLeft = si.analysis.bidiLevel % 2; - } - qreal y = position.y() + (sl.y + sl.base() - base).toReal(); - bool toggleAntialiasing = !(p->renderHints() & QPainter::Antialiasing) - && (p->transform().type() > QTransform::TxTranslate); - if (toggleAntialiasing) - p->setRenderHint(QPainter::Antialiasing); - p->fillRect(QRectF(x, y, qreal(width), (base + descent).toReal()), p->pen().brush()); - if (toggleAntialiasing) - p->setRenderHint(QPainter::Antialiasing, false); - if (d->layoutData->hasBidi) { - const int arrow_extent = 4; - int sign = rightToLeft ? -1 : 1; - p->drawLine(QLineF(x, y, x + (sign * arrow_extent/2), y + arrow_extent/2)); - p->drawLine(QLineF(x, y+arrow_extent, x + (sign * arrow_extent/2), y + arrow_extent/2)); - } - return; -} - -/*! - \class QTextLine - \reentrant - - \brief The QTextLine class represents a line of text inside a QTextLayout. - \inmodule QtGui - - \ingroup richtext-processing - - A text line is usually created by QTextLayout::createLine(). - - After being created, the line can be filled using the setLineWidth() - or setNumColumns() functions. A line has a number of attributes including the - rectangle it occupies, rect(), its coordinates, x() and y(), its - textLength(), width() and naturalTextWidth(), and its ascent() and descent() - relative to the text. The position of the cursor in terms of the - line is available from cursorToX() and its inverse from - xToCursor(). A line can be moved with setPosition(). -*/ - -/*! - \enum QTextLine::Edge - - \value Leading - \value Trailing -*/ - -/*! - \enum QTextLine::CursorPosition - - \value CursorBetweenCharacters - \value CursorOnCharacter -*/ - -/*! - \fn QTextLine::QTextLine(int line, QTextEngine *e) - \internal - - Constructs a new text line using the line at position \a line in - the text engine \a e. -*/ - -/*! - \fn QTextLine::QTextLine() - - Creates an invalid line. -*/ - -/*! - \fn bool QTextLine::isValid() const - - Returns \c true if this text line is valid; otherwise returns \c false. -*/ - -/*! - \fn int QTextLine::lineNumber() const - - Returns the position of the line in the text engine. -*/ - - -/*! - Returns the line's bounding rectangle. - - \sa x(), y(), textLength(), width() -*/ -QRectF QTextLine::rect() const -{ - const QScriptLine& sl = eng->lines[index]; - return QRectF(sl.x.toReal(), sl.y.toReal(), sl.width.toReal(), sl.height().toReal()); -} - -/*! - Returns the rectangle covered by the line. -*/ -QRectF QTextLine::naturalTextRect() const -{ - const QScriptLine& sl = eng->lines[index]; - QFixed x = sl.x + eng->alignLine(sl); - - QFixed width = sl.textWidth; - if (sl.justified) - width = sl.width; - - return QRectF(x.toReal(), sl.y.toReal(), width.toReal(), sl.height().toReal()); -} - -/*! - Returns the line's x position. - - \sa rect(), y(), textLength(), width() -*/ -qreal QTextLine::x() const -{ - return eng->lines[index].x.toReal(); -} - -/*! - Returns the line's y position. - - \sa x(), rect(), textLength(), width() -*/ -qreal QTextLine::y() const -{ - return eng->lines[index].y.toReal(); -} - -/*! - Returns the line's width as specified by the layout() function. - - \sa naturalTextWidth(), x(), y(), textLength(), rect() -*/ -qreal QTextLine::width() const -{ - return eng->lines[index].width.toReal(); -} - - -/*! - Returns the line's ascent. - - \sa descent(), height() -*/ -qreal QTextLine::ascent() const -{ - return eng->lines[index].ascent.toReal(); -} - -/*! - Returns the line's descent. - - \sa ascent(), height() -*/ -qreal QTextLine::descent() const -{ - return eng->lines[index].descent.toReal(); -} - -/*! - Returns the line's height. This is equal to ascent() + descent() - if leading is not included. If leading is included, this equals to - ascent() + descent() + leading(). - - \sa ascent(), descent(), leading(), setLeadingIncluded() -*/ -qreal QTextLine::height() const -{ - return eng->lines[index].height().ceil().toReal(); -} - -/*! - \since 4.6 - - Returns the line's leading. - - \sa ascent(), descent(), height() -*/ -qreal QTextLine::leading() const -{ - return eng->lines[index].leading.toReal(); -} - -/*! - \since 4.6 - - Includes positive leading into the line's height if \a included is true; - otherwise does not include leading. - - By default, leading is not included. - - Note that negative leading is ignored, it must be handled - in the code using the text lines by letting the lines overlap. - - \sa leadingIncluded() - -*/ -void QTextLine::setLeadingIncluded(bool included) -{ - eng->lines[index].leadingIncluded= included; - -} - -/*! - \since 4.6 - - Returns \c true if positive leading is included into the line's height; - otherwise returns \c false. - - By default, leading is not included. - - \sa setLeadingIncluded() -*/ -bool QTextLine::leadingIncluded() const -{ - return eng->lines[index].leadingIncluded; -} - -/*! - Returns the width of the line that is occupied by text. This is - always \<= to width(), and is the minimum width that could be used - by layout() without changing the line break position. -*/ -qreal QTextLine::naturalTextWidth() const -{ - return eng->lines[index].textWidth.toReal(); -} - -/*! - \since 4.7 - Returns the horizontal advance of the text. The advance of the text - is the distance from its position to the next position at which - text would naturally be drawn. - - By adding the advance to the position of the text line and using this - as the position of a second text line, you will be able to position - the two lines side-by-side without gaps in-between. -*/ -qreal QTextLine::horizontalAdvance() const -{ - return eng->lines[index].textAdvance.toReal(); -} - -/*! - Lays out the line with the given \a width. The line is filled from - its starting position with as many characters as will fit into - the line. In case the text cannot be split at the end of the line, - it will be filled with additional characters to the next whitespace - or end of the text. -*/ -void QTextLine::setLineWidth(qreal width) -{ - QScriptLine &line = eng->lines[index]; - if (!eng->layoutData) { - qWarning("QTextLine: Can't set a line width while not layouting."); - return; - } - - if (width > QFIXED_MAX) - width = QFIXED_MAX; - - line.width = QFixed::fromReal(width); - if (line.length - && line.textWidth <= line.width - && line.from + line.length == eng->layoutData->string.length()) - // no need to do anything if the line is already layouted and the last one. This optimization helps - // when using things in a single line layout. - return; - line.length = 0; - line.textWidth = 0; - - layout_helper(INT_MAX); -} - -/*! - Lays out the line. The line is filled from its starting position - with as many characters as are specified by \a numColumns. In case - the text cannot be split until \a numColumns characters, the line - will be filled with as many characters to the next whitespace or - end of the text. -*/ -void QTextLine::setNumColumns(int numColumns) -{ - QScriptLine &line = eng->lines[index]; - line.width = QFIXED_MAX; - line.length = 0; - line.textWidth = 0; - layout_helper(numColumns); -} - -/*! - Lays out the line. The line is filled from its starting position - with as many characters as are specified by \a numColumns. In case - the text cannot be split until \a numColumns characters, the line - will be filled with as many characters to the next whitespace or - end of the text. The provided \a alignmentWidth is used as reference - width for alignment. -*/ -void QTextLine::setNumColumns(int numColumns, qreal alignmentWidth) -{ - QScriptLine &line = eng->lines[index]; - line.width = QFixed::fromReal(alignmentWidth); - line.length = 0; - line.textWidth = 0; - layout_helper(numColumns); -} - -#if 0 -#define LB_DEBUG qDebug -#else -#define LB_DEBUG if (0) qDebug -#endif - -namespace { - - struct LineBreakHelper - { - LineBreakHelper() - : glyphCount(0), maxGlyphs(0), currentPosition(0), fontEngine(0), logClusters(0), - manualWrap(false), whiteSpaceOrObject(true) - { - } - - - QScriptLine tmpData; - QScriptLine spaceData; - - QGlyphLayout glyphs; - - int glyphCount; - int maxGlyphs; - int currentPosition; - glyph_t previousGlyph; - - QFixed minw; - QFixed softHyphenWidth; - QFixed rightBearing; - QFixed minimumRightBearing; - - QFontEngine *fontEngine; - const unsigned short *logClusters; - - bool manualWrap; - bool whiteSpaceOrObject; - - bool checkFullOtherwiseExtend(QScriptLine &line); - - QFixed calculateNewWidth(const QScriptLine &line) const { - return line.textWidth + tmpData.textWidth + spaceData.textWidth + softHyphenWidth - - qMin(rightBearing, QFixed()); - } - - inline glyph_t currentGlyph() const - { - Q_ASSERT(currentPosition > 0); - Q_ASSERT(logClusters[currentPosition - 1] < glyphs.numGlyphs); - - return glyphs.glyphs[logClusters[currentPosition - 1]]; - } - - inline void saveCurrentGlyph() - { - previousGlyph = 0; - if (currentPosition > 0 && - logClusters[currentPosition - 1] < glyphs.numGlyphs) { - previousGlyph = currentGlyph(); // needed to calculate right bearing later - } - } - - inline void adjustRightBearing(glyph_t glyph) - { - qreal rb; - fontEngine->getGlyphBearings(glyph, 0, &rb); - rightBearing = qMin(QFixed(), QFixed::fromReal(rb)); - } - - inline void adjustRightBearing() - { - if (currentPosition <= 0) - return; - adjustRightBearing(currentGlyph()); - } - - inline void adjustPreviousRightBearing() - { - if (previousGlyph > 0) - adjustRightBearing(previousGlyph); - } - - inline void resetRightBearing() - { - rightBearing = QFixed(1); // Any positive number is defined as invalid since only - // negative right bearings are interesting to us. - } - }; - -inline bool LineBreakHelper::checkFullOtherwiseExtend(QScriptLine &line) -{ - LB_DEBUG("possible break width %f, spacew=%f", tmpData.textWidth.toReal(), spaceData.textWidth.toReal()); - - QFixed newWidth = calculateNewWidth(line); - if (line.length && !manualWrap && (newWidth > line.width || glyphCount > maxGlyphs)) - return true; - - minw = qMax(minw, tmpData.textWidth); - line += tmpData; - line.textWidth += spaceData.textWidth; - - line.length += spaceData.length; - tmpData.textWidth = 0; - tmpData.length = 0; - spaceData.textWidth = 0; - spaceData.length = 0; - - return false; -} - -} // anonymous namespace - - -static inline void addNextCluster(int &pos, int end, QScriptLine &line, int &glyphCount, - const QScriptItem ¤t, const unsigned short *logClusters, - const QGlyphLayout &glyphs) -{ - int glyphPosition = logClusters[pos]; - do { // got to the first next cluster - ++pos; - ++line.length; - } while (pos < end && logClusters[pos] == glyphPosition); - do { // calculate the textWidth for the rest of the current cluster. - if (!glyphs.attributes[glyphPosition].dontPrint) - line.textWidth += glyphs.advances[glyphPosition]; - ++glyphPosition; - } while (glyphPosition < current.num_glyphs && !glyphs.attributes[glyphPosition].clusterStart); - - Q_ASSERT((pos == end && glyphPosition == current.num_glyphs) || logClusters[pos] == glyphPosition); - - ++glyphCount; -} - - -// fill QScriptLine -void QTextLine::layout_helper(int maxGlyphs) -{ - QScriptLine &line = eng->lines[index]; - line.length = 0; - line.trailingSpaces = 0; - line.textWidth = 0; - line.hasTrailingSpaces = false; - - if (!eng->layoutData->items.size() || line.from >= eng->layoutData->string.length()) { - line.setDefaultHeight(eng); - return; - } - - Q_ASSERT(line.from < eng->layoutData->string.length()); - - LineBreakHelper lbh; - - lbh.maxGlyphs = maxGlyphs; - - QTextOption::WrapMode wrapMode = eng->option.wrapMode(); - bool breakany = (wrapMode == QTextOption::WrapAnywhere); - lbh.manualWrap = (wrapMode == QTextOption::ManualWrap || wrapMode == QTextOption::NoWrap); - - int item = -1; - int newItem = eng->findItem(line.from); - Q_ASSERT(newItem >= 0); - - LB_DEBUG("from: %d: item=%d, total %d, width available %f", line.from, newItem, eng->layoutData->items.size(), line.width.toReal()); - - Qt::Alignment alignment = eng->option.alignment(); - - const QCharAttributes *attributes = eng->attributes(); - if (!attributes) - return; - lbh.currentPosition = line.from; - int end = 0; - lbh.logClusters = eng->layoutData->logClustersPtr; - lbh.previousGlyph = 0; - - while (newItem < eng->layoutData->items.size()) { - lbh.resetRightBearing(); - lbh.softHyphenWidth = 0; - if (newItem != item) { - item = newItem; - const QScriptItem ¤t = eng->layoutData->items[item]; - if (!current.num_glyphs) { - eng->shape(item); - attributes = eng->attributes(); - if (!attributes) - return; - lbh.logClusters = eng->layoutData->logClustersPtr; - } - lbh.currentPosition = qMax(line.from, current.position); - end = current.position + eng->length(item); - lbh.glyphs = eng->shapedGlyphs(¤t); - QFontEngine *fontEngine = eng->fontEngine(current); - if (lbh.fontEngine != fontEngine) { - lbh.fontEngine = fontEngine; - lbh.minimumRightBearing = qMin(QFixed(), - QFixed::fromReal(fontEngine->minRightBearing())); - } - } - const QScriptItem ¤t = eng->layoutData->items[item]; - - lbh.tmpData.leading = qMax(lbh.tmpData.leading + lbh.tmpData.ascent, - current.leading + current.ascent) - qMax(lbh.tmpData.ascent, - current.ascent); - lbh.tmpData.ascent = qMax(lbh.tmpData.ascent, current.ascent); - lbh.tmpData.descent = qMax(lbh.tmpData.descent, current.descent); - - if (current.analysis.flags == QScriptAnalysis::Tab && (alignment & (Qt::AlignLeft | Qt::AlignRight | Qt::AlignCenter | Qt::AlignJustify))) { - lbh.whiteSpaceOrObject = true; - if (lbh.checkFullOtherwiseExtend(line)) - goto found; - - QFixed x = line.x + line.textWidth + lbh.tmpData.textWidth + lbh.spaceData.textWidth; - QFixed tabWidth = eng->calculateTabWidth(item, x); - attributes = eng->attributes(); - if (!attributes) - return; - lbh.logClusters = eng->layoutData->logClustersPtr; - lbh.glyphs = eng->shapedGlyphs(¤t); - - lbh.spaceData.textWidth += tabWidth; - lbh.spaceData.length++; - newItem = item + 1; - - QFixed averageCharWidth = eng->fontEngine(current)->averageCharWidth(); - lbh.glyphCount += qRound(tabWidth / averageCharWidth); - - if (lbh.checkFullOtherwiseExtend(line)) - goto found; - } else if (current.analysis.flags == QScriptAnalysis::LineOrParagraphSeparator) { - lbh.whiteSpaceOrObject = true; - // if the line consists only of the line separator make sure - // we have a sane height - if (!line.length && !lbh.tmpData.length) - line.setDefaultHeight(eng); - if (eng->option.flags() & QTextOption::ShowLineAndParagraphSeparators) { - if (lbh.checkFullOtherwiseExtend(line)) - goto found; - - addNextCluster(lbh.currentPosition, end, lbh.tmpData, lbh.glyphCount, - current, lbh.logClusters, lbh.glyphs); - } else { - lbh.tmpData.length++; - lbh.adjustPreviousRightBearing(); - } - line += lbh.tmpData; - goto found; - } else if (current.analysis.flags == QScriptAnalysis::Object) { - lbh.whiteSpaceOrObject = true; - lbh.tmpData.length++; - - if (eng->block.docHandle()) { - QTextInlineObject inlineObject(item, eng); - eng->docLayout()->positionInlineObject(inlineObject, eng->block.position() + current.position, inlineObject.format()); - } - - lbh.tmpData.textWidth += current.width; - - newItem = item + 1; - ++lbh.glyphCount; - if (lbh.checkFullOtherwiseExtend(line)) - goto found; - } else if (attributes[lbh.currentPosition].whiteSpace) { - lbh.whiteSpaceOrObject = true; - while (lbh.currentPosition < end && attributes[lbh.currentPosition].whiteSpace) - addNextCluster(lbh.currentPosition, end, lbh.spaceData, lbh.glyphCount, - current, lbh.logClusters, lbh.glyphs); - - if (!lbh.manualWrap && lbh.spaceData.textWidth > line.width) { - lbh.spaceData.textWidth = line.width; // ignore spaces that fall out of the line. - goto found; - } - } else { - lbh.whiteSpaceOrObject = false; - bool sb_or_ws = false; - lbh.saveCurrentGlyph(); - do { - addNextCluster(lbh.currentPosition, end, lbh.tmpData, lbh.glyphCount, - current, lbh.logClusters, lbh.glyphs); - - // This is a hack to fix a regression caused by the introduction of the - // whitespace flag to non-breakable spaces and will cause the non-breakable - // spaces to behave as in previous Qt versions in the line breaking algorithm. - // The line breaks do not currently follow the Unicode specs, but fixing this would - // require refactoring the code and would cause behavioral regressions. - bool isBreakableSpace = lbh.currentPosition < eng->layoutData->string.length() - && attributes[lbh.currentPosition].whiteSpace - && eng->layoutData->string.at(lbh.currentPosition).decompositionTag() != QChar::NoBreak; - - if (lbh.currentPosition >= eng->layoutData->string.length() - || isBreakableSpace - || attributes[lbh.currentPosition].lineBreak) { - sb_or_ws = true; - break; - } else if (breakany && attributes[lbh.currentPosition].graphemeBoundary) { - break; - } - } while (lbh.currentPosition < end); - lbh.minw = qMax(lbh.tmpData.textWidth, lbh.minw); - - if (lbh.currentPosition > 0 && lbh.currentPosition < end - && attributes[lbh.currentPosition].lineBreak - && eng->layoutData->string.at(lbh.currentPosition - 1).unicode() == QChar::SoftHyphen) { - // if we are splitting up a word because of - // a soft hyphen then we ... - // - // a) have to take the width of the soft hyphen into - // account to see if the first syllable(s) /and/ - // the soft hyphen fit into the line - // - // b) if we are so short of available width that the - // soft hyphen is the first breakable position, then - // we don't want to show it. However we initially - // have to take the width for it into account so that - // the text document layout sees the overflow and - // switch to break-anywhere mode, in which we - // want the soft-hyphen to slip into the next line - // and thus become invisible again. - // - if (line.length) - lbh.softHyphenWidth = lbh.glyphs.advances[lbh.logClusters[lbh.currentPosition - 1]]; - else if (breakany) - lbh.tmpData.textWidth += lbh.glyphs.advances[lbh.logClusters[lbh.currentPosition - 1]]; - } - - // The actual width of the text needs to take the right bearing into account. The - // right bearing is left-ward, which means that if the rightmost pixel is to the right - // of the advance of the glyph, the bearing will be negative. We flip the sign - // for the code to be more readable. Logic borrowed from qfontmetrics.cpp. - // We ignore the right bearing if the minimum negative bearing is too little to - // expand the text beyond the edge. - if (sb_or_ws|breakany) { - QFixed rightBearing = lbh.rightBearing; // store previous right bearing - if (lbh.calculateNewWidth(line) - lbh.minimumRightBearing > line.width) - lbh.adjustRightBearing(); - if (lbh.checkFullOtherwiseExtend(line)) { - // we are too wide, fix right bearing - if (rightBearing <= 0) - lbh.rightBearing = rightBearing; // take from cache - else - lbh.adjustPreviousRightBearing(); - - if (!breakany) { - line.textWidth += lbh.softHyphenWidth; - } - - goto found; - } - } - lbh.saveCurrentGlyph(); - } - if (lbh.currentPosition == end) - newItem = item + 1; - } - LB_DEBUG("reached end of line"); - lbh.checkFullOtherwiseExtend(line); -found: - if (lbh.rightBearing > 0 && !lbh.whiteSpaceOrObject) // If right bearing has not yet been adjusted - lbh.adjustRightBearing(); - line.textAdvance = line.textWidth; - line.textWidth -= qMin(QFixed(), lbh.rightBearing); - - if (line.length == 0) { - LB_DEBUG("no break available in line, adding temp: length %d, width %f, space: length %d, width %f", - lbh.tmpData.length, lbh.tmpData.textWidth.toReal(), - lbh.spaceData.length, lbh.spaceData.textWidth.toReal()); - line += lbh.tmpData; - } - - LB_DEBUG("line length = %d, ascent=%f, descent=%f, textWidth=%f (spacew=%f)", line.length, line.ascent.toReal(), - line.descent.toReal(), line.textWidth.toReal(), lbh.spaceData.width.toReal()); - LB_DEBUG(" : '%s'", eng->layoutData->string.mid(line.from, line.length).toUtf8().data()); - - if (lbh.manualWrap) { - eng->minWidth = qMax(eng->minWidth, line.textWidth); - eng->maxWidth = qMax(eng->maxWidth, line.textWidth); - } else { - eng->minWidth = qMax(eng->minWidth, lbh.minw); - eng->maxWidth += line.textWidth; - } - - if (line.textWidth > 0 && item < eng->layoutData->items.size()) - eng->maxWidth += lbh.spaceData.textWidth; - if (eng->option.flags() & QTextOption::IncludeTrailingSpaces) - line.textWidth += lbh.spaceData.textWidth; - if (lbh.spaceData.length) { - line.trailingSpaces = lbh.spaceData.length; - line.hasTrailingSpaces = true; - } - - line.justified = false; - line.gridfitted = false; - - if (eng->option.wrapMode() == QTextOption::WrapAtWordBoundaryOrAnywhere) { - if ((lbh.maxGlyphs != INT_MAX && lbh.glyphCount > lbh.maxGlyphs) - || (lbh.maxGlyphs == INT_MAX && line.textWidth > line.width)) { - - eng->option.setWrapMode(QTextOption::WrapAnywhere); - line.length = 0; - line.textWidth = 0; - layout_helper(lbh.maxGlyphs); - eng->option.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); - } - } -} - -/*! - Moves the line to position \a pos. -*/ -void QTextLine::setPosition(const QPointF &pos) -{ - eng->lines[index].x = QFixed::fromReal(pos.x()); - eng->lines[index].y = QFixed::fromReal(pos.y()); -} - -/*! - Returns the line's position relative to the text layout's position. -*/ -QPointF QTextLine::position() const -{ - return QPointF(eng->lines[index].x.toReal(), eng->lines[index].y.toReal()); -} - -// ### DOC: I have no idea what this means/does. -// You create a text layout with a string of text. Once you laid -// it out, it contains a number of QTextLines. from() returns the position -// inside the text string where this line starts. If you e.g. has a -// text of "This is a string", laid out into two lines (the second -// starting at the word 'a'), layout.lineAt(0).from() == 0 and -// layout.lineAt(1).from() == 8. -/*! - Returns the start of the line from the beginning of the string - passed to the QTextLayout. -*/ -int QTextLine::textStart() const -{ - return eng->lines[index].from; -} - -/*! - Returns the length of the text in the line. - - \sa naturalTextWidth() -*/ -int QTextLine::textLength() const -{ - if (eng->option.flags() & QTextOption::ShowLineAndParagraphSeparators - && eng->block.isValid() && index == eng->lines.count()-1) { - return eng->lines[index].length - 1; - } - return eng->lines[index].length + eng->lines[index].trailingSpaces; -} - -static void setPenAndDrawBackground(QPainter *p, const QPen &defaultPen, const QTextCharFormat &chf, const QRectF &r) -{ - QBrush c = chf.foreground(); - if (c.style() == Qt::NoBrush) { - p->setPen(defaultPen); - } - - QBrush bg = chf.background(); - if (bg.style() != Qt::NoBrush && !chf.property(SuppressBackground).toBool()) - p->fillRect(QRectF(qFloor(r.x()), qFloor(r.y()), r.width(), r.height()), bg); - if (c.style() != Qt::NoBrush) { - p->setPen(QPen(c, 0)); - } - -} - -#if !defined(QT_NO_RAWFONT) -static QGlyphRun glyphRunWithInfo(QFontEngine *fontEngine, - const QGlyphLayout &glyphLayout, - const QPointF &pos, - const QGlyphRun::GlyphRunFlags &flags, - const QFixed &selectionX, - const QFixed &selectionWidth, - int glyphsStart, - int glyphsEnd, - unsigned short *logClusters, - int textPosition, - int textLength) -{ - Q_ASSERT(logClusters != 0); - - QGlyphRun glyphRun; - - QGlyphRunPrivate *d = QGlyphRunPrivate::get(glyphRun); - - int rangeStart = textPosition; - while (*logClusters != glyphsStart && rangeStart < textPosition + textLength) { - ++logClusters; - ++rangeStart; - } - - int rangeEnd = rangeStart; - while (*logClusters != glyphsEnd && rangeEnd < textPosition + textLength) { - ++logClusters; - ++rangeEnd; - } - - d->textRangeStart = rangeStart; - d->textRangeEnd = rangeEnd; - - // Make a font for this particular engine - QRawFont font; - QRawFontPrivate *fontD = QRawFontPrivate::get(font); - fontD->setFontEngine(fontEngine); - - QVarLengthArray glyphsArray; - QVarLengthArray positionsArray; - - QTextItem::RenderFlags renderFlags; - if (flags.testFlag(QGlyphRun::Overline)) - renderFlags |= QTextItem::Overline; - if (flags.testFlag(QGlyphRun::Underline)) - renderFlags |= QTextItem::Underline; - if (flags.testFlag(QGlyphRun::StrikeOut)) - renderFlags |= QTextItem::StrikeOut; - if (flags.testFlag(QGlyphRun::RightToLeft)) - renderFlags |= QTextItem::RightToLeft; - - fontEngine->getGlyphPositions(glyphLayout, QTransform(), renderFlags, glyphsArray, - positionsArray); - Q_ASSERT(glyphsArray.size() == positionsArray.size()); - - qreal fontHeight = font.ascent() + font.descent(); - qreal minY = 0; - qreal maxY = 0; - QVector glyphs; - glyphs.reserve(glyphsArray.size()); - QVector positions; - positions.reserve(glyphsArray.size()); - for (int i=0; i QTextLine::glyphRuns(int from, int length) const -{ - const QScriptLine &line = eng->lines[index]; - - if (line.length == 0) - return QList(); - - if (from < 0) - from = textStart(); - - if (length < 0) - length = textLength(); - - if (length == 0) - return QList(); - - QTextLayout::FormatRange selection; - selection.start = from; - selection.length = length; - - QTextLineItemIterator iterator(eng, index, QPointF(), &selection); - qreal y = line.y.toReal() + line.base().toReal(); - QList glyphRuns; - while (!iterator.atEnd()) { - QScriptItem &si = iterator.next(); - if (si.analysis.flags >= QScriptAnalysis::TabOrObject) - continue; - - if (from >= 0 && length >= 0 && (from >= iterator.itemEnd || from + length <= iterator.itemStart)) - continue; - - QPointF pos(iterator.x.toReal(), y); - - QFont font; - QGlyphRun::GlyphRunFlags flags; - if (!eng->useRawFont) { - font = eng->font(si); - if (font.overline()) - flags |= QGlyphRun::Overline; - if (font.underline()) - flags |= QGlyphRun::Underline; - if (font.strikeOut()) - flags |= QGlyphRun::StrikeOut; - } - - bool rtl = false; - if (si.analysis.bidiLevel % 2) { - flags |= QGlyphRun::RightToLeft; - rtl = true; - } - - int relativeFrom = qMax(iterator.itemStart, from) - si.position; - int relativeTo = qMin(iterator.itemEnd, from + length) - 1 - si.position; - - unsigned short *logClusters = eng->logClusters(&si); - int glyphsStart = logClusters[relativeFrom]; - int glyphsEnd = (relativeTo == iterator.itemLength) ? si.num_glyphs - 1 : logClusters[relativeTo]; - // the glyph index right next to the requested range - int nextGlyphIndex = (relativeTo < iterator.itemLength - 1) ? logClusters[relativeTo + 1] : si.num_glyphs; - if (nextGlyphIndex - 1 > glyphsEnd) - glyphsEnd = nextGlyphIndex - 1; - bool startsInsideLigature = relativeFrom > 0 && logClusters[relativeFrom - 1] == glyphsStart; - bool endsInsideLigature = nextGlyphIndex == glyphsEnd; - - int itemGlyphsStart = logClusters[iterator.itemStart - si.position]; - int itemGlyphsEnd = logClusters[iterator.itemEnd - 1 - si.position]; - - QGlyphLayout glyphLayout = eng->shapedGlyphs(&si); - - // Calculate new x position of glyph layout for a subset. This becomes somewhat complex - // when we're breaking a RTL script item, since the expected position passed into - // getGlyphPositions() is the left-most edge of the left-most glyph in an RTL run. - if (relativeFrom != (iterator.itemStart - si.position) && !rtl) { - for (int i=itemGlyphsStart; iglyphsEnd; --i) { - QFixed justification = QFixed::fromFixed(glyphLayout.justifications[i].space_18d6); - pos.rx() += (glyphLayout.advances[i] + justification).toReal(); - } - } - - glyphLayout = glyphLayout.mid(glyphsStart, glyphsEnd - glyphsStart + 1); - - QFixed x; - QFixed width; - iterator.getSelectionBounds(&x, &width); - - if (glyphLayout.numGlyphs > 0) { - QFontEngine *mainFontEngine; -#ifndef QT_NO_RAWFONT - if (eng->useRawFont && eng->rawFont.isValid()) - mainFontEngine= eng->fontEngine(si); - else -#endif - mainFontEngine = font.d->engineForScript(si.analysis.script); - - if (mainFontEngine->type() == QFontEngine::Multi) { - QFontEngineMulti *multiFontEngine = static_cast(mainFontEngine); - int end = rtl ? glyphLayout.numGlyphs : 0; - int start = rtl ? end : 0; - int which = glyphLayout.glyphs[rtl ? start - 1 : end] >> 24; - for (; (rtl && start > 0) || (!rtl && end < glyphLayout.numGlyphs); - rtl ? --start : ++end) { - const int e = glyphLayout.glyphs[rtl ? start - 1 : end] >> 24; - if (e == which) - continue; - - QGlyphLayout subLayout = glyphLayout.mid(start, end - start); - multiFontEngine->ensureEngineAt(which); - - QGlyphRun::GlyphRunFlags subFlags = flags; - if (start == 0 && startsInsideLigature) - subFlags |= QGlyphRun::SplitLigature; - - glyphRuns.append(glyphRunWithInfo(multiFontEngine->engine(which), - subLayout, - pos, - subFlags, - x, - width, - glyphsStart + start, - glyphsStart + end, - logClusters, - iterator.itemStart, - iterator.itemLength)); - for (int i = 0; i < subLayout.numGlyphs; ++i) { - QFixed justification = QFixed::fromFixed(subLayout.justifications[i].space_18d6); - pos.rx() += (subLayout.advances[i] + justification).toReal(); - } - - if (rtl) - end = start; - else - start = end; - which = e; - } - - QGlyphLayout subLayout = glyphLayout.mid(start, end - start); - multiFontEngine->ensureEngineAt(which); - - QGlyphRun::GlyphRunFlags subFlags = flags; - if ((start == 0 && startsInsideLigature) || endsInsideLigature) - subFlags |= QGlyphRun::SplitLigature; - - QGlyphRun glyphRun = glyphRunWithInfo(multiFontEngine->engine(which), - subLayout, - pos, - subFlags, - x, - width, - glyphsStart + start, - glyphsStart + end, - logClusters, - iterator.itemStart, - iterator.itemLength); - if (!glyphRun.isEmpty()) - glyphRuns.append(glyphRun); - } else { - if (startsInsideLigature || endsInsideLigature) - flags |= QGlyphRun::SplitLigature; - QGlyphRun glyphRun = glyphRunWithInfo(mainFontEngine, - glyphLayout, - pos, - flags, - x, - width, - glyphsStart, - glyphsEnd, - logClusters, - iterator.itemStart, - iterator.itemLength); - if (!glyphRun.isEmpty()) - glyphRuns.append(glyphRun); - } - } - } - - return glyphRuns; -} -#endif // QT_NO_RAWFONT - -/*! - \fn void QTextLine::draw(QPainter *painter, const QPointF &position, const QTextLayout::FormatRange *selection) const - - Draws a line on the given \a painter at the specified \a position. - The \a selection is reserved for internal use. -*/ -void QTextLine::draw(QPainter *p, const QPointF &pos, const QTextLayout::FormatRange *selection) const -{ -#ifndef QT_NO_RAWFONT - // Not intended to work with rawfont - Q_ASSERT(!eng->useRawFont); -#endif - const QScriptLine &line = eng->lines[index]; - QPen pen = p->pen(); - - bool noText = (selection && selection->format.property(SuppressText).toBool()); - - if (!line.length) { - if (selection - && selection->start <= line.from - && selection->start + selection->length > line.from) { - - const qreal lineHeight = line.height().toReal(); - QRectF r(pos.x() + line.x.toReal(), pos.y() + line.y.toReal(), - lineHeight / 2, QFontMetrics(eng->font()).width(QLatin1Char(' '))); - setPenAndDrawBackground(p, QPen(), selection->format, r); - p->setPen(pen); - } - return; - } - - - QTextLineItemIterator iterator(eng, index, pos, selection); - QFixed lineBase = line.base(); - eng->clearDecorations(); - eng->enableDelayDecorations(); - - const QFixed y = QFixed::fromReal(pos.y()) + line.y + lineBase; - - bool suppressColors = (eng->option.flags() & QTextOption::SuppressColors); - while (!iterator.atEnd()) { - QScriptItem &si = iterator.next(); - - if (selection && selection->start >= 0 && iterator.isOutsideSelection()) - continue; - - if (si.analysis.flags == QScriptAnalysis::LineOrParagraphSeparator - && !(eng->option.flags() & QTextOption::ShowLineAndParagraphSeparators)) - continue; - - QFixed itemBaseLine = y; - QFont f = eng->font(si); - QTextCharFormat format; - - if (eng->hasFormats() || selection) { - format = eng->format(&si); - if (suppressColors) { - format.clearForeground(); - format.clearBackground(); - format.clearProperty(QTextFormat::TextUnderlineColor); - } - if (selection) - format.merge(selection->format); - - setPenAndDrawBackground(p, pen, format, QRectF(iterator.x.toReal(), (y - lineBase).toReal(), - iterator.itemWidth.toReal(), line.height().toReal())); - - QTextCharFormat::VerticalAlignment valign = format.verticalAlignment(); - if (valign == QTextCharFormat::AlignSuperScript || valign == QTextCharFormat::AlignSubScript) { - QFontEngine *fe = f.d->engineForScript(si.analysis.script); - QFixed height = fe->ascent() + fe->descent(); - if (valign == QTextCharFormat::AlignSubScript) - itemBaseLine += height / 6; - else if (valign == QTextCharFormat::AlignSuperScript) - itemBaseLine -= height / 2; - } - } - - if (si.analysis.flags >= QScriptAnalysis::TabOrObject) { - - if (eng->hasFormats()) { - p->save(); - if (si.analysis.flags == QScriptAnalysis::Object && eng->block.docHandle()) { - QFixed itemY = y - si.ascent; - if (format.verticalAlignment() == QTextCharFormat::AlignTop) { - itemY = y - lineBase; - } - - QRectF itemRect(iterator.x.toReal(), itemY.toReal(), iterator.itemWidth.toReal(), si.height().toReal()); - - eng->docLayout()->drawInlineObject(p, itemRect, - QTextInlineObject(iterator.item, eng), - si.position + eng->block.position(), - format); - if (selection) { - QBrush bg = format.brushProperty(ObjectSelectionBrush); - if (bg.style() != Qt::NoBrush) { - QColor c = bg.color(); - c.setAlpha(128); - p->fillRect(itemRect, c); - } - } - } else { // si.isTab - QFont f = eng->font(si); - QTextItemInt gf(si, &f, format); - gf.chars = 0; - gf.num_chars = 0; - gf.width = iterator.itemWidth; - QPainterPrivate::get(p)->drawTextItem(QPointF(iterator.x.toReal(), y.toReal()), gf, eng); - if (eng->option.flags() & QTextOption::ShowTabsAndSpaces) { - QChar visualTab(0x2192); - int w = QFontMetrics(f).width(visualTab); - qreal x = iterator.itemWidth.toReal() - w; // Right-aligned - if (x < 0) - p->setClipRect(QRectF(iterator.x.toReal(), line.y.toReal(), - iterator.itemWidth.toReal(), line.height().toReal()), - Qt::IntersectClip); - else - x /= 2; // Centered - p->drawText(QPointF(iterator.x.toReal() + x, - y.toReal()), visualTab); - } - - } - p->restore(); - } - - continue; - } - - unsigned short *logClusters = eng->logClusters(&si); - QGlyphLayout glyphs = eng->shapedGlyphs(&si); - - QTextItemInt gf(glyphs.mid(iterator.glyphsStart, iterator.glyphsEnd - iterator.glyphsStart), - &f, eng->layoutData->string.unicode() + iterator.itemStart, - iterator.itemEnd - iterator.itemStart, eng->fontEngine(si), format); - gf.logClusters = logClusters + iterator.itemStart - si.position; - gf.width = iterator.itemWidth; - gf.justified = line.justified; - gf.initWithScriptItem(si); - - Q_ASSERT(gf.fontEngine); - - QPointF pos(iterator.x.toReal(), itemBaseLine.toReal()); - if (format.penProperty(QTextFormat::TextOutline).style() != Qt::NoPen) { - QPainterPath path; - path.setFillRule(Qt::WindingFill); - - if (gf.glyphs.numGlyphs) - gf.fontEngine->addOutlineToPath(pos.x(), pos.y(), gf.glyphs, &path, gf.flags); - if (gf.flags) { - const QFontEngine *fe = gf.fontEngine; - const qreal lw = fe->lineThickness().toReal(); - if (gf.flags & QTextItem::Underline) { - qreal offs = fe->underlinePosition().toReal(); - path.addRect(pos.x(), pos.y() + offs, gf.width.toReal(), lw); - } - if (gf.flags & QTextItem::Overline) { - qreal offs = fe->ascent().toReal() + 1; - path.addRect(pos.x(), pos.y() - offs, gf.width.toReal(), lw); - } - if (gf.flags & QTextItem::StrikeOut) { - qreal offs = fe->ascent().toReal() / 3; - path.addRect(pos.x(), pos.y() - offs, gf.width.toReal(), lw); - } - } - - p->save(); - p->setRenderHint(QPainter::Antialiasing); - //Currently QPen with a Qt::NoPen style still returns a default - //QBrush which != Qt::NoBrush so we need this specialcase to reset it - if (p->pen().style() == Qt::NoPen) - p->setBrush(Qt::NoBrush); - else - p->setBrush(p->pen().brush()); - - p->setPen(format.textOutline()); - p->drawPath(path); - p->restore(); - } else { - if (noText) - gf.glyphs.numGlyphs = 0; // slightly less elegant than it should be - QPainterPrivate::get(p)->drawTextItem(pos, gf, eng); - } - - if (si.analysis.flags == QScriptAnalysis::Space - && (eng->option.flags() & QTextOption::ShowTabsAndSpaces)) { - QBrush c = format.foreground(); - if (c.style() != Qt::NoBrush) - p->setPen(c.color()); - QChar visualSpace((ushort)0xb7); - p->drawText(QPointF(iterator.x.toReal(), itemBaseLine.toReal()), visualSpace); - p->setPen(pen); - } - } - eng->drawDecorations(p); - - if (eng->hasFormats()) - p->setPen(pen); -} - -/*! - \fn int QTextLine::cursorToX(int cursorPos, Edge edge) const - - \overload -*/ - -/*! - Converts the cursor position \a cursorPos to the corresponding x position - inside the line, taking account of the \a edge. - - If \a cursorPos is not a valid cursor position, the nearest valid - cursor position will be used instead, and cpos will be modified to - point to this valid cursor position. - - \sa xToCursor() -*/ -qreal QTextLine::cursorToX(int *cursorPos, Edge edge) const -{ - if (!eng->layoutData) - eng->itemize(); - - const QScriptLine &line = eng->lines[index]; - bool lastLine = index >= eng->lines.size() - 1; - - QFixed x = line.x; - x += eng->alignLine(line) - eng->leadingSpaceWidth(line); - - if (!index && !eng->layoutData->items.size()) { - *cursorPos = 0; - return x.toReal(); - } - - int lineEnd = line.from + line.length + line.trailingSpaces; - int pos = qBound(0, *cursorPos, lineEnd); - int itm; - const QCharAttributes *attributes = eng->attributes(); - if (!attributes) { - *cursorPos = 0; - return x.toReal(); - } - while (pos < lineEnd && !attributes[pos].graphemeBoundary) - pos++; - if (pos == lineEnd) { - // end of line ensure we have the last item on the line - itm = eng->findItem(pos-1); - } - else - itm = eng->findItem(pos); - if (itm < 0) { - *cursorPos = 0; - return x.toReal(); - } - eng->shapeLine(line); - - const QScriptItem *si = &eng->layoutData->items[itm]; - if (!si->num_glyphs) - eng->shape(itm); - pos -= si->position; - - QGlyphLayout glyphs = eng->shapedGlyphs(si); - unsigned short *logClusters = eng->logClusters(si); - Q_ASSERT(logClusters); - - int l = eng->length(itm); - if (pos > l) - pos = l; - if (pos < 0) - pos = 0; - - int glyph_pos = pos == l ? si->num_glyphs : logClusters[pos]; - if (edge == Trailing && glyph_pos < si->num_glyphs) { - // trailing edge is leading edge of next cluster - glyph_pos++; - while (glyph_pos < si->num_glyphs && !glyphs.attributes[glyph_pos].clusterStart) - glyph_pos++; - } - - bool reverse = eng->layoutData->items[itm].analysis.bidiLevel % 2; - - - // add the items left of the cursor - - int firstItem = eng->findItem(line.from); - int lastItem = eng->findItem(lineEnd - 1); - int nItems = (firstItem >= 0 && lastItem >= firstItem)? (lastItem-firstItem+1) : 0; - - QVarLengthArray visualOrder(nItems); - QVarLengthArray levels(nItems); - for (int i = 0; i < nItems; ++i) - levels[i] = eng->layoutData->items[i+firstItem].analysis.bidiLevel; - QTextEngine::bidiReorder(nItems, levels.data(), visualOrder.data()); - - for (int i = 0; i < nItems; ++i) { - int item = visualOrder[i]+firstItem; - if (item == itm) - break; - QScriptItem &si = eng->layoutData->items[item]; - if (!si.num_glyphs) - eng->shape(item); - - if (si.analysis.flags >= QScriptAnalysis::TabOrObject) { - x += si.width; - continue; - } - int start = qMax(line.from, si.position); - int end = qMin(lineEnd, si.position + eng->length(item)); - - logClusters = eng->logClusters(&si); - - int gs = logClusters[start-si.position]; - int ge = (end == si.position + eng->length(item)) ? si.num_glyphs-1 : logClusters[end-si.position-1]; - - QGlyphLayout glyphs = eng->shapedGlyphs(&si); - - while (gs <= ge) { - x += glyphs.effectiveAdvance(gs); - ++gs; - } - } - - logClusters = eng->logClusters(si); - glyphs = eng->shapedGlyphs(si); - if (si->analysis.flags >= QScriptAnalysis::TabOrObject) { - if (pos == (reverse ? 0 : l)) - x += si->width; - } else { - bool rtl = eng->isRightToLeft(); - bool visual = eng->visualCursorMovement(); - int end = qMin(lineEnd, si->position + l) - si->position; - if (reverse) { - int glyph_end = end == l ? si->num_glyphs : logClusters[end]; - int glyph_start = glyph_pos; - if (visual && !rtl && !(lastLine && itm == (visualOrder[nItems - 1] + firstItem))) - glyph_start++; - for (int i = glyph_end - 1; i >= glyph_start; i--) - x += glyphs.effectiveAdvance(i); - } else { - int start = qMax(line.from - si->position, 0); - int glyph_start = logClusters[start]; - int glyph_end = glyph_pos; - if (!visual || !rtl || (lastLine && itm == visualOrder[0] + firstItem)) - glyph_end--; - for (int i = glyph_start; i <= glyph_end; i++) - x += glyphs.effectiveAdvance(i); - } - x += eng->offsetInLigature(si, pos, end, glyph_pos); - } - - if (eng->option.wrapMode() != QTextOption::NoWrap && x > line.x + line.width) - x = line.x + line.width; - if (eng->option.wrapMode() != QTextOption::NoWrap && x < 0) - x = 0; - - *cursorPos = pos + si->position; - return x.toReal(); -} - -/*! - \fn int QTextLine::xToCursor(qreal x, CursorPosition cpos) const - - Converts the x-coordinate \a x, to the nearest matching cursor - position, depending on the cursor position type, \a cpos. - Note that result cursor position includes possible preedit area text. - - \sa cursorToX() -*/ -int QTextLine::xToCursor(qreal _x, CursorPosition cpos) const -{ - QFixed x = QFixed::fromReal(_x); - const QScriptLine &line = eng->lines[index]; - bool lastLine = index >= eng->lines.size() - 1; - int lineNum = index; - - if (!eng->layoutData) - eng->itemize(); - - int line_length = textLength(); - - if (!line_length) - return line.from; - - int firstItem = eng->findItem(line.from); - int lastItem = eng->findItem(line.from + line_length - 1); - int nItems = (firstItem >= 0 && lastItem >= firstItem)? (lastItem-firstItem+1) : 0; - - if (!nItems) - return 0; - - x -= line.x; - x -= eng->alignLine(line); -// qDebug("xToCursor: x=%f, cpos=%d", x.toReal(), cpos); - - QVarLengthArray visualOrder(nItems); - QVarLengthArray levels(nItems); - for (int i = 0; i < nItems; ++i) - levels[i] = eng->layoutData->items[i+firstItem].analysis.bidiLevel; - QTextEngine::bidiReorder(nItems, levels.data(), visualOrder.data()); - - bool visual = eng->visualCursorMovement(); - if (x <= 0) { - // left of first item - int item = visualOrder[0]+firstItem; - QScriptItem &si = eng->layoutData->items[item]; - if (!si.num_glyphs) - eng->shape(item); - int pos = si.position; - if (si.analysis.bidiLevel % 2) - pos += eng->length(item); - pos = qMax(line.from, pos); - pos = qMin(line.from + line_length, pos); - return pos; - } else if (x < line.textWidth - || (line.justified && x < line.width)) { - // has to be in one of the runs - QFixed pos; - bool rtl = eng->isRightToLeft(); - - eng->shapeLine(line); - QVector insertionPoints; - if (visual && rtl) - eng->insertionPointsForLine(lineNum, insertionPoints); - int nchars = 0; - for (int i = 0; i < nItems; ++i) { - int item = visualOrder[i]+firstItem; - QScriptItem &si = eng->layoutData->items[item]; - int item_length = eng->length(item); -// qDebug(" item %d, visual %d x_remain=%f", i, item, x.toReal()); - - int start = qMax(line.from - si.position, 0); - int end = qMin(line.from + line_length - si.position, item_length); - - unsigned short *logClusters = eng->logClusters(&si); - - int gs = logClusters[start]; - int ge = (end == item_length ? si.num_glyphs : logClusters[end]) - 1; - QGlyphLayout glyphs = eng->shapedGlyphs(&si); - - QFixed item_width = 0; - if (si.analysis.flags >= QScriptAnalysis::TabOrObject) { - item_width = si.width; - } else { - int g = gs; - while (g <= ge) { - item_width += glyphs.effectiveAdvance(g); - ++g; - } - } -// qDebug(" start=%d, end=%d, gs=%d, ge=%d item_width=%f", start, end, gs, ge, item_width.toReal()); - - if (pos + item_width < x) { - pos += item_width; - nchars += end; - continue; - } -// qDebug(" inside run"); - if (si.analysis.flags >= QScriptAnalysis::TabOrObject) { - if (cpos == QTextLine::CursorOnCharacter) - return si.position; - bool left_half = (x - pos) < item_width/2; - - if (bool(si.analysis.bidiLevel % 2) != left_half) - return si.position; - return si.position + 1; - } - - int glyph_pos = -1; - QFixed edge; - // has to be inside run - if (cpos == QTextLine::CursorOnCharacter) { - if (si.analysis.bidiLevel % 2) { - pos += item_width; - glyph_pos = gs; - while (gs <= ge) { - if (glyphs.attributes[gs].clusterStart) { - if (pos < x) - break; - glyph_pos = gs; - edge = pos; - } - pos -= glyphs.effectiveAdvance(gs); - ++gs; - } - } else { - glyph_pos = gs; - while (gs <= ge) { - if (glyphs.attributes[gs].clusterStart) { - if (pos > x) - break; - glyph_pos = gs; - edge = pos; - } - pos += glyphs.effectiveAdvance(gs); - ++gs; - } - } - } else { - QFixed dist = INT_MAX/256; - if (si.analysis.bidiLevel % 2) { - if (!visual || rtl || (lastLine && i == nItems - 1)) { - pos += item_width; - while (gs <= ge) { - if (glyphs.attributes[gs].clusterStart && qAbs(x-pos) < dist) { - glyph_pos = gs; - edge = pos; - dist = qAbs(x-pos); - } - pos -= glyphs.effectiveAdvance(gs); - ++gs; - } - } else { - while (ge >= gs) { - if (glyphs.attributes[ge].clusterStart && qAbs(x-pos) < dist) { - glyph_pos = ge; - edge = pos; - dist = qAbs(x-pos); - } - pos += glyphs.effectiveAdvance(ge); - --ge; - } - } - } else { - if (!visual || !rtl || (lastLine && i == 0)) { - while (gs <= ge) { - if (glyphs.attributes[gs].clusterStart && qAbs(x-pos) < dist) { - glyph_pos = gs; - edge = pos; - dist = qAbs(x-pos); - } - pos += glyphs.effectiveAdvance(gs); - ++gs; - } - } else { - QFixed oldPos = pos; - while (gs <= ge) { - pos += glyphs.effectiveAdvance(gs); - if (glyphs.attributes[gs].clusterStart && qAbs(x-pos) < dist) { - glyph_pos = gs; - edge = pos; - dist = qAbs(x-pos); - } - ++gs; - } - pos = oldPos; - } - } - if (qAbs(x-pos) < dist) { - if (visual) { - if (!rtl && i < nItems - 1) { - nchars += end; - continue; - } - if (rtl && nchars > 0) - return insertionPoints[lastLine ? nchars : nchars - 1]; - } - return eng->positionInLigature(&si, end, x, pos, -1, - cpos == QTextLine::CursorOnCharacter); - } - } - Q_ASSERT(glyph_pos != -1); - return eng->positionInLigature(&si, end, x, edge, glyph_pos, - cpos == QTextLine::CursorOnCharacter); - } - } - // right of last item -// qDebug() << "right of last"; - int item = visualOrder[nItems-1]+firstItem; - QScriptItem &si = eng->layoutData->items[item]; - if (!si.num_glyphs) - eng->shape(item); - int pos = si.position; - if (!(si.analysis.bidiLevel % 2)) - pos += eng->length(item); - pos = qMax(line.from, pos); - - int maxPos = line.from + line_length; - - // except for the last line we assume that the - // character between lines is a space and we want - // to position the cursor to the left of that - // character. - // ###### breaks with japanese for example - if (this->index < eng->lines.count() - 1) - --maxPos; - - pos = qMin(pos, maxPos); - return pos; -} - -QT_END_NAMESPACE diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/text/qtextlayout.h b/Telegram/_qt_5_5_0_patch/qtbase/src/gui/text/qtextlayout.h deleted file mode 100644 index 64c381035..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/gui/text/qtextlayout.h +++ /dev/null @@ -1,260 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifndef QTEXTLAYOUT_H -#define QTEXTLAYOUT_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -QT_BEGIN_NAMESPACE - - -class QTextEngine; -class QFont; -#ifndef QT_NO_RAWFONT -class QRawFont; -#endif -class QRect; -class QRegion; -class QTextFormat; -class QPalette; -class QPainter; - -class Q_GUI_EXPORT QTextInlineObject -{ -public: - QTextInlineObject(int i, QTextEngine *e) : itm(i), eng(e) {} - inline QTextInlineObject() : itm(0), eng(0) {} - inline bool isValid() const { return eng; } - - QRectF rect() const; - qreal width() const; - qreal ascent() const; - qreal descent() const; - qreal height() const; - - Qt::LayoutDirection textDirection() const; - - void setWidth(qreal w); - void setAscent(qreal a); - void setDescent(qreal d); - - int textPosition() const; - - int formatIndex() const; - QTextFormat format() const; - -private: - friend class QTextLayout; - int itm; - QTextEngine *eng; -}; - -class QPaintDevice; -class QTextFormat; -class QTextLine; -class QTextBlock; -class QTextOption; - -class Q_GUI_EXPORT QTextLayout -{ -public: - // does itemization - QTextLayout(); - QTextLayout(const QString& text); - QTextLayout(const QString& text, const QFont &font, QPaintDevice *paintdevice = 0); - QTextLayout(const QTextBlock &b); - ~QTextLayout(); - - void setFont(const QFont &f); - QFont font() const; - -#ifndef QT_NO_RAWFONT - void setRawFont(const QRawFont &rawFont); -#endif - - void setText(const QString& string); - QString text() const; - - void setTextOption(const QTextOption &option); - const QTextOption &textOption() const; - - void setPreeditArea(int position, const QString &text); - int preeditAreaPosition() const; - QString preeditAreaText() const; - - struct FormatRange { - int start; - int length; - QTextCharFormat format; - }; - void setAdditionalFormats(const QList &overrides); - QList additionalFormats() const; - void clearAdditionalFormats(); - - void setCacheEnabled(bool enable); - bool cacheEnabled() const; - - void setCursorMoveStyle(Qt::CursorMoveStyle style); - Qt::CursorMoveStyle cursorMoveStyle() const; - - void beginLayout(); - void endLayout(); - void clearLayout(); - - QTextLine createLine(); - - int lineCount() const; - QTextLine lineAt(int i) const; - QTextLine lineForTextPosition(int pos) const; - - enum CursorMode { - SkipCharacters, - SkipWords - }; - bool isValidCursorPosition(int pos) const; - int nextCursorPosition(int oldPos, CursorMode mode = SkipCharacters) const; - int previousCursorPosition(int oldPos, CursorMode mode = SkipCharacters) const; - int leftCursorPosition(int oldPos) const; - int rightCursorPosition(int oldPos) const; - - void draw(QPainter *p, const QPointF &pos, const QVector &selections = QVector(), - const QRectF &clip = QRectF()) const; - void drawCursor(QPainter *p, const QPointF &pos, int cursorPosition) const; - void drawCursor(QPainter *p, const QPointF &pos, int cursorPosition, int width) const; - - QPointF position() const; - void setPosition(const QPointF &p); - - QRectF boundingRect() const; - - qreal minimumWidth() const; - qreal maximumWidth() const; - -#if !defined(QT_NO_RAWFONT) - QList glyphRuns(int from = -1, int length = -1) const; -#endif - - QTextEngine *engine() const { return d; } - void setFlags(int flags); -private: - QTextLayout(QTextEngine *e) : d(e) {} - Q_DISABLE_COPY(QTextLayout) - - friend class QPainter; - friend class QGraphicsSimpleTextItemPrivate; - friend class QGraphicsSimpleTextItem; - friend void qt_format_text(const QFont &font, const QRectF &_r, int tf, const QTextOption *, const QString& str, - QRectF *brect, int tabstops, int* tabarray, int tabarraylen, - QPainter *painter); - QTextEngine *d; - - friend class TextBlock; -}; - - -class Q_GUI_EXPORT QTextLine -{ -public: - inline QTextLine() : index(0), eng(0) {} - inline bool isValid() const { return eng; } - - QRectF rect() const; - qreal x() const; - qreal y() const; - qreal width() const; - qreal ascent() const; - qreal descent() const; - qreal height() const; - qreal leading() const; - - void setLeadingIncluded(bool included); - bool leadingIncluded() const; - - qreal naturalTextWidth() const; - qreal horizontalAdvance() const; - QRectF naturalTextRect() const; - - enum Edge { - Leading, - Trailing - }; - enum CursorPosition { - CursorBetweenCharacters, - CursorOnCharacter - }; - - /* cursorPos gets set to the valid position */ - qreal cursorToX(int *cursorPos, Edge edge = Leading) const; - inline qreal cursorToX(int cursorPos, Edge edge = Leading) const { return cursorToX(&cursorPos, edge); } - int xToCursor(qreal x, CursorPosition = CursorBetweenCharacters) const; - - void setLineWidth(qreal width); - void setNumColumns(int columns); - void setNumColumns(int columns, qreal alignmentWidth); - - void setPosition(const QPointF &pos); - QPointF position() const; - - int textStart() const; - int textLength() const; - - int lineNumber() const { return index; } - - void draw(QPainter *p, const QPointF &point, const QTextLayout::FormatRange *selection = 0) const; - -#if !defined(QT_NO_RAWFONT) - QList glyphRuns(int from = -1, int length = -1) const; -#endif - -private: - QTextLine(int line, QTextEngine *e) : index(line), eng(e) {} - void layout_helper(int numGlyphs); - - friend class QTextLayout; - friend class QTextFragment; - int index; - QTextEngine *eng; -}; - -QT_END_NAMESPACE - -#endif // QTEXTLAYOUT_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/network/socket/qnativesocketengine_win.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/network/socket/qnativesocketengine_win.cpp deleted file mode 100644 index a1c2e082d..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/network/socket/qnativesocketengine_win.cpp +++ /dev/null @@ -1,1537 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Copyright (C) 2015 Intel Corporation. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the QtNetwork module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -// Prevent windows system header files from defining min/max as macros. -#define NOMINMAX 1 - -#include -#include - -#include "qnativesocketengine_p.h" - -#include -#include -#include -#include -#include - -//#define QNATIVESOCKETENGINE_DEBUG -#if defined(QNATIVESOCKETENGINE_DEBUG) -# include -# include -#endif - -QT_BEGIN_NAMESPACE - -//Some distributions of mingw (including 4.7.2 from mingw.org) are missing this from headers. -//Also microsoft headers don't include it when building on XP and earlier. -#ifndef IPV6_V6ONLY -#define IPV6_V6ONLY 27 -#endif - -#if defined(QNATIVESOCKETENGINE_DEBUG) - -void verboseWSErrorDebug(int r) -{ - switch (r) { - case WSANOTINITIALISED : qDebug("WSA error : WSANOTINITIALISED"); break; - case WSAEINTR: qDebug("WSA error : WSAEINTR"); break; - case WSAEBADF: qDebug("WSA error : WSAEBADF"); break; - case WSAEACCES: qDebug("WSA error : WSAEACCES"); break; - case WSAEFAULT: qDebug("WSA error : WSAEFAULT"); break; - case WSAEINVAL: qDebug("WSA error : WSAEINVAL"); break; - case WSAEMFILE: qDebug("WSA error : WSAEMFILE"); break; - case WSAEWOULDBLOCK: qDebug("WSA error : WSAEWOULDBLOCK"); break; - case WSAEINPROGRESS: qDebug("WSA error : WSAEINPROGRESS"); break; - case WSAEALREADY: qDebug("WSA error : WSAEALREADY"); break; - case WSAENOTSOCK: qDebug("WSA error : WSAENOTSOCK"); break; - case WSAEDESTADDRREQ: qDebug("WSA error : WSAEDESTADDRREQ"); break; - case WSAEMSGSIZE: qDebug("WSA error : WSAEMSGSIZE"); break; - case WSAEPROTOTYPE: qDebug("WSA error : WSAEPROTOTYPE"); break; - case WSAENOPROTOOPT: qDebug("WSA error : WSAENOPROTOOPT"); break; - case WSAEPROTONOSUPPORT: qDebug("WSA error : WSAEPROTONOSUPPORT"); break; - case WSAESOCKTNOSUPPORT: qDebug("WSA error : WSAESOCKTNOSUPPORT"); break; - case WSAEOPNOTSUPP: qDebug("WSA error : WSAEOPNOTSUPP"); break; - case WSAEPFNOSUPPORT: qDebug("WSA error : WSAEPFNOSUPPORT"); break; - case WSAEAFNOSUPPORT: qDebug("WSA error : WSAEAFNOSUPPORT"); break; - case WSAEADDRINUSE: qDebug("WSA error : WSAEADDRINUSE"); break; - case WSAEADDRNOTAVAIL: qDebug("WSA error : WSAEADDRNOTAVAIL"); break; - case WSAENETDOWN: qDebug("WSA error : WSAENETDOWN"); break; - case WSAENETUNREACH: qDebug("WSA error : WSAENETUNREACH"); break; - case WSAENETRESET: qDebug("WSA error : WSAENETRESET"); break; - case WSAECONNABORTED: qDebug("WSA error : WSAECONNABORTED"); break; - case WSAECONNRESET: qDebug("WSA error : WSAECONNRESET"); break; - case WSAENOBUFS: qDebug("WSA error : WSAENOBUFS"); break; - case WSAEISCONN: qDebug("WSA error : WSAEISCONN"); break; - case WSAENOTCONN: qDebug("WSA error : WSAENOTCONN"); break; - case WSAESHUTDOWN: qDebug("WSA error : WSAESHUTDOWN"); break; - case WSAETOOMANYREFS: qDebug("WSA error : WSAETOOMANYREFS"); break; - case WSAETIMEDOUT: qDebug("WSA error : WSAETIMEDOUT"); break; - case WSAECONNREFUSED: qDebug("WSA error : WSAECONNREFUSED"); break; - case WSAELOOP: qDebug("WSA error : WSAELOOP"); break; - case WSAENAMETOOLONG: qDebug("WSA error : WSAENAMETOOLONG"); break; - case WSAEHOSTDOWN: qDebug("WSA error : WSAEHOSTDOWN"); break; - case WSAEHOSTUNREACH: qDebug("WSA error : WSAEHOSTUNREACH"); break; - case WSAENOTEMPTY: qDebug("WSA error : WSAENOTEMPTY"); break; - case WSAEPROCLIM: qDebug("WSA error : WSAEPROCLIM"); break; - case WSAEUSERS: qDebug("WSA error : WSAEUSERS"); break; - case WSAEDQUOT: qDebug("WSA error : WSAEDQUOT"); break; - case WSAESTALE: qDebug("WSA error : WSAESTALE"); break; - case WSAEREMOTE: qDebug("WSA error : WSAEREMOTE"); break; - case WSAEDISCON: qDebug("WSA error : WSAEDISCON"); break; - default: qDebug("WSA error : Unknown"); break; - } - qErrnoWarning(r, "more details"); -} - -/* - Returns a human readable representation of the first \a len - characters in \a data. -*/ -static QByteArray qt_prettyDebug(const char *data, int len, int maxLength) -{ - if (!data) return "(null)"; - QByteArray out; - for (int i = 0; i < len; ++i) { - char c = data[i]; - if (isprint(int(uchar(c)))) { - out += c; - } else switch (c) { - case '\n': out += "\\n"; break; - case '\r': out += "\\r"; break; - case '\t': out += "\\t"; break; - default: - QString tmp; - tmp.sprintf("\\%o", c); - out += tmp.toLatin1().constData(); - } - } - - if (len < maxLength) - out += "..."; - - return out; -} - - -#define WS_ERROR_DEBUG(x) verboseWSErrorDebug(x); - -#else - -#define WS_ERROR_DEBUG(x) Q_UNUSED(x) - -#endif - -#ifndef AF_INET6 -#define AF_INET6 23 /* Internetwork Version 6 */ -#endif - -#ifndef SO_EXCLUSIVEADDRUSE -#define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR)) /* disallow local address reuse */ -#endif - -/* - Extracts the port and address from a sockaddr, and stores them in - \a port and \a addr if they are non-null. -*/ -static inline void qt_socket_getPortAndAddress(SOCKET socketDescriptor, const qt_sockaddr *sa, quint16 *port, QHostAddress *address) -{ - if (sa->a.sa_family == AF_INET6) { - const qt_sockaddr_in6 *sa6 = &sa->a6; - Q_IPV6ADDR tmp; - for (int i = 0; i < 16; ++i) - tmp.c[i] = sa6->sin6_addr.qt_s6_addr[i]; - if (address) { - QHostAddress a; - a.setAddress(tmp); - if (sa6->sin6_scope_id) - a.setScopeId(QString::number(sa6->sin6_scope_id)); - *address = a; - } - if (port) - WSANtohs(socketDescriptor, sa6->sin6_port, port); - } else - - if (sa->a.sa_family == AF_INET) { - const sockaddr_in *sa4 = &sa->a4; - unsigned long addr; - WSANtohl(socketDescriptor, sa4->sin_addr.s_addr, &addr); - QHostAddress a; - a.setAddress(addr); - if (address) - *address = a; - if (port) - WSANtohs(socketDescriptor, sa4->sin_port, port); - } -} - -static void convertToLevelAndOption(QNativeSocketEngine::SocketOption opt, - QAbstractSocket::NetworkLayerProtocol socketProtocol, int &level, int &n) -{ - n = 0; - level = SOL_SOCKET; // default - - switch (opt) { - case QNativeSocketEngine::NonBlockingSocketOption: // WSAIoctl - case QNativeSocketEngine::TypeOfServiceOption: // not supported - Q_UNREACHABLE(); - - case QNativeSocketEngine::ReceiveBufferSocketOption: - n = SO_RCVBUF; - break; - case QNativeSocketEngine::SendBufferSocketOption: - n = SO_SNDBUF; - break; - case QNativeSocketEngine::BroadcastSocketOption: - n = SO_BROADCAST; - break; - case QNativeSocketEngine::AddressReusable: - n = SO_REUSEADDR; - break; - case QNativeSocketEngine::BindExclusively: - n = SO_EXCLUSIVEADDRUSE; - break; - case QNativeSocketEngine::ReceiveOutOfBandData: - n = SO_OOBINLINE; - break; - case QNativeSocketEngine::LowDelayOption: - level = IPPROTO_TCP; - n = TCP_NODELAY; - break; - case QNativeSocketEngine::KeepAliveOption: - n = SO_KEEPALIVE; - break; - case QNativeSocketEngine::MulticastTtlOption: - if (socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) { - level = IPPROTO_IPV6; - n = IPV6_MULTICAST_HOPS; - } else - { - level = IPPROTO_IP; - n = IP_MULTICAST_TTL; - } - break; - case QNativeSocketEngine::MulticastLoopbackOption: - if (socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) { - level = IPPROTO_IPV6; - n = IPV6_MULTICAST_LOOP; - } else - { - level = IPPROTO_IP; - n = IP_MULTICAST_LOOP; - } - break; - } -} - -/*! \internal - - Sets the port and address to a sockaddr. Requires that sa point to the IPv6 struct if the address is IPv6. -*/ -void QNativeSocketEnginePrivate::setPortAndAddress(sockaddr_in * sockAddrIPv4, qt_sockaddr_in6 * sockAddrIPv6, - quint16 port, const QHostAddress & address, sockaddr ** sockAddrPtr, QT_SOCKLEN_T *sockAddrSize) -{ - if (address.protocol() == QAbstractSocket::IPv6Protocol - || address.protocol() == QAbstractSocket::AnyIPProtocol - || socketProtocol == QAbstractSocket::IPv6Protocol - || socketProtocol == QAbstractSocket::AnyIPProtocol) { - memset(sockAddrIPv6, 0, sizeof(qt_sockaddr_in6)); - sockAddrIPv6->sin6_family = AF_INET6; - sockAddrIPv6->sin6_scope_id = address.scopeId().toUInt(); - WSAHtons(socketDescriptor, port, &(sockAddrIPv6->sin6_port)); - Q_IPV6ADDR tmp = address.toIPv6Address(); - memcpy(&(sockAddrIPv6->sin6_addr.qt_s6_addr), &tmp, sizeof(tmp)); - *sockAddrSize = sizeof(qt_sockaddr_in6); - *sockAddrPtr = (struct sockaddr *) sockAddrIPv6; - } else - - if (address.protocol() == QAbstractSocket::IPv4Protocol - || address.protocol() == QAbstractSocket::UnknownNetworkLayerProtocol) { - memset(sockAddrIPv4, 0, sizeof(sockaddr_in)); - sockAddrIPv4->sin_family = AF_INET; - WSAHtons(socketDescriptor, port, &(sockAddrIPv4->sin_port)); - WSAHtonl(socketDescriptor, address.toIPv4Address(), &(sockAddrIPv4->sin_addr.s_addr)); - *sockAddrSize = sizeof(sockaddr_in); - *sockAddrPtr = (struct sockaddr *) sockAddrIPv4; - } else { - // unreachable - } -} - -/*! \internal - -*/ -static inline QAbstractSocket::SocketType qt_socket_getType(qintptr socketDescriptor) -{ - int value = 0; - QT_SOCKLEN_T valueSize = sizeof(value); - if (::getsockopt(socketDescriptor, SOL_SOCKET, SO_TYPE, (char *) &value, &valueSize) != 0) { - WS_ERROR_DEBUG(WSAGetLastError()); - } else { - if (value == SOCK_STREAM) - return QAbstractSocket::TcpSocket; - else if (value == SOCK_DGRAM) - return QAbstractSocket::UdpSocket; - } - return QAbstractSocket::UnknownSocketType; -} - -/*! \internal - -*/ -static inline int qt_socket_getMaxMsgSize(qintptr socketDescriptor) -{ - int value = 0; - QT_SOCKLEN_T valueSize = sizeof(value); - if (::getsockopt(socketDescriptor, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *) &value, &valueSize) != 0) { - WS_ERROR_DEBUG(WSAGetLastError()); - } - return value; -} - -QWindowsSockInit::QWindowsSockInit() -: version(0) -{ - //### should we try for 2.2 on all platforms ?? - WSAData wsadata; - - // IPv6 requires Winsock v2.0 or better. - if (WSAStartup(MAKEWORD(2,0), &wsadata) != 0) { - qWarning("QTcpSocketAPI: WinSock v2.0 initialization failed."); - } else { - version = 0x20; - } -} - -QWindowsSockInit::~QWindowsSockInit() -{ - WSACleanup(); -} - -// MS Transport Provider IOCTL to control -// reporting PORT_UNREACHABLE messages -// on UDP sockets via recv/WSARecv/etc. -// Path TRUE in input buffer to enable (default if supported), -// FALSE to disable. -#ifndef SIO_UDP_CONNRESET -# ifndef IOC_VENDOR -# define IOC_VENDOR 0x18000000 -# endif -# ifndef _WSAIOW -# define _WSAIOW(x,y) (IOC_IN|(x)|(y)) -# endif -# define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12) -#endif - -bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType socketType, QAbstractSocket::NetworkLayerProtocol &socketProtocol) -{ - - //### no ip6 support on winsocket 1.1 but we will try not to use this !!!!!!!!!!!!1 - /* - if (winsockVersion < 0x20 && socketProtocol == QAbstractSocket::IPv6Protocol) { - //### no ip6 support - return -1; - } - */ - QSysInfo::WinVersion osver = QSysInfo::windowsVersion(); - - //Windows XP and 2003 support IPv6 but not dual stack sockets - int protocol = (socketProtocol == QAbstractSocket::IPv6Protocol - || (socketProtocol == QAbstractSocket::AnyIPProtocol && osver >= QSysInfo::WV_6_0)) ? AF_INET6 : AF_INET; - int type = (socketType == QAbstractSocket::UdpSocket) ? SOCK_DGRAM : SOCK_STREAM; - - // MSDN KB179942 states that on winnt 4 WSA_FLAG_OVERLAPPED is needed if socket is to be non blocking - // and recomends alwasy doing it for cross windows version comapablity. - - // WSA_FLAG_NO_HANDLE_INHERIT is atomic (like linux O_CLOEXEC), but requires windows 7 SP 1 or later - // SetHandleInformation is supported since W2K but isn't atomic -#ifndef WSA_FLAG_NO_HANDLE_INHERIT -#define WSA_FLAG_NO_HANDLE_INHERIT 0x80 -#endif - - SOCKET socket = INVALID_SOCKET; - // Windows 7 or later, try the new API - if ((osver & QSysInfo::WV_NT_based) >= QSysInfo::WV_6_1) - socket = ::WSASocket(protocol, type, 0, NULL, 0, WSA_FLAG_NO_HANDLE_INHERIT | WSA_FLAG_OVERLAPPED); - // previous call fails if the windows 7 service pack 1 or hot fix isn't installed. - - // Try the old API if the new one failed on Windows 7, or always on earlier versions - if (socket == INVALID_SOCKET && ((osver & QSysInfo::WV_NT_based) <= QSysInfo::WV_6_1)) { - socket = ::WSASocket(protocol, type, 0, NULL, 0, WSA_FLAG_OVERLAPPED); -#ifdef HANDLE_FLAG_INHERIT - if (socket != INVALID_SOCKET) { - // make non inheritable the old way - BOOL handleFlags = SetHandleInformation((HANDLE)socket, HANDLE_FLAG_INHERIT, 0); -#ifdef QNATIVESOCKETENGINE_DEBUG - qDebug() << "QNativeSocketEnginePrivate::createNewSocket - set inheritable" << handleFlags; -#else - Q_UNUSED(handleFlags); -#endif - } -#endif - } - - if (socket == INVALID_SOCKET) { - int err = WSAGetLastError(); - WS_ERROR_DEBUG(err); - switch (err) { - case WSANOTINITIALISED: - //### - break; - case WSAEAFNOSUPPORT: - case WSAESOCKTNOSUPPORT: - case WSAEPROTOTYPE: - case WSAEINVAL: - setError(QAbstractSocket::UnsupportedSocketOperationError, ProtocolUnsupportedErrorString); - break; - case WSAEMFILE: - case WSAENOBUFS: - setError(QAbstractSocket::SocketResourceError, ResourceErrorString); - break; - default: - break; - } - - return false; - } - -#if !defined(Q_OS_WINCE) - if (socketType == QAbstractSocket::UdpSocket) { - // enable new behavior using - // SIO_UDP_CONNRESET - DWORD dwBytesReturned = 0; - int bNewBehavior = 1; - if (::WSAIoctl(socket, SIO_UDP_CONNRESET, &bNewBehavior, sizeof(bNewBehavior), - NULL, 0, &dwBytesReturned, NULL, NULL) == SOCKET_ERROR) { - // not to worry isBogusUdpReadNotification() should handle this otherwise - int err = WSAGetLastError(); - WS_ERROR_DEBUG(err); - } - } -#endif - - socketDescriptor = socket; - - // Make the socket nonblocking. - if (!setOption(QAbstractSocketEngine::NonBlockingSocketOption, 1)) { - setError(QAbstractSocket::UnsupportedSocketOperationError, NonBlockingInitFailedErrorString); - q_func()->close(); - return false; - } - - return true; -} - -/*! \internal - - Returns the value of the socket option \a opt. -*/ -int QNativeSocketEnginePrivate::option(QNativeSocketEngine::SocketOption opt) const -{ - Q_Q(const QNativeSocketEngine); - if (!q->isValid()) - return -1; - - // handle non-getsockopt - switch (opt) { - case QNativeSocketEngine::NonBlockingSocketOption: { - unsigned long buf = 0; - if (WSAIoctl(socketDescriptor, FIONBIO, 0,0, &buf, sizeof(buf), 0,0,0) == 0) - return buf; - else - return -1; - break; - } - case QNativeSocketEngine::TypeOfServiceOption: - return -1; - - default: - break; - } - -#if Q_BYTE_ORDER != Q_LITTLE_ENDIAN -#error code assumes windows is little endian -#endif - int n, level; - int v = 0; //note: windows doesn't write to all bytes if the option type is smaller than int - QT_SOCKOPTLEN_T len = sizeof(v); - - convertToLevelAndOption(opt, socketProtocol, level, n); - if (getsockopt(socketDescriptor, level, n, (char *) &v, &len) == 0) - return v; - WS_ERROR_DEBUG(WSAGetLastError()); - return -1; -} - - -/*! \internal - Sets the socket option \a opt to \a v. -*/ -bool QNativeSocketEnginePrivate::setOption(QNativeSocketEngine::SocketOption opt, int v) -{ - Q_Q(const QNativeSocketEngine); - if (!q->isValid()) - return false; - - // handle non-setsockopt options - switch (opt) { - case QNativeSocketEngine::SendBufferSocketOption: - // see QTBUG-30478 SO_SNDBUF should not be used on Vista or later - if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA) - return false; - break; - case QNativeSocketEngine::NonBlockingSocketOption: - { - unsigned long buf = v; - unsigned long outBuf; - DWORD sizeWritten = 0; - if (::WSAIoctl(socketDescriptor, FIONBIO, &buf, sizeof(unsigned long), &outBuf, sizeof(unsigned long), &sizeWritten, 0,0) == SOCKET_ERROR) { - WS_ERROR_DEBUG(WSAGetLastError()); - return false; - } - return true; - break; - } - case QNativeSocketEngine::TypeOfServiceOption: - return false; - - default: - break; - } - - int n, level; - convertToLevelAndOption(opt, socketProtocol, level, n); - if (::setsockopt(socketDescriptor, level, n, (char*)&v, sizeof(v)) != 0) { - WS_ERROR_DEBUG(WSAGetLastError()); - return false; - } - return true; -} - -/*! - Fetches information about both ends of the connection: whatever is - available. -*/ -bool QNativeSocketEnginePrivate::fetchConnectionParameters() -{ - localPort = 0; - localAddress.clear(); - peerPort = 0; - peerAddress.clear(); - - if (socketDescriptor == -1) - return false; - - qt_sockaddr sa; - QT_SOCKLEN_T sockAddrSize = sizeof(sa); - - // Determine local address - memset(&sa, 0, sizeof(sa)); - if (::getsockname(socketDescriptor, &sa.a, &sockAddrSize) == 0) { - qt_socket_getPortAndAddress(socketDescriptor, &sa, &localPort, &localAddress); - // Determine protocol family - switch (sa.a.sa_family) { - case AF_INET: - socketProtocol = QAbstractSocket::IPv4Protocol; - break; - case AF_INET6: - socketProtocol = QAbstractSocket::IPv6Protocol; - break; - default: - socketProtocol = QAbstractSocket::UnknownNetworkLayerProtocol; - break; - } - } else { - int err = WSAGetLastError(); - WS_ERROR_DEBUG(err); - if (err == WSAENOTSOCK) { - setError(QAbstractSocket::UnsupportedSocketOperationError, - InvalidSocketErrorString); - return false; - } - } - - // determine if local address is dual mode - DWORD ipv6only = 0; - QT_SOCKOPTLEN_T optlen = sizeof(ipv6only); - if (localAddress == QHostAddress::AnyIPv6 - && QSysInfo::windowsVersion() >= QSysInfo::WV_6_0 - && !getsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&ipv6only, &optlen )) { - if (!ipv6only) { - socketProtocol = QAbstractSocket::AnyIPProtocol; - localAddress = QHostAddress::Any; - } - } - - memset(&sa, 0, sizeof(sa)); - if (::getpeername(socketDescriptor, &sa.a, &sockAddrSize) == 0) { - qt_socket_getPortAndAddress(socketDescriptor, &sa, &peerPort, &peerAddress); - } else { - WS_ERROR_DEBUG(WSAGetLastError()); - } - - socketType = qt_socket_getType(socketDescriptor); - -#if defined (QNATIVESOCKETENGINE_DEBUG) - QString socketProtocolStr = "UnknownProtocol"; - if (socketProtocol == QAbstractSocket::IPv4Protocol) socketProtocolStr = "IPv4Protocol"; - else if (socketProtocol == QAbstractSocket::IPv6Protocol) socketProtocolStr = "IPv6Protocol"; - - QString socketTypeStr = "UnknownSocketType"; - if (socketType == QAbstractSocket::TcpSocket) socketTypeStr = "TcpSocket"; - else if (socketType == QAbstractSocket::UdpSocket) socketTypeStr = "UdpSocket"; - - qDebug("QNativeSocketEnginePrivate::fetchConnectionParameters() localAddress == %s, localPort = %i, peerAddress == %s, peerPort = %i, socketProtocol == %s, socketType == %s", localAddress.toString().toLatin1().constData(), localPort, peerAddress.toString().toLatin1().constData(), peerPort, socketProtocolStr.toLatin1().constData(), socketTypeStr.toLatin1().constData()); -#endif - - return true; -} - - -bool QNativeSocketEnginePrivate::nativeConnect(const QHostAddress &address, quint16 port) -{ - -#if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeConnect() to %s :: %i", address.toString().toLatin1().constData(), port); -#endif - - struct sockaddr_in sockAddrIPv4; - qt_sockaddr_in6 sockAddrIPv6; - struct sockaddr *sockAddrPtr = 0; - QT_SOCKLEN_T sockAddrSize = 0; - - setPortAndAddress(&sockAddrIPv4, &sockAddrIPv6, port, address, &sockAddrPtr, &sockAddrSize); - - if ((socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) && address.toIPv4Address()) { - //IPV6_V6ONLY option must be cleared to connect to a V4 mapped address - if (QSysInfo::windowsVersion() >= QSysInfo::WV_6_0) { - DWORD ipv6only = 0; - ipv6only = ::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&ipv6only, sizeof(ipv6only) ); - } - } - - forever { - int connectResult = ::WSAConnect(socketDescriptor, sockAddrPtr, sockAddrSize, 0,0,0,0); - if (connectResult == SOCKET_ERROR) { - int err = WSAGetLastError(); - WS_ERROR_DEBUG(err); - - switch (err) { - case WSANOTINITIALISED: - //### - break; - case WSAEISCONN: - socketState = QAbstractSocket::ConnectedState; - break; - case WSAEWOULDBLOCK: { - // If WSAConnect returns WSAEWOULDBLOCK on the second - // connection attempt, we have to check SO_ERROR's - // value to detect ECONNREFUSED. If we don't get - // ECONNREFUSED, we'll have to treat it as an - // unfinished operation. - int value = 0; - QT_SOCKLEN_T valueSize = sizeof(value); - bool tryAgain = false; - bool errorDetected = false; - int tries = 0; - do { - if (::getsockopt(socketDescriptor, SOL_SOCKET, SO_ERROR, (char *) &value, &valueSize) == 0) { - if (value == WSAECONNREFUSED) { - setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString); - socketState = QAbstractSocket::UnconnectedState; - errorDetected = true; - break; - } - if (value == WSAETIMEDOUT) { - setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString); - socketState = QAbstractSocket::UnconnectedState; - errorDetected = true; - break; - } - if (value == WSAEHOSTUNREACH) { - setError(QAbstractSocket::NetworkError, HostUnreachableErrorString); - socketState = QAbstractSocket::UnconnectedState; - errorDetected = true; - break; - } - if (value == WSAENETUNREACH) { - setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString); - socketState = QAbstractSocket::UnconnectedState; - errorDetected = true; - break; - } - if (value == WSAEADDRNOTAVAIL) { - setError(QAbstractSocket::NetworkError, AddressNotAvailableErrorString); - socketState = QAbstractSocket::UnconnectedState; - errorDetected = true; - break; - } - if (value == NOERROR) { - // When we get WSAEWOULDBLOCK the outcome was not known, so a - // NOERROR might indicate that the result of the operation - // is still unknown. We try again to increase the chance that we did - // get the correct result. - tryAgain = !tryAgain; - } - } - tries++; - } while (tryAgain && (tries < 2)); - - if (errorDetected) - break; - // fall through - } - case WSAEINPROGRESS: - setError(QAbstractSocket::UnfinishedSocketOperationError, InvalidSocketErrorString); - socketState = QAbstractSocket::ConnectingState; - break; - case WSAEADDRINUSE: - setError(QAbstractSocket::NetworkError, AddressInuseErrorString); - break; - case WSAECONNREFUSED: - setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString); - socketState = QAbstractSocket::UnconnectedState; - break; - case WSAETIMEDOUT: - setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString); - break; - case WSAEACCES: - setError(QAbstractSocket::SocketAccessError, AccessErrorString); - socketState = QAbstractSocket::UnconnectedState; - break; - case WSAEHOSTUNREACH: - setError(QAbstractSocket::NetworkError, HostUnreachableErrorString); - socketState = QAbstractSocket::UnconnectedState; - break; - case WSAENETUNREACH: - setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString); - socketState = QAbstractSocket::UnconnectedState; - break; - case WSAEINVAL: - case WSAEALREADY: - setError(QAbstractSocket::UnfinishedSocketOperationError, InvalidSocketErrorString); - break; - default: - break; - } - if (socketState != QAbstractSocket::ConnectedState) { -#if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeConnect(%s, %i) == false (%s)", - address.toString().toLatin1().constData(), port, - socketState == QAbstractSocket::ConnectingState - ? "Connection in progress" : socketErrorString.toLatin1().constData()); -#endif - return false; - } - } - break; - } - -#if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeConnect(%s, %i) == true", - address.toString().toLatin1().constData(), port); -#endif - - socketState = QAbstractSocket::ConnectedState; - return true; -} - - -bool QNativeSocketEnginePrivate::nativeBind(const QHostAddress &a, quint16 port) -{ - QHostAddress address = a; - DWORD ipv6only = 0; - switch (address.protocol()) { - case QAbstractSocket::IPv6Protocol: - if (address.toIPv6Address()[0] == 0xff) { - // binding to a multicast address - address = QHostAddress(QHostAddress::AnyIPv6); - } - //This is default in current windows versions, it may change in future so set it explicitly - if (QSysInfo::windowsVersion() >= QSysInfo::WV_6_0) { - ipv6only = 1; - ipv6only = ::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&ipv6only, sizeof(ipv6only) ); - } - break; - case QAbstractSocket::IPv4Protocol: - if ((address.toIPv4Address() & 0xffff0000) == 0xefff0000) { - // binding to a multicast address - address = QHostAddress(QHostAddress::AnyIPv4); - } - break; - case QAbstractSocket::AnyIPProtocol: - if (QSysInfo::windowsVersion() >= QSysInfo::WV_6_0) { - ipv6only = ::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&ipv6only, sizeof(ipv6only) ); - } else { - address = QHostAddress(QHostAddress::AnyIPv4); //xp/WS2003 and earlier don't support dual stack, so bind to IPv4 - socketProtocol = QAbstractSocket::IPv4Protocol; - } - break; - default: - break; - } - - struct sockaddr_in sockAddrIPv4; - qt_sockaddr_in6 sockAddrIPv6; - struct sockaddr *sockAddrPtr = 0; - QT_SOCKLEN_T sockAddrSize = 0; - - setPortAndAddress(&sockAddrIPv4, &sockAddrIPv6, port, address, &sockAddrPtr, &sockAddrSize); - - - int bindResult = ::bind(socketDescriptor, sockAddrPtr, sockAddrSize); - if (bindResult == SOCKET_ERROR) { - int err = WSAGetLastError(); - WS_ERROR_DEBUG(err); - switch (err) { - case WSANOTINITIALISED: - //### - break; - case WSAEADDRINUSE: - case WSAEINVAL: - setError(QAbstractSocket::AddressInUseError, AddressInuseErrorString); - break; - case WSAEACCES: - setError(QAbstractSocket::SocketAccessError, AddressProtectedErrorString); - break; - case WSAEADDRNOTAVAIL: - setError(QAbstractSocket::SocketAddressNotAvailableError, AddressNotAvailableErrorString); - break; - default: - break; - } - -#if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeBind(%s, %i) == false (%s)", - address.toString().toLatin1().constData(), port, socketErrorString.toLatin1().constData()); -#endif - - return false; - } - -#if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeBind(%s, %i) == true", - address.toString().toLatin1().constData(), port); -#endif - socketState = QAbstractSocket::BoundState; - return true; -} - - -bool QNativeSocketEnginePrivate::nativeListen(int backlog) -{ - if (::listen(socketDescriptor, backlog) == SOCKET_ERROR) { - int err = WSAGetLastError(); - WS_ERROR_DEBUG(err); - switch (err) { - case WSANOTINITIALISED: - //### - break; - case WSAEADDRINUSE: - setError(QAbstractSocket::AddressInUseError, - PortInuseErrorString); - break; - default: - break; - } - -#if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeListen(%i) == false (%s)", - backlog, socketErrorString.toLatin1().constData()); -#endif - return false; - } - -#if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeListen(%i) == true", backlog); -#endif - - socketState = QAbstractSocket::ListeningState; - return true; -} - -int QNativeSocketEnginePrivate::nativeAccept() -{ - int acceptedDescriptor = WSAAccept(socketDescriptor, 0,0,0,0); - if (acceptedDescriptor == -1) { - int err = WSAGetLastError(); - switch (err) { - case WSAEACCES: - setError(QAbstractSocket::SocketAccessError, AccessErrorString); - break; - case WSAECONNREFUSED: - setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString); - break; - case WSAECONNRESET: - setError(QAbstractSocket::NetworkError, RemoteHostClosedErrorString); - break; - case WSAENETDOWN: - setError(QAbstractSocket::NetworkError, NetworkUnreachableErrorString); - case WSAENOTSOCK: - setError(QAbstractSocket::SocketResourceError, NotSocketErrorString); - break; - case WSAEINVAL: - case WSAEOPNOTSUPP: - setError(QAbstractSocket::UnsupportedSocketOperationError, ProtocolUnsupportedErrorString); - break; - case WSAEFAULT: - case WSAEMFILE: - case WSAENOBUFS: - setError(QAbstractSocket::SocketResourceError, ResourceErrorString); - break; - case WSAEWOULDBLOCK: - setError(QAbstractSocket::TemporaryError, TemporaryErrorString); - break; - default: - setError(QAbstractSocket::UnknownSocketError, UnknownSocketErrorString); - break; - } - } else if (acceptedDescriptor != -1 && QAbstractEventDispatcher::instance()) { - // Because of WSAAsyncSelect() WSAAccept returns a non blocking socket - // with the same attributes as the listening socket including the current - // WSAAsyncSelect(). To be able to change the socket to blocking mode the - // WSAAsyncSelect() call must be cancled. - QSocketNotifier n(acceptedDescriptor, QSocketNotifier::Read); - n.setEnabled(true); - n.setEnabled(false); - } -#if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeAccept() == %i", acceptedDescriptor); -#endif - return acceptedDescriptor; -} - -static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d, - int how6, - int how4, - const QHostAddress &groupAddress, - const QNetworkInterface &iface) -{ - int level = 0; - int sockOpt = 0; - char *sockArg; - int sockArgSize; - - struct ip_mreq mreq4; - struct ipv6_mreq mreq6; - - if (groupAddress.protocol() == QAbstractSocket::IPv6Protocol) { - level = IPPROTO_IPV6; - sockOpt = how6; - sockArg = reinterpret_cast(&mreq6); - sockArgSize = sizeof(mreq6); - memset(&mreq6, 0, sizeof(mreq6)); - Q_IPV6ADDR ip6 = groupAddress.toIPv6Address(); - memcpy(&mreq6.ipv6mr_multiaddr, &ip6, sizeof(ip6)); - mreq6.ipv6mr_interface = iface.index(); - } else - - if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol) { - level = IPPROTO_IP; - sockOpt = how4; - sockArg = reinterpret_cast(&mreq4); - sockArgSize = sizeof(mreq4); - memset(&mreq4, 0, sizeof(mreq4)); - mreq4.imr_multiaddr.s_addr = htonl(groupAddress.toIPv4Address()); - - if (iface.isValid()) { - QList addressEntries = iface.addressEntries(); - if (!addressEntries.isEmpty()) { - QHostAddress firstIP = addressEntries.first().ip(); - mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address()); - } else { - d->setError(QAbstractSocket::NetworkError, - QNativeSocketEnginePrivate::NetworkUnreachableErrorString); - return false; - } - } else { - mreq4.imr_interface.s_addr = INADDR_ANY; - } - } else { - // unreachable - d->setError(QAbstractSocket::UnsupportedSocketOperationError, - QNativeSocketEnginePrivate::ProtocolUnsupportedErrorString); - return false; - } - - int res = setsockopt(d->socketDescriptor, level, sockOpt, sockArg, sockArgSize); - if (res == -1) { - d->setError(QAbstractSocket::UnsupportedSocketOperationError, - QNativeSocketEnginePrivate::OperationUnsupportedErrorString); - return false; - } - return true; -} - -bool QNativeSocketEnginePrivate::nativeJoinMulticastGroup(const QHostAddress &groupAddress, - const QNetworkInterface &iface) -{ - return multicastMembershipHelper(this, - IPV6_JOIN_GROUP, - IP_ADD_MEMBERSHIP, - groupAddress, - iface); -} - -bool QNativeSocketEnginePrivate::nativeLeaveMulticastGroup(const QHostAddress &groupAddress, - const QNetworkInterface &iface) -{ - return multicastMembershipHelper(this, - IPV6_LEAVE_GROUP, - IP_DROP_MEMBERSHIP, - groupAddress, - iface); -} - -QNetworkInterface QNativeSocketEnginePrivate::nativeMulticastInterface() const -{ - if (socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) { - uint v; - QT_SOCKOPTLEN_T sizeofv = sizeof(v); - if (::getsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *) &v, &sizeofv) == -1) - return QNetworkInterface(); - return QNetworkInterface::interfaceFromIndex(v); - } - - struct in_addr v; - v.s_addr = 0; - QT_SOCKOPTLEN_T sizeofv = sizeof(v); - if (::getsockopt(socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (char *) &v, &sizeofv) == -1) - return QNetworkInterface(); - if (v.s_addr != 0 && sizeofv >= QT_SOCKOPTLEN_T(sizeof(v))) { - QHostAddress ipv4(ntohl(v.s_addr)); - QList ifaces = QNetworkInterface::allInterfaces(); - for (int i = 0; i < ifaces.count(); ++i) { - const QNetworkInterface &iface = ifaces.at(i); - if (!(iface.flags() & QNetworkInterface::CanMulticast)) - continue; - QList entries = iface.addressEntries(); - for (int j = 0; j < entries.count(); ++j) { - const QNetworkAddressEntry &entry = entries.at(j); - if (entry.ip() == ipv4) - return iface; - } - } - } - return QNetworkInterface(); -} - -bool QNativeSocketEnginePrivate::nativeSetMulticastInterface(const QNetworkInterface &iface) -{ - - if (socketProtocol == QAbstractSocket::IPv6Protocol || socketProtocol == QAbstractSocket::AnyIPProtocol) { - uint v = iface.isValid() ? iface.index() : 0; - return (::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *) &v, sizeof(v)) != -1); - } - - struct in_addr v; - if (iface.isValid()) { - QList entries = iface.addressEntries(); - for (int i = 0; i < entries.count(); ++i) { - const QNetworkAddressEntry &entry = entries.at(i); - const QHostAddress &ip = entry.ip(); - if (ip.protocol() == QAbstractSocket::IPv4Protocol) { - v.s_addr = htonl(ip.toIPv4Address()); - int r = ::setsockopt(socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (char *) &v, sizeof(v)); - if (r != -1) - return true; - } - } - return false; - } - - v.s_addr = INADDR_ANY; - return (::setsockopt(socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, (char *) &v, sizeof(v)) != -1); -} - -qint64 QNativeSocketEnginePrivate::nativeBytesAvailable() const -{ - unsigned long nbytes = 0; - unsigned long dummy = 0; - DWORD sizeWritten = 0; - if (::WSAIoctl(socketDescriptor, FIONREAD, &dummy, sizeof(dummy), &nbytes, sizeof(nbytes), &sizeWritten, 0,0) == SOCKET_ERROR) { - WS_ERROR_DEBUG(WSAGetLastError()); - return -1; - } - - // ioctlsocket sometimes reports 1 byte available for datagrams - // while the following recvfrom returns -1 and claims connection - // was reset (udp is connectionless). so we peek one byte to - // catch this case and return 0 bytes available if recvfrom - // fails. - if (nbytes == 1 && socketType == QAbstractSocket::UdpSocket) { - char c; - WSABUF buf; - buf.buf = &c; - buf.len = sizeof(c); - DWORD flags = MSG_PEEK; - if (::WSARecvFrom(socketDescriptor, &buf, 1, 0, &flags, 0,0,0,0) == SOCKET_ERROR) - return 0; - } - return nbytes; -} - - -bool QNativeSocketEnginePrivate::nativeHasPendingDatagrams() const -{ -#if !defined(Q_OS_WINCE) - // Create a sockaddr struct and reset its port number. - qt_sockaddr storage; - QT_SOCKLEN_T storageSize = sizeof(storage); - memset(&storage, 0, storageSize); - - bool result = false; - - // Peek 0 bytes into the next message. The size of the message may - // well be 0, so we check if there was a sender. - char c; - WSABUF buf; - buf.buf = &c; - buf.len = sizeof(c); - DWORD available = 0; - DWORD flags = MSG_PEEK; - int ret = ::WSARecvFrom(socketDescriptor, &buf, 1, &available, &flags, &storage.a, &storageSize,0,0); - int err = WSAGetLastError(); - if (ret == SOCKET_ERROR && err != WSAEMSGSIZE) { - WS_ERROR_DEBUG(err); - if (err == WSAECONNRESET || err == WSAENETRESET) { - // Discard error message to prevent QAbstractSocket from - // getting this message repeatedly after reenabling the - // notifiers. - flags = 0; - ::WSARecvFrom(socketDescriptor, &buf, 1, &available, &flags, - &storage.a, &storageSize, 0, 0); - } - } else { - // If there's no error, or if our buffer was too small, there must be - // a pending datagram. - result = true; - } - -#else // Q_OS_WINCE - bool result = false; - fd_set readS; - FD_ZERO(&readS); - FD_SET((SOCKET)socketDescriptor, &readS); - timeval timeout; - timeout.tv_sec = 0; - timeout.tv_usec = 5000; - int available = ::select(1, &readS, 0, 0, &timeout); - result = available > 0; -#endif - -#if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeHasPendingDatagrams() == %s", - result ? "true" : "false"); -#endif - return result; -} - - -qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const -{ - qint64 ret = -1; -#if !defined(Q_OS_WINCE) - int recvResult = 0; - DWORD flags; - DWORD bufferCount = 5; - WSABUF * buf = 0; - for (;;) { - // the data written to udpMessagePeekBuffer is discarded, so - // this function is still reentrant although it might not look - // so. - static char udpMessagePeekBuffer[8192]; - - buf = new WSABUF[bufferCount]; - for (DWORD i=0; i maxLength ? maxLength : qint64(bytesRead); - } else { - WS_ERROR_DEBUG(err); - setError(QAbstractSocket::NetworkError, ReceiveDatagramErrorString); - ret = -1; - } - } else { - ret = qint64(bytesRead); - } - - qt_socket_getPortAndAddress(socketDescriptor, &aa, port, address); - -#if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeReceiveDatagram(%p \"%s\", %li, %s, %i) == %li", - data, qt_prettyDebug(data, qMin(ret, 16), ret).data(), maxLength, - address ? address->toString().toLatin1().constData() : "(nil)", - port ? *port : 0, ret); -#endif - - return ret; -} - - -qint64 QNativeSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 len, - const QHostAddress &address, quint16 port) -{ - qint64 ret = -1; - struct sockaddr_in sockAddrIPv4; - qt_sockaddr_in6 sockAddrIPv6; - struct sockaddr *sockAddrPtr = 0; - QT_SOCKLEN_T sockAddrSize = 0; - - setPortAndAddress(&sockAddrIPv4, &sockAddrIPv6, port, address, &sockAddrPtr, &sockAddrSize); - - WSABUF buf; -#if !defined(Q_OS_WINCE) - buf.buf = len ? (char*)data : 0; -#else - char tmp; - buf.buf = len ? (char*)data : &tmp; -#endif - buf.len = len; - DWORD flags = 0; - DWORD bytesSent = 0; - if (::WSASendTo(socketDescriptor, &buf, 1, &bytesSent, flags, sockAddrPtr, sockAddrSize, 0,0) == SOCKET_ERROR) { - int err = WSAGetLastError(); - WS_ERROR_DEBUG(err); - switch (err) { - case WSAEMSGSIZE: - setError(QAbstractSocket::DatagramTooLargeError, DatagramTooLargeErrorString); - break; - default: - setError(QAbstractSocket::NetworkError, SendDatagramErrorString); - break; - } - ret = -1; - } else { - ret = qint64(bytesSent); - } - -#if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeSendDatagram(%p \"%s\", %li, \"%s\", %i) == %li", data, - qt_prettyDebug(data, qMin(len, 16), len).data(), 0, address.toString().toLatin1().constData(), - port, ret); -#endif - - return ret; -} - - -qint64 QNativeSocketEnginePrivate::nativeWrite(const char *data, qint64 len) -{ - Q_Q(QNativeSocketEngine); - qint64 ret = 0; - qint64 bytesToSend = len; - - for (;;) { - WSABUF buf; - buf.buf = (char*)data + ret; - buf.len = bytesToSend; - DWORD flags = 0; - DWORD bytesWritten = 0; - - int socketRet = ::WSASend(socketDescriptor, &buf, 1, &bytesWritten, flags, 0,0); - - ret += qint64(bytesWritten); - - int err; - if (socketRet != SOCKET_ERROR) { - if (ret == len) - break; - else - continue; - } else if ((err = WSAGetLastError()) == WSAEWOULDBLOCK) { - break; - } else if (err == WSAENOBUFS) { - // this function used to not send more than 49152 per call to WSASendTo - // to avoid getting a WSAENOBUFS. However this is a performance regression - // and we think it only appears with old windows versions. We now handle the - // WSAENOBUFS and hope it never appears anyway. - // just go on, the next loop run we will try a smaller number - } else { - WS_ERROR_DEBUG(err); - switch (err) { - case WSAECONNRESET: - case WSAECONNABORTED: - ret = -1; - setError(QAbstractSocket::NetworkError, WriteErrorString); - q->close(); - break; - default: - break; - } - break; - } - - // for next send: - bytesToSend = qMin(49152, len - ret); - } - -#if defined (QNATIVESOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeWrite(%p \"%s\", %li) == %li", - data, qt_prettyDebug(data, qMin((int)ret, 16), (int)ret).data(), (int)len, (int)ret); -#endif - - return ret; -} - -qint64 QNativeSocketEnginePrivate::nativeRead(char *data, qint64 maxLength) -{ - qint64 ret = -1; - WSABUF buf; - buf.buf = data; - buf.len = maxLength; - DWORD flags = 0; - DWORD bytesRead = 0; -#if defined(Q_OS_WINCE) - WSASetLastError(0); -#endif - if (::WSARecv(socketDescriptor, &buf, 1, &bytesRead, &flags, 0,0) == SOCKET_ERROR) { - int err = WSAGetLastError(); - WS_ERROR_DEBUG(err); - switch (err) { - case WSAEWOULDBLOCK: - ret = -2; - break; - case WSAEBADF: - case WSAEINVAL: - //error string is now set in read(), not here in nativeRead() - break; - case WSAECONNRESET: - case WSAECONNABORTED: - // for tcp sockets this will be handled in QNativeSocketEngine::read - ret = 0; - break; - default: - break; - } - } else { - if (WSAGetLastError() == WSAEWOULDBLOCK) - ret = -2; - else - ret = qint64(bytesRead); - } - -#if defined (QNATIVESOCKETENGINE_DEBUG) - if (ret != -2) { - qDebug("QNativeSocketEnginePrivate::nativeRead(%p \"%s\", %li) == %li", - data, qt_prettyDebug(data, qMin((int)bytesRead, 16), (int)bytesRead).data(), (int)maxLength, (int)ret); - } else { - qDebug("QNativeSocketEnginePrivate::nativeRead(%p, %li) == -2 (WOULD BLOCK)", - data, int(maxLength)); - } -#endif - - return ret; -} - -int QNativeSocketEnginePrivate::nativeSelect(int timeout, bool selectForRead) const -{ - bool readEnabled = selectForRead && readNotifier && readNotifier->isEnabled(); - if (readEnabled) - readNotifier->setEnabled(false); - - fd_set fds; - - int ret = 0; - - memset(&fds, 0, sizeof(fd_set)); - fds.fd_count = 1; - fds.fd_array[0] = (SOCKET)socketDescriptor; - - struct timeval tv; - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - - if (selectForRead) { - ret = select(0, &fds, 0, 0, timeout < 0 ? 0 : &tv); - } else { - // select for write - - // Windows needs this to report errors when connecting a socket ... - fd_set fdexception; - FD_ZERO(&fdexception); - FD_SET((SOCKET)socketDescriptor, &fdexception); - - ret = select(0, 0, &fds, &fdexception, timeout < 0 ? 0 : &tv); - - // ... but if it is actually set, pretend it did not happen - if (ret > 0 && FD_ISSET((SOCKET)socketDescriptor, &fdexception)) - ret--; - } - - if (readEnabled) - readNotifier->setEnabled(true); - - return ret; -} - -int QNativeSocketEnginePrivate::nativeSelect(int timeout, - bool checkRead, bool checkWrite, - bool *selectForRead, bool *selectForWrite) const -{ - bool readEnabled = checkRead && readNotifier && readNotifier->isEnabled(); - if (readEnabled) - readNotifier->setEnabled(false); - - fd_set fdread; - fd_set fdwrite; - fd_set fdexception; - - int ret = 0; - - memset(&fdread, 0, sizeof(fd_set)); - if (checkRead) { - fdread.fd_count = 1; - fdread.fd_array[0] = (SOCKET)socketDescriptor; - } - memset(&fdwrite, 0, sizeof(fd_set)); - FD_ZERO(&fdexception); - if (checkWrite) { - fdwrite.fd_count = 1; - fdwrite.fd_array[0] = (SOCKET)socketDescriptor; - - // Windows needs this to report errors when connecting a socket - FD_SET((SOCKET)socketDescriptor, &fdexception); - } - - struct timeval tv; - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - -#if !defined(Q_OS_WINCE) - ret = select(socketDescriptor + 1, &fdread, &fdwrite, &fdexception, timeout < 0 ? 0 : &tv); -#else - ret = select(1, &fdread, &fdwrite, &fdexception, timeout < 0 ? 0 : &tv); -#endif - - //... but if it is actually set, pretend it did not happen - if (ret > 0 && FD_ISSET((SOCKET)socketDescriptor, &fdexception)) - ret--; - - if (readEnabled) - readNotifier->setEnabled(true); - - if (ret <= 0) - return ret; - - *selectForRead = FD_ISSET((SOCKET)socketDescriptor, &fdread); - *selectForWrite = FD_ISSET((SOCKET)socketDescriptor, &fdwrite); - - return ret; -} - -void QNativeSocketEnginePrivate::nativeClose() -{ -#if defined (QTCPSOCKETENGINE_DEBUG) - qDebug("QNativeSocketEnginePrivate::nativeClose()"); -#endif - // We were doing a setsockopt here before with SO_DONTLINGER. (However with kind of wrong - // usage of parameters, it wants a BOOL but we used a struct and pretended it to be bool). - // We don't think setting this option should be done here, if a user wants it she/he can - // do it manually with socketDescriptor()/setSocketDescriptor(); - ::closesocket(socketDescriptor); -} - -QT_END_NAMESPACE diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp deleted file mode 100644 index 190683ef9..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp +++ /dev/null @@ -1,377 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qbasicfontdatabase_p.h" - -#include -#include - -#include -#include -#include -#include -#include - -#undef QT_NO_FREETYPE -#include -#include - -#include -#include FT_TRUETYPE_TABLES_H -#include FT_ERRORS_H - -QT_BEGIN_NAMESPACE - -void QBasicFontDatabase::populateFontDatabase() -{ - QString fontpath = fontDir(); - - if(!QFile::exists(fontpath)) { - qWarning("QFontDatabase: Cannot find font directory %s - is Qt installed correctly?", - qPrintable(fontpath)); - return; - } - - QDir dir(fontpath); - dir.setNameFilters(QStringList() << QLatin1String("*.ttf") - << QLatin1String("*.ttc") << QLatin1String("*.pfa") - << QLatin1String("*.pfb") - << QLatin1String("*.otf")); - dir.refresh(); - for (int i = 0; i < int(dir.count()); ++i) { - const QByteArray file = QFile::encodeName(dir.absoluteFilePath(dir[i])); -// qDebug() << "looking at" << file; - addTTFile(QByteArray(), file); - } -} - -inline static void setHintingPreference(QFontEngine *engine, QFont::HintingPreference hintingPreference) -{ - switch (hintingPreference) { - case QFont::PreferNoHinting: - engine->setDefaultHintStyle(QFontEngineFT::HintNone); - break; - case QFont::PreferFullHinting: - engine->setDefaultHintStyle(QFontEngineFT::HintFull); - break; - case QFont::PreferVerticalHinting: - engine->setDefaultHintStyle(QFontEngineFT::HintLight); - break; - case QFont::PreferDefaultHinting: - // Leave it as it is - break; - } -} - -QFontEngine *QBasicFontDatabase::fontEngine(const QFontDef &fontDef, void *usrPtr) -{ - FontFile *fontfile = static_cast (usrPtr); - QFontEngine::FaceId fid; - fid.filename = QFile::encodeName(fontfile->fileName); - fid.index = fontfile->indexValue; - - bool antialias = !(fontDef.styleStrategy & QFont::NoAntialias); - QFontEngineFT *engine = new QFontEngineFT(fontDef); - QFontEngineFT::GlyphFormat format = QFontEngineFT::Format_Mono; - if (antialias) { - QFontEngine::SubpixelAntialiasingType subpixelType = subpixelAntialiasingTypeHint(); - if (subpixelType == QFontEngine::Subpixel_None || (fontDef.styleStrategy & QFont::NoSubpixelAntialias)) { - format = QFontEngineFT::Format_A8; - engine->subpixelType = QFontEngine::Subpixel_None; - } else { - format = QFontEngineFT::Format_A32; - engine->subpixelType = subpixelType; - } - } - - if (!engine->init(fid, antialias, format) || engine->invalid()) { - delete engine; - engine = 0; - } else { - setHintingPreference(engine, static_cast(fontDef.hintingPreference)); - } - - return engine; -} - -namespace { - - class QFontEngineFTRawData: public QFontEngineFT - { - public: - QFontEngineFTRawData(const QFontDef &fontDef) : QFontEngineFT(fontDef) - { - } - - void updateFamilyNameAndStyle() - { - fontDef.family = QString::fromLatin1(freetype->face->family_name); - - if (freetype->face->style_flags & FT_STYLE_FLAG_ITALIC) - fontDef.style = QFont::StyleItalic; - - if (freetype->face->style_flags & FT_STYLE_FLAG_BOLD) - fontDef.weight = QFont::Bold; - } - - bool initFromData(const QByteArray &fontData) - { - FaceId faceId; - faceId.filename = ""; - faceId.index = 0; - faceId.uuid = QUuid::createUuid().toByteArray(); - - return init(faceId, true, Format_None, fontData); - } - }; - -} - -QFontEngine *QBasicFontDatabase::fontEngine(const QByteArray &fontData, qreal pixelSize, - QFont::HintingPreference hintingPreference) -{ - QFontDef fontDef; - fontDef.pixelSize = pixelSize; - fontDef.hintingPreference = hintingPreference; - - QFontEngineFTRawData *fe = new QFontEngineFTRawData(fontDef); - if (!fe->initFromData(fontData)) { - delete fe; - return 0; - } - - fe->updateFamilyNameAndStyle(); - setHintingPreference(fe, hintingPreference); - - return fe; -} - -QStringList QBasicFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const -{ - Q_UNUSED(family); - Q_UNUSED(style); - Q_UNUSED(script); - Q_UNUSED(styleHint); - return QStringList(); -} - -QStringList QBasicFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName) -{ - return addTTFile(fontData,fileName.toLocal8Bit()); -} - -void QBasicFontDatabase::releaseHandle(void *handle) -{ - FontFile *file = static_cast(handle); - delete file; -} - -extern FT_Library qt_getFreetype(); - -// copied from freetype with some modifications - -#ifndef FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY -#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY FT_MAKE_TAG('i', 'g', 'p', 'f') -#endif - -#ifndef FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY -#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY FT_MAKE_TAG('i', 'g', 'p', 's') -#endif - -/* there's a Mac-specific extended implementation of FT_New_Face() */ -/* in src/base/ftmac.c */ - -#if !defined( FT_MACINTOSH ) || defined( DARWIN_NO_CARBON ) - -/* documentation is in freetype.h */ - -FT_Error __ft_New_Face(FT_Library library, const char* pathname, FT_Long face_index, FT_Face *aface) { - FT_Open_Args args; - - /* test for valid `library' and `aface' delayed to FT_Open_Face() */ - if (!pathname) - return FT_Err_Invalid_Argument; - - FT_Parameter params[2]; - params[0].tag = FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY; - params[0].data = 0; - params[1].tag = FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY; - params[1].data = 0; - args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; - args.pathname = (char*)pathname; - args.stream = NULL; - args.num_params = 2; - args.params = params; - - return FT_Open_Face(library, &args, face_index, aface); -} - -#else - -FT_Error __ft_New_Face(FT_Library library, const char* pathname, FT_Long face_index, FT_Face *aface) { - return FT_New_Face(library, pathname, face_index, aface); -} - -#endif /* defined( FT_MACINTOSH ) && !defined( DARWIN_NO_CARBON ) */ - -/* documentation is in freetype.h */ - -FT_Error __ft_New_Memory_Face(FT_Library library, const FT_Byte* file_base, FT_Long file_size, FT_Long face_index, FT_Face *aface) { - FT_Open_Args args; - - /* test for valid `library' and `face' delayed to FT_Open_Face() */ - if (!file_base) - return FT_Err_Invalid_Argument; - - FT_Parameter params[2]; - params[0].tag = FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY; - params[0].data = 0; - params[1].tag = FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY; - params[1].data = 0; - args.flags = FT_OPEN_MEMORY | FT_OPEN_PARAMS; - args.memory_base = file_base; - args.memory_size = file_size; - args.stream = NULL; - args.num_params = 2; - args.params = params; - - return FT_Open_Face(library, &args, face_index, aface); -} - -// end - -QStringList QBasicFontDatabase::addTTFile(const QByteArray &fontData, const QByteArray &file, QSupportedWritingSystems *supportedWritingSystems) -{ - FT_Library library = qt_getFreetype(); - - int index = 0; - int numFaces = 0; - QStringList families; - do { - FT_Face face; - FT_Error error; - if (!fontData.isEmpty()) { - error = __ft_New_Memory_Face(library, (const FT_Byte *)fontData.constData(), fontData.size(), index, &face); - } else { - error = __ft_New_Face(library, file.constData(), index, &face); - } - if (error != FT_Err_Ok) { - qDebug() << "FT_New_Face failed with index" << index << ":" << hex << error; - break; - } - numFaces = face->num_faces; - - QFont::Weight weight = QFont::Normal; - - QFont::Style style = QFont::StyleNormal; - if (face->style_flags & FT_STYLE_FLAG_ITALIC) - style = QFont::StyleItalic; - - if (face->style_flags & FT_STYLE_FLAG_BOLD) - weight = QFont::Bold; - - bool fixedPitch = (face->face_flags & FT_FACE_FLAG_FIXED_WIDTH); - - QSupportedWritingSystems writingSystems; - // detect symbol fonts - for (int i = 0; i < face->num_charmaps; ++i) { - FT_CharMap cm = face->charmaps[i]; - if (cm->encoding == FT_ENCODING_ADOBE_CUSTOM - || cm->encoding == FT_ENCODING_MS_SYMBOL) { - writingSystems.setSupported(QFontDatabase::Symbol); - if (supportedWritingSystems) - supportedWritingSystems->setSupported(QFontDatabase::Symbol); - break; - } - } - - TT_OS2 *os2 = (TT_OS2 *)FT_Get_Sfnt_Table(face, ft_sfnt_os2); - if (os2) { - quint32 unicodeRange[4] = { - quint32(os2->ulUnicodeRange1), - quint32(os2->ulUnicodeRange2), - quint32(os2->ulUnicodeRange3), - quint32(os2->ulUnicodeRange4) - }; - quint32 codePageRange[2] = { - quint32(os2->ulCodePageRange1), - quint32(os2->ulCodePageRange2) - }; - - writingSystems = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRange, codePageRange); - if (supportedWritingSystems) - *supportedWritingSystems = writingSystems; - - if (os2->usWeightClass) { - weight = QPlatformFontDatabase::weightFromInteger(os2->usWeightClass); - } else if (os2->panose[2]) { - int w = os2->panose[2]; - if (w <= 1) - weight = QFont::Thin; - else if (w <= 2) - weight = QFont::ExtraLight; - else if (w <= 3) - weight = QFont::Light; - else if (w <= 5) - weight = QFont::Normal; - else if (w <= 6) - weight = QFont::Medium; - else if (w <= 7) - weight = QFont::DemiBold; - else if (w <= 8) - weight = QFont::Bold; - else if (w <= 9) - weight = QFont::ExtraBold; - else if (w <= 10) - weight = QFont::Black; - } - } - - QString family = QString::fromLatin1(face->family_name); - FontFile *fontFile = new FontFile; - fontFile->fileName = QFile::decodeName(file); - fontFile->indexValue = index; - - QFont::Stretch stretch = QFont::Unstretched; - - registerFont(family,QString::fromLatin1(face->style_name),QString(),weight,style,stretch,true,true,0,fixedPitch,writingSystems,fontFile); - - families.append(family); - - FT_Done_Face(face); - ++index; - } while (index < numFaces); - return families; -} - -QT_END_NAMESPACE diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp deleted file mode 100644 index 9f1df7082..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ /dev/null @@ -1,954 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qfontconfigdatabase_p.h" -#include "qfontenginemultifontconfig_p.h" - -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include - -#include -#if FC_VERSION >= 20402 -#include -#endif - -QT_BEGIN_NAMESPACE - -static const int maxWeight = 99; - -static inline int mapToQtWeightForRange(int fcweight, int fcLower, int fcUpper, int qtLower, int qtUpper) -{ - return qtLower + ((fcweight - fcLower) * (qtUpper - qtLower)) / (fcUpper - fcLower); -} - -static inline bool requiresOpenType(int writingSystem) -{ - return ((writingSystem >= QFontDatabase::Syriac && writingSystem <= QFontDatabase::Sinhala) - || writingSystem == QFontDatabase::Khmer || writingSystem == QFontDatabase::Nko); -} - -static inline int weightFromFcWeight(int fcweight) -{ - // Font Config uses weights from 0 to 215 (the highest enum value) while QFont ranges from - // 0 to 99. The spacing between the values for the enums are uneven so a linear mapping from - // Font Config values to Qt would give surprising results. So, we do a piecewise linear - // mapping. This ensures that where there is a corresponding enum on both sides (for example - // FC_WEIGHT_DEMIBOLD and QFont::DemiBold) we map one to the other but other values map - // to intermediate Qt weights. - - if (fcweight <= FC_WEIGHT_THIN) - return QFont::Thin; - if (fcweight <= FC_WEIGHT_ULTRALIGHT) - return mapToQtWeightForRange(fcweight, FC_WEIGHT_THIN, FC_WEIGHT_ULTRALIGHT, QFont::Thin, QFont::ExtraLight); - if (fcweight <= FC_WEIGHT_LIGHT) - return mapToQtWeightForRange(fcweight, FC_WEIGHT_ULTRALIGHT, FC_WEIGHT_LIGHT, QFont::ExtraLight, QFont::Light); - if (fcweight <= FC_WEIGHT_NORMAL) - return mapToQtWeightForRange(fcweight, FC_WEIGHT_LIGHT, FC_WEIGHT_NORMAL, QFont::Light, QFont::Normal); - if (fcweight <= FC_WEIGHT_MEDIUM) - return mapToQtWeightForRange(fcweight, FC_WEIGHT_NORMAL, FC_WEIGHT_MEDIUM, QFont::Normal, QFont::Medium); - if (fcweight <= FC_WEIGHT_DEMIBOLD) - return mapToQtWeightForRange(fcweight, FC_WEIGHT_MEDIUM, FC_WEIGHT_DEMIBOLD, QFont::Medium, QFont::DemiBold); - if (fcweight <= FC_WEIGHT_BOLD) - return mapToQtWeightForRange(fcweight, FC_WEIGHT_DEMIBOLD, FC_WEIGHT_BOLD, QFont::DemiBold, QFont::Bold); - if (fcweight <= FC_WEIGHT_ULTRABOLD) - return mapToQtWeightForRange(fcweight, FC_WEIGHT_BOLD, FC_WEIGHT_ULTRABOLD, QFont::Bold, QFont::ExtraBold); - if (fcweight <= FC_WEIGHT_BLACK) - return mapToQtWeightForRange(fcweight, FC_WEIGHT_ULTRABOLD, FC_WEIGHT_BLACK, QFont::ExtraBold, QFont::Black); - if (fcweight <= FC_WEIGHT_ULTRABLACK) - return mapToQtWeightForRange(fcweight, FC_WEIGHT_BLACK, FC_WEIGHT_ULTRABLACK, QFont::Black, maxWeight); - return maxWeight; -} - -static inline int stretchFromFcWidth(int fcwidth) -{ - // Font Config enums for width match pretty closely with those used by Qt so just use - // Font Config values directly while enforcing the same limits imposed by QFont. - const int maxStretch = 4000; - int qtstretch; - if (fcwidth < 1) - qtstretch = 1; - else if (fcwidth > maxStretch) - qtstretch = maxStretch; - else - qtstretch = fcwidth; - - return qtstretch; -} - -static const char *specialLanguages[] = { - "", // Unknown - "", // Inherited - "", // Common - "en", // Latin - "el", // Greek - "ru", // Cyrillic - "hy", // Armenian - "he", // Hebrew - "ar", // Arabic - "syr", // Syriac - "dv", // Thaana - "hi", // Devanagari - "bn", // Bengali - "pa", // Gurmukhi - "gu", // Gujarati - "or", // Oriya - "ta", // Tamil - "te", // Telugu - "kn", // Kannada - "ml", // Malayalam - "si", // Sinhala - "th", // Thai - "lo", // Lao - "bo", // Tibetan - "my", // Myanmar - "ka", // Georgian - "ko", // Hangul - "am", // Ethiopic - "chr", // Cherokee - "cr", // CanadianAboriginal - "sga", // Ogham - "non", // Runic - "km", // Khmer - "mn", // Mongolian - "ja", // Hiragana - "ja", // Katakana - "zh-TW", // Bopomofo - "", // Han - "ii", // Yi - "ett", // OldItalic - "got", // Gothic - "en", // Deseret - "fil", // Tagalog - "hnn", // Hanunoo - "bku", // Buhid - "tbw", // Tagbanwa - "cop", // Coptic - "lif", // Limbu - "tdd", // TaiLe - "grc", // LinearB - "uga", // Ugaritic - "en", // Shavian - "so", // Osmanya - "grc", // Cypriot - "", // Braille - "bug", // Buginese - "khb", // NewTaiLue - "cu", // Glagolitic - "shi", // Tifinagh - "syl", // SylotiNagri - "peo", // OldPersian - "pra", // Kharoshthi - "ban", // Balinese - "akk", // Cuneiform - "phn", // Phoenician - "lzh", // PhagsPa - "man", // Nko - "su", // Sundanese - "lep", // Lepcha - "sat", // OlChiki - "vai", // Vai - "saz", // Saurashtra - "eky", // KayahLi - "rej", // Rejang - "xlc", // Lycian - "xcr", // Carian - "xld", // Lydian - "cjm", // Cham - "nod", // TaiTham - "blt", // TaiViet - "ae", // Avestan - "egy", // EgyptianHieroglyphs - "smp", // Samaritan - "lis", // Lisu - "bax", // Bamum - "jv", // Javanese - "mni", // MeeteiMayek - "arc", // ImperialAramaic - "xsa", // OldSouthArabian - "xpr", // InscriptionalParthian - "pal", // InscriptionalPahlavi - "otk", // OldTurkic - "bh", // Kaithi - "bbc", // Batak - "pra", // Brahmi - "myz", // Mandaic - "ccp", // Chakma - "xmr", // MeroiticCursive - "xmr", // MeroiticHieroglyphs - "hmd", // Miao - "sa", // Sharada - "srb", // SoraSompeng - "doi", // Takri - "lez", // CaucasianAlbanian - "bsq", // BassaVah - "fr", // Duployan - "sq", // Elbasan - "sa", // Grantha - "hnj", // PahawhHmong - "sd", // Khojki - "lab", // LinearA - "hi", // Mahajani - "xmn", // Manichaean - "men", // MendeKikakui - "mr", // Modi - "mru", // Mro - "xna", // OldNorthArabian - "arc", // Nabataean - "arc", // Palmyrene - "ctd", // PauCinHau - "kv", // OldPermic - "pal", // PsalterPahlavi - "sa", // Siddham - "sd", // Khudawadi - "mai", // Tirhuta - "hoc" // WarangCiti -}; -Q_STATIC_ASSERT(sizeof(specialLanguages) / sizeof(const char *) == QChar::ScriptCount); - -// this could become a list of all languages used for each writing -// system, instead of using the single most common language. -static const char *languageForWritingSystem[] = { - 0, // Any - "en", // Latin - "el", // Greek - "ru", // Cyrillic - "hy", // Armenian - "he", // Hebrew - "ar", // Arabic - "syr", // Syriac - "div", // Thaana - "hi", // Devanagari - "bn", // Bengali - "pa", // Gurmukhi - "gu", // Gujarati - "or", // Oriya - "ta", // Tamil - "te", // Telugu - "kn", // Kannada - "ml", // Malayalam - "si", // Sinhala - "th", // Thai - "lo", // Lao - "bo", // Tibetan - "my", // Myanmar - "ka", // Georgian - "km", // Khmer - "zh-cn", // SimplifiedChinese - "zh-tw", // TraditionalChinese - "ja", // Japanese - "ko", // Korean - "vi", // Vietnamese - 0, // Symbol - "sga", // Ogham - "non", // Runic - "man" // N'Ko -}; -Q_STATIC_ASSERT(sizeof(languageForWritingSystem) / sizeof(const char *) == QFontDatabase::WritingSystemsCount); - -#if FC_VERSION >= 20297 -// Newer FontConfig let's us sort out fonts that contain certain glyphs, but no -// open type tables for is directly. Do this so we don't pick some strange -// pseudo unicode font -static const char *openType[] = { - 0, // Any - 0, // Latin - 0, // Greek - 0, // Cyrillic - 0, // Armenian - 0, // Hebrew - 0, // Arabic - "syrc", // Syriac - "thaa", // Thaana - "deva", // Devanagari - "beng", // Bengali - "guru", // Gurmukhi - "gujr", // Gujarati - "orya", // Oriya - "taml", // Tamil - "telu", // Telugu - "knda", // Kannada - "mlym", // Malayalam - "sinh", // Sinhala - 0, // Thai - 0, // Lao - "tibt", // Tibetan - "mymr", // Myanmar - 0, // Georgian - "khmr", // Khmer - 0, // SimplifiedChinese - 0, // TraditionalChinese - 0, // Japanese - 0, // Korean - 0, // Vietnamese - 0, // Symbol - 0, // Ogham - 0, // Runic - "nko " // N'Ko -}; -Q_STATIC_ASSERT(sizeof(openType) / sizeof(const char *) == QFontDatabase::WritingSystemsCount); -#endif - -static const char *getFcFamilyForStyleHint(const QFont::StyleHint style) -{ - const char *stylehint = 0; - switch (style) { - case QFont::SansSerif: - stylehint = "sans-serif"; - break; - case QFont::Serif: - stylehint = "serif"; - break; - case QFont::TypeWriter: - case QFont::Monospace: - stylehint = "monospace"; - break; - case QFont::Cursive: - stylehint = "cursive"; - break; - case QFont::Fantasy: - stylehint = "fantasy"; - break; - default: - break; - } - return stylehint; -} - -static void populateFromPattern(FcPattern *pattern) -{ - QString familyName; - FcChar8 *value = 0; - int weight_value; - int slant_value; - int spacing_value; - int width_value; - FcChar8 *file_value; - int indexValue; - FcChar8 *foundry_value; - FcChar8 *style_value; - FcBool scalable; - FcBool antialias; - - if (FcPatternGetString(pattern, FC_FAMILY, 0, &value) != FcResultMatch) - return; - - familyName = QString::fromUtf8((const char *)value); - if (familyName == QLatin1String("Open Sans")) { - FcChar8 *styl = 0; - if (FcPatternGetString(pattern, FC_STYLE, 0, &styl) == FcResultMatch) { - QString style = QString::fromUtf8(reinterpret_cast(styl)); - if (style == QLatin1String("Semibold")) { - familyName.append(QChar(QChar::Space)).append(style); - } - } - } - - slant_value = FC_SLANT_ROMAN; - weight_value = FC_WEIGHT_REGULAR; - spacing_value = FC_PROPORTIONAL; - file_value = 0; - indexValue = 0; - scalable = FcTrue; - - - if (FcPatternGetInteger(pattern, FC_SLANT, 0, &slant_value) != FcResultMatch) - slant_value = FC_SLANT_ROMAN; - if (FcPatternGetInteger(pattern, FC_WEIGHT, 0, &weight_value) != FcResultMatch) - weight_value = FC_WEIGHT_REGULAR; - if (FcPatternGetInteger(pattern, FC_WIDTH, 0, &width_value) != FcResultMatch) - width_value = FC_WIDTH_NORMAL; - if (FcPatternGetInteger(pattern, FC_SPACING, 0, &spacing_value) != FcResultMatch) - spacing_value = FC_PROPORTIONAL; - if (FcPatternGetString(pattern, FC_FILE, 0, &file_value) != FcResultMatch) - file_value = 0; - if (FcPatternGetInteger(pattern, FC_INDEX, 0, &indexValue) != FcResultMatch) - indexValue = 0; - if (FcPatternGetBool(pattern, FC_SCALABLE, 0, &scalable) != FcResultMatch) - scalable = FcTrue; - if (FcPatternGetString(pattern, FC_FOUNDRY, 0, &foundry_value) != FcResultMatch) - foundry_value = 0; - if (FcPatternGetString(pattern, FC_STYLE, 0, &style_value) != FcResultMatch) - style_value = 0; - if (FcPatternGetBool(pattern,FC_ANTIALIAS,0,&antialias) != FcResultMatch) - antialias = true; - - QSupportedWritingSystems writingSystems; - FcLangSet *langset = 0; - FcResult res = FcPatternGetLangSet(pattern, FC_LANG, 0, &langset); - if (res == FcResultMatch) { - bool hasLang = false; - for (int j = 1; j < QFontDatabase::WritingSystemsCount; ++j) { - const FcChar8 *lang = (const FcChar8*) languageForWritingSystem[j]; - if (lang) { - FcLangResult langRes = FcLangSetHasLang(langset, lang); - if (langRes != FcLangDifferentLang) { - writingSystems.setSupported(QFontDatabase::WritingSystem(j)); - hasLang = true; - } - } - } - if (!hasLang) - // none of our known languages, add it to the other set - writingSystems.setSupported(QFontDatabase::Other); - } else { - // we set Other to supported for symbol fonts. It makes no - // sense to merge these with other ones, as they are - // special in a way. - writingSystems.setSupported(QFontDatabase::Other); - } - -#if FC_VERSION >= 20297 - for (int j = 1; j < QFontDatabase::WritingSystemsCount; ++j) { - if (writingSystems.supported(QFontDatabase::WritingSystem(j)) - && requiresOpenType(j) && openType[j]) { - FcChar8 *cap; - res = FcPatternGetString (pattern, FC_CAPABILITY, 0, &cap); - if (res != FcResultMatch || !strstr((const char *)cap, openType[j])) - writingSystems.setSupported(QFontDatabase::WritingSystem(j),false); - } - } -#endif - - FontFile *fontFile = new FontFile; - fontFile->fileName = QString::fromLocal8Bit((const char *)file_value); - fontFile->indexValue = indexValue; - - QFont::Style style = (slant_value == FC_SLANT_ITALIC) - ? QFont::StyleItalic - : ((slant_value == FC_SLANT_OBLIQUE) - ? QFont::StyleOblique - : QFont::StyleNormal); - // Note: weight should really be an int but registerFont incorrectly uses an enum - QFont::Weight weight = QFont::Weight(weightFromFcWeight(weight_value)); - - double pixel_size = 0; - if (!scalable) - FcPatternGetDouble (pattern, FC_PIXEL_SIZE, 0, &pixel_size); - - bool fixedPitch = spacing_value >= FC_MONO; - // Note: stretch should really be an int but registerFont incorrectly uses an enum - QFont::Stretch stretch = QFont::Stretch(stretchFromFcWidth(width_value)); - QString styleName = style_value ? QString::fromUtf8((const char *) style_value) : QString(); - QPlatformFontDatabase::registerFont(familyName,styleName,QLatin1String((const char *)foundry_value),weight,style,stretch,antialias,scalable,pixel_size,fixedPitch,writingSystems,fontFile); -// qDebug() << familyName << (const char *)foundry_value << weight << style << &writingSystems << scalable << true << pixel_size; - - for (int k = 1; FcPatternGetString(pattern, FC_FAMILY, k, &value) == FcResultMatch; ++k) - QPlatformFontDatabase::registerAliasToFontFamily(familyName, QString::fromUtf8((const char *)value)); - -} - -void QFontconfigDatabase::populateFontDatabase() -{ - FcInitReinitialize(); - FcFontSet *fonts; - - { - FcObjectSet *os = FcObjectSetCreate(); - FcPattern *pattern = FcPatternCreate(); - const char *properties [] = { - FC_FAMILY, FC_STYLE, FC_WEIGHT, FC_SLANT, - FC_SPACING, FC_FILE, FC_INDEX, - FC_LANG, FC_CHARSET, FC_FOUNDRY, FC_SCALABLE, FC_PIXEL_SIZE, - FC_WIDTH, -#if FC_VERSION >= 20297 - FC_CAPABILITY, -#endif - (const char *)0 - }; - const char **p = properties; - while (*p) { - FcObjectSetAdd(os, *p); - ++p; - } - fonts = FcFontList(0, pattern, os); - FcObjectSetDestroy(os); - FcPatternDestroy(pattern); - } - - for (int i = 0; i < fonts->nfont; i++) - populateFromPattern(fonts->fonts[i]); - - FcFontSetDestroy (fonts); - - struct FcDefaultFont { - const char *qtname; - const char *rawname; - bool fixed; - }; - const FcDefaultFont defaults[] = { - { "Serif", "serif", false }, - { "Sans Serif", "sans-serif", false }, - { "Monospace", "monospace", true }, - { 0, 0, false } - }; - const FcDefaultFont *f = defaults; - // aliases only make sense for 'common', not for any of the specials - QSupportedWritingSystems ws; - ws.setSupported(QFontDatabase::Latin); - - while (f->qtname) { - QString familyQtName = QString::fromLatin1(f->qtname); - registerFont(familyQtName,QString(),QString(),QFont::Normal,QFont::StyleNormal,QFont::Unstretched,true,true,0,f->fixed,ws,0); - registerFont(familyQtName,QString(),QString(),QFont::Normal,QFont::StyleItalic,QFont::Unstretched,true,true,0,f->fixed,ws,0); - registerFont(familyQtName,QString(),QString(),QFont::Normal,QFont::StyleOblique,QFont::Unstretched,true,true,0,f->fixed,ws,0); - ++f; - } - - //Lighthouse has very lazy population of the font db. We want it to be initialized when - //QApplication is constructed, so that the population procedure can do something like this to - //set the default font -// const FcDefaultFont *s = defaults; -// QFont font("Sans Serif"); -// font.setPointSize(9); -// QApplication::setFont(font); -} - -QFontEngineMulti *QFontconfigDatabase::fontEngineMulti(QFontEngine *fontEngine, QChar::Script script) -{ - return new QFontEngineMultiFontConfig(fontEngine, script); -} - -namespace { -QFontEngine::HintStyle defaultHintStyleFromMatch(QFont::HintingPreference hintingPreference, FcPattern *match, bool useXftConf) -{ - switch (hintingPreference) { - case QFont::PreferNoHinting: - return QFontEngine::HintNone; - case QFont::PreferVerticalHinting: - return QFontEngine::HintLight; - case QFont::PreferFullHinting: - return QFontEngine::HintFull; - case QFont::PreferDefaultHinting: - break; - } - - if (QGuiApplication::platformNativeInterface()->nativeResourceForScreen("nofonthinting", - QGuiApplication::primaryScreen())) { - return QFontEngine::HintNone; - } - - int hint_style = 0; - if (FcPatternGetInteger (match, FC_HINT_STYLE, 0, &hint_style) == FcResultMatch) { - switch (hint_style) { - case FC_HINT_NONE: - return QFontEngine::HintNone; - case FC_HINT_SLIGHT: - return QFontEngine::HintLight; - case FC_HINT_MEDIUM: - return QFontEngine::HintMedium; - case FC_HINT_FULL: - return QFontEngine::HintFull; - default: - Q_UNREACHABLE(); - break; - } - } - - if (useXftConf) { - void *hintStyleResource = - QGuiApplication::platformNativeInterface()->nativeResourceForScreen("hintstyle", - QGuiApplication::primaryScreen()); - int hintStyle = int(reinterpret_cast(hintStyleResource)); - if (hintStyle > 0) - return QFontEngine::HintStyle(hintStyle - 1); - } - - return QFontEngine::HintFull; -} - -QFontEngine::SubpixelAntialiasingType subpixelTypeFromMatch(FcPattern *match, bool useXftConf) -{ - int subpixel = FC_RGBA_UNKNOWN; - if (FcPatternGetInteger(match, FC_RGBA, 0, &subpixel) == FcResultMatch) { - switch (subpixel) { - case FC_RGBA_UNKNOWN: - case FC_RGBA_NONE: - return QFontEngine::Subpixel_None; - case FC_RGBA_RGB: - return QFontEngine::Subpixel_RGB; - case FC_RGBA_BGR: - return QFontEngine::Subpixel_BGR; - case FC_RGBA_VRGB: - return QFontEngine::Subpixel_VRGB; - case FC_RGBA_VBGR: - return QFontEngine::Subpixel_VBGR; - default: - Q_UNREACHABLE(); - break; - } - } - - if (useXftConf) { - void *subpixelTypeResource = - QGuiApplication::platformNativeInterface()->nativeResourceForScreen("subpixeltype", - QGuiApplication::primaryScreen()); - int subpixelType = int(reinterpret_cast(subpixelTypeResource)); - if (subpixelType > 0) - return QFontEngine::SubpixelAntialiasingType(subpixelType - 1); - } - - return QFontEngine::Subpixel_None; -} -} // namespace - -QFontEngine *QFontconfigDatabase::fontEngine(const QFontDef &f, void *usrPtr) -{ - if (!usrPtr) - return 0; - - FontFile *fontfile = static_cast (usrPtr); - QFontEngine::FaceId fid; - fid.filename = QFile::encodeName(fontfile->fileName); - fid.index = fontfile->indexValue; - - QFontEngineFT *engine = new QFontEngineFT(f); - engine->face_id = fid; - - setupFontEngine(engine, f); - - if (!engine->init(fid, engine->antialias, engine->defaultFormat) || engine->invalid()) { - delete engine; - engine = 0; - } - - return engine; -} - -QFontEngine *QFontconfigDatabase::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) -{ - QFontEngineFT *engine = static_cast(QBasicFontDatabase::fontEngine(fontData, pixelSize, hintingPreference)); - if (engine == 0) - return 0; - - setupFontEngine(engine, engine->fontDef); - - return engine; -} - -QStringList QFontconfigDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const -{ - QStringList fallbackFamilies; - FcPattern *pattern = FcPatternCreate(); - if (!pattern) - return fallbackFamilies; - - FcValue value; - value.type = FcTypeString; - QByteArray cs = family.toUtf8(); - value.u.s = (const FcChar8 *)cs.data(); - FcPatternAdd(pattern,FC_FAMILY,value,true); - - int slant_value = FC_SLANT_ROMAN; - if (style == QFont::StyleItalic) - slant_value = FC_SLANT_ITALIC; - else if (style == QFont::StyleOblique) - slant_value = FC_SLANT_OBLIQUE; - FcPatternAddInteger(pattern, FC_SLANT, slant_value); - - Q_ASSERT(uint(script) < QChar::ScriptCount); - if (*specialLanguages[script] != '\0') { - FcLangSet *ls = FcLangSetCreate(); - FcLangSetAdd(ls, (const FcChar8*)specialLanguages[script]); - FcPatternAddLangSet(pattern, FC_LANG, ls); - FcLangSetDestroy(ls); - } else if (!family.isEmpty()) { - // If script is Common or Han, then it may include languages like CJK, - // we should attach system default language set to the pattern - // to obtain correct font fallback list (i.e. if LANG=zh_CN - // then we normally want to use a Chinese font for CJK text; - // while a Japanese font should be used for that if LANG=ja) - FcPattern *dummy = FcPatternCreate(); - FcDefaultSubstitute(dummy); - FcChar8 *lang = 0; - FcResult res = FcPatternGetString(dummy, FC_LANG, 0, &lang); - if (res == FcResultMatch) - FcPatternAddString(pattern, FC_LANG, lang); - FcPatternDestroy(dummy); - } - - const char *stylehint = getFcFamilyForStyleHint(styleHint); - if (stylehint) { - value.u.s = (const FcChar8 *)stylehint; - FcPatternAddWeak(pattern, FC_FAMILY, value, FcTrue); - } - - FcConfigSubstitute(0, pattern, FcMatchPattern); - FcDefaultSubstitute(pattern); - - FcResult result = FcResultMatch; - FcFontSet *fontSet = FcFontSort(0,pattern,FcFalse,0,&result); - FcPatternDestroy(pattern); - - if (fontSet) { - for (int i = 0; i < fontSet->nfont; i++) { - FcChar8 *value = 0; - if (FcPatternGetString(fontSet->fonts[i], FC_FAMILY, 0, &value) != FcResultMatch) - continue; - // capitalize(value); - QString familyName = QString::fromUtf8((const char *)value); - if (!fallbackFamilies.contains(familyName,Qt::CaseInsensitive) && - familyName.compare(family, Qt::CaseInsensitive)) { - fallbackFamilies << familyName; - } - } - FcFontSetDestroy(fontSet); - } -// qDebug() << "fallbackFamilies for:" << family << style << styleHint << script << fallbackFamilies; - - return fallbackFamilies; -} - -static FcPattern *queryFont(const FcChar8 *file, const QByteArray &data, int id, FcBlanks *blanks, int *count) -{ -#if FC_VERSION < 20402 - Q_UNUSED(data) - return FcFreeTypeQuery(file, id, blanks, count); -#else - if (data.isEmpty()) - return FcFreeTypeQuery(file, id, blanks, count); - - FT_Library lib = qt_getFreetype(); - - FcPattern *pattern = 0; - - FT_Face face; - if (!FT_New_Memory_Face(lib, (const FT_Byte *)data.constData(), data.size(), id, &face)) { - *count = face->num_faces; - - pattern = FcFreeTypeQueryFace(face, file, id, blanks); - - FT_Done_Face(face); - } - - return pattern; -#endif -} - -QStringList QFontconfigDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName) -{ - QStringList families; - - FcFontSet *set = FcConfigGetFonts(0, FcSetApplication); - if (!set) { - FcConfigAppFontAddFile(0, (const FcChar8 *)":/non-existent"); - set = FcConfigGetFonts(0, FcSetApplication); // try again - if (!set) - return families; - } - - int id = 0; - FcBlanks *blanks = FcConfigGetBlanks(0); - int count = 0; - - FcPattern *pattern; - do { - pattern = queryFont((const FcChar8 *)QFile::encodeName(fileName).constData(), - fontData, id, blanks, &count); - if (!pattern) - return families; - - FcChar8 *fam = 0; - if (FcPatternGetString(pattern, FC_FAMILY, 0, &fam) == FcResultMatch) { - QString family = QString::fromUtf8(reinterpret_cast(fam)); - if (family == QLatin1String("Open Sans")) { - FcChar8 *styl = 0; - if (FcPatternGetString(pattern, FC_STYLE, 0, &styl) == FcResultMatch) { - QString style = QString::fromUtf8(reinterpret_cast(styl)); - if (style == QLatin1String("Semibold")) { - family.append(QChar(QChar::Space)).append(style); - } - } - } - families << family; - } - populateFromPattern(pattern); - - FcFontSetAdd(set, pattern); - - ++id; - } while (id < count); - - return families; -} - -QString QFontconfigDatabase::resolveFontFamilyAlias(const QString &family) const -{ - QString resolved = QBasicFontDatabase::resolveFontFamilyAlias(family); - if (!resolved.isEmpty() && resolved != family) - return resolved; - FcPattern *pattern = FcPatternCreate(); - if (!pattern) - return family; - - if (!family.isEmpty()) { - QByteArray cs = family.toUtf8(); - FcPatternAddString(pattern, FC_FAMILY, (const FcChar8 *) cs.constData()); - } - FcConfigSubstitute(0, pattern, FcMatchPattern); - FcDefaultSubstitute(pattern); - - FcChar8 *familyAfterSubstitution = 0; - FcPatternGetString(pattern, FC_FAMILY, 0, &familyAfterSubstitution); - resolved = QString::fromUtf8((const char *) familyAfterSubstitution); - FcPatternDestroy(pattern); - - return resolved; -} - -QFont QFontconfigDatabase::defaultFont() const -{ - // Hack to get system default language until FcGetDefaultLangs() - // is exported (https://bugs.freedesktop.org/show_bug.cgi?id=32853) - // or https://bugs.freedesktop.org/show_bug.cgi?id=35482 is fixed - FcPattern *dummy = FcPatternCreate(); - FcDefaultSubstitute(dummy); - FcChar8 *lang = 0; - FcResult res = FcPatternGetString(dummy, FC_LANG, 0, &lang); - - FcPattern *pattern = FcPatternCreate(); - if (res == FcResultMatch) { - // Make defaultFont pattern matching locale language aware, because - // certain FC_LANG based custom rules may happen in FcConfigSubstitute() - FcPatternAddString(pattern, FC_LANG, lang); - } - FcConfigSubstitute(0, pattern, FcMatchPattern); - FcDefaultSubstitute(pattern); - - FcChar8 *familyAfterSubstitution = 0; - FcPatternGetString(pattern, FC_FAMILY, 0, &familyAfterSubstitution); - QString resolved = QString::fromUtf8((const char *) familyAfterSubstitution); - FcPatternDestroy(pattern); - FcPatternDestroy(dummy); - - return QFont(resolved); -} - -void QFontconfigDatabase::setupFontEngine(QFontEngineFT *engine, const QFontDef &fontDef) const -{ - bool antialias = !(fontDef.styleStrategy & QFont::NoAntialias); - bool forcedAntialiasSetting = !antialias; - - const QPlatformServices *services = QGuiApplicationPrivate::platformIntegration()->services(); - bool useXftConf = (services && (services->desktopEnvironment() == "GNOME" || services->desktopEnvironment() == "UNITY")); - if (useXftConf) { - void *antialiasResource = - QGuiApplication::platformNativeInterface()->nativeResourceForScreen("antialiasingEnabled", - QGuiApplication::primaryScreen()); - int antialiasingEnabled = int(reinterpret_cast(antialiasResource)); - if (antialiasingEnabled > 0) - antialias = antialiasingEnabled - 1; - } - - QFontEngine::GlyphFormat format; - // try and get the pattern - FcPattern *pattern = FcPatternCreate(); - - FcValue value; - value.type = FcTypeString; - QByteArray cs = fontDef.family.toUtf8(); - value.u.s = (const FcChar8 *)cs.data(); - FcPatternAdd(pattern,FC_FAMILY,value,true); - - QFontEngine::FaceId fid = engine->faceId(); - - if (!fid.filename.isEmpty()) { - value.u.s = (const FcChar8 *)fid.filename.data(); - FcPatternAdd(pattern,FC_FILE,value,true); - - value.type = FcTypeInteger; - value.u.i = fid.index; - FcPatternAdd(pattern,FC_INDEX,value,true); - } - - if (fontDef.pixelSize > 0.1) - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontDef.pixelSize); - - FcResult result; - - FcConfigSubstitute(0, pattern, FcMatchPattern); - FcDefaultSubstitute(pattern); - - FcPattern *match = FcFontMatch(0, pattern, &result); - if (match) { - engine->setDefaultHintStyle(defaultHintStyleFromMatch((QFont::HintingPreference)fontDef.hintingPreference, match, useXftConf)); - - FcBool fc_autohint; - if (FcPatternGetBool(match, FC_AUTOHINT,0, &fc_autohint) == FcResultMatch) - engine->forceAutoHint = fc_autohint; - -#if defined(FT_LCD_FILTER_H) - int lcdFilter; - if (FcPatternGetInteger(match, FC_LCD_FILTER, 0, &lcdFilter) == FcResultMatch) - engine->lcdFilterType = lcdFilter; -#endif - - if (!forcedAntialiasSetting) { - FcBool fc_antialias; - if (FcPatternGetBool(match, FC_ANTIALIAS,0, &fc_antialias) == FcResultMatch) - antialias = fc_antialias; - } - - if (antialias) { - QFontEngine::SubpixelAntialiasingType subpixelType = QFontEngine::Subpixel_None; - if (!(fontDef.styleStrategy & QFont::NoSubpixelAntialias)) - subpixelType = subpixelTypeFromMatch(match, useXftConf); - engine->subpixelType = subpixelType; - - format = (subpixelType == QFontEngine::Subpixel_None) - ? QFontEngine::Format_A8 - : QFontEngine::Format_A32; - } else - format = QFontEngine::Format_Mono; - - FcPatternDestroy(match); - } else - format = antialias ? QFontEngine::Format_A8 : QFontEngine::Format_Mono; - - FcPatternDestroy(pattern); - - engine->antialias = antialias; - engine->defaultFormat = format; - engine->glyphFormat = format; -} - -QT_END_NAMESPACE diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm b/Telegram/_qt_5_5_0_patch/qtbase/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm deleted file mode 100644 index 1594dacbc..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm +++ /dev/null @@ -1,900 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qglobal.h" - -#if defined(Q_OS_MACX) -#import -#import -#elif defined(Q_OS_IOS) -#import -#endif - -#include "qcoretextfontdatabase_p.h" -#include "qfontengine_coretext_p.h" -#include -#include -#include - -QT_BEGIN_NAMESPACE - -namespace { -class AutoReleasePool -{ -public: - AutoReleasePool(): pool([[NSAutoreleasePool alloc] init]) {} - ~AutoReleasePool() { [pool release]; } - -private: - NSAutoreleasePool *pool; -}; -} - -// this could become a list of all languages used for each writing -// system, instead of using the single most common language. -static const char *languageForWritingSystem[] = { - 0, // Any - "en", // Latin - "el", // Greek - "ru", // Cyrillic - "hy", // Armenian - "he", // Hebrew - "ar", // Arabic - "syr", // Syriac - "div", // Thaana - "hi", // Devanagari - "bn", // Bengali - "pa", // Gurmukhi - "gu", // Gujarati - "or", // Oriya - "ta", // Tamil - "te", // Telugu - "kn", // Kannada - "ml", // Malayalam - "si", // Sinhala - "th", // Thai - "lo", // Lao - "bo", // Tibetan - "my", // Myanmar - "ka", // Georgian - "km", // Khmer - "zh-Hans", // SimplifiedChinese - "zh-Hant", // TraditionalChinese - "ja", // Japanese - "ko", // Korean - "vi", // Vietnamese - 0, // Symbol - "sga", // Ogham - "non", // Runic - "man" // N'Ko -}; -enum { LanguageCount = sizeof(languageForWritingSystem) / sizeof(const char *) }; - -#ifdef Q_OS_OSX -static NSInteger languageMapSort(id obj1, id obj2, void *context) -{ - NSArray *map1 = (NSArray *) obj1; - NSArray *map2 = (NSArray *) obj2; - NSArray *languages = (NSArray *) context; - - NSString *lang1 = [map1 objectAtIndex: 0]; - NSString *lang2 = [map2 objectAtIndex: 0]; - - return [languages indexOfObject: lang1] - [languages indexOfObject: lang2]; -} -#endif - -QCoreTextFontDatabase::QCoreTextFontDatabase() -{ -#ifdef Q_OS_MACX - QSettings appleSettings(QLatin1String("apple.com")); - QVariant appleValue = appleSettings.value(QLatin1String("AppleAntiAliasingThreshold")); - if (appleValue.isValid()) - QCoreTextFontEngine::antialiasingThreshold = appleValue.toInt(); - - /* - font_smoothing = 0 means no smoothing, while 1-3 means subpixel - antialiasing with different hinting styles (but we don't care about the - exact value, only if subpixel rendering is available or not) - */ - int font_smoothing = 0; - appleValue = appleSettings.value(QLatin1String("AppleFontSmoothing")); - if (appleValue.isValid()) { - font_smoothing = appleValue.toInt(); - } else { - // non-Apple displays do not provide enough information about subpixel rendering so - // draw text with cocoa and compare pixel colors to see if subpixel rendering is enabled - int w = 10; - int h = 10; - NSRect rect = NSMakeRect(0.0, 0.0, w, h); - NSImage *fontImage = [[NSImage alloc] initWithSize:NSMakeSize(w, h)]; - - [fontImage lockFocus]; - - [[NSColor whiteColor] setFill]; - NSRectFill(rect); - - NSString *str = @"X\\"; - NSFont *font = [NSFont fontWithName:@"Helvetica" size:10.0]; - NSMutableDictionary *attrs = [NSMutableDictionary dictionary]; - [attrs setObject:font forKey:NSFontAttributeName]; - [attrs setObject:[NSColor blackColor] forKey:NSForegroundColorAttributeName]; - - [str drawInRect:rect withAttributes:attrs]; - - NSBitmapImageRep *nsBitmapImage = [[NSBitmapImageRep alloc] initWithFocusedViewRect:rect]; - - [fontImage unlockFocus]; - - float red, green, blue; - for (int x = 0; x < w; x++) { - for (int y = 0; y < h; y++) { - NSColor *pixelColor = [nsBitmapImage colorAtX:x y:y]; - red = [pixelColor redComponent]; - green = [pixelColor greenComponent]; - blue = [pixelColor blueComponent]; - if (red != green || red != blue) - font_smoothing = 1; - } - } - - [nsBitmapImage release]; - [fontImage release]; - } - QCoreTextFontEngine::defaultGlyphFormat = (font_smoothing > 0 - ? QFontEngine::Format_A32 - : QFontEngine::Format_A8); -#else - QCoreTextFontEngine::defaultGlyphFormat = QFontEngine::Format_A8; -#endif -} - -QCoreTextFontDatabase::~QCoreTextFontDatabase() -{ - foreach (CTFontDescriptorRef ref, m_systemFontDescriptors) - CFRelease(ref); -} - -static CFArrayRef availableFamilyNames() -{ -#if defined(Q_OS_OSX) - return CTFontManagerCopyAvailableFontFamilyNames(); -#elif defined(Q_OS_IOS) - return (CFArrayRef) [[UIFont familyNames] retain]; -#endif -} - -void QCoreTextFontDatabase::populateFontDatabase() -{ - // The caller (QFontDB) expects the db to be populate only with system fonts, so we need - // to make sure that any previously registered app fonts become invisible. - removeApplicationFonts(); - - QCFType familyNames = availableFamilyNames(); - const int numberOfFamilies = CFArrayGetCount(familyNames); - for (int i = 0; i < numberOfFamilies; ++i) { - CFStringRef familyNameRef = (CFStringRef) CFArrayGetValueAtIndex(familyNames, i); - QString familyName = QCFString::toQString(familyNameRef); - - // Don't populate internal fonts - if (familyName.startsWith(QLatin1Char('.')) || familyName == QLatin1String("LastResort")) - continue; - - QPlatformFontDatabase::registerFontFamily(familyName); - -#if defined(Q_OS_OSX) - QString localizedFamilyName = QString::fromNSString([[NSFontManager sharedFontManager] localizedNameForFamily:(NSString*)familyNameRef face:nil]); - if (familyName != localizedFamilyName) - QPlatformFontDatabase::registerAliasToFontFamily(familyName, localizedFamilyName); -#endif - } - - // Force creating the theme fonts to get the descriptors in m_systemFontDescriptors - if (m_themeFonts.isEmpty()) - (void)themeFonts(); - - Q_FOREACH (CTFontDescriptorRef fontDesc, m_systemFontDescriptors) - populateFromDescriptor(fontDesc); -} - -void QCoreTextFontDatabase::populateFamily(const QString &familyName) -{ - QCFType attributes = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFDictionaryAddValue(attributes, kCTFontFamilyNameAttribute, QCFString(familyName)); - QCFType nameOnlyDescriptor = CTFontDescriptorCreateWithAttributes(attributes); - - // A single family might match several different fonts with different styles eg. - QCFType matchingFonts = (CFArrayRef) CTFontDescriptorCreateMatchingFontDescriptors(nameOnlyDescriptor, 0); - if (!matchingFonts) { - qWarning() << "QCoreTextFontDatabase: Found no matching fonts for family" << familyName; - return; - } - - const int numFonts = CFArrayGetCount(matchingFonts); - for (int i = 0; i < numFonts; ++i) - populateFromDescriptor(CTFontDescriptorRef(CFArrayGetValueAtIndex(matchingFonts, i))); -} - -struct FontDescription { - QCFString familyName; - QCFString styleName; - QString foundryName; - QFont::Weight weight; - QFont::Style style; - QFont::Stretch stretch; - int pixelSize; - bool fixedPitch; - QSupportedWritingSystems writingSystems; -}; - -static void getFontDescription(CTFontDescriptorRef font, FontDescription *fd) -{ - QCFType styles = (CFDictionaryRef) CTFontDescriptorCopyAttribute(font, kCTFontTraitsAttribute); - - fd->foundryName = QStringLiteral("CoreText"); - fd->familyName = (CFStringRef) CTFontDescriptorCopyAttribute(font, kCTFontFamilyNameAttribute); - QCFString _displayName = (CFStringRef) CTFontDescriptorCopyAttribute(font, kCTFontDisplayNameAttribute); - if (_displayName == QStringLiteral("Open Sans Semibold")) { - fd->familyName = _displayName; - } - fd->styleName = (CFStringRef)CTFontDescriptorCopyAttribute(font, kCTFontStyleNameAttribute); - fd->weight = QFont::Normal; - fd->style = QFont::StyleNormal; - fd->stretch = QFont::Unstretched; - fd->fixedPitch = false; - - if (QCFType tempFont = CTFontCreateWithFontDescriptor(font, 0.0, 0)) { - uint tag = MAKE_TAG('O', 'S', '/', '2'); - CTFontRef tempFontRef = tempFont; - void *userData = reinterpret_cast(&tempFontRef); - uint length = 128; - QVarLengthArray os2Table(length); - if (QCoreTextFontEngine::ct_getSfntTable(userData, tag, os2Table.data(), &length) && length >= 86) { - if (length > uint(os2Table.length())) { - os2Table.resize(length); - if (!QCoreTextFontEngine::ct_getSfntTable(userData, tag, os2Table.data(), &length)) - Q_UNREACHABLE(); - Q_ASSERT(length >= 86); - } - quint32 unicodeRange[4] = { - qFromBigEndian(os2Table.data() + 42), - qFromBigEndian(os2Table.data() + 46), - qFromBigEndian(os2Table.data() + 50), - qFromBigEndian(os2Table.data() + 54) - }; - quint32 codePageRange[2] = { - qFromBigEndian(os2Table.data() + 78), - qFromBigEndian(os2Table.data() + 82) - }; - fd->writingSystems = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRange, codePageRange); - } - } - - if (styles) { - if (CFNumberRef weightValue = (CFNumberRef) CFDictionaryGetValue(styles, kCTFontWeightTrait)) { - float normalizedWeight; - if (CFNumberGetValue(weightValue, kCFNumberFloatType, &normalizedWeight)) - fd->weight = QCoreTextFontEngine::qtWeightFromCFWeight(normalizedWeight); - } - if (CFNumberRef italic = (CFNumberRef) CFDictionaryGetValue(styles, kCTFontSlantTrait)) { - double d; - if (CFNumberGetValue(italic, kCFNumberDoubleType, &d)) { - if (d > 0.0) - fd->style = QFont::StyleItalic; - } - } - if (CFNumberRef symbolic = (CFNumberRef) CFDictionaryGetValue(styles, kCTFontSymbolicTrait)) { - int d; - if (CFNumberGetValue(symbolic, kCFNumberSInt32Type, &d)) { - if (d & kCTFontMonoSpaceTrait) - fd->fixedPitch = true; - if (d & kCTFontExpandedTrait) - fd->stretch = QFont::Expanded; - else if (d & kCTFontCondensedTrait) - fd->stretch = QFont::Condensed; - } - } - } - - if (QCFType size = (CFNumberRef) CTFontDescriptorCopyAttribute(font, kCTFontSizeAttribute)) { - if (CFNumberIsFloatType(size)) { - double d; - CFNumberGetValue(size, kCFNumberDoubleType, &d); - fd->pixelSize = d; - } else { - CFNumberGetValue(size, kCFNumberIntType, &fd->pixelSize); - } - } - - if (QCFType languages = (CFArrayRef) CTFontDescriptorCopyAttribute(font, kCTFontLanguagesAttribute)) { - CFIndex length = CFArrayGetCount(languages); - for (int i = 1; i < LanguageCount; ++i) { - if (!languageForWritingSystem[i]) - continue; - QCFString lang = CFStringCreateWithCString(NULL, languageForWritingSystem[i], kCFStringEncodingASCII); - if (CFArrayContainsValue(languages, CFRangeMake(0, length), lang)) - fd->writingSystems.setSupported(QFontDatabase::WritingSystem(i)); - } - } -} - -void QCoreTextFontDatabase::populateFromDescriptor(CTFontDescriptorRef font) -{ - FontDescription fd; - getFontDescription(font, &fd); - - CFRetain(font); - QPlatformFontDatabase::registerFont(fd.familyName, fd.styleName, fd.foundryName, fd.weight, fd.style, fd.stretch, - true /* antialiased */, true /* scalable */, - fd.pixelSize, fd.fixedPitch, fd.writingSystems, (void *) font); -} - -void QCoreTextFontDatabase::releaseHandle(void *handle) -{ - CFRelease(CTFontDescriptorRef(handle)); -} - -extern CGAffineTransform qt_transform_from_fontdef(const QFontDef &fontDef); - -QFontEngine *QCoreTextFontDatabase::fontEngine(const QFontDef &f, void *usrPtr) -{ - qreal scaledPointSize = f.pixelSize; - - // When 96 DPI is forced, the Mac plugin will use DPI 72 for some - // fonts (hardcoded in qcocoaintegration.mm) and 96 for others. This - // discrepancy makes it impossible to find the correct point size - // here without having the DPI used for the font. Until a proper - // solution (requiring API change) can be made, we simply fall back - // to passing in the point size to retain old behavior. - if (QGuiApplication::testAttribute(Qt::AA_Use96Dpi)) - scaledPointSize = f.pointSize; - - CTFontDescriptorRef descriptor = (CTFontDescriptorRef) usrPtr; - CGAffineTransform matrix = qt_transform_from_fontdef(f); - CTFontRef font = CTFontCreateWithFontDescriptor(descriptor, scaledPointSize, &matrix); - if (font) { - QFontEngine *engine = new QCoreTextFontEngine(font, f); - engine->fontDef = f; - CFRelease(font); - return engine; - } - - return NULL; -} - -static void releaseFontData(void* info, const void* data, size_t size) -{ - Q_UNUSED(data); - Q_UNUSED(size); - delete (QByteArray*)info; -} - -QFontEngine *QCoreTextFontDatabase::fontEngine(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference) -{ - Q_UNUSED(hintingPreference); - - QByteArray* fontDataCopy = new QByteArray(fontData); - QCFType dataProvider = CGDataProviderCreateWithData(fontDataCopy, - fontDataCopy->constData(), fontDataCopy->size(), releaseFontData); - - CGFontRef cgFont = CGFontCreateWithDataProvider(dataProvider); - - QFontEngine *fontEngine = NULL; - if (cgFont == NULL) { - qWarning("QCoreTextFontDatabase::fontEngine: CGFontCreateWithDataProvider failed"); - } else { - QFontDef def; - def.pixelSize = pixelSize; - def.pointSize = pixelSize * 72.0 / qt_defaultDpi(); - fontEngine = new QCoreTextFontEngine(cgFont, def); - CFRelease(cgFont); - } - - return fontEngine; -} - -QFont::StyleHint styleHintFromNSString(NSString *style) -{ - if ([style isEqual: @"sans-serif"]) - return QFont::SansSerif; - else if ([style isEqual: @"monospace"]) - return QFont::Monospace; - else if ([style isEqual: @"cursive"]) - return QFont::Cursive; - else if ([style isEqual: @"serif"]) - return QFont::Serif; - else if ([style isEqual: @"fantasy"]) - return QFont::Fantasy; - else // if ([style isEqual: @"default"]) - return QFont::AnyStyle; -} - -#ifdef Q_OS_OSX -static QString familyNameFromPostScriptName(NSString *psName) -{ - QCFType fontDescriptor = (CTFontDescriptorRef) CTFontDescriptorCreateWithNameAndSize((CFStringRef)psName, 12.0); - QCFString familyName = (CFStringRef) CTFontDescriptorCopyAttribute(fontDescriptor, kCTFontFamilyNameAttribute); - QString name = QCFString::toQString(familyName); - if (name.isEmpty()) - qWarning() << "QCoreTextFontDatabase: Failed to resolve family name for PostScript name " << QCFString::toQString((CFStringRef)psName); - - return name; -} -#endif - -QStringList QCoreTextFontDatabase::fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script) const -{ - Q_UNUSED(style); - Q_UNUSED(script); - - AutoReleasePool pool; - - static QHash fallbackLists; - - if (!family.isEmpty()) { -#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_8, __IPHONE_6_0) - // CTFontCopyDefaultCascadeListForLanguages is available in the SDK - #if QT_MAC_DEPLOYMENT_TARGET_BELOW(__MAC_10_8, __IPHONE_6_0) - // But we have to feature check at runtime - if (&CTFontCopyDefaultCascadeListForLanguages) - #endif - { - if (fallbackLists.contains(family)) - return fallbackLists.value(family); - - QCFType attributes = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFDictionaryAddValue(attributes, kCTFontFamilyNameAttribute, QCFString(family)); - if (QCFType fontDescriptor = CTFontDescriptorCreateWithAttributes(attributes)) { - if (QCFType font = CTFontCreateWithFontDescriptor(fontDescriptor, 12.0, 0)) { - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSArray *languages = [defaults stringArrayForKey: @"AppleLanguages"]; - - QCFType cascadeList = (CFArrayRef) CTFontCopyDefaultCascadeListForLanguages(font, (CFArrayRef) languages); - if (cascadeList) { - QStringList fallbackList; - const int numCascades = CFArrayGetCount(cascadeList); - for (int i = 0; i < numCascades; ++i) { - CTFontDescriptorRef fontFallback = (CTFontDescriptorRef) CFArrayGetValueAtIndex(cascadeList, i); - QCFString fallbackFamilyName = (CFStringRef) CTFontDescriptorCopyAttribute(fontFallback, kCTFontFamilyNameAttribute); - fallbackList.append(QCFString::toQString(fallbackFamilyName)); - } - -#if defined(Q_OS_OSX) - // Since we are only returning a list of default fonts for the current language, we do not - // cover all unicode completely. This was especially an issue for some of the common script - // symbols such as mathematical symbols, currency or geometric shapes. To minimize the risk - // of missing glyphs, we add Arial Unicode MS as a final fail safe, since this covers most - // of Unicode 2.1. - if (!fallbackList.contains(QStringLiteral("Arial Unicode MS"))) - fallbackList.append(QStringLiteral("Arial Unicode MS")); -#endif - - fallbackLists[family] = fallbackList; - } - } - - if (fallbackLists.contains(family)) - return fallbackLists.value(family); - } - } -#endif - } - - // We were not able to find a fallback for the specific family, - // so we fall back to the stylehint. - - static const QString styleLookupKey = QString::fromLatin1(".QFontStyleHint_%1"); - - static bool didPopulateStyleFallbacks = false; - if (!didPopulateStyleFallbacks) { -#if defined(Q_OS_MACX) - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - NSArray *languages = [defaults stringArrayForKey: @"AppleLanguages"]; - - NSDictionary *fallbackDict = [NSDictionary dictionaryWithContentsOfFile: @"/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/Resources/DefaultFontFallbacks.plist"]; - - for (NSString *style in [fallbackDict allKeys]) { - NSArray *list = [fallbackDict valueForKey: style]; - QFont::StyleHint fallbackStyleHint = styleHintFromNSString(style); - QStringList fallbackList; - for (id item in list) { - // sort the array based on system language preferences - if ([item isKindOfClass: [NSArray class]]) { - NSArray *langs = [(NSArray *) item sortedArrayUsingFunction: languageMapSort - context: languages]; - for (NSArray *map in langs) - fallbackList.append(familyNameFromPostScriptName([map objectAtIndex: 1])); - } - else if ([item isKindOfClass: [NSString class]]) - fallbackList.append(familyNameFromPostScriptName(item)); - } - - if (QCoreTextFontEngine::supportsColorGlyphs()) - fallbackList.append(QLatin1String("Apple Color Emoji")); - - // Since we are only returning a list of default fonts for the current language, we do not - // cover all unicode completely. This was especially an issue for some of the common script - // symbols such as mathematical symbols, currency or geometric shapes. To minimize the risk - // of missing glyphs, we add Arial Unicode MS as a final fail safe, since this covers most - // of Unicode 2.1. - if (!fallbackList.contains(QStringLiteral("Arial Unicode MS"))) - fallbackList.append(QStringLiteral("Arial Unicode MS")); - - fallbackLists[styleLookupKey.arg(fallbackStyleHint)] = fallbackList; - } -#else - QStringList staticFallbackList; - staticFallbackList << QString::fromLatin1("Helvetica,Apple Color Emoji,Geeza Pro,Arial Hebrew,Thonburi,Kailasa" - "Hiragino Kaku Gothic ProN,.Heiti J,Apple SD Gothic Neo,.Heiti K,Heiti SC,Heiti TC" - "Bangla Sangam MN,Devanagari Sangam MN,Gujarati Sangam MN,Gurmukhi MN,Kannada Sangam MN" - "Malayalam Sangam MN,Oriya Sangam MN,Sinhala Sangam MN,Tamil Sangam MN,Telugu Sangam MN" - "Euphemia UCAS,.PhoneFallback").split(QLatin1String(",")); - - for (int i = QFont::Helvetica; i <= QFont::Fantasy; ++i) - fallbackLists[styleLookupKey.arg(i)] = staticFallbackList; -#endif - - didPopulateStyleFallbacks = true; - } - - Q_ASSERT(!fallbackLists.isEmpty()); - return fallbackLists[styleLookupKey.arg(styleHint)]; -} - -#if HAVE_CORETEXT -static CFArrayRef createDescriptorArrayForFont(CTFontRef font) -{ - CFMutableArrayRef array = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); - CFArrayAppendValue(array, QCFType(CTFontCopyFontDescriptor(font))); - return array; -} -#endif - -QStringList QCoreTextFontDatabase::addApplicationFont(const QByteArray &fontData, const QString &fileName) -{ - QCFType fonts; - QStringList families; - -#if HAVE_CORETEXT - if (&CTFontManagerRegisterGraphicsFont) { - CFErrorRef error = 0; - if (!fontData.isEmpty()) { - QByteArray* fontDataCopy = new QByteArray(fontData); - QCFType dataProvider = CGDataProviderCreateWithData(fontDataCopy, - fontDataCopy->constData(), fontDataCopy->size(), releaseFontData); - QCFType cgFont = CGFontCreateWithDataProvider(dataProvider); - if (cgFont) { - if (CTFontManagerRegisterGraphicsFont(cgFont, &error)) { - QCFType font = CTFontCreateWithGraphicsFont(cgFont, 0.0, NULL, NULL); - fonts = createDescriptorArrayForFont(font); - m_applicationFonts.append(QVariant::fromValue(QCFType::constructFromGet(cgFont))); - } - } - } else { - QCFType fontURL = CFURLCreateWithFileSystemPath(NULL, QCFString(fileName), kCFURLPOSIXPathStyle, false); - if (CTFontManagerRegisterFontsForURL(fontURL, kCTFontManagerScopeProcess, &error)) { -#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_6, __IPHONE_7_0) - if (&CTFontManagerCreateFontDescriptorsFromURL) - fonts = CTFontManagerCreateFontDescriptorsFromURL(fontURL); - else -#endif - { - // We're limited to a single font per file, unless we dive into the font tables - QCFType attributes = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, - &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFDictionaryAddValue(attributes, kCTFontURLAttribute, fontURL); - QCFType descriptor = CTFontDescriptorCreateWithAttributes(attributes); - QCFType font = CTFontCreateWithFontDescriptor(descriptor, 0.0, NULL); - fonts = createDescriptorArrayForFont(font); - } - - m_applicationFonts.append(QVariant::fromValue(QCFType::constructFromGet(fontURL))); - } - } - - if (error) { - NSLog(@"Unable to register font: %@", error); - CFRelease(error); - } - } -#endif -#if HAVE_CORETEXT && HAVE_ATS - else -#endif -#if HAVE_ATS - { - ATSFontContainerRef fontContainer; - OSStatus e; - - if (!fontData.isEmpty()) { - e = ATSFontActivateFromMemory((void *) fontData.constData(), fontData.size(), - kATSFontContextLocal, kATSFontFormatUnspecified, NULL, - kATSOptionFlagsDefault, &fontContainer); - } else { - FSRef ref; - OSErr qt_mac_create_fsref(const QString &file, FSRef *fsref); - if (qt_mac_create_fsref(fileName, &ref) != noErr) - return QStringList(); - e = ATSFontActivateFromFileReference(&ref, kATSFontContextLocal, kATSFontFormatUnspecified, 0, - kATSOptionFlagsDefault, &fontContainer); - } - - if (e == noErr) { - ItemCount fontCount = 0; - e = ATSFontFindFromContainer(fontContainer, kATSOptionFlagsDefault, 0, 0, &fontCount); - if (e != noErr) - return QStringList(); - - QVarLengthArray containedFonts(fontCount); - e = ATSFontFindFromContainer(fontContainer, kATSOptionFlagsDefault, fontCount, containedFonts.data(), &fontCount); - if (e != noErr) - return QStringList(); - - CFMutableArrayRef fontsArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); - for (int i = 0; i < containedFonts.size(); ++i) { - QCFType font = CTFontCreateWithPlatformFont(containedFonts[i], 12.0, NULL, NULL); - CFArrayAppendValue(fontsArray, QCFType(CTFontCopyFontDescriptor(font))); - } - - fonts = fontsArray; - - m_applicationFonts.append(QVariant::fromValue(fontContainer)); - } - } -#endif - - if (fonts) { - const int numFonts = CFArrayGetCount(fonts); - for (int i = 0; i < numFonts; ++i) { - CTFontDescriptorRef fontDescriptor = CTFontDescriptorRef(CFArrayGetValueAtIndex(fonts, i)); - populateFromDescriptor(fontDescriptor); - QCFType familyName = CFStringRef(CTFontDescriptorCopyAttribute(fontDescriptor, kCTFontFamilyNameAttribute)); - families.append(QCFString(familyName)); - } - } - - return families; -} - -bool QCoreTextFontDatabase::isPrivateFontFamily(const QString &family) const -{ - if (family.startsWith(QLatin1Char('.'))) - return true; - - return QPlatformFontDatabase::isPrivateFontFamily(family); -} - -static CTFontUIFontType fontTypeFromTheme(QPlatformTheme::Font f) -{ - switch (f) { - case QPlatformTheme::SystemFont: - return kCTFontSystemFontType; - - case QPlatformTheme::MenuFont: - case QPlatformTheme::MenuBarFont: - case QPlatformTheme::MenuItemFont: - return kCTFontMenuItemFontType; - - case QPlatformTheme::MessageBoxFont: - return kCTFontEmphasizedSystemFontType; - - case QPlatformTheme::LabelFont: - return kCTFontSystemFontType; - - case QPlatformTheme::TipLabelFont: - return kCTFontToolTipFontType; - - case QPlatformTheme::StatusBarFont: - return kCTFontSystemFontType; - - case QPlatformTheme::TitleBarFont: - return kCTFontWindowTitleFontType; - - case QPlatformTheme::MdiSubWindowTitleFont: - case QPlatformTheme::DockWidgetTitleFont: - return kCTFontSystemFontType; - - case QPlatformTheme::PushButtonFont: - return kCTFontPushButtonFontType; - - case QPlatformTheme::CheckBoxFont: - case QPlatformTheme::RadioButtonFont: - return kCTFontSystemFontType; - - case QPlatformTheme::ToolButtonFont: - return kCTFontSmallToolbarFontType; - - case QPlatformTheme::ItemViewFont: - return kCTFontSystemFontType; - - case QPlatformTheme::ListViewFont: - return kCTFontViewsFontType; - - case QPlatformTheme::HeaderViewFont: - return kCTFontSmallSystemFontType; - - case QPlatformTheme::ListBoxFont: - return kCTFontViewsFontType; - - case QPlatformTheme::ComboMenuItemFont: - return kCTFontSystemFontType; - - case QPlatformTheme::ComboLineEditFont: - return kCTFontViewsFontType; - - case QPlatformTheme::SmallFont: - return kCTFontSmallSystemFontType; - - case QPlatformTheme::MiniFont: - return kCTFontMiniSystemFontType; - - case QPlatformTheme::FixedFont: - return kCTFontUserFixedPitchFontType; - - default: - return kCTFontSystemFontType; - } -} - -static CTFontDescriptorRef fontDescriptorFromTheme(QPlatformTheme::Font f) -{ -#ifdef Q_OS_IOS - if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_7_0) { - // Use Dynamic Type to resolve theme fonts if possible, to get - // correct font sizes and style based on user configuration. - NSString *textStyle = 0; - switch (f) { - case QPlatformTheme::TitleBarFont: - case QPlatformTheme::HeaderViewFont: - textStyle = UIFontTextStyleHeadline; - break; - case QPlatformTheme::MdiSubWindowTitleFont: - textStyle = UIFontTextStyleSubheadline; - break; - case QPlatformTheme::TipLabelFont: - case QPlatformTheme::SmallFont: - textStyle = UIFontTextStyleFootnote; - break; - case QPlatformTheme::MiniFont: - textStyle = UIFontTextStyleCaption2; - break; - case QPlatformTheme::FixedFont: - // Fall back to regular code path, as iOS doesn't provide - // an appropriate text style for this theme font. - break; - default: - textStyle = UIFontTextStyleBody; - break; - } - - if (textStyle) { - UIFontDescriptor *desc = [UIFontDescriptor preferredFontDescriptorWithTextStyle:textStyle]; - return static_cast(CFBridgingRetain(desc)); - } - } -#endif // Q_OS_IOS - - // OSX default case and iOS fallback case - CTFontUIFontType fontType = fontTypeFromTheme(f); - QCFType ctFont = CTFontCreateUIFontForLanguage(fontType, 0.0, NULL); - return CTFontCopyFontDescriptor(ctFont); -} - -const QHash &QCoreTextFontDatabase::themeFonts() const -{ - if (m_themeFonts.isEmpty()) { - for (long f = QPlatformTheme::SystemFont; f < QPlatformTheme::NFonts; f++) { - QPlatformTheme::Font ft = static_cast(f); - m_themeFonts.insert(ft, themeFont(ft)); - } - } - - return m_themeFonts; -} - -QFont *QCoreTextFontDatabase::themeFont(QPlatformTheme::Font f) const -{ - CTFontDescriptorRef fontDesc = fontDescriptorFromTheme(f); - FontDescription fd; - getFontDescription(fontDesc, &fd); - - if (!m_systemFontDescriptors.contains(fontDesc)) - m_systemFontDescriptors.insert(fontDesc); - else - CFRelease(fontDesc); - - QFont *font = new QFont(fd.familyName, fd.pixelSize, fd.weight, fd.style == QFont::StyleItalic); - return font; -} - -QFont QCoreTextFontDatabase::defaultFont() const -{ - if (defaultFontName.isEmpty()) { - QCFType font = CTFontCreateUIFontForLanguage(kCTFontSystemFontType, 12.0, NULL); - defaultFontName = (QString) QCFString(CTFontCopyFullName(font)); - } - - return QFont(defaultFontName); -} - -bool QCoreTextFontDatabase::fontsAlwaysScalable() const -{ - return true; -} - -QList QCoreTextFontDatabase::standardSizes() const -{ - QList ret; - static const unsigned short standard[] = - { 9, 10, 11, 12, 13, 14, 18, 24, 36, 48, 64, 72, 96, 144, 288, 0 }; - ret.reserve(int(sizeof(standard) / sizeof(standard[0]))); - const unsigned short *sizes = standard; - while (*sizes) ret << *sizes++; - return ret; -} - -void QCoreTextFontDatabase::removeApplicationFonts() -{ - if (m_applicationFonts.isEmpty()) - return; - - foreach (const QVariant &font, m_applicationFonts) { -#if HAVE_CORETEXT - if (&CTFontManagerUnregisterGraphicsFont && &CTFontManagerUnregisterFontsForURL) { - CFErrorRef error; - if (font.canConvert(qMetaTypeId >())) { - CTFontManagerUnregisterGraphicsFont(font.value >(), &error); - } else if (font.canConvert(qMetaTypeId >())) { - CTFontManagerUnregisterFontsForURL(font.value >(), kCTFontManagerScopeProcess, &error); - } - } -#endif -#if HAVE_CORETEXT && HAVE_ATS - else -#endif -#if HAVE_ATS - if (font.canConvert(qMetaTypeId())) { - ATSFontDeactivate(font.value(), 0, kATSOptionFlagsDoNotNotify); - } -#endif - } - - m_applicationFonts.clear(); - -#if HAVE_ATS - ATSFontNotify(kATSFontNotifyActionFontsChanged, 0); -#endif -} - -QT_END_NAMESPACE - diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/compose/compose.pro b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/compose/compose.pro deleted file mode 100644 index 65183b6fd..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/compose/compose.pro +++ /dev/null @@ -1,29 +0,0 @@ -TARGET = composeplatforminputcontextplugin - -PLUGIN_TYPE = platforminputcontexts -PLUGIN_EXTENDS = - -PLUGIN_CLASS_NAME = QComposePlatformInputContextPlugin -load(qt_plugin) - -QT += gui-private - -DEFINES += X11_PREFIX='\\"$$QMAKE_X11_PREFIX\\"' - -SOURCES += $$PWD/qcomposeplatforminputcontextmain.cpp \ - $$PWD/qcomposeplatforminputcontext.cpp \ - $$PWD/generator/qtablegenerator.cpp \ - -HEADERS += $$PWD/qcomposeplatforminputcontext.h \ - $$PWD/generator/qtablegenerator.h \ - -# libxkbcommon -contains(QT_CONFIG, xkbcommon-qt): { - # dont't need x11 dependency for compose key plugin - QT_CONFIG -= use-xkbcommon-x11support -# include(../../../3rdparty/xkbcommon.pri) -} else { - LIBS += $$QMAKE_LIBS_XKBCOMMON - QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_XKBCOMMON -} - -OTHER_FILES += $$PWD/compose.json diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitx.json b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitx.json deleted file mode 100644 index 6d2b389df..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitx.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "Keys": [ "fcitx" ] -} \ No newline at end of file diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitx.pro b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitx.pro deleted file mode 100644 index cbd3ab76e..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitx.pro +++ /dev/null @@ -1,38 +0,0 @@ -TARGET = fcitxplatforminputcontextplugin - -PLUGIN_TYPE = platforminputcontexts -PLUGIN_EXTENDS = - -PLUGIN_CLASS_NAME = QFcitxPlatformInputContextPlugin -load(qt_plugin) - -QT += dbus gui-private -SOURCES += $$PWD/fcitxqtconnection.cpp \ - $$PWD/fcitxqtformattedpreedit.cpp \ - $$PWD/fcitxqtinputcontextproxy.cpp \ - $$PWD/fcitxqtinputmethoditem.cpp \ - $$PWD/fcitxqtinputmethodproxy.cpp \ - $$PWD/fcitxqtkeyboardlayout.cpp \ - $$PWD/fcitxqtkeyboardproxy.cpp \ - $$PWD/keyuni.cpp \ - $$PWD/main.cpp \ - $$PWD/qfcitxplatforminputcontext.cpp \ - $$PWD/utils.cpp - -HEADERS += $$PWD/fcitxqtconnection.h \ - $$PWD/fcitxqtconnection_p.h \ - $$PWD/fcitxqtdbusaddons_export.h \ - $$PWD/fcitxqtdbusaddons_version.h \ - $$PWD/fcitxqtformattedpreedit.h \ - $$PWD/fcitxqtinputcontextproxy.h \ - $$PWD/fcitxqtinputmethoditem.h \ - $$PWD/fcitxqtinputmethodproxy.h \ - $$PWD/fcitxqtkeyboardlayout.h \ - $$PWD/fcitxqtkeyboardproxy.h \ - $$PWD/keydata.h \ - $$PWD/keyserver_x11.h \ - $$PWD/keyuni.h \ - $$PWD/main.h \ - $$PWD/qfcitxplatforminputcontext.h \ - $$PWD/utils.h - -OTHER_FILES += $$PWD/fcitx.json diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection.cpp deleted file mode 100644 index a50178a44..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection.cpp +++ /dev/null @@ -1,369 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2012 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#include "fcitxqtconnection_p.h" -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -// utils function in fcitx-utils and fcitx-config -bool _pid_exists(pid_t pid) { - if (pid <= 0) - return 0; - return !(kill(pid, 0) && (errno == ESRCH)); -} - - -FcitxQtConnection::FcitxQtConnection(QObject* parent): QObject(parent) - ,d_ptr(new FcitxQtConnectionPrivate(this)) -{ -} - -void FcitxQtConnection::startConnection() -{ - Q_D(FcitxQtConnection); - if (!d->m_initialized) { - d->initialize(); - d->createConnection(); - } -} - -void FcitxQtConnection::endConnection() -{ - Q_D(FcitxQtConnection); - d->cleanUp(); - d->finalize(); - d->m_connectedOnce = false; -} - -bool FcitxQtConnection::autoReconnect() -{ - Q_D(FcitxQtConnection); - return d->m_autoReconnect; -} - -void FcitxQtConnection::setAutoReconnect(bool a) -{ - Q_D(FcitxQtConnection); - d->m_autoReconnect = a; -} - -QDBusConnection* FcitxQtConnection::connection() -{ - Q_D(FcitxQtConnection); - return d->m_connection; -} - -const QString& FcitxQtConnection::serviceName() -{ - Q_D(FcitxQtConnection); - return d->m_serviceName; -} - -bool FcitxQtConnection::isConnected() -{ - Q_D(FcitxQtConnection); - return d->isConnected(); -} - - - -FcitxQtConnection::~FcitxQtConnection() -{ -} - -FcitxQtConnectionPrivate::FcitxQtConnectionPrivate(FcitxQtConnection* conn) : QObject(conn) - ,q_ptr(conn) - ,m_displayNumber(-1) - ,m_serviceName(QString("%1-%2").arg("org.fcitx.Fcitx").arg(displayNumber())) - ,m_connection(0) - ,m_serviceWatcher(new QDBusServiceWatcher(conn)) - ,m_watcher(new QFileSystemWatcher(this)) - ,m_autoReconnect(true) - ,m_connectedOnce(false) - ,m_initialized(false) -{ -} - -FcitxQtConnectionPrivate::~FcitxQtConnectionPrivate() -{ - if (m_connection) - delete m_connection; -} - -void FcitxQtConnectionPrivate::initialize() { - m_serviceWatcher->setConnection(QDBusConnection::sessionBus()); - m_serviceWatcher->addWatchedService(m_serviceName); - - QFileInfo info(socketFile()); - QDir dir(info.path()); - if (!dir.exists()) { - QDir rt(QDir::root()); - rt.mkpath(info.path()); - } - m_watcher->addPath(info.path()); - if (info.exists()) { - m_watcher->addPath(info.filePath()); - } - - connect(m_watcher, SIGNAL(fileChanged(QString)), this, SLOT(socketFileChanged())); - connect(m_watcher, SIGNAL(directoryChanged(QString)), this, SLOT(socketFileChanged())); - m_initialized = true; -} - -void FcitxQtConnectionPrivate::finalize() { - m_serviceWatcher->removeWatchedService(m_serviceName); - m_watcher->removePaths(m_watcher->files()); - m_watcher->removePaths(m_watcher->directories()); - m_watcher->disconnect(SIGNAL(fileChanged(QString))); - m_watcher->disconnect(SIGNAL(directoryChanged(QString))); - m_initialized = false; -} - -void FcitxQtConnectionPrivate::socketFileChanged() { - QFileInfo info(socketFile()); - if (info.exists()) { - if (m_watcher->files().indexOf(info.filePath()) == -1) - m_watcher->addPath(info.filePath()); - } - - QString addr = address(); - if (addr.isNull()) - return; - - cleanUp(); - createConnection(); -} - -QByteArray FcitxQtConnectionPrivate::localMachineId() -{ -#if QT_VERSION >= QT_VERSION_CHECK(4, 8, 0) - return QDBusConnection::localMachineId(); -#else - QFile file1("/var/lib/dbus/machine-id"); - QFile file2("/etc/machine-id"); - QFile* fileToRead = NULL; - if (file1.open(QIODevice::ReadOnly)) { - fileToRead = &file1; - } - else if (file2.open(QIODevice::ReadOnly)) { - fileToRead = &file2; - } - if (fileToRead) { - QByteArray result = fileToRead->readLine(1024); - fileToRead->close(); - result = result.trimmed(); - if (!result.isEmpty()) - return result; - } - return "machine-id"; -#endif -} - -int FcitxQtConnectionPrivate::displayNumber() { - if (m_displayNumber < 0) { - QByteArray displayNumber("0"); - QByteArray display(qgetenv("DISPLAY")); - int pos = display.indexOf(':'); - - if (pos >= 0) { - ++pos; - int pos2 = display.indexOf('.', pos); - if (pos2 > 0) { - displayNumber = display.mid(pos, pos2 - pos); - } else { - displayNumber = display.mid(pos); - } - } - - bool ok; - int d = displayNumber.toInt(&ok); - if (ok) { - m_displayNumber = d; - } else { - m_displayNumber = 0; - } - } - - return m_displayNumber; -} - -const QString& FcitxQtConnectionPrivate::socketFile() -{ - if (!m_socketFile.isEmpty()) - return m_socketFile; - - QString filename = QString("%1-%2").arg(QString::fromLatin1(QDBusConnection::localMachineId())).arg(displayNumber()); - - QString home = QString::fromLocal8Bit(qgetenv("XDG_CONFIG_HOME")); - if (home.isEmpty()) { - home = QDir::homePath().append(QLatin1Literal("/.config")); - } - m_socketFile = QString("%1/fcitx/dbus/%2").arg(home).arg(filename); - - return m_socketFile; -} - -QString FcitxQtConnectionPrivate::address() -{ - QString addr; - QByteArray addrVar = qgetenv("FCITX_DBUS_ADDRESS"); - if (!addrVar.isNull()) - return QString::fromLocal8Bit(addrVar); - - QFile file(socketFile()); - if (!file.open(QIODevice::ReadOnly)) - return QString(); - - const int BUFSIZE = 1024; - - char buffer[BUFSIZE]; - size_t sz = file.read(buffer, BUFSIZE); - file.close(); - if (sz == 0) - return QString(); - char* p = buffer; - while(*p) - p++; - size_t addrlen = p - buffer; - if (sz != addrlen + 2 * sizeof(pid_t) + 1) - return QString(); - - /* skip '\0' */ - p++; - pid_t *ppid = (pid_t*) p; - pid_t daemonpid = ppid[0]; - pid_t fcitxpid = ppid[1]; - - if (!_pid_exists(daemonpid) - || !_pid_exists(fcitxpid)) - return QString(); - - addr = QLatin1String(buffer); - - return addr; -} - -void FcitxQtConnectionPrivate::createConnection() { - if (m_connectedOnce && !m_autoReconnect) { - return; - } - - m_serviceWatcher->disconnect(SIGNAL(serviceOwnerChanged(QString,QString,QString))); - QString addr = address(); - if (!addr.isNull()) { - QDBusConnection connection(QDBusConnection::connectToBus(addr, "fcitx")); - if (connection.isConnected()) { - // qDebug() << "create private"; - m_connection = new QDBusConnection(connection); - } - else - QDBusConnection::disconnectFromBus("fcitx"); - } - - if (!m_connection) { - QDBusConnection* connection = new QDBusConnection(QDBusConnection::sessionBus()); - connect(m_serviceWatcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)), this, SLOT(imChanged(QString,QString,QString))); - QDBusReply registered = connection->interface()->isServiceRegistered(m_serviceName); - if (!registered.isValid() || !registered.value()) { - delete connection; - } - else { - m_connection = connection; - } - } - - Q_Q(FcitxQtConnection); - if (m_connection) { - - m_connection->connect ("org.freedesktop.DBus.Local", - "/org/freedesktop/DBus/Local", - "org.freedesktop.DBus.Local", - "Disconnected", - this, - SLOT (dbusDisconnected ())); - m_connectedOnce = true; - emit q->connected(); - } -} - - -void FcitxQtConnectionPrivate::dbusDisconnected() -{ - cleanUp(); - - createConnection(); -} - -void FcitxQtConnectionPrivate::imChanged(const QString& service, const QString& oldowner, const QString& newowner) -{ - if (service == m_serviceName) { - /* old die */ - if (oldowner.length() > 0 || newowner.length() > 0) - cleanUp(); - - /* new rise */ - if (newowner.length() > 0) { - QTimer::singleShot(100, this, SLOT(newServiceAppear())); - } - } -} - -void FcitxQtConnectionPrivate::cleanUp() -{ - Q_Q(FcitxQtConnection); - bool doemit = false; - QDBusConnection::disconnectFromBus("fcitx"); - if (m_connection) { - delete m_connection; - m_connection = 0; - doemit = true; - } - - if (!m_autoReconnect && m_connectedOnce) - finalize(); - - /* we want m_connection and finalize being called before the signal - * thus isConnected will return false in slot - * and startConnection can be called in slot - */ - if (doemit) - emit q->disconnected(); -} - -bool FcitxQtConnectionPrivate::isConnected() -{ - return m_connection && m_connection->isConnected(); -} - -void FcitxQtConnectionPrivate::newServiceAppear() { - if (!isConnected()) { - cleanUp(); - - createConnection(); - } -} diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection.h deleted file mode 100644 index efe255f90..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection.h +++ /dev/null @@ -1,111 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2012 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef FCITXQTCONNECTION_H -#define FCITXQTCONNECTION_H - -#include "fcitxqtdbusaddons_export.h" - -#include - -class QDBusConnection; - -class FcitxQtConnectionPrivate; - - -/** - * dbus connection to fcitx - **/ -class FCITXQTDBUSADDONS_EXPORT FcitxQtConnection : public QObject { - Q_OBJECT - Q_PROPERTY(bool autoReconnect READ autoReconnect WRITE setAutoReconnect) - Q_PROPERTY(bool connected READ isConnected) - Q_PROPERTY(QDBusConnection* connection READ connection) - Q_PROPERTY(QString serviceName READ serviceName) -public: - /** - * create a new connection - * - * @param parent - **/ - explicit FcitxQtConnection(QObject* parent = 0); - - /** - * destroy the connection - **/ - virtual ~FcitxQtConnection(); - - /** - * the connection will not start to work until you call this function - * you may want to connect to the signal before you call this function - **/ - void startConnection(); - void endConnection(); - /** - * automatically reconnect if fcitx disappeared - * - * @param a ... - * @return void - **/ - void setAutoReconnect(bool a); - - /** - * check this connection is doing automatical reconnect or not - * - * default value is true - **/ - bool autoReconnect(); - - /** - * return the current dbus connection to fcitx, notice, the object return - * by this function might be deteled if fcitx disappear, or might return 0 - * if fcitx is not running - * - * @return QDBusConnection* - **/ - QDBusConnection* connection(); - /** - * current fcitx dbus service name, can be used for create DBus proxy - * - * @return service name - **/ - const QString& serviceName(); - /** - * check its connected or not - **/ - bool isConnected(); - -Q_SIGNALS: - /** - * this signal will be emitted upon fcitx appears - **/ - void connected(); - /** - * this signal will be emitted upon fcitx disappears - * - * it will come with connected in pair - **/ - void disconnected(); - -private: - FcitxQtConnectionPrivate * const d_ptr; - Q_DECLARE_PRIVATE(FcitxQtConnection); -}; - -#endif // FCITXCONNECTION_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection_p.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection_p.h deleted file mode 100644 index dda726ac6..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtconnection_p.h +++ /dev/null @@ -1,68 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2012 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef FCITXQTCONNECTION_P_H -#define FCITXQTCONNECTION_P_H - -#include "fcitxqtconnection.h" -#include -#include - -class QDBusConnection; -class QDBusServiceWatcher; - -class FcitxQtConnectionPrivate : public QObject { - Q_OBJECT -public: - FcitxQtConnectionPrivate(FcitxQtConnection* conn); - virtual ~FcitxQtConnectionPrivate(); - FcitxQtConnection * const q_ptr; - Q_DECLARE_PUBLIC(FcitxQtConnection); - -private Q_SLOTS: - void imChanged(const QString& service, const QString& oldowner, const QString& newowner); - void dbusDisconnected(); - void cleanUp(); - void newServiceAppear(); - void socketFileChanged(); - -private: - bool isConnected(); - - static QByteArray localMachineId(); - const QString& socketFile(); - void createConnection(); - QString address(); - int displayNumber(); - void initialize(); - void finalize(); - - int m_displayNumber; - QString m_serviceName; - QDBusConnection* m_connection; - QDBusServiceWatcher* m_serviceWatcher; - QFileSystemWatcher* m_watcher; - QString m_socketFile; - bool m_autoReconnect; - bool m_connectedOnce; - bool m_initialized; -}; - - -#endif // FCITXCONNECTION_P_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtdbusaddons_export.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtdbusaddons_export.h deleted file mode 100644 index 3fabfb999..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtdbusaddons_export.h +++ /dev/null @@ -1,41 +0,0 @@ - -#ifndef FCITXQTDBUSADDONS_EXPORT_H -#define FCITXQTDBUSADDONS_EXPORT_H - -#ifdef FCITXQTDBUSADDONS_STATIC_DEFINE -# define FCITXQTDBUSADDONS_EXPORT -# define FCITXQTDBUSADDONS_NO_EXPORT -#else -# ifndef FCITXQTDBUSADDONS_EXPORT -# ifdef FcitxQt5DBusAddons_EXPORTS - /* We are building this library */ -# define FCITXQTDBUSADDONS_EXPORT __attribute__((visibility("default"))) -# else - /* We are using this library */ -# define FCITXQTDBUSADDONS_EXPORT __attribute__((visibility("default"))) -# endif -# endif - -# ifndef FCITXQTDBUSADDONS_NO_EXPORT -# define FCITXQTDBUSADDONS_NO_EXPORT __attribute__((visibility("hidden"))) -# endif -#endif - -#ifndef FCITXQTDBUSADDONS_DEPRECATED -# define FCITXQTDBUSADDONS_DEPRECATED __attribute__ ((__deprecated__)) -#endif - -#ifndef FCITXQTDBUSADDONS_DEPRECATED_EXPORT -# define FCITXQTDBUSADDONS_DEPRECATED_EXPORT FCITXQTDBUSADDONS_EXPORT FCITXQTDBUSADDONS_DEPRECATED -#endif - -#ifndef FCITXQTDBUSADDONS_DEPRECATED_NO_EXPORT -# define FCITXQTDBUSADDONS_DEPRECATED_NO_EXPORT FCITXQTDBUSADDONS_NO_EXPORT FCITXQTDBUSADDONS_DEPRECATED -#endif - -#define DEFINE_NO_DEPRECATED 0 -#if DEFINE_NO_DEPRECATED -# define FCITXQTDBUSADDONS_NO_DEPRECATED -#endif - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtdbusaddons_version.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtdbusaddons_version.h deleted file mode 100644 index 7b6dbf477..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtdbusaddons_version.h +++ /dev/null @@ -1,11 +0,0 @@ - -#ifndef FCITXQT5DBUSADDONS_VERSION_H -#define FCITXQT5DBUSADDONS_VERSION_H - -#define FCITXQT5DBUSADDONS_VERSION_STRING "1.0.0" -#define FCITXQT5DBUSADDONS_VERSION_MAJOR 1 -#define FCITXQT5DBUSADDONS_VERSION_MINOR 0 -#define FCITXQT5DBUSADDONS_VERSION_PATCH 0 -#define FCITXQT5DBUSADDONS_VERSION ((1<<16)|(0<<8)|(0)) - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtformattedpreedit.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtformattedpreedit.cpp deleted file mode 100644 index c6af84547..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtformattedpreedit.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2012 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#include - -#include "fcitxqtformattedpreedit.h" - -void FcitxQtFormattedPreedit::registerMetaType() -{ - qRegisterMetaType("FcitxQtFormattedPreedit"); - qDBusRegisterMetaType(); - qRegisterMetaType("FcitxQtFormattedPreeditList"); - qDBusRegisterMetaType(); -} - -qint32 FcitxQtFormattedPreedit::format() const -{ - return m_format; -} - -const QString& FcitxQtFormattedPreedit::string() const -{ - return m_string; -} - -void FcitxQtFormattedPreedit::setFormat(qint32 format) -{ - m_format = format; -} - -void FcitxQtFormattedPreedit::setString(const QString& str) -{ - m_string = str; -} - -bool FcitxQtFormattedPreedit::operator==(const FcitxQtFormattedPreedit& preedit) const -{ - return (preedit.m_format == m_format) && (preedit.m_string == m_string); -} - -FCITXQTDBUSADDONS_EXPORT -QDBusArgument& operator<<(QDBusArgument& argument, const FcitxQtFormattedPreedit& preedit) -{ - argument.beginStructure(); - argument << preedit.string(); - argument << preedit.format(); - argument.endStructure(); - return argument; -} - -FCITXQTDBUSADDONS_EXPORT -const QDBusArgument& operator>>(const QDBusArgument& argument, FcitxQtFormattedPreedit& preedit) -{ - QString str; - qint32 format; - argument.beginStructure(); - argument >> str >> format; - argument.endStructure(); - preedit.setString(str); - preedit.setFormat(format); - return argument; -} diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtformattedpreedit.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtformattedpreedit.h deleted file mode 100644 index a00355c6f..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtformattedpreedit.h +++ /dev/null @@ -1,51 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2012 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef FCITX_QT_FORMATTED_PREEDIT_H -#define FCITX_QT_FORMATTED_PREEDIT_H - -#include "fcitxqtdbusaddons_export.h" - -#include -#include - -class FCITXQTDBUSADDONS_EXPORT FcitxQtFormattedPreedit { -public: - const QString& string() const; - qint32 format() const; - void setString(const QString& str); - void setFormat(qint32 format); - - static void registerMetaType(); - - bool operator ==(const FcitxQtFormattedPreedit& preedit) const; -private: - QString m_string; - qint32 m_format; -}; - -typedef QList FcitxQtFormattedPreeditList; - -QDBusArgument& operator<<(QDBusArgument& argument, const FcitxQtFormattedPreedit& im); -const QDBusArgument& operator>>(const QDBusArgument& argument, FcitxQtFormattedPreedit& im); - -Q_DECLARE_METATYPE(FcitxQtFormattedPreedit) -Q_DECLARE_METATYPE(FcitxQtFormattedPreeditList) - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.cpp deleted file mode 100644 index b47d332cd..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -N -p fcitxqtinputcontextproxy -c FcitxQtInputContextProxy interfaces/org.fcitx.Fcitx.InputContext.xml -i fcitxqtformattedpreedit.h -i fcitxqt_export.h - * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - * - * This is an auto-generated file. - * This file may have been hand-edited. Look for HAND-EDIT comments - * before re-generating it. - */ - -#include "fcitxqtinputcontextproxy.h" - -/* - * Implementation of interface class FcitxQtInputContextProxy - */ - -FcitxQtInputContextProxy::FcitxQtInputContextProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) - : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) -{ -} - -FcitxQtInputContextProxy::~FcitxQtInputContextProxy() -{ -} - diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.h deleted file mode 100644 index 19874dc45..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputcontextproxy.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -N -p fcitxqtinputcontextproxy -c FcitxQtInputContextProxy interfaces/org.fcitx.Fcitx.InputContext.xml -i fcitxqtformattedpreedit.h -i fcitxqt_export.h - * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - * - * This is an auto-generated file. - * Do not edit! All changes made to it will be lost. - */ - -#ifndef FCITXQTINPUTCONTEXTPROXY_H_1409252990 -#define FCITXQTINPUTCONTEXTPROXY_H_1409252990 - -#include -#include -#include -#include -#include -#include -#include -#include -#include "fcitxqtformattedpreedit.h" -#include "fcitxqtdbusaddons_export.h" - -/* - * Proxy class for interface org.fcitx.Fcitx.InputContext - */ -class FCITXQTDBUSADDONS_EXPORT FcitxQtInputContextProxy: public QDBusAbstractInterface -{ - Q_OBJECT -public: - static inline const char *staticInterfaceName() - { return "org.fcitx.Fcitx.InputContext"; } - -public: - FcitxQtInputContextProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); - - ~FcitxQtInputContextProxy(); - -public Q_SLOTS: // METHODS - inline QDBusPendingReply<> CloseIC() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("CloseIC"), argumentList); - } - - inline QDBusPendingReply<> DestroyIC() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("DestroyIC"), argumentList); - } - - inline QDBusPendingReply<> EnableIC() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("EnableIC"), argumentList); - } - - inline QDBusPendingReply<> FocusIn() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("FocusIn"), argumentList); - } - - inline QDBusPendingReply<> FocusOut() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("FocusOut"), argumentList); - } - - inline QDBusPendingReply<> MouseEvent(int x) - { - QList argumentList; - argumentList << QVariant::fromValue(x); - return asyncCallWithArgumentList(QLatin1String("MouseEvent"), argumentList); - } - - inline QDBusPendingReply ProcessKeyEvent(uint keyval, uint keycode, uint state, int type, uint time) - { - QList argumentList; - argumentList << QVariant::fromValue(keyval) << QVariant::fromValue(keycode) << QVariant::fromValue(state) << QVariant::fromValue(type) << QVariant::fromValue(time); - return asyncCallWithArgumentList(QLatin1String("ProcessKeyEvent"), argumentList); - } - - inline QDBusPendingReply<> Reset() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("Reset"), argumentList); - } - - inline QDBusPendingReply<> SetCapacity(uint caps) - { - QList argumentList; - argumentList << QVariant::fromValue(caps); - return asyncCallWithArgumentList(QLatin1String("SetCapacity"), argumentList); - } - - inline QDBusPendingReply<> SetCursorLocation(int x, int y) - { - QList argumentList; - argumentList << QVariant::fromValue(x) << QVariant::fromValue(y); - return asyncCallWithArgumentList(QLatin1String("SetCursorLocation"), argumentList); - } - - inline QDBusPendingReply<> SetCursorRect(int x, int y, int w, int h) - { - QList argumentList; - argumentList << QVariant::fromValue(x) << QVariant::fromValue(y) << QVariant::fromValue(w) << QVariant::fromValue(h); - return asyncCallWithArgumentList(QLatin1String("SetCursorRect"), argumentList); - } - - inline QDBusPendingReply<> SetSurroundingText(const QString &text, uint cursor, uint anchor) - { - QList argumentList; - argumentList << QVariant::fromValue(text) << QVariant::fromValue(cursor) << QVariant::fromValue(anchor); - return asyncCallWithArgumentList(QLatin1String("SetSurroundingText"), argumentList); - } - - inline QDBusPendingReply<> SetSurroundingTextPosition(uint cursor, uint anchor) - { - QList argumentList; - argumentList << QVariant::fromValue(cursor) << QVariant::fromValue(anchor); - return asyncCallWithArgumentList(QLatin1String("SetSurroundingTextPosition"), argumentList); - } - -Q_SIGNALS: // SIGNALS - void CloseIM(); - void CommitString(const QString &str); - void DeleteSurroundingText(int offset, uint nchar); - void EnableIM(); - void ForwardKey(uint keyval, uint state, int type); - void UpdateClientSideUI(const QString &auxup, const QString &auxdown, const QString &preedit, const QString &candidateword, const QString &imname, int cursorpos); - void UpdateFormattedPreedit(FcitxQtFormattedPreeditList str, int cursorpos); -}; - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethoditem.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethoditem.cpp deleted file mode 100644 index d28ed1149..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethoditem.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2011~2012 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -// Qt -#include -#include - -// self -#include "fcitxqtinputmethoditem.h" - -bool FcitxQtInputMethodItem::enabled() const -{ - return m_enabled; -} -const QString& FcitxQtInputMethodItem::langCode() const -{ - return m_langCode; -} -const QString& FcitxQtInputMethodItem::name() const -{ - return m_name; -} -const QString& FcitxQtInputMethodItem::uniqueName() const -{ - return m_uniqueName; -} -void FcitxQtInputMethodItem::setEnabled(bool enable) -{ - m_enabled = enable; -} -void FcitxQtInputMethodItem::setLangCode(const QString& lang) -{ - m_langCode = lang; -} -void FcitxQtInputMethodItem::setName(const QString& name) -{ - m_name = name; -} -void FcitxQtInputMethodItem::setUniqueName(const QString& name) -{ - m_uniqueName = name; -} - -void FcitxQtInputMethodItem::registerMetaType() -{ - qRegisterMetaType("FcitxQtInputMethodItem"); - qDBusRegisterMetaType(); - qRegisterMetaType("FcitxQtInputMethodItemList"); - qDBusRegisterMetaType(); -} - -FCITXQTDBUSADDONS_EXPORT -QDBusArgument& operator<<(QDBusArgument& argument, const FcitxQtInputMethodItem& im) -{ - argument.beginStructure(); - argument << im.name(); - argument << im.uniqueName(); - argument << im.langCode(); - argument << im.enabled(); - argument.endStructure(); - return argument; -} - -FCITXQTDBUSADDONS_EXPORT -const QDBusArgument& operator>>(const QDBusArgument& argument, FcitxQtInputMethodItem& im) -{ - QString name; - QString uniqueName; - QString langCode; - bool enabled; - argument.beginStructure(); - argument >> name >> uniqueName >> langCode >> enabled; - argument.endStructure(); - im.setName(name); - im.setUniqueName(uniqueName); - im.setLangCode(langCode); - im.setEnabled(enabled); - return argument; -} diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethoditem.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethoditem.h deleted file mode 100644 index 6b8c7805c..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethoditem.h +++ /dev/null @@ -1,64 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2011~2012 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef FCITX_QT_INPUT_METHOD_ITEM_H -#define FCITX_QT_INPUT_METHOD_ITEM_H - -#include "fcitxqtdbusaddons_export.h" - -// Qt -#include -#include -#include - -class FCITXQTDBUSADDONS_EXPORT FcitxQtInputMethodItem -{ -public: - const QString& name() const; - const QString& uniqueName() const; - const QString& langCode() const; - bool enabled() const; - - void setName(const QString& name); - void setUniqueName(const QString& name); - void setLangCode(const QString& name); - void setEnabled(bool name); - static void registerMetaType(); - - inline bool operator < (const FcitxQtInputMethodItem& im) const { - if (m_enabled == true && im.m_enabled == false) - return true; - return false; - } -private: - QString m_name; - QString m_uniqueName; - QString m_langCode; - bool m_enabled; -}; - -typedef QList FcitxQtInputMethodItemList; - -QDBusArgument& operator<<(QDBusArgument& argument, const FcitxQtInputMethodItem& im); -const QDBusArgument& operator>>(const QDBusArgument& argument, FcitxQtInputMethodItem& im); - -Q_DECLARE_METATYPE(FcitxQtInputMethodItem) -Q_DECLARE_METATYPE(FcitxQtInputMethodItemList) - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.cpp deleted file mode 100644 index 068f4c2ee..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -N -p fcitxqtinputmethodproxy -c FcitxQtInputMethodProxy interfaces/org.fcitx.Fcitx.InputMethod.xml -i fcitxqtinputmethoditem.h -i fcitxqt_export.h - * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - * - * This is an auto-generated file. - * This file may have been hand-edited. Look for HAND-EDIT comments - * before re-generating it. - */ - -#include "fcitxqtinputmethodproxy.h" - -/* - * Implementation of interface class FcitxQtInputMethodProxy - */ - -FcitxQtInputMethodProxy::FcitxQtInputMethodProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) - : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) -{ -} - -FcitxQtInputMethodProxy::~FcitxQtInputMethodProxy() -{ -} - diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.h deleted file mode 100644 index 7aa37e22b..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtinputmethodproxy.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -N -p fcitxqtinputmethodproxy -c FcitxQtInputMethodProxy interfaces/org.fcitx.Fcitx.InputMethod.xml -i fcitxqtinputmethoditem.h -i fcitxqt_export.h - * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - * - * This is an auto-generated file. - * Do not edit! All changes made to it will be lost. - */ - -#ifndef FCITXQTINPUTMETHODPROXY_H_1409252990 -#define FCITXQTINPUTMETHODPROXY_H_1409252990 - -#include -#include -#include -#include -#include -#include -#include -#include -#include "fcitxqtinputmethoditem.h" -#include "fcitxqtdbusaddons_export.h" - -/* - * Proxy class for interface org.fcitx.Fcitx.InputMethod - */ -class FCITXQTDBUSADDONS_EXPORT FcitxQtInputMethodProxy: public QDBusAbstractInterface -{ - Q_OBJECT -public: - static inline const char *staticInterfaceName() - { return "org.fcitx.Fcitx.InputMethod"; } - -public: - FcitxQtInputMethodProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); - - ~FcitxQtInputMethodProxy(); - - Q_PROPERTY(QString CurrentIM READ currentIM WRITE setCurrentIM) - inline QString currentIM() const - { return qvariant_cast< QString >(property("CurrentIM")); } - inline void setCurrentIM(const QString &value) - { setProperty("CurrentIM", QVariant::fromValue(value)); } - - Q_PROPERTY(FcitxQtInputMethodItemList IMList READ iMList WRITE setIMList) - inline FcitxQtInputMethodItemList iMList() const - { return qvariant_cast< FcitxQtInputMethodItemList >(property("IMList")); } - inline void setIMList(FcitxQtInputMethodItemList value) - { setProperty("IMList", QVariant::fromValue(value)); } - -public Q_SLOTS: // METHODS - inline QDBusPendingReply<> ActivateIM() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("ActivateIM"), argumentList); - } - - inline QDBusPendingReply<> Configure() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("Configure"), argumentList); - } - - inline QDBusPendingReply<> ConfigureAddon(const QString &addon) - { - QList argumentList; - argumentList << QVariant::fromValue(addon); - return asyncCallWithArgumentList(QLatin1String("ConfigureAddon"), argumentList); - } - - inline QDBusPendingReply<> ConfigureIM(const QString &im) - { - QList argumentList; - argumentList << QVariant::fromValue(im); - return asyncCallWithArgumentList(QLatin1String("ConfigureIM"), argumentList); - } - - inline QDBusPendingReply CreateIC() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("CreateIC"), argumentList); - } - inline QDBusReply CreateIC(uint &keyval1, uint &state1, uint &keyval2, uint &state2) - { - QList argumentList; - QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("CreateIC"), argumentList); - if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 5) { - keyval1 = qdbus_cast(reply.arguments().at(1)); - state1 = qdbus_cast(reply.arguments().at(2)); - keyval2 = qdbus_cast(reply.arguments().at(3)); - state2 = qdbus_cast(reply.arguments().at(4)); - } - return reply; - } - - inline QDBusPendingReply CreateICv2(const QString &appname) - { - QList argumentList; - argumentList << QVariant::fromValue(appname); - return asyncCallWithArgumentList(QLatin1String("CreateICv2"), argumentList); - } - inline QDBusReply CreateICv2(const QString &appname, bool &enable, uint &keyval1, uint &state1, uint &keyval2, uint &state2) - { - QList argumentList; - argumentList << QVariant::fromValue(appname); - QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("CreateICv2"), argumentList); - if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 6) { - enable = qdbus_cast(reply.arguments().at(1)); - keyval1 = qdbus_cast(reply.arguments().at(2)); - state1 = qdbus_cast(reply.arguments().at(3)); - keyval2 = qdbus_cast(reply.arguments().at(4)); - state2 = qdbus_cast(reply.arguments().at(5)); - } - return reply; - } - - inline QDBusPendingReply CreateICv3(const QString &appname, int pid) - { - QList argumentList; - argumentList << QVariant::fromValue(appname) << QVariant::fromValue(pid); - return asyncCallWithArgumentList(QLatin1String("CreateICv3"), argumentList); - } - inline QDBusReply CreateICv3(const QString &appname, int pid, bool &enable, uint &keyval1, uint &state1, uint &keyval2, uint &state2) - { - QList argumentList; - argumentList << QVariant::fromValue(appname) << QVariant::fromValue(pid); - QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("CreateICv3"), argumentList); - if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 6) { - enable = qdbus_cast(reply.arguments().at(1)); - keyval1 = qdbus_cast(reply.arguments().at(2)); - state1 = qdbus_cast(reply.arguments().at(3)); - keyval2 = qdbus_cast(reply.arguments().at(4)); - state2 = qdbus_cast(reply.arguments().at(5)); - } - return reply; - } - - inline QDBusPendingReply<> Exit() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("Exit"), argumentList); - } - - inline QDBusPendingReply GetCurrentIM() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("GetCurrentIM"), argumentList); - } - - inline QDBusPendingReply GetCurrentState() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("GetCurrentState"), argumentList); - } - - inline QDBusPendingReply GetCurrentUI() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("GetCurrentUI"), argumentList); - } - - inline QDBusPendingReply GetIMAddon(const QString &im) - { - QList argumentList; - argumentList << QVariant::fromValue(im); - return asyncCallWithArgumentList(QLatin1String("GetIMAddon"), argumentList); - } - - inline QDBusPendingReply<> InactivateIM() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("InactivateIM"), argumentList); - } - - inline QDBusPendingReply<> ReloadAddonConfig(const QString &addon) - { - QList argumentList; - argumentList << QVariant::fromValue(addon); - return asyncCallWithArgumentList(QLatin1String("ReloadAddonConfig"), argumentList); - } - - inline QDBusPendingReply<> ReloadConfig() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("ReloadConfig"), argumentList); - } - - inline QDBusPendingReply<> ResetIMList() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("ResetIMList"), argumentList); - } - - inline QDBusPendingReply<> Restart() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("Restart"), argumentList); - } - - inline QDBusPendingReply<> SetCurrentIM(const QString &im) - { - QList argumentList; - argumentList << QVariant::fromValue(im); - return asyncCallWithArgumentList(QLatin1String("SetCurrentIM"), argumentList); - } - - inline QDBusPendingReply<> ToggleIM() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("ToggleIM"), argumentList); - } - -Q_SIGNALS: // SIGNALS -}; - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardlayout.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardlayout.cpp deleted file mode 100644 index 32cd981ea..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardlayout.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2011~2012 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -// Qt -#include -#include - -// self -#include "fcitxqtkeyboardlayout.h" - -const QString& FcitxQtKeyboardLayout::layout() const -{ - return m_layout; -} -const QString& FcitxQtKeyboardLayout::langCode() const -{ - return m_langCode; -} -const QString& FcitxQtKeyboardLayout::name() const -{ - return m_name; -} - -const QString& FcitxQtKeyboardLayout::variant() const -{ - return m_variant; -} - -void FcitxQtKeyboardLayout::setLayout(const QString& layout) -{ - m_layout = layout; -} - -void FcitxQtKeyboardLayout::setLangCode(const QString& lang) -{ - m_langCode = lang; -} - -void FcitxQtKeyboardLayout::setName(const QString& name) -{ - m_name = name; -} - -void FcitxQtKeyboardLayout::setVariant(const QString& variant) -{ - m_variant = variant; -} - -void FcitxQtKeyboardLayout::registerMetaType() -{ - qRegisterMetaType("FcitxQtKeyboardLayout"); - qDBusRegisterMetaType(); - qRegisterMetaType("FcitxQtKeyboardLayoutList"); - qDBusRegisterMetaType(); -} - -FCITXQTDBUSADDONS_EXPORT -QDBusArgument& operator<<(QDBusArgument& argument, const FcitxQtKeyboardLayout& layout) -{ - argument.beginStructure(); - argument << layout.layout(); - argument << layout.variant(); - argument << layout.name(); - argument << layout.langCode(); - argument.endStructure(); - return argument; -} - -FCITXQTDBUSADDONS_EXPORT -const QDBusArgument& operator>>(const QDBusArgument& argument, FcitxQtKeyboardLayout& layout) -{ - QString l; - QString variant; - QString name; - QString langCode; - argument.beginStructure(); - argument >> l >> variant >> name >> langCode; - argument.endStructure(); - layout.setLayout(l); - layout.setVariant(variant); - layout.setName(name); - layout.setLangCode(langCode); - return argument; -} diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardlayout.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardlayout.h deleted file mode 100644 index d33438dce..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardlayout.h +++ /dev/null @@ -1,58 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2011~2012 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef FCITX_QT_KEYBOARD_LAYOUT_H -#define FCITX_QT_KEYBOARD_LAYOUT_H - -#include "fcitxqtdbusaddons_export.h" - -// Qt -#include -#include -#include - -class FCITXQTDBUSADDONS_EXPORT FcitxQtKeyboardLayout -{ -public: - const QString& layout() const; - const QString& variant() const; - const QString& name() const; - const QString& langCode() const; - void setLayout(const QString& layout); - void setLangCode(const QString& lang); - void setName(const QString& name); - void setVariant(const QString& variant); - - static void registerMetaType(); -private: - QString m_layout; - QString m_variant; - QString m_name; - QString m_langCode; -}; - -typedef QList FcitxQtKeyboardLayoutList; - -QDBusArgument& operator<<(QDBusArgument& argument, const FcitxQtKeyboardLayout& l); -const QDBusArgument& operator>>(const QDBusArgument& argument, FcitxQtKeyboardLayout& l); - -Q_DECLARE_METATYPE(FcitxQtKeyboardLayout) -Q_DECLARE_METATYPE(FcitxQtKeyboardLayoutList) - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.cpp deleted file mode 100644 index 7523a9206..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -N -p fcitxqtkeyboardproxy -c FcitxQtKeyboardProxy interfaces/org.fcitx.Fcitx.Keyboard.xml -i fcitxqtkeyboardlayout.h -i fcitxqt_export.h - * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - * - * This is an auto-generated file. - * This file may have been hand-edited. Look for HAND-EDIT comments - * before re-generating it. - */ - -#include "fcitxqtkeyboardproxy.h" - -/* - * Implementation of interface class FcitxQtKeyboardProxy - */ - -FcitxQtKeyboardProxy::FcitxQtKeyboardProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) - : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) -{ -} - -FcitxQtKeyboardProxy::~FcitxQtKeyboardProxy() -{ -} - diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.h deleted file mode 100644 index 42a6561f3..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/fcitxqtkeyboardproxy.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -N -p fcitxqtkeyboardproxy -c FcitxQtKeyboardProxy interfaces/org.fcitx.Fcitx.Keyboard.xml -i fcitxqtkeyboardlayout.h -i fcitxqt_export.h - * - * qdbusxml2cpp is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). - * - * This is an auto-generated file. - * Do not edit! All changes made to it will be lost. - */ - -#ifndef FCITXQTKEYBOARDPROXY_H_1409252990 -#define FCITXQTKEYBOARDPROXY_H_1409252990 - -#include -#include -#include -#include -#include -#include -#include -#include -#include "fcitxqtkeyboardlayout.h" -#include "fcitxqtdbusaddons_export.h" - -/* - * Proxy class for interface org.fcitx.Fcitx.Keyboard - */ -class FCITXQTDBUSADDONS_EXPORT FcitxQtKeyboardProxy: public QDBusAbstractInterface -{ - Q_OBJECT -public: - static inline const char *staticInterfaceName() - { return "org.fcitx.Fcitx.Keyboard"; } - -public: - FcitxQtKeyboardProxy(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); - - ~FcitxQtKeyboardProxy(); - -public Q_SLOTS: // METHODS - inline QDBusPendingReply GetLayoutForIM(const QString &im) - { - QList argumentList; - argumentList << QVariant::fromValue(im); - return asyncCallWithArgumentList(QLatin1String("GetLayoutForIM"), argumentList); - } - inline QDBusReply GetLayoutForIM(const QString &im, QString &variant) - { - QList argumentList; - argumentList << QVariant::fromValue(im); - QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("GetLayoutForIM"), argumentList); - if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 2) { - variant = qdbus_cast(reply.arguments().at(1)); - } - return reply; - } - - inline QDBusPendingReply GetLayouts() - { - QList argumentList; - return asyncCallWithArgumentList(QLatin1String("GetLayouts"), argumentList); - } - - inline QDBusPendingReply<> SetLayoutForIM(const QString &im, const QString &layout, const QString &variant) - { - QList argumentList; - argumentList << QVariant::fromValue(im) << QVariant::fromValue(layout) << QVariant::fromValue(variant); - return asyncCallWithArgumentList(QLatin1String("SetLayoutForIM"), argumentList); - } - -Q_SIGNALS: // SIGNALS -}; - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.InputContext.xml b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.InputContext.xml deleted file mode 100644 index 1423d69ac..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.InputContext.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.InputMethod.xml b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.InputMethod.xml deleted file mode 100644 index 00dc20ab7..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.InputMethod.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.Keyboard.xml b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.Keyboard.xml deleted file mode 100644 index 28ffa538f..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/interfaces/org.fcitx.Fcitx.Keyboard.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/keydata.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/keydata.h deleted file mode 100644 index 5cee56558..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/keydata.h +++ /dev/null @@ -1,1612 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2013 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef KEYDATA_H -#define KEYDATA_H - -struct _FcitxKeySymToUnicode{ - uint16_t keysym; - uint16_t ucs; -}; - -struct _FcitxUnicodeToKeySym { - uint16_t keysym; - uint16_t ucs; -}; - -static const struct _FcitxKeySymToUnicode gdk_keysym_to_unicode_tab[] = { - { 0x01a1, 0x0104 }, /* Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */ - { 0x01a2, 0x02d8 }, /* breve ˘ BREVE */ - { 0x01a3, 0x0141 }, /* Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */ - { 0x01a5, 0x013d }, /* Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */ - { 0x01a6, 0x015a }, /* Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */ - { 0x01a9, 0x0160 }, /* Scaron Š LATIN CAPITAL LETTER S WITH CARON */ - { 0x01aa, 0x015e }, /* Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */ - { 0x01ab, 0x0164 }, /* Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */ - { 0x01ac, 0x0179 }, /* Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */ - { 0x01ae, 0x017d }, /* Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */ - { 0x01af, 0x017b }, /* Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */ - { 0x01b1, 0x0105 }, /* aogonek ą LATIN SMALL LETTER A WITH OGONEK */ - { 0x01b2, 0x02db }, /* ogonek ˛ OGONEK */ - { 0x01b3, 0x0142 }, /* lstroke ł LATIN SMALL LETTER L WITH STROKE */ - { 0x01b5, 0x013e }, /* lcaron ľ LATIN SMALL LETTER L WITH CARON */ - { 0x01b6, 0x015b }, /* sacute ś LATIN SMALL LETTER S WITH ACUTE */ - { 0x01b7, 0x02c7 }, /* caron ˇ CARON */ - { 0x01b9, 0x0161 }, /* scaron š LATIN SMALL LETTER S WITH CARON */ - { 0x01ba, 0x015f }, /* scedilla ş LATIN SMALL LETTER S WITH CEDILLA */ - { 0x01bb, 0x0165 }, /* tcaron ť LATIN SMALL LETTER T WITH CARON */ - { 0x01bc, 0x017a }, /* zacute ź LATIN SMALL LETTER Z WITH ACUTE */ - { 0x01bd, 0x02dd }, /* doubleacute ˝ DOUBLE ACUTE ACCENT */ - { 0x01be, 0x017e }, /* zcaron ž LATIN SMALL LETTER Z WITH CARON */ - { 0x01bf, 0x017c }, /* zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */ - { 0x01c0, 0x0154 }, /* Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */ - { 0x01c3, 0x0102 }, /* Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */ - { 0x01c5, 0x0139 }, /* Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */ - { 0x01c6, 0x0106 }, /* Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */ - { 0x01c8, 0x010c }, /* Ccaron Č LATIN CAPITAL LETTER C WITH CARON */ - { 0x01ca, 0x0118 }, /* Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */ - { 0x01cc, 0x011a }, /* Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */ - { 0x01cf, 0x010e }, /* Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */ - { 0x01d0, 0x0110 }, /* Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */ - { 0x01d1, 0x0143 }, /* Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */ - { 0x01d2, 0x0147 }, /* Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */ - { 0x01d5, 0x0150 }, /* Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ - { 0x01d8, 0x0158 }, /* Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */ - { 0x01d9, 0x016e }, /* Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */ - { 0x01db, 0x0170 }, /* Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ - { 0x01de, 0x0162 }, /* Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */ - { 0x01e0, 0x0155 }, /* racute ŕ LATIN SMALL LETTER R WITH ACUTE */ - { 0x01e3, 0x0103 }, /* abreve ă LATIN SMALL LETTER A WITH BREVE */ - { 0x01e5, 0x013a }, /* lacute ĺ LATIN SMALL LETTER L WITH ACUTE */ - { 0x01e6, 0x0107 }, /* cacute ć LATIN SMALL LETTER C WITH ACUTE */ - { 0x01e8, 0x010d }, /* ccaron č LATIN SMALL LETTER C WITH CARON */ - { 0x01ea, 0x0119 }, /* eogonek ę LATIN SMALL LETTER E WITH OGONEK */ - { 0x01ec, 0x011b }, /* ecaron ě LATIN SMALL LETTER E WITH CARON */ - { 0x01ef, 0x010f }, /* dcaron ď LATIN SMALL LETTER D WITH CARON */ - { 0x01f0, 0x0111 }, /* dstroke đ LATIN SMALL LETTER D WITH STROKE */ - { 0x01f1, 0x0144 }, /* nacute ń LATIN SMALL LETTER N WITH ACUTE */ - { 0x01f2, 0x0148 }, /* ncaron ň LATIN SMALL LETTER N WITH CARON */ - { 0x01f5, 0x0151 }, /* odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */ - { 0x01f8, 0x0159 }, /* rcaron ř LATIN SMALL LETTER R WITH CARON */ - { 0x01f9, 0x016f }, /* uring ů LATIN SMALL LETTER U WITH RING ABOVE */ - { 0x01fb, 0x0171 }, /* udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */ - { 0x01fe, 0x0163 }, /* tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */ - { 0x01ff, 0x02d9 }, /* abovedot ˙ DOT ABOVE */ - { 0x02a1, 0x0126 }, /* Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */ - { 0x02a6, 0x0124 }, /* Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ - { 0x02a9, 0x0130 }, /* Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */ - { 0x02ab, 0x011e }, /* Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */ - { 0x02ac, 0x0134 }, /* Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ - { 0x02b1, 0x0127 }, /* hstroke ħ LATIN SMALL LETTER H WITH STROKE */ - { 0x02b6, 0x0125 }, /* hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */ - { 0x02b9, 0x0131 }, /* idotless ı LATIN SMALL LETTER DOTLESS I */ - { 0x02bb, 0x011f }, /* gbreve ğ LATIN SMALL LETTER G WITH BREVE */ - { 0x02bc, 0x0135 }, /* jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */ - { 0x02c5, 0x010a }, /* Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */ - { 0x02c6, 0x0108 }, /* Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ - { 0x02d5, 0x0120 }, /* Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */ - { 0x02d8, 0x011c }, /* Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ - { 0x02dd, 0x016c }, /* Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */ - { 0x02de, 0x015c }, /* Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ - { 0x02e5, 0x010b }, /* cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */ - { 0x02e6, 0x0109 }, /* ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */ - { 0x02f5, 0x0121 }, /* gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */ - { 0x02f8, 0x011d }, /* gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */ - { 0x02fd, 0x016d }, /* ubreve ŭ LATIN SMALL LETTER U WITH BREVE */ - { 0x02fe, 0x015d }, /* scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */ - { 0x03a2, 0x0138 }, /* kra ĸ LATIN SMALL LETTER KRA */ - { 0x03a3, 0x0156 }, /* Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */ - { 0x03a5, 0x0128 }, /* Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */ - { 0x03a6, 0x013b }, /* Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */ - { 0x03aa, 0x0112 }, /* Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */ - { 0x03ab, 0x0122 }, /* Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */ - { 0x03ac, 0x0166 }, /* Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */ - { 0x03b3, 0x0157 }, /* rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */ - { 0x03b5, 0x0129 }, /* itilde ĩ LATIN SMALL LETTER I WITH TILDE */ - { 0x03b6, 0x013c }, /* lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */ - { 0x03ba, 0x0113 }, /* emacron ē LATIN SMALL LETTER E WITH MACRON */ - { 0x03bb, 0x0123 }, /* gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */ - { 0x03bc, 0x0167 }, /* tslash ŧ LATIN SMALL LETTER T WITH STROKE */ - { 0x03bd, 0x014a }, /* ENG Ŋ LATIN CAPITAL LETTER ENG */ - { 0x03bf, 0x014b }, /* eng ŋ LATIN SMALL LETTER ENG */ - { 0x03c0, 0x0100 }, /* Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */ - { 0x03c7, 0x012e }, /* Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */ - { 0x03cc, 0x0116 }, /* Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */ - { 0x03cf, 0x012a }, /* Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */ - { 0x03d1, 0x0145 }, /* Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */ - { 0x03d2, 0x014c }, /* Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */ - { 0x03d3, 0x0136 }, /* Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */ - { 0x03d9, 0x0172 }, /* Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */ - { 0x03dd, 0x0168 }, /* Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */ - { 0x03de, 0x016a }, /* Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */ - { 0x03e0, 0x0101 }, /* amacron ā LATIN SMALL LETTER A WITH MACRON */ - { 0x03e7, 0x012f }, /* iogonek į LATIN SMALL LETTER I WITH OGONEK */ - { 0x03ec, 0x0117 }, /* eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */ - { 0x03ef, 0x012b }, /* imacron ī LATIN SMALL LETTER I WITH MACRON */ - { 0x03f1, 0x0146 }, /* ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */ - { 0x03f2, 0x014d }, /* omacron ō LATIN SMALL LETTER O WITH MACRON */ - { 0x03f3, 0x0137 }, /* kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */ - { 0x03f9, 0x0173 }, /* uogonek ų LATIN SMALL LETTER U WITH OGONEK */ - { 0x03fd, 0x0169 }, /* utilde ũ LATIN SMALL LETTER U WITH TILDE */ - { 0x03fe, 0x016b }, /* umacron ū LATIN SMALL LETTER U WITH MACRON */ - { 0x047e, 0x203e }, /* overline ‾ OVERLINE */ - { 0x04a1, 0x3002 }, /* kana_fullstop 。 IDEOGRAPHIC FULL STOP */ - { 0x04a2, 0x300c }, /* kana_openingbracket 「 LEFT CORNER BRACKET */ - { 0x04a3, 0x300d }, /* kana_closingbracket 」 RIGHT CORNER BRACKET */ - { 0x04a4, 0x3001 }, /* kana_comma 、 IDEOGRAPHIC COMMA */ - { 0x04a5, 0x30fb }, /* kana_conjunctive ・ KATAKANA MIDDLE DOT */ - { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */ - { 0x04a7, 0x30a1 }, /* kana_a ァ KATAKANA LETTER SMALL A */ - { 0x04a8, 0x30a3 }, /* kana_i ィ KATAKANA LETTER SMALL I */ - { 0x04a9, 0x30a5 }, /* kana_u ゥ KATAKANA LETTER SMALL U */ - { 0x04aa, 0x30a7 }, /* kana_e ェ KATAKANA LETTER SMALL E */ - { 0x04ab, 0x30a9 }, /* kana_o ォ KATAKANA LETTER SMALL O */ - { 0x04ac, 0x30e3 }, /* kana_ya ャ KATAKANA LETTER SMALL YA */ - { 0x04ad, 0x30e5 }, /* kana_yu ュ KATAKANA LETTER SMALL YU */ - { 0x04ae, 0x30e7 }, /* kana_yo ョ KATAKANA LETTER SMALL YO */ - { 0x04af, 0x30c3 }, /* kana_tsu ッ KATAKANA LETTER SMALL TU */ - { 0x04b0, 0x30fc }, /* prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */ - { 0x04b1, 0x30a2 }, /* kana_A ア KATAKANA LETTER A */ - { 0x04b2, 0x30a4 }, /* kana_I イ KATAKANA LETTER I */ - { 0x04b3, 0x30a6 }, /* kana_U ウ KATAKANA LETTER U */ - { 0x04b4, 0x30a8 }, /* kana_E エ KATAKANA LETTER E */ - { 0x04b5, 0x30aa }, /* kana_O オ KATAKANA LETTER O */ - { 0x04b6, 0x30ab }, /* kana_KA カ KATAKANA LETTER KA */ - { 0x04b7, 0x30ad }, /* kana_KI キ KATAKANA LETTER KI */ - { 0x04b8, 0x30af }, /* kana_KU ク KATAKANA LETTER KU */ - { 0x04b9, 0x30b1 }, /* kana_KE ケ KATAKANA LETTER KE */ - { 0x04ba, 0x30b3 }, /* kana_KO コ KATAKANA LETTER KO */ - { 0x04bb, 0x30b5 }, /* kana_SA サ KATAKANA LETTER SA */ - { 0x04bc, 0x30b7 }, /* kana_SHI シ KATAKANA LETTER SI */ - { 0x04bd, 0x30b9 }, /* kana_SU ス KATAKANA LETTER SU */ - { 0x04be, 0x30bb }, /* kana_SE セ KATAKANA LETTER SE */ - { 0x04bf, 0x30bd }, /* kana_SO ソ KATAKANA LETTER SO */ - { 0x04c0, 0x30bf }, /* kana_TA タ KATAKANA LETTER TA */ - { 0x04c1, 0x30c1 }, /* kana_CHI チ KATAKANA LETTER TI */ - { 0x04c2, 0x30c4 }, /* kana_TSU ツ KATAKANA LETTER TU */ - { 0x04c3, 0x30c6 }, /* kana_TE テ KATAKANA LETTER TE */ - { 0x04c4, 0x30c8 }, /* kana_TO ト KATAKANA LETTER TO */ - { 0x04c5, 0x30ca }, /* kana_NA ナ KATAKANA LETTER NA */ - { 0x04c6, 0x30cb }, /* kana_NI ニ KATAKANA LETTER NI */ - { 0x04c7, 0x30cc }, /* kana_NU ヌ KATAKANA LETTER NU */ - { 0x04c8, 0x30cd }, /* kana_NE ネ KATAKANA LETTER NE */ - { 0x04c9, 0x30ce }, /* kana_NO ノ KATAKANA LETTER NO */ - { 0x04ca, 0x30cf }, /* kana_HA ハ KATAKANA LETTER HA */ - { 0x04cb, 0x30d2 }, /* kana_HI ヒ KATAKANA LETTER HI */ - { 0x04cc, 0x30d5 }, /* kana_FU フ KATAKANA LETTER HU */ - { 0x04cd, 0x30d8 }, /* kana_HE ヘ KATAKANA LETTER HE */ - { 0x04ce, 0x30db }, /* kana_HO ホ KATAKANA LETTER HO */ - { 0x04cf, 0x30de }, /* kana_MA マ KATAKANA LETTER MA */ - { 0x04d0, 0x30df }, /* kana_MI ミ KATAKANA LETTER MI */ - { 0x04d1, 0x30e0 }, /* kana_MU ム KATAKANA LETTER MU */ - { 0x04d2, 0x30e1 }, /* kana_ME メ KATAKANA LETTER ME */ - { 0x04d3, 0x30e2 }, /* kana_MO モ KATAKANA LETTER MO */ - { 0x04d4, 0x30e4 }, /* kana_YA ヤ KATAKANA LETTER YA */ - { 0x04d5, 0x30e6 }, /* kana_YU ユ KATAKANA LETTER YU */ - { 0x04d6, 0x30e8 }, /* kana_YO ヨ KATAKANA LETTER YO */ - { 0x04d7, 0x30e9 }, /* kana_RA ラ KATAKANA LETTER RA */ - { 0x04d8, 0x30ea }, /* kana_RI リ KATAKANA LETTER RI */ - { 0x04d9, 0x30eb }, /* kana_RU ル KATAKANA LETTER RU */ - { 0x04da, 0x30ec }, /* kana_RE レ KATAKANA LETTER RE */ - { 0x04db, 0x30ed }, /* kana_RO ロ KATAKANA LETTER RO */ - { 0x04dc, 0x30ef }, /* kana_WA ワ KATAKANA LETTER WA */ - { 0x04dd, 0x30f3 }, /* kana_N ン KATAKANA LETTER N */ - { 0x04de, 0x309b }, /* voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */ - { 0x04df, 0x309c }, /* semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ - { 0x05ac, 0x060c }, /* Arabic_comma ، ARABIC COMMA */ - { 0x05bb, 0x061b }, /* Arabic_semicolon ؛ ARABIC SEMICOLON */ - { 0x05bf, 0x061f }, /* Arabic_question_mark ؟ ARABIC QUESTION MARK */ - { 0x05c1, 0x0621 }, /* Arabic_hamza ء ARABIC LETTER HAMZA */ - { 0x05c2, 0x0622 }, /* Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */ - { 0x05c3, 0x0623 }, /* Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */ - { 0x05c4, 0x0624 }, /* Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */ - { 0x05c5, 0x0625 }, /* Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */ - { 0x05c6, 0x0626 }, /* Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */ - { 0x05c7, 0x0627 }, /* Arabic_alef ا ARABIC LETTER ALEF */ - { 0x05c8, 0x0628 }, /* Arabic_beh ب ARABIC LETTER BEH */ - { 0x05c9, 0x0629 }, /* Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */ - { 0x05ca, 0x062a }, /* Arabic_teh ت ARABIC LETTER TEH */ - { 0x05cb, 0x062b }, /* Arabic_theh ث ARABIC LETTER THEH */ - { 0x05cc, 0x062c }, /* Arabic_jeem ج ARABIC LETTER JEEM */ - { 0x05cd, 0x062d }, /* Arabic_hah ح ARABIC LETTER HAH */ - { 0x05ce, 0x062e }, /* Arabic_khah خ ARABIC LETTER KHAH */ - { 0x05cf, 0x062f }, /* Arabic_dal د ARABIC LETTER DAL */ - { 0x05d0, 0x0630 }, /* Arabic_thal ذ ARABIC LETTER THAL */ - { 0x05d1, 0x0631 }, /* Arabic_ra ر ARABIC LETTER REH */ - { 0x05d2, 0x0632 }, /* Arabic_zain ز ARABIC LETTER ZAIN */ - { 0x05d3, 0x0633 }, /* Arabic_seen س ARABIC LETTER SEEN */ - { 0x05d4, 0x0634 }, /* Arabic_sheen ش ARABIC LETTER SHEEN */ - { 0x05d5, 0x0635 }, /* Arabic_sad ص ARABIC LETTER SAD */ - { 0x05d6, 0x0636 }, /* Arabic_dad ض ARABIC LETTER DAD */ - { 0x05d7, 0x0637 }, /* Arabic_tah ط ARABIC LETTER TAH */ - { 0x05d8, 0x0638 }, /* Arabic_zah ظ ARABIC LETTER ZAH */ - { 0x05d9, 0x0639 }, /* Arabic_ain ع ARABIC LETTER AIN */ - { 0x05da, 0x063a }, /* Arabic_ghain غ ARABIC LETTER GHAIN */ - { 0x05e0, 0x0640 }, /* Arabic_tatweel ـ ARABIC TATWEEL */ - { 0x05e1, 0x0641 }, /* Arabic_feh ف ARABIC LETTER FEH */ - { 0x05e2, 0x0642 }, /* Arabic_qaf ق ARABIC LETTER QAF */ - { 0x05e3, 0x0643 }, /* Arabic_kaf ك ARABIC LETTER KAF */ - { 0x05e4, 0x0644 }, /* Arabic_lam ل ARABIC LETTER LAM */ - { 0x05e5, 0x0645 }, /* Arabic_meem م ARABIC LETTER MEEM */ - { 0x05e6, 0x0646 }, /* Arabic_noon ن ARABIC LETTER NOON */ - { 0x05e7, 0x0647 }, /* Arabic_ha ه ARABIC LETTER HEH */ - { 0x05e8, 0x0648 }, /* Arabic_waw و ARABIC LETTER WAW */ - { 0x05e9, 0x0649 }, /* Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */ - { 0x05ea, 0x064a }, /* Arabic_yeh ي ARABIC LETTER YEH */ - { 0x05eb, 0x064b }, /* Arabic_fathatan ً ARABIC FATHATAN */ - { 0x05ec, 0x064c }, /* Arabic_dammatan ٌ ARABIC DAMMATAN */ - { 0x05ed, 0x064d }, /* Arabic_kasratan ٍ ARABIC KASRATAN */ - { 0x05ee, 0x064e }, /* Arabic_fatha َ ARABIC FATHA */ - { 0x05ef, 0x064f }, /* Arabic_damma ُ ARABIC DAMMA */ - { 0x05f0, 0x0650 }, /* Arabic_kasra ِ ARABIC KASRA */ - { 0x05f1, 0x0651 }, /* Arabic_shadda ّ ARABIC SHADDA */ - { 0x05f2, 0x0652 }, /* Arabic_sukun ْ ARABIC SUKUN */ - { 0x06a1, 0x0452 }, /* Serbian_dje ђ CYRILLIC SMALL LETTER DJE */ - { 0x06a2, 0x0453 }, /* Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */ - { 0x06a3, 0x0451 }, /* Cyrillic_io ё CYRILLIC SMALL LETTER IO */ - { 0x06a4, 0x0454 }, /* Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */ - { 0x06a5, 0x0455 }, /* Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */ - { 0x06a6, 0x0456 }, /* Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ - { 0x06a7, 0x0457 }, /* Ukrainian_yi ї CYRILLIC SMALL LETTER YI */ - { 0x06a8, 0x0458 }, /* Cyrillic_je ј CYRILLIC SMALL LETTER JE */ - { 0x06a9, 0x0459 }, /* Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */ - { 0x06aa, 0x045a }, /* Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */ - { 0x06ab, 0x045b }, /* Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */ - { 0x06ac, 0x045c }, /* Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */ - { 0x06ad, 0x0491 }, /* Ukrainian_ghe_with_upturn ґ CYRILLIC SMALL LETTER GHE WITH UPTURN */ - { 0x06ae, 0x045e }, /* Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */ - { 0x06af, 0x045f }, /* Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */ - { 0x06b0, 0x2116 }, /* numerosign № NUMERO SIGN */ - { 0x06b1, 0x0402 }, /* Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */ - { 0x06b2, 0x0403 }, /* Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */ - { 0x06b3, 0x0401 }, /* Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */ - { 0x06b4, 0x0404 }, /* Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */ - { 0x06b5, 0x0405 }, /* Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */ - { 0x06b6, 0x0406 }, /* Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ - { 0x06b7, 0x0407 }, /* Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */ - { 0x06b8, 0x0408 }, /* Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */ - { 0x06b9, 0x0409 }, /* Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */ - { 0x06ba, 0x040a }, /* Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */ - { 0x06bb, 0x040b }, /* Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */ - { 0x06bc, 0x040c }, /* Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */ - { 0x06bd, 0x0490 }, /* Ukrainian_GHE_WITH_UPTURN Ґ CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ - { 0x06be, 0x040e }, /* Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */ - { 0x06bf, 0x040f }, /* Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */ - { 0x06c0, 0x044e }, /* Cyrillic_yu ю CYRILLIC SMALL LETTER YU */ - { 0x06c1, 0x0430 }, /* Cyrillic_a а CYRILLIC SMALL LETTER A */ - { 0x06c2, 0x0431 }, /* Cyrillic_be б CYRILLIC SMALL LETTER BE */ - { 0x06c3, 0x0446 }, /* Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */ - { 0x06c4, 0x0434 }, /* Cyrillic_de д CYRILLIC SMALL LETTER DE */ - { 0x06c5, 0x0435 }, /* Cyrillic_ie е CYRILLIC SMALL LETTER IE */ - { 0x06c6, 0x0444 }, /* Cyrillic_ef ф CYRILLIC SMALL LETTER EF */ - { 0x06c7, 0x0433 }, /* Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */ - { 0x06c8, 0x0445 }, /* Cyrillic_ha х CYRILLIC SMALL LETTER HA */ - { 0x06c9, 0x0438 }, /* Cyrillic_i и CYRILLIC SMALL LETTER I */ - { 0x06ca, 0x0439 }, /* Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */ - { 0x06cb, 0x043a }, /* Cyrillic_ka к CYRILLIC SMALL LETTER KA */ - { 0x06cc, 0x043b }, /* Cyrillic_el л CYRILLIC SMALL LETTER EL */ - { 0x06cd, 0x043c }, /* Cyrillic_em м CYRILLIC SMALL LETTER EM */ - { 0x06ce, 0x043d }, /* Cyrillic_en н CYRILLIC SMALL LETTER EN */ - { 0x06cf, 0x043e }, /* Cyrillic_o о CYRILLIC SMALL LETTER O */ - { 0x06d0, 0x043f }, /* Cyrillic_pe п CYRILLIC SMALL LETTER PE */ - { 0x06d1, 0x044f }, /* Cyrillic_ya я CYRILLIC SMALL LETTER YA */ - { 0x06d2, 0x0440 }, /* Cyrillic_er р CYRILLIC SMALL LETTER ER */ - { 0x06d3, 0x0441 }, /* Cyrillic_es с CYRILLIC SMALL LETTER ES */ - { 0x06d4, 0x0442 }, /* Cyrillic_te т CYRILLIC SMALL LETTER TE */ - { 0x06d5, 0x0443 }, /* Cyrillic_u у CYRILLIC SMALL LETTER U */ - { 0x06d6, 0x0436 }, /* Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */ - { 0x06d7, 0x0432 }, /* Cyrillic_ve в CYRILLIC SMALL LETTER VE */ - { 0x06d8, 0x044c }, /* Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */ - { 0x06d9, 0x044b }, /* Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */ - { 0x06da, 0x0437 }, /* Cyrillic_ze з CYRILLIC SMALL LETTER ZE */ - { 0x06db, 0x0448 }, /* Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */ - { 0x06dc, 0x044d }, /* Cyrillic_e э CYRILLIC SMALL LETTER E */ - { 0x06dd, 0x0449 }, /* Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */ - { 0x06de, 0x0447 }, /* Cyrillic_che ч CYRILLIC SMALL LETTER CHE */ - { 0x06df, 0x044a }, /* Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */ - { 0x06e0, 0x042e }, /* Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */ - { 0x06e1, 0x0410 }, /* Cyrillic_A А CYRILLIC CAPITAL LETTER A */ - { 0x06e2, 0x0411 }, /* Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */ - { 0x06e3, 0x0426 }, /* Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */ - { 0x06e4, 0x0414 }, /* Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */ - { 0x06e5, 0x0415 }, /* Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */ - { 0x06e6, 0x0424 }, /* Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */ - { 0x06e7, 0x0413 }, /* Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */ - { 0x06e8, 0x0425 }, /* Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */ - { 0x06e9, 0x0418 }, /* Cyrillic_I И CYRILLIC CAPITAL LETTER I */ - { 0x06ea, 0x0419 }, /* Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */ - { 0x06eb, 0x041a }, /* Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */ - { 0x06ec, 0x041b }, /* Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */ - { 0x06ed, 0x041c }, /* Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */ - { 0x06ee, 0x041d }, /* Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */ - { 0x06ef, 0x041e }, /* Cyrillic_O О CYRILLIC CAPITAL LETTER O */ - { 0x06f0, 0x041f }, /* Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */ - { 0x06f1, 0x042f }, /* Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */ - { 0x06f2, 0x0420 }, /* Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */ - { 0x06f3, 0x0421 }, /* Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */ - { 0x06f4, 0x0422 }, /* Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */ - { 0x06f5, 0x0423 }, /* Cyrillic_U У CYRILLIC CAPITAL LETTER U */ - { 0x06f6, 0x0416 }, /* Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */ - { 0x06f7, 0x0412 }, /* Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */ - { 0x06f8, 0x042c }, /* Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */ - { 0x06f9, 0x042b }, /* Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */ - { 0x06fa, 0x0417 }, /* Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */ - { 0x06fb, 0x0428 }, /* Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */ - { 0x06fc, 0x042d }, /* Cyrillic_E Э CYRILLIC CAPITAL LETTER E */ - { 0x06fd, 0x0429 }, /* Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */ - { 0x06fe, 0x0427 }, /* Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */ - { 0x06ff, 0x042a }, /* Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */ - { 0x07a1, 0x0386 }, /* Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */ - { 0x07a2, 0x0388 }, /* Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */ - { 0x07a3, 0x0389 }, /* Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */ - { 0x07a4, 0x038a }, /* Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */ - { 0x07a5, 0x03aa }, /* Greek_IOTAdieresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ - { 0x07a7, 0x038c }, /* Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */ - { 0x07a8, 0x038e }, /* Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */ - { 0x07a9, 0x03ab }, /* Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ - { 0x07ab, 0x038f }, /* Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */ - { 0x07ae, 0x0385 }, /* Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */ - { 0x07af, 0x2015 }, /* Greek_horizbar ― HORIZONTAL BAR */ - { 0x07b1, 0x03ac }, /* Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */ - { 0x07b2, 0x03ad }, /* Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */ - { 0x07b3, 0x03ae }, /* Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */ - { 0x07b4, 0x03af }, /* Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */ - { 0x07b5, 0x03ca }, /* Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */ - { 0x07b6, 0x0390 }, /* Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ - { 0x07b7, 0x03cc }, /* Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */ - { 0x07b8, 0x03cd }, /* Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */ - { 0x07b9, 0x03cb }, /* Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ - { 0x07ba, 0x03b0 }, /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ - { 0x07bb, 0x03ce }, /* Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */ - { 0x07c1, 0x0391 }, /* Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */ - { 0x07c2, 0x0392 }, /* Greek_BETA Β GREEK CAPITAL LETTER BETA */ - { 0x07c3, 0x0393 }, /* Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */ - { 0x07c4, 0x0394 }, /* Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */ - { 0x07c5, 0x0395 }, /* Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */ - { 0x07c6, 0x0396 }, /* Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */ - { 0x07c7, 0x0397 }, /* Greek_ETA Η GREEK CAPITAL LETTER ETA */ - { 0x07c8, 0x0398 }, /* Greek_THETA Θ GREEK CAPITAL LETTER THETA */ - { 0x07c9, 0x0399 }, /* Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */ - { 0x07ca, 0x039a }, /* Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */ - { 0x07cb, 0x039b }, /* Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */ - { 0x07cc, 0x039c }, /* Greek_MU Μ GREEK CAPITAL LETTER MU */ - { 0x07cd, 0x039d }, /* Greek_NU Ν GREEK CAPITAL LETTER NU */ - { 0x07ce, 0x039e }, /* Greek_XI Ξ GREEK CAPITAL LETTER XI */ - { 0x07cf, 0x039f }, /* Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */ - { 0x07d0, 0x03a0 }, /* Greek_PI Π GREEK CAPITAL LETTER PI */ - { 0x07d1, 0x03a1 }, /* Greek_RHO Ρ GREEK CAPITAL LETTER RHO */ - { 0x07d2, 0x03a3 }, /* Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */ - { 0x07d4, 0x03a4 }, /* Greek_TAU Τ GREEK CAPITAL LETTER TAU */ - { 0x07d5, 0x03a5 }, /* Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */ - { 0x07d6, 0x03a6 }, /* Greek_PHI Φ GREEK CAPITAL LETTER PHI */ - { 0x07d7, 0x03a7 }, /* Greek_CHI Χ GREEK CAPITAL LETTER CHI */ - { 0x07d8, 0x03a8 }, /* Greek_PSI Ψ GREEK CAPITAL LETTER PSI */ - { 0x07d9, 0x03a9 }, /* Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */ - { 0x07e1, 0x03b1 }, /* Greek_alpha α GREEK SMALL LETTER ALPHA */ - { 0x07e2, 0x03b2 }, /* Greek_beta β GREEK SMALL LETTER BETA */ - { 0x07e3, 0x03b3 }, /* Greek_gamma γ GREEK SMALL LETTER GAMMA */ - { 0x07e4, 0x03b4 }, /* Greek_delta δ GREEK SMALL LETTER DELTA */ - { 0x07e5, 0x03b5 }, /* Greek_epsilon ε GREEK SMALL LETTER EPSILON */ - { 0x07e6, 0x03b6 }, /* Greek_zeta ζ GREEK SMALL LETTER ZETA */ - { 0x07e7, 0x03b7 }, /* Greek_eta η GREEK SMALL LETTER ETA */ - { 0x07e8, 0x03b8 }, /* Greek_theta θ GREEK SMALL LETTER THETA */ - { 0x07e9, 0x03b9 }, /* Greek_iota ι GREEK SMALL LETTER IOTA */ - { 0x07ea, 0x03ba }, /* Greek_kappa κ GREEK SMALL LETTER KAPPA */ - { 0x07eb, 0x03bb }, /* Greek_lambda λ GREEK SMALL LETTER LAMDA */ - { 0x07ec, 0x03bc }, /* Greek_mu μ GREEK SMALL LETTER MU */ - { 0x07ed, 0x03bd }, /* Greek_nu ν GREEK SMALL LETTER NU */ - { 0x07ee, 0x03be }, /* Greek_xi ξ GREEK SMALL LETTER XI */ - { 0x07ef, 0x03bf }, /* Greek_omicron ο GREEK SMALL LETTER OMICRON */ - { 0x07f0, 0x03c0 }, /* Greek_pi π GREEK SMALL LETTER PI */ - { 0x07f1, 0x03c1 }, /* Greek_rho ρ GREEK SMALL LETTER RHO */ - { 0x07f2, 0x03c3 }, /* Greek_sigma σ GREEK SMALL LETTER SIGMA */ - { 0x07f3, 0x03c2 }, /* Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */ - { 0x07f4, 0x03c4 }, /* Greek_tau τ GREEK SMALL LETTER TAU */ - { 0x07f5, 0x03c5 }, /* Greek_upsilon υ GREEK SMALL LETTER UPSILON */ - { 0x07f6, 0x03c6 }, /* Greek_phi φ GREEK SMALL LETTER PHI */ - { 0x07f7, 0x03c7 }, /* Greek_chi χ GREEK SMALL LETTER CHI */ - { 0x07f8, 0x03c8 }, /* Greek_psi ψ GREEK SMALL LETTER PSI */ - { 0x07f9, 0x03c9 }, /* Greek_omega ω GREEK SMALL LETTER OMEGA */ - /* 0x08a1 leftradical ? ??? */ - /* 0x08a2 topleftradical ? ??? */ - /* 0x08a3 horizconnector ? ??? */ - { 0x08a4, 0x2320 }, /* topintegral ⌠ TOP HALF INTEGRAL */ - { 0x08a5, 0x2321 }, /* botintegral ⌡ BOTTOM HALF INTEGRAL */ - { 0x08a6, 0x2502 }, /* vertconnector │ BOX DRAWINGS LIGHT VERTICAL */ - /* 0x08a7 topleftsqbracket ? ??? */ - /* 0x08a8 botleftsqbracket ? ??? */ - /* 0x08a9 toprightsqbracket ? ??? */ - /* 0x08aa botrightsqbracket ? ??? */ - /* 0x08ab topleftparens ? ??? */ - /* 0x08ac botleftparens ? ??? */ - /* 0x08ad toprightparens ? ??? */ - /* 0x08ae botrightparens ? ??? */ - /* 0x08af leftmiddlecurlybrace ? ??? */ - /* 0x08b0 rightmiddlecurlybrace ? ??? */ - /* 0x08b1 topleftsummation ? ??? */ - /* 0x08b2 botleftsummation ? ??? */ - /* 0x08b3 topvertsummationconnector ? ??? */ - /* 0x08b4 botvertsummationconnector ? ??? */ - /* 0x08b5 toprightsummation ? ??? */ - /* 0x08b6 botrightsummation ? ??? */ - /* 0x08b7 rightmiddlesummation ? ??? */ - { 0x08bc, 0x2264 }, /* lessthanequal ≤ LESS-THAN OR EQUAL TO */ - { 0x08bd, 0x2260 }, /* notequal ≠ NOT EQUAL TO */ - { 0x08be, 0x2265 }, /* greaterthanequal ≥ GREATER-THAN OR EQUAL TO */ - { 0x08bf, 0x222b }, /* integral ∫ INTEGRAL */ - { 0x08c0, 0x2234 }, /* therefore ∴ THEREFORE */ - { 0x08c1, 0x221d }, /* variation ∝ PROPORTIONAL TO */ - { 0x08c2, 0x221e }, /* infinity ∞ INFINITY */ - { 0x08c5, 0x2207 }, /* nabla ∇ NABLA */ - { 0x08c8, 0x2245 }, /* approximate ≅ APPROXIMATELY EQUAL TO */ - /* 0x08c9 similarequal ? ??? */ - { 0x08cd, 0x21d4 }, /* ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */ - { 0x08ce, 0x21d2 }, /* implies ⇒ RIGHTWARDS DOUBLE ARROW */ - { 0x08cf, 0x2261 }, /* identical ≡ IDENTICAL TO */ - { 0x08d6, 0x221a }, /* radical √ SQUARE ROOT */ - { 0x08da, 0x2282 }, /* includedin ⊂ SUBSET OF */ - { 0x08db, 0x2283 }, /* includes ⊃ SUPERSET OF */ - { 0x08dc, 0x2229 }, /* intersection ∩ INTERSECTION */ - { 0x08dd, 0x222a }, /* union ∪ UNION */ - { 0x08de, 0x2227 }, /* logicaland ∧ LOGICAL AND */ - { 0x08df, 0x2228 }, /* logicalor ∨ LOGICAL OR */ - { 0x08ef, 0x2202 }, /* partialderivative ∂ PARTIAL DIFFERENTIAL */ - { 0x08f6, 0x0192 }, /* function ƒ LATIN SMALL LETTER F WITH HOOK */ - { 0x08fb, 0x2190 }, /* leftarrow ← LEFTWARDS ARROW */ - { 0x08fc, 0x2191 }, /* uparrow ↑ UPWARDS ARROW */ - { 0x08fd, 0x2192 }, /* rightarrow → RIGHTWARDS ARROW */ - { 0x08fe, 0x2193 }, /* downarrow ↓ DOWNWARDS ARROW */ - { 0x09df, 0x2422 }, /* blank ␢ BLANK SYMBOL */ - { 0x09e0, 0x25c6 }, /* soliddiamond ◆ BLACK DIAMOND */ - { 0x09e1, 0x2592 }, /* checkerboard ▒ MEDIUM SHADE */ - { 0x09e2, 0x2409 }, /* ht ␉ SYMBOL FOR HORIZONTAL TABULATION */ - { 0x09e3, 0x240c }, /* ff ␌ SYMBOL FOR FORM FEED */ - { 0x09e4, 0x240d }, /* cr ␍ SYMBOL FOR CARRIAGE RETURN */ - { 0x09e5, 0x240a }, /* lf ␊ SYMBOL FOR LINE FEED */ - { 0x09e8, 0x2424 }, /* nl ␤ SYMBOL FOR NEWLINE */ - { 0x09e9, 0x240b }, /* vt ␋ SYMBOL FOR VERTICAL TABULATION */ - { 0x09ea, 0x2518 }, /* lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */ - { 0x09eb, 0x2510 }, /* uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */ - { 0x09ec, 0x250c }, /* upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ - { 0x09ed, 0x2514 }, /* lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */ - { 0x09ee, 0x253c }, /* crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ - /* 0x09ef horizlinescan1 ? ??? */ - /* 0x09f0 horizlinescan3 ? ??? */ - { 0x09f1, 0x2500 }, /* horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */ - /* 0x09f2 horizlinescan7 ? ??? */ - /* 0x09f3 horizlinescan9 ? ??? */ - { 0x09f4, 0x251c }, /* leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ - { 0x09f5, 0x2524 }, /* rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */ - { 0x09f6, 0x2534 }, /* bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */ - { 0x09f7, 0x252c }, /* topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ - { 0x09f8, 0x2502 }, /* vertbar │ BOX DRAWINGS LIGHT VERTICAL */ - { 0x0aa1, 0x2003 }, /* emspace   EM SPACE */ - { 0x0aa2, 0x2002 }, /* enspace   EN SPACE */ - { 0x0aa3, 0x2004 }, /* em3space   THREE-PER-EM SPACE */ - { 0x0aa4, 0x2005 }, /* em4space   FOUR-PER-EM SPACE */ - { 0x0aa5, 0x2007 }, /* digitspace   FIGURE SPACE */ - { 0x0aa6, 0x2008 }, /* punctspace   PUNCTUATION SPACE */ - { 0x0aa7, 0x2009 }, /* thinspace   THIN SPACE */ - { 0x0aa8, 0x200a }, /* hairspace   HAIR SPACE */ - { 0x0aa9, 0x2014 }, /* emdash — EM DASH */ - { 0x0aaa, 0x2013 }, /* endash – EN DASH */ - /* 0x0aac signifblank ? ??? */ - { 0x0aae, 0x2026 }, /* ellipsis … HORIZONTAL ELLIPSIS */ - /* 0x0aaf doubbaselinedot ? ??? */ - { 0x0ab0, 0x2153 }, /* onethird ⅓ VULGAR FRACTION ONE THIRD */ - { 0x0ab1, 0x2154 }, /* twothirds ⅔ VULGAR FRACTION TWO THIRDS */ - { 0x0ab2, 0x2155 }, /* onefifth ⅕ VULGAR FRACTION ONE FIFTH */ - { 0x0ab3, 0x2156 }, /* twofifths ⅖ VULGAR FRACTION TWO FIFTHS */ - { 0x0ab4, 0x2157 }, /* threefifths ⅗ VULGAR FRACTION THREE FIFTHS */ - { 0x0ab5, 0x2158 }, /* fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */ - { 0x0ab6, 0x2159 }, /* onesixth ⅙ VULGAR FRACTION ONE SIXTH */ - { 0x0ab7, 0x215a }, /* fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */ - { 0x0ab8, 0x2105 }, /* careof ℅ CARE OF */ - { 0x0abb, 0x2012 }, /* figdash ‒ FIGURE DASH */ - { 0x0abc, 0x2329 }, /* leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */ - { 0x0abd, 0x002e }, /* decimalpoint . FULL STOP */ - { 0x0abe, 0x232a }, /* rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */ - /* 0x0abf marker ? ??? */ - { 0x0ac3, 0x215b }, /* oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */ - { 0x0ac4, 0x215c }, /* threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */ - { 0x0ac5, 0x215d }, /* fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */ - { 0x0ac6, 0x215e }, /* seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */ - { 0x0ac9, 0x2122 }, /* trademark ™ TRADE MARK SIGN */ - { 0x0aca, 0x2613 }, /* signaturemark ☓ SALTIRE */ - /* 0x0acb trademarkincircle ? ??? */ - { 0x0acc, 0x25c1 }, /* leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */ - { 0x0acd, 0x25b7 }, /* rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */ - { 0x0ace, 0x25cb }, /* emopencircle ○ WHITE CIRCLE */ - { 0x0acf, 0x25a1 }, /* emopenrectangle □ WHITE SQUARE */ - { 0x0ad0, 0x2018 }, /* leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */ - { 0x0ad1, 0x2019 }, /* rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */ - { 0x0ad2, 0x201c }, /* leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */ - { 0x0ad3, 0x201d }, /* rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */ - { 0x0ad4, 0x211e }, /* prescription ℞ PRESCRIPTION TAKE */ - { 0x0ad6, 0x2032 }, /* minutes ′ PRIME */ - { 0x0ad7, 0x2033 }, /* seconds ″ DOUBLE PRIME */ - { 0x0ad9, 0x271d }, /* latincross ✝ LATIN CROSS */ - /* 0x0ada hexagram ? ??? */ - { 0x0adb, 0x25ac }, /* filledrectbullet ▬ BLACK RECTANGLE */ - { 0x0adc, 0x25c0 }, /* filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */ - { 0x0add, 0x25b6 }, /* filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */ - { 0x0ade, 0x25cf }, /* emfilledcircle ● BLACK CIRCLE */ - { 0x0adf, 0x25a0 }, /* emfilledrect ■ BLACK SQUARE */ - { 0x0ae0, 0x25e6 }, /* enopencircbullet ◦ WHITE BULLET */ - { 0x0ae1, 0x25ab }, /* enopensquarebullet ▫ WHITE SMALL SQUARE */ - { 0x0ae2, 0x25ad }, /* openrectbullet ▭ WHITE RECTANGLE */ - { 0x0ae3, 0x25b3 }, /* opentribulletup △ WHITE UP-POINTING TRIANGLE */ - { 0x0ae4, 0x25bd }, /* opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */ - { 0x0ae5, 0x2606 }, /* openstar ☆ WHITE STAR */ - { 0x0ae6, 0x2022 }, /* enfilledcircbullet • BULLET */ - { 0x0ae7, 0x25aa }, /* enfilledsqbullet ▪ BLACK SMALL SQUARE */ - { 0x0ae8, 0x25b2 }, /* filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */ - { 0x0ae9, 0x25bc }, /* filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */ - { 0x0aea, 0x261c }, /* leftpointer ☜ WHITE LEFT POINTING INDEX */ - { 0x0aeb, 0x261e }, /* rightpointer ☞ WHITE RIGHT POINTING INDEX */ - { 0x0aec, 0x2663 }, /* club ♣ BLACK CLUB SUIT */ - { 0x0aed, 0x2666 }, /* diamond ♦ BLACK DIAMOND SUIT */ - { 0x0aee, 0x2665 }, /* heart ♥ BLACK HEART SUIT */ - { 0x0af0, 0x2720 }, /* maltesecross ✠ MALTESE CROSS */ - { 0x0af1, 0x2020 }, /* dagger † DAGGER */ - { 0x0af2, 0x2021 }, /* doubledagger ‡ DOUBLE DAGGER */ - { 0x0af3, 0x2713 }, /* checkmark ✓ CHECK MARK */ - { 0x0af4, 0x2717 }, /* ballotcross ✗ BALLOT X */ - { 0x0af5, 0x266f }, /* musicalsharp ♯ MUSIC SHARP SIGN */ - { 0x0af6, 0x266d }, /* musicalflat ♭ MUSIC FLAT SIGN */ - { 0x0af7, 0x2642 }, /* malesymbol ♂ MALE SIGN */ - { 0x0af8, 0x2640 }, /* femalesymbol ♀ FEMALE SIGN */ - { 0x0af9, 0x260e }, /* telephone ☎ BLACK TELEPHONE */ - { 0x0afa, 0x2315 }, /* telephonerecorder ⌕ TELEPHONE RECORDER */ - { 0x0afb, 0x2117 }, /* phonographcopyright ℗ SOUND RECORDING COPYRIGHT */ - { 0x0afc, 0x2038 }, /* caret ‸ CARET */ - { 0x0afd, 0x201a }, /* singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */ - { 0x0afe, 0x201e }, /* doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */ - /* 0x0aff cursor ? ??? */ - { 0x0ba3, 0x003c }, /* leftcaret < LESS-THAN SIGN */ - { 0x0ba6, 0x003e }, /* rightcaret > GREATER-THAN SIGN */ - { 0x0ba8, 0x2228 }, /* downcaret ∨ LOGICAL OR */ - { 0x0ba9, 0x2227 }, /* upcaret ∧ LOGICAL AND */ - { 0x0bc0, 0x00af }, /* overbar ¯ MACRON */ - { 0x0bc2, 0x22a4 }, /* downtack ⊤ DOWN TACK */ - { 0x0bc3, 0x2229 }, /* upshoe ∩ INTERSECTION */ - { 0x0bc4, 0x230a }, /* downstile ⌊ LEFT FLOOR */ - { 0x0bc6, 0x005f }, /* underbar _ LOW LINE */ - { 0x0bca, 0x2218 }, /* jot ∘ RING OPERATOR */ - { 0x0bcc, 0x2395 }, /* quad ⎕ APL FUNCTIONAL SYMBOL QUAD (Unicode 3.0) */ - { 0x0bce, 0x22a5 }, /* uptack ⊥ UP TACK */ - { 0x0bcf, 0x25cb }, /* circle ○ WHITE CIRCLE */ - { 0x0bd3, 0x2308 }, /* upstile ⌈ LEFT CEILING */ - { 0x0bd6, 0x222a }, /* downshoe ∪ UNION */ - { 0x0bd8, 0x2283 }, /* rightshoe ⊃ SUPERSET OF */ - { 0x0bda, 0x2282 }, /* leftshoe ⊂ SUBSET OF */ - { 0x0bdc, 0x22a3 }, /* lefttack ⊣ LEFT TACK */ - { 0x0bfc, 0x22a2 }, /* righttack ⊢ RIGHT TACK */ - { 0x0cdf, 0x2017 }, /* hebrew_doublelowline ‗ DOUBLE LOW LINE */ - { 0x0ce0, 0x05d0 }, /* hebrew_aleph א HEBREW LETTER ALEF */ - { 0x0ce1, 0x05d1 }, /* hebrew_bet ב HEBREW LETTER BET */ - { 0x0ce2, 0x05d2 }, /* hebrew_gimel ג HEBREW LETTER GIMEL */ - { 0x0ce3, 0x05d3 }, /* hebrew_dalet ד HEBREW LETTER DALET */ - { 0x0ce4, 0x05d4 }, /* hebrew_he ה HEBREW LETTER HE */ - { 0x0ce5, 0x05d5 }, /* hebrew_waw ו HEBREW LETTER VAV */ - { 0x0ce6, 0x05d6 }, /* hebrew_zain ז HEBREW LETTER ZAYIN */ - { 0x0ce7, 0x05d7 }, /* hebrew_chet ח HEBREW LETTER HET */ - { 0x0ce8, 0x05d8 }, /* hebrew_tet ט HEBREW LETTER TET */ - { 0x0ce9, 0x05d9 }, /* hebrew_yod י HEBREW LETTER YOD */ - { 0x0cea, 0x05da }, /* hebrew_finalkaph ך HEBREW LETTER FINAL KAF */ - { 0x0ceb, 0x05db }, /* hebrew_kaph כ HEBREW LETTER KAF */ - { 0x0cec, 0x05dc }, /* hebrew_lamed ל HEBREW LETTER LAMED */ - { 0x0ced, 0x05dd }, /* hebrew_finalmem ם HEBREW LETTER FINAL MEM */ - { 0x0cee, 0x05de }, /* hebrew_mem מ HEBREW LETTER MEM */ - { 0x0cef, 0x05df }, /* hebrew_finalnun ן HEBREW LETTER FINAL NUN */ - { 0x0cf0, 0x05e0 }, /* hebrew_nun נ HEBREW LETTER NUN */ - { 0x0cf1, 0x05e1 }, /* hebrew_samech ס HEBREW LETTER SAMEKH */ - { 0x0cf2, 0x05e2 }, /* hebrew_ayin ע HEBREW LETTER AYIN */ - { 0x0cf3, 0x05e3 }, /* hebrew_finalpe ף HEBREW LETTER FINAL PE */ - { 0x0cf4, 0x05e4 }, /* hebrew_pe פ HEBREW LETTER PE */ - { 0x0cf5, 0x05e5 }, /* hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */ - { 0x0cf6, 0x05e6 }, /* hebrew_zade צ HEBREW LETTER TSADI */ - { 0x0cf7, 0x05e7 }, /* hebrew_qoph ק HEBREW LETTER QOF */ - { 0x0cf8, 0x05e8 }, /* hebrew_resh ר HEBREW LETTER RESH */ - { 0x0cf9, 0x05e9 }, /* hebrew_shin ש HEBREW LETTER SHIN */ - { 0x0cfa, 0x05ea }, /* hebrew_taw ת HEBREW LETTER TAV */ - { 0x0da1, 0x0e01 }, /* Thai_kokai ก THAI CHARACTER KO KAI */ - { 0x0da2, 0x0e02 }, /* Thai_khokhai ข THAI CHARACTER KHO KHAI */ - { 0x0da3, 0x0e03 }, /* Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */ - { 0x0da4, 0x0e04 }, /* Thai_khokhwai ค THAI CHARACTER KHO KHWAI */ - { 0x0da5, 0x0e05 }, /* Thai_khokhon ฅ THAI CHARACTER KHO KHON */ - { 0x0da6, 0x0e06 }, /* Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */ - { 0x0da7, 0x0e07 }, /* Thai_ngongu ง THAI CHARACTER NGO NGU */ - { 0x0da8, 0x0e08 }, /* Thai_chochan จ THAI CHARACTER CHO CHAN */ - { 0x0da9, 0x0e09 }, /* Thai_choching ฉ THAI CHARACTER CHO CHING */ - { 0x0daa, 0x0e0a }, /* Thai_chochang ช THAI CHARACTER CHO CHANG */ - { 0x0dab, 0x0e0b }, /* Thai_soso ซ THAI CHARACTER SO SO */ - { 0x0dac, 0x0e0c }, /* Thai_chochoe ฌ THAI CHARACTER CHO CHOE */ - { 0x0dad, 0x0e0d }, /* Thai_yoying ญ THAI CHARACTER YO YING */ - { 0x0dae, 0x0e0e }, /* Thai_dochada ฎ THAI CHARACTER DO CHADA */ - { 0x0daf, 0x0e0f }, /* Thai_topatak ฏ THAI CHARACTER TO PATAK */ - { 0x0db0, 0x0e10 }, /* Thai_thothan ฐ THAI CHARACTER THO THAN */ - { 0x0db1, 0x0e11 }, /* Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */ - { 0x0db2, 0x0e12 }, /* Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */ - { 0x0db3, 0x0e13 }, /* Thai_nonen ณ THAI CHARACTER NO NEN */ - { 0x0db4, 0x0e14 }, /* Thai_dodek ด THAI CHARACTER DO DEK */ - { 0x0db5, 0x0e15 }, /* Thai_totao ต THAI CHARACTER TO TAO */ - { 0x0db6, 0x0e16 }, /* Thai_thothung ถ THAI CHARACTER THO THUNG */ - { 0x0db7, 0x0e17 }, /* Thai_thothahan ท THAI CHARACTER THO THAHAN */ - { 0x0db8, 0x0e18 }, /* Thai_thothong ธ THAI CHARACTER THO THONG */ - { 0x0db9, 0x0e19 }, /* Thai_nonu น THAI CHARACTER NO NU */ - { 0x0dba, 0x0e1a }, /* Thai_bobaimai บ THAI CHARACTER BO BAIMAI */ - { 0x0dbb, 0x0e1b }, /* Thai_popla ป THAI CHARACTER PO PLA */ - { 0x0dbc, 0x0e1c }, /* Thai_phophung ผ THAI CHARACTER PHO PHUNG */ - { 0x0dbd, 0x0e1d }, /* Thai_fofa ฝ THAI CHARACTER FO FA */ - { 0x0dbe, 0x0e1e }, /* Thai_phophan พ THAI CHARACTER PHO PHAN */ - { 0x0dbf, 0x0e1f }, /* Thai_fofan ฟ THAI CHARACTER FO FAN */ - { 0x0dc0, 0x0e20 }, /* Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */ - { 0x0dc1, 0x0e21 }, /* Thai_moma ม THAI CHARACTER MO MA */ - { 0x0dc2, 0x0e22 }, /* Thai_yoyak ย THAI CHARACTER YO YAK */ - { 0x0dc3, 0x0e23 }, /* Thai_rorua ร THAI CHARACTER RO RUA */ - { 0x0dc4, 0x0e24 }, /* Thai_ru ฤ THAI CHARACTER RU */ - { 0x0dc5, 0x0e25 }, /* Thai_loling ล THAI CHARACTER LO LING */ - { 0x0dc6, 0x0e26 }, /* Thai_lu ฦ THAI CHARACTER LU */ - { 0x0dc7, 0x0e27 }, /* Thai_wowaen ว THAI CHARACTER WO WAEN */ - { 0x0dc8, 0x0e28 }, /* Thai_sosala ศ THAI CHARACTER SO SALA */ - { 0x0dc9, 0x0e29 }, /* Thai_sorusi ษ THAI CHARACTER SO RUSI */ - { 0x0dca, 0x0e2a }, /* Thai_sosua ส THAI CHARACTER SO SUA */ - { 0x0dcb, 0x0e2b }, /* Thai_hohip ห THAI CHARACTER HO HIP */ - { 0x0dcc, 0x0e2c }, /* Thai_lochula ฬ THAI CHARACTER LO CHULA */ - { 0x0dcd, 0x0e2d }, /* Thai_oang อ THAI CHARACTER O ANG */ - { 0x0dce, 0x0e2e }, /* Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */ - { 0x0dcf, 0x0e2f }, /* Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */ - { 0x0dd0, 0x0e30 }, /* Thai_saraa ะ THAI CHARACTER SARA A */ - { 0x0dd1, 0x0e31 }, /* Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */ - { 0x0dd2, 0x0e32 }, /* Thai_saraaa า THAI CHARACTER SARA AA */ - { 0x0dd3, 0x0e33 }, /* Thai_saraam ำ THAI CHARACTER SARA AM */ - { 0x0dd4, 0x0e34 }, /* Thai_sarai ิ THAI CHARACTER SARA I */ - { 0x0dd5, 0x0e35 }, /* Thai_saraii ี THAI CHARACTER SARA II */ - { 0x0dd6, 0x0e36 }, /* Thai_saraue ึ THAI CHARACTER SARA UE */ - { 0x0dd7, 0x0e37 }, /* Thai_sarauee ื THAI CHARACTER SARA UEE */ - { 0x0dd8, 0x0e38 }, /* Thai_sarau ุ THAI CHARACTER SARA U */ - { 0x0dd9, 0x0e39 }, /* Thai_sarauu ู THAI CHARACTER SARA UU */ - { 0x0dda, 0x0e3a }, /* Thai_phinthu ฺ THAI CHARACTER PHINTHU */ - { 0x0dde, 0x0e3e }, /* Thai_maihanakat_maitho ฾ ??? */ - { 0x0ddf, 0x0e3f }, /* Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */ - { 0x0de0, 0x0e40 }, /* Thai_sarae เ THAI CHARACTER SARA E */ - { 0x0de1, 0x0e41 }, /* Thai_saraae แ THAI CHARACTER SARA AE */ - { 0x0de2, 0x0e42 }, /* Thai_sarao โ THAI CHARACTER SARA O */ - { 0x0de3, 0x0e43 }, /* Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */ - { 0x0de4, 0x0e44 }, /* Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */ - { 0x0de5, 0x0e45 }, /* Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */ - { 0x0de6, 0x0e46 }, /* Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */ - { 0x0de7, 0x0e47 }, /* Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */ - { 0x0de8, 0x0e48 }, /* Thai_maiek ่ THAI CHARACTER MAI EK */ - { 0x0de9, 0x0e49 }, /* Thai_maitho ้ THAI CHARACTER MAI THO */ - { 0x0dea, 0x0e4a }, /* Thai_maitri ๊ THAI CHARACTER MAI TRI */ - { 0x0deb, 0x0e4b }, /* Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */ - { 0x0dec, 0x0e4c }, /* Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */ - { 0x0ded, 0x0e4d }, /* Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */ - { 0x0df0, 0x0e50 }, /* Thai_leksun ๐ THAI DIGIT ZERO */ - { 0x0df1, 0x0e51 }, /* Thai_leknung ๑ THAI DIGIT ONE */ - { 0x0df2, 0x0e52 }, /* Thai_leksong ๒ THAI DIGIT TWO */ - { 0x0df3, 0x0e53 }, /* Thai_leksam ๓ THAI DIGIT THREE */ - { 0x0df4, 0x0e54 }, /* Thai_leksi ๔ THAI DIGIT FOUR */ - { 0x0df5, 0x0e55 }, /* Thai_lekha ๕ THAI DIGIT FIVE */ - { 0x0df6, 0x0e56 }, /* Thai_lekhok ๖ THAI DIGIT SIX */ - { 0x0df7, 0x0e57 }, /* Thai_lekchet ๗ THAI DIGIT SEVEN */ - { 0x0df8, 0x0e58 }, /* Thai_lekpaet ๘ THAI DIGIT EIGHT */ - { 0x0df9, 0x0e59 }, /* Thai_lekkao ๙ THAI DIGIT NINE */ - { 0x0ea1, 0x3131 }, /* Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */ - { 0x0ea2, 0x3132 }, /* Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */ - { 0x0ea3, 0x3133 }, /* Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */ - { 0x0ea4, 0x3134 }, /* Hangul_Nieun ㄴ HANGUL LETTER NIEUN */ - { 0x0ea5, 0x3135 }, /* Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */ - { 0x0ea6, 0x3136 }, /* Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */ - { 0x0ea7, 0x3137 }, /* Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */ - { 0x0ea8, 0x3138 }, /* Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */ - { 0x0ea9, 0x3139 }, /* Hangul_Rieul ㄹ HANGUL LETTER RIEUL */ - { 0x0eaa, 0x313a }, /* Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */ - { 0x0eab, 0x313b }, /* Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */ - { 0x0eac, 0x313c }, /* Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */ - { 0x0ead, 0x313d }, /* Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */ - { 0x0eae, 0x313e }, /* Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */ - { 0x0eaf, 0x313f }, /* Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */ - { 0x0eb0, 0x3140 }, /* Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */ - { 0x0eb1, 0x3141 }, /* Hangul_Mieum ㅁ HANGUL LETTER MIEUM */ - { 0x0eb2, 0x3142 }, /* Hangul_Pieub ㅂ HANGUL LETTER PIEUP */ - { 0x0eb3, 0x3143 }, /* Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */ - { 0x0eb4, 0x3144 }, /* Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */ - { 0x0eb5, 0x3145 }, /* Hangul_Sios ㅅ HANGUL LETTER SIOS */ - { 0x0eb6, 0x3146 }, /* Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */ - { 0x0eb7, 0x3147 }, /* Hangul_Ieung ㅇ HANGUL LETTER IEUNG */ - { 0x0eb8, 0x3148 }, /* Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */ - { 0x0eb9, 0x3149 }, /* Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */ - { 0x0eba, 0x314a }, /* Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */ - { 0x0ebb, 0x314b }, /* Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */ - { 0x0ebc, 0x314c }, /* Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */ - { 0x0ebd, 0x314d }, /* Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */ - { 0x0ebe, 0x314e }, /* Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */ - { 0x0ebf, 0x314f }, /* Hangul_A ㅏ HANGUL LETTER A */ - { 0x0ec0, 0x3150 }, /* Hangul_AE ㅐ HANGUL LETTER AE */ - { 0x0ec1, 0x3151 }, /* Hangul_YA ㅑ HANGUL LETTER YA */ - { 0x0ec2, 0x3152 }, /* Hangul_YAE ㅒ HANGUL LETTER YAE */ - { 0x0ec3, 0x3153 }, /* Hangul_EO ㅓ HANGUL LETTER EO */ - { 0x0ec4, 0x3154 }, /* Hangul_E ㅔ HANGUL LETTER E */ - { 0x0ec5, 0x3155 }, /* Hangul_YEO ㅕ HANGUL LETTER YEO */ - { 0x0ec6, 0x3156 }, /* Hangul_YE ㅖ HANGUL LETTER YE */ - { 0x0ec7, 0x3157 }, /* Hangul_O ㅗ HANGUL LETTER O */ - { 0x0ec8, 0x3158 }, /* Hangul_WA ㅘ HANGUL LETTER WA */ - { 0x0ec9, 0x3159 }, /* Hangul_WAE ㅙ HANGUL LETTER WAE */ - { 0x0eca, 0x315a }, /* Hangul_OE ㅚ HANGUL LETTER OE */ - { 0x0ecb, 0x315b }, /* Hangul_YO ㅛ HANGUL LETTER YO */ - { 0x0ecc, 0x315c }, /* Hangul_U ㅜ HANGUL LETTER U */ - { 0x0ecd, 0x315d }, /* Hangul_WEO ㅝ HANGUL LETTER WEO */ - { 0x0ece, 0x315e }, /* Hangul_WE ㅞ HANGUL LETTER WE */ - { 0x0ecf, 0x315f }, /* Hangul_WI ㅟ HANGUL LETTER WI */ - { 0x0ed0, 0x3160 }, /* Hangul_YU ㅠ HANGUL LETTER YU */ - { 0x0ed1, 0x3161 }, /* Hangul_EU ㅡ HANGUL LETTER EU */ - { 0x0ed2, 0x3162 }, /* Hangul_YI ㅢ HANGUL LETTER YI */ - { 0x0ed3, 0x3163 }, /* Hangul_I ㅣ HANGUL LETTER I */ - { 0x0ed4, 0x11a8 }, /* Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */ - { 0x0ed5, 0x11a9 }, /* Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */ - { 0x0ed6, 0x11aa }, /* Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */ - { 0x0ed7, 0x11ab }, /* Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */ - { 0x0ed8, 0x11ac }, /* Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */ - { 0x0ed9, 0x11ad }, /* Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */ - { 0x0eda, 0x11ae }, /* Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */ - { 0x0edb, 0x11af }, /* Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */ - { 0x0edc, 0x11b0 }, /* Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */ - { 0x0edd, 0x11b1 }, /* Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */ - { 0x0ede, 0x11b2 }, /* Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */ - { 0x0edf, 0x11b3 }, /* Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */ - { 0x0ee0, 0x11b4 }, /* Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */ - { 0x0ee1, 0x11b5 }, /* Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */ - { 0x0ee2, 0x11b6 }, /* Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */ - { 0x0ee3, 0x11b7 }, /* Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */ - { 0x0ee4, 0x11b8 }, /* Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */ - { 0x0ee5, 0x11b9 }, /* Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */ - { 0x0ee6, 0x11ba }, /* Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */ - { 0x0ee7, 0x11bb }, /* Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */ - { 0x0ee8, 0x11bc }, /* Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */ - { 0x0ee9, 0x11bd }, /* Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */ - { 0x0eea, 0x11be }, /* Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */ - { 0x0eeb, 0x11bf }, /* Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */ - { 0x0eec, 0x11c0 }, /* Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */ - { 0x0eed, 0x11c1 }, /* Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */ - { 0x0eee, 0x11c2 }, /* Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */ - { 0x0eef, 0x316d }, /* Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */ - { 0x0ef0, 0x3171 }, /* Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */ - { 0x0ef1, 0x3178 }, /* Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */ - { 0x0ef2, 0x317f }, /* Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */ - /* 0x0ef3 Hangul_KkogjiDalrinIeung ? ??? */ - { 0x0ef4, 0x3184 }, /* Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */ - { 0x0ef5, 0x3186 }, /* Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */ - { 0x0ef6, 0x318d }, /* Hangul_AraeA ㆍ HANGUL LETTER ARAEA */ - { 0x0ef7, 0x318e }, /* Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */ - { 0x0ef8, 0x11eb }, /* Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */ - /* 0x0ef9 Hangul_J_KkogjiDalrinIeung ? ??? */ - { 0x0efa, 0x11f9 }, /* Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */ - { 0x0eff, 0x20a9 }, /* Korean_Won ₩ WON SIGN */ - { 0x13bc, 0x0152 }, /* OE Œ LATIN CAPITAL LIGATURE OE */ - { 0x13bd, 0x0153 }, /* oe œ LATIN SMALL LIGATURE OE */ - { 0x13be, 0x0178 }, /* Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */ - { 0x20a0, 0x20a0 }, /* EcuSign ₠ EURO-CURRENCY SIGN */ - { 0x20a1, 0x20a1 }, /* ColonSign ₡ COLON SIGN */ - { 0x20a2, 0x20a2 }, /* CruzeiroSign ₢ CRUZEIRO SIGN */ - { 0x20a3, 0x20a3 }, /* FFrancSign ₣ FRENCH FRANC SIGN */ - { 0x20a4, 0x20a4 }, /* LiraSign ₤ LIRA SIGN */ - { 0x20a5, 0x20a5 }, /* MillSign ₥ MILL SIGN */ - { 0x20a6, 0x20a6 }, /* NairaSign ₦ NAIRA SIGN */ - { 0x20a7, 0x20a7 }, /* PesetaSign ₧ PESETA SIGN */ - { 0x20a8, 0x20a8 }, /* RupeeSign ₨ RUPEE SIGN */ - { 0x20a9, 0x20a9 }, /* WonSign ₩ WON SIGN */ - { 0x20aa, 0x20aa }, /* NewSheqelSign ₪ NEW SHEQEL SIGN */ - { 0x20ab, 0x20ab }, /* DongSign ₫ DONG SIGN */ - { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */ - - - /* Following items added to GTK, not in the xterm table */ - - /* A few ASCII control characters */ - - { 0xFF08 /* Backspace */, '\b' }, - { 0xFF09 /* Tab */, '\t' }, - { 0xFF0A /* Linefeed */, '\n' }, - { 0xFF0B /* Vert. Tab */, '\v' }, - { 0xFF0D /* Return */, '\r' }, - { 0xFF1B /* Escape */, '\033' }, - - /* Numeric keypad */ - - { 0xFF80 /* Space */, ' ' }, - { 0xFFAA /* Multiply */, '*' }, - { 0xFFAB /* Add */, '+' }, - { 0xFFAC /* Separator */, ',' }, - { 0xFFAD /* Subtract */, '-' }, - { 0xFFAE /* Decimal */, '.' }, - { 0xFFAF /* Divide */, '/' }, - { 0xFFB0 /* 0 */, '0' }, - { 0xFFB1 /* 1 */, '1' }, - { 0xFFB2 /* 2 */, '2' }, - { 0xFFB3 /* 3 */, '3' }, - { 0xFFB4 /* 4 */, '4' }, - { 0xFFB5 /* 5 */, '5' }, - { 0xFFB6 /* 6 */, '6' }, - { 0xFFB7 /* 7 */, '7' }, - { 0xFFB8 /* 8 */, '8' }, - { 0xFFB9 /* 9 */, '9' }, - { 0xFFBD /* Equal */, '=' }, - - /* End numeric keypad */ - - { 0xFFFF /* Delete */, '\177' } -}; - -static const struct _FcitxUnicodeToKeySym gdk_unicode_to_keysym_tab[] = { - { 0x0abd, 0x002e }, /* decimalpoint . FULL STOP */ - { 0x0ba3, 0x003c }, /* leftcaret < LESS-THAN SIGN */ - { 0x0ba6, 0x003e }, /* rightcaret > GREATER-THAN SIGN */ - { 0x0bc6, 0x005f }, /* underbar _ LOW LINE */ - { 0x0bc0, 0x00af }, /* overbar ¯ MACRON */ - { 0x03c0, 0x0100 }, /* Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */ - { 0x03e0, 0x0101 }, /* amacron ā LATIN SMALL LETTER A WITH MACRON */ - { 0x01c3, 0x0102 }, /* Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */ - { 0x01e3, 0x0103 }, /* abreve ă LATIN SMALL LETTER A WITH BREVE */ - { 0x01a1, 0x0104 }, /* Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */ - { 0x01b1, 0x0105 }, /* aogonek ą LATIN SMALL LETTER A WITH OGONEK */ - { 0x01c6, 0x0106 }, /* Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */ - { 0x01e6, 0x0107 }, /* cacute ć LATIN SMALL LETTER C WITH ACUTE */ - { 0x02c6, 0x0108 }, /* Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ - { 0x02e6, 0x0109 }, /* ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */ - { 0x02c5, 0x010a }, /* Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */ - { 0x02e5, 0x010b }, /* cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */ - { 0x01c8, 0x010c }, /* Ccaron Č LATIN CAPITAL LETTER C WITH CARON */ - { 0x01e8, 0x010d }, /* ccaron č LATIN SMALL LETTER C WITH CARON */ - { 0x01cf, 0x010e }, /* Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */ - { 0x01ef, 0x010f }, /* dcaron ď LATIN SMALL LETTER D WITH CARON */ - { 0x01d0, 0x0110 }, /* Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */ - { 0x01f0, 0x0111 }, /* dstroke đ LATIN SMALL LETTER D WITH STROKE */ - { 0x03aa, 0x0112 }, /* Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */ - { 0x03ba, 0x0113 }, /* emacron ē LATIN SMALL LETTER E WITH MACRON */ - { 0x03cc, 0x0116 }, /* Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */ - { 0x03ec, 0x0117 }, /* eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */ - { 0x01ca, 0x0118 }, /* Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */ - { 0x01ea, 0x0119 }, /* eogonek ę LATIN SMALL LETTER E WITH OGONEK */ - { 0x01cc, 0x011a }, /* Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */ - { 0x01ec, 0x011b }, /* ecaron ě LATIN SMALL LETTER E WITH CARON */ - { 0x02d8, 0x011c }, /* Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ - { 0x02f8, 0x011d }, /* gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */ - { 0x02ab, 0x011e }, /* Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */ - { 0x02bb, 0x011f }, /* gbreve ğ LATIN SMALL LETTER G WITH BREVE */ - { 0x02d5, 0x0120 }, /* Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */ - { 0x02f5, 0x0121 }, /* gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */ - { 0x03ab, 0x0122 }, /* Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */ - { 0x03bb, 0x0123 }, /* gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */ - { 0x02a6, 0x0124 }, /* Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ - { 0x02b6, 0x0125 }, /* hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */ - { 0x02a1, 0x0126 }, /* Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */ - { 0x02b1, 0x0127 }, /* hstroke ħ LATIN SMALL LETTER H WITH STROKE */ - { 0x03a5, 0x0128 }, /* Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */ - { 0x03b5, 0x0129 }, /* itilde ĩ LATIN SMALL LETTER I WITH TILDE */ - { 0x03cf, 0x012a }, /* Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */ - { 0x03ef, 0x012b }, /* imacron ī LATIN SMALL LETTER I WITH MACRON */ - { 0x03c7, 0x012e }, /* Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */ - { 0x03e7, 0x012f }, /* iogonek į LATIN SMALL LETTER I WITH OGONEK */ - { 0x02a9, 0x0130 }, /* Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */ - { 0x02b9, 0x0131 }, /* idotless ı LATIN SMALL LETTER DOTLESS I */ - { 0x02ac, 0x0134 }, /* Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ - { 0x02bc, 0x0135 }, /* jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */ - { 0x03d3, 0x0136 }, /* Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */ - { 0x03f3, 0x0137 }, /* kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */ - { 0x03a2, 0x0138 }, /* kra ĸ LATIN SMALL LETTER KRA */ - { 0x01c5, 0x0139 }, /* Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */ - { 0x01e5, 0x013a }, /* lacute ĺ LATIN SMALL LETTER L WITH ACUTE */ - { 0x03a6, 0x013b }, /* Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */ - { 0x03b6, 0x013c }, /* lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */ - { 0x01a5, 0x013d }, /* Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */ - { 0x01b5, 0x013e }, /* lcaron ľ LATIN SMALL LETTER L WITH CARON */ - { 0x01a3, 0x0141 }, /* Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */ - { 0x01b3, 0x0142 }, /* lstroke ł LATIN SMALL LETTER L WITH STROKE */ - { 0x01d1, 0x0143 }, /* Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */ - { 0x01f1, 0x0144 }, /* nacute ń LATIN SMALL LETTER N WITH ACUTE */ - { 0x03d1, 0x0145 }, /* Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */ - { 0x03f1, 0x0146 }, /* ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */ - { 0x01d2, 0x0147 }, /* Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */ - { 0x01f2, 0x0148 }, /* ncaron ň LATIN SMALL LETTER N WITH CARON */ - { 0x03bd, 0x014a }, /* ENG Ŋ LATIN CAPITAL LETTER ENG */ - { 0x03bf, 0x014b }, /* eng ŋ LATIN SMALL LETTER ENG */ - { 0x03d2, 0x014c }, /* Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */ - { 0x03f2, 0x014d }, /* omacron ō LATIN SMALL LETTER O WITH MACRON */ - { 0x01d5, 0x0150 }, /* Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ - { 0x01f5, 0x0151 }, /* odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */ - { 0x13bc, 0x0152 }, /* OE Œ LATIN CAPITAL LIGATURE OE */ - { 0x13bd, 0x0153 }, /* oe œ LATIN SMALL LIGATURE OE */ - { 0x01c0, 0x0154 }, /* Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */ - { 0x01e0, 0x0155 }, /* racute ŕ LATIN SMALL LETTER R WITH ACUTE */ - { 0x03a3, 0x0156 }, /* Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */ - { 0x03b3, 0x0157 }, /* rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */ - { 0x01d8, 0x0158 }, /* Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */ - { 0x01f8, 0x0159 }, /* rcaron ř LATIN SMALL LETTER R WITH CARON */ - { 0x01a6, 0x015a }, /* Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */ - { 0x01b6, 0x015b }, /* sacute ś LATIN SMALL LETTER S WITH ACUTE */ - { 0x02de, 0x015c }, /* Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ - { 0x02fe, 0x015d }, /* scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */ - { 0x01aa, 0x015e }, /* Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */ - { 0x01ba, 0x015f }, /* scedilla ş LATIN SMALL LETTER S WITH CEDILLA */ - { 0x01a9, 0x0160 }, /* Scaron Š LATIN CAPITAL LETTER S WITH CARON */ - { 0x01b9, 0x0161 }, /* scaron š LATIN SMALL LETTER S WITH CARON */ - { 0x01de, 0x0162 }, /* Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */ - { 0x01fe, 0x0163 }, /* tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */ - { 0x01ab, 0x0164 }, /* Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */ - { 0x01bb, 0x0165 }, /* tcaron ť LATIN SMALL LETTER T WITH CARON */ - { 0x03ac, 0x0166 }, /* Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */ - { 0x03bc, 0x0167 }, /* tslash ŧ LATIN SMALL LETTER T WITH STROKE */ - { 0x03dd, 0x0168 }, /* Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */ - { 0x03fd, 0x0169 }, /* utilde ũ LATIN SMALL LETTER U WITH TILDE */ - { 0x03de, 0x016a }, /* Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */ - { 0x03fe, 0x016b }, /* umacron ū LATIN SMALL LETTER U WITH MACRON */ - { 0x02dd, 0x016c }, /* Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */ - { 0x02fd, 0x016d }, /* ubreve ŭ LATIN SMALL LETTER U WITH BREVE */ - { 0x01d9, 0x016e }, /* Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */ - { 0x01f9, 0x016f }, /* uring ů LATIN SMALL LETTER U WITH RING ABOVE */ - { 0x01db, 0x0170 }, /* Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ - { 0x01fb, 0x0171 }, /* udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */ - { 0x03d9, 0x0172 }, /* Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */ - { 0x03f9, 0x0173 }, /* uogonek ų LATIN SMALL LETTER U WITH OGONEK */ - { 0x13be, 0x0178 }, /* Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */ - { 0x01ac, 0x0179 }, /* Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */ - { 0x01bc, 0x017a }, /* zacute ź LATIN SMALL LETTER Z WITH ACUTE */ - { 0x01af, 0x017b }, /* Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */ - { 0x01bf, 0x017c }, /* zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */ - { 0x01ae, 0x017d }, /* Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */ - { 0x01be, 0x017e }, /* zcaron ž LATIN SMALL LETTER Z WITH CARON */ - { 0x08f6, 0x0192 }, /* function ƒ LATIN SMALL LETTER F WITH HOOK */ - { 0x01b7, 0x02c7 }, /* caron ˇ CARON */ - { 0x01a2, 0x02d8 }, /* breve ˘ BREVE */ - { 0x01ff, 0x02d9 }, /* abovedot ˙ DOT ABOVE */ - { 0x01b2, 0x02db }, /* ogonek ˛ OGONEK */ - { 0x01bd, 0x02dd }, /* doubleacute ˝ DOUBLE ACUTE ACCENT */ - { 0x07ae, 0x0385 }, /* Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */ - { 0x07a1, 0x0386 }, /* Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */ - { 0x07a2, 0x0388 }, /* Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */ - { 0x07a3, 0x0389 }, /* Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */ - { 0x07a4, 0x038a }, /* Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */ - { 0x07a7, 0x038c }, /* Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */ - { 0x07a8, 0x038e }, /* Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */ - { 0x07ab, 0x038f }, /* Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */ - { 0x07b6, 0x0390 }, /* Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ - { 0x07c1, 0x0391 }, /* Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */ - { 0x07c2, 0x0392 }, /* Greek_BETA Β GREEK CAPITAL LETTER BETA */ - { 0x07c3, 0x0393 }, /* Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */ - { 0x07c4, 0x0394 }, /* Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */ - { 0x07c5, 0x0395 }, /* Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */ - { 0x07c6, 0x0396 }, /* Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */ - { 0x07c7, 0x0397 }, /* Greek_ETA Η GREEK CAPITAL LETTER ETA */ - { 0x07c8, 0x0398 }, /* Greek_THETA Θ GREEK CAPITAL LETTER THETA */ - { 0x07c9, 0x0399 }, /* Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */ - { 0x07ca, 0x039a }, /* Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */ - { 0x07cb, 0x039b }, /* Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */ - { 0x07cc, 0x039c }, /* Greek_MU Μ GREEK CAPITAL LETTER MU */ - { 0x07cd, 0x039d }, /* Greek_NU Ν GREEK CAPITAL LETTER NU */ - { 0x07ce, 0x039e }, /* Greek_XI Ξ GREEK CAPITAL LETTER XI */ - { 0x07cf, 0x039f }, /* Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */ - { 0x07d0, 0x03a0 }, /* Greek_PI Π GREEK CAPITAL LETTER PI */ - { 0x07d1, 0x03a1 }, /* Greek_RHO Ρ GREEK CAPITAL LETTER RHO */ - { 0x07d2, 0x03a3 }, /* Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */ - { 0x07d4, 0x03a4 }, /* Greek_TAU Τ GREEK CAPITAL LETTER TAU */ - { 0x07d5, 0x03a5 }, /* Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */ - { 0x07d6, 0x03a6 }, /* Greek_PHI Φ GREEK CAPITAL LETTER PHI */ - { 0x07d7, 0x03a7 }, /* Greek_CHI Χ GREEK CAPITAL LETTER CHI */ - { 0x07d8, 0x03a8 }, /* Greek_PSI Ψ GREEK CAPITAL LETTER PSI */ - { 0x07d9, 0x03a9 }, /* Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */ - { 0x07a5, 0x03aa }, /* Greek_IOTAdieresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ - { 0x07a9, 0x03ab }, /* Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ - { 0x07b1, 0x03ac }, /* Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */ - { 0x07b2, 0x03ad }, /* Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */ - { 0x07b3, 0x03ae }, /* Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */ - { 0x07b4, 0x03af }, /* Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */ - { 0x07ba, 0x03b0 }, /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ - { 0x07e1, 0x03b1 }, /* Greek_alpha α GREEK SMALL LETTER ALPHA */ - { 0x07e2, 0x03b2 }, /* Greek_beta β GREEK SMALL LETTER BETA */ - { 0x07e3, 0x03b3 }, /* Greek_gamma γ GREEK SMALL LETTER GAMMA */ - { 0x07e4, 0x03b4 }, /* Greek_delta δ GREEK SMALL LETTER DELTA */ - { 0x07e5, 0x03b5 }, /* Greek_epsilon ε GREEK SMALL LETTER EPSILON */ - { 0x07e6, 0x03b6 }, /* Greek_zeta ζ GREEK SMALL LETTER ZETA */ - { 0x07e7, 0x03b7 }, /* Greek_eta η GREEK SMALL LETTER ETA */ - { 0x07e8, 0x03b8 }, /* Greek_theta θ GREEK SMALL LETTER THETA */ - { 0x07e9, 0x03b9 }, /* Greek_iota ι GREEK SMALL LETTER IOTA */ - { 0x07ea, 0x03ba }, /* Greek_kappa κ GREEK SMALL LETTER KAPPA */ - { 0x07eb, 0x03bb }, /* Greek_lambda λ GREEK SMALL LETTER LAMDA */ - { 0x07ec, 0x03bc }, /* Greek_mu μ GREEK SMALL LETTER MU */ - { 0x07ed, 0x03bd }, /* Greek_nu ν GREEK SMALL LETTER NU */ - { 0x07ee, 0x03be }, /* Greek_xi ξ GREEK SMALL LETTER XI */ - { 0x07ef, 0x03bf }, /* Greek_omicron ο GREEK SMALL LETTER OMICRON */ - { 0x07f0, 0x03c0 }, /* Greek_pi π GREEK SMALL LETTER PI */ - { 0x07f1, 0x03c1 }, /* Greek_rho ρ GREEK SMALL LETTER RHO */ - { 0x07f3, 0x03c2 }, /* Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */ - { 0x07f2, 0x03c3 }, /* Greek_sigma σ GREEK SMALL LETTER SIGMA */ - { 0x07f4, 0x03c4 }, /* Greek_tau τ GREEK SMALL LETTER TAU */ - { 0x07f5, 0x03c5 }, /* Greek_upsilon υ GREEK SMALL LETTER UPSILON */ - { 0x07f6, 0x03c6 }, /* Greek_phi φ GREEK SMALL LETTER PHI */ - { 0x07f7, 0x03c7 }, /* Greek_chi χ GREEK SMALL LETTER CHI */ - { 0x07f8, 0x03c8 }, /* Greek_psi ψ GREEK SMALL LETTER PSI */ - { 0x07f9, 0x03c9 }, /* Greek_omega ω GREEK SMALL LETTER OMEGA */ - { 0x07b5, 0x03ca }, /* Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */ - { 0x07b9, 0x03cb }, /* Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ - { 0x07b7, 0x03cc }, /* Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */ - { 0x07b8, 0x03cd }, /* Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */ - { 0x07bb, 0x03ce }, /* Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */ - { 0x06b3, 0x0401 }, /* Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */ - { 0x06b1, 0x0402 }, /* Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */ - { 0x06b2, 0x0403 }, /* Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */ - { 0x06b4, 0x0404 }, /* Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */ - { 0x06b5, 0x0405 }, /* Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */ - { 0x06b6, 0x0406 }, /* Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ - { 0x06b7, 0x0407 }, /* Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */ - { 0x06b8, 0x0408 }, /* Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */ - { 0x06b9, 0x0409 }, /* Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */ - { 0x06ba, 0x040a }, /* Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */ - { 0x06bb, 0x040b }, /* Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */ - { 0x06bc, 0x040c }, /* Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */ - { 0x06be, 0x040e }, /* Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */ - { 0x06bf, 0x040f }, /* Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */ - { 0x06e1, 0x0410 }, /* Cyrillic_A А CYRILLIC CAPITAL LETTER A */ - { 0x06e2, 0x0411 }, /* Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */ - { 0x06f7, 0x0412 }, /* Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */ - { 0x06e7, 0x0413 }, /* Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */ - { 0x06e4, 0x0414 }, /* Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */ - { 0x06e5, 0x0415 }, /* Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */ - { 0x06f6, 0x0416 }, /* Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */ - { 0x06fa, 0x0417 }, /* Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */ - { 0x06e9, 0x0418 }, /* Cyrillic_I И CYRILLIC CAPITAL LETTER I */ - { 0x06ea, 0x0419 }, /* Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */ - { 0x06eb, 0x041a }, /* Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */ - { 0x06ec, 0x041b }, /* Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */ - { 0x06ed, 0x041c }, /* Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */ - { 0x06ee, 0x041d }, /* Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */ - { 0x06ef, 0x041e }, /* Cyrillic_O О CYRILLIC CAPITAL LETTER O */ - { 0x06f0, 0x041f }, /* Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */ - { 0x06f2, 0x0420 }, /* Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */ - { 0x06f3, 0x0421 }, /* Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */ - { 0x06f4, 0x0422 }, /* Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */ - { 0x06f5, 0x0423 }, /* Cyrillic_U У CYRILLIC CAPITAL LETTER U */ - { 0x06e6, 0x0424 }, /* Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */ - { 0x06e8, 0x0425 }, /* Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */ - { 0x06e3, 0x0426 }, /* Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */ - { 0x06fe, 0x0427 }, /* Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */ - { 0x06fb, 0x0428 }, /* Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */ - { 0x06fd, 0x0429 }, /* Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */ - { 0x06ff, 0x042a }, /* Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */ - { 0x06f9, 0x042b }, /* Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */ - { 0x06f8, 0x042c }, /* Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */ - { 0x06fc, 0x042d }, /* Cyrillic_E Э CYRILLIC CAPITAL LETTER E */ - { 0x06e0, 0x042e }, /* Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */ - { 0x06f1, 0x042f }, /* Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */ - { 0x06c1, 0x0430 }, /* Cyrillic_a а CYRILLIC SMALL LETTER A */ - { 0x06c2, 0x0431 }, /* Cyrillic_be б CYRILLIC SMALL LETTER BE */ - { 0x06d7, 0x0432 }, /* Cyrillic_ve в CYRILLIC SMALL LETTER VE */ - { 0x06c7, 0x0433 }, /* Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */ - { 0x06c4, 0x0434 }, /* Cyrillic_de д CYRILLIC SMALL LETTER DE */ - { 0x06c5, 0x0435 }, /* Cyrillic_ie е CYRILLIC SMALL LETTER IE */ - { 0x06d6, 0x0436 }, /* Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */ - { 0x06da, 0x0437 }, /* Cyrillic_ze з CYRILLIC SMALL LETTER ZE */ - { 0x06c9, 0x0438 }, /* Cyrillic_i и CYRILLIC SMALL LETTER I */ - { 0x06ca, 0x0439 }, /* Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */ - { 0x06cb, 0x043a }, /* Cyrillic_ka к CYRILLIC SMALL LETTER KA */ - { 0x06cc, 0x043b }, /* Cyrillic_el л CYRILLIC SMALL LETTER EL */ - { 0x06cd, 0x043c }, /* Cyrillic_em м CYRILLIC SMALL LETTER EM */ - { 0x06ce, 0x043d }, /* Cyrillic_en н CYRILLIC SMALL LETTER EN */ - { 0x06cf, 0x043e }, /* Cyrillic_o о CYRILLIC SMALL LETTER O */ - { 0x06d0, 0x043f }, /* Cyrillic_pe п CYRILLIC SMALL LETTER PE */ - { 0x06d2, 0x0440 }, /* Cyrillic_er р CYRILLIC SMALL LETTER ER */ - { 0x06d3, 0x0441 }, /* Cyrillic_es с CYRILLIC SMALL LETTER ES */ - { 0x06d4, 0x0442 }, /* Cyrillic_te т CYRILLIC SMALL LETTER TE */ - { 0x06d5, 0x0443 }, /* Cyrillic_u у CYRILLIC SMALL LETTER U */ - { 0x06c6, 0x0444 }, /* Cyrillic_ef ф CYRILLIC SMALL LETTER EF */ - { 0x06c8, 0x0445 }, /* Cyrillic_ha х CYRILLIC SMALL LETTER HA */ - { 0x06c3, 0x0446 }, /* Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */ - { 0x06de, 0x0447 }, /* Cyrillic_che ч CYRILLIC SMALL LETTER CHE */ - { 0x06db, 0x0448 }, /* Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */ - { 0x06dd, 0x0449 }, /* Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */ - { 0x06df, 0x044a }, /* Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */ - { 0x06d9, 0x044b }, /* Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */ - { 0x06d8, 0x044c }, /* Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */ - { 0x06dc, 0x044d }, /* Cyrillic_e э CYRILLIC SMALL LETTER E */ - { 0x06c0, 0x044e }, /* Cyrillic_yu ю CYRILLIC SMALL LETTER YU */ - { 0x06d1, 0x044f }, /* Cyrillic_ya я CYRILLIC SMALL LETTER YA */ - { 0x06a3, 0x0451 }, /* Cyrillic_io ё CYRILLIC SMALL LETTER IO */ - { 0x06a1, 0x0452 }, /* Serbian_dje ђ CYRILLIC SMALL LETTER DJE */ - { 0x06a2, 0x0453 }, /* Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */ - { 0x06a4, 0x0454 }, /* Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */ - { 0x06a5, 0x0455 }, /* Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */ - { 0x06a6, 0x0456 }, /* Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ - { 0x06a7, 0x0457 }, /* Ukrainian_yi ї CYRILLIC SMALL LETTER YI */ - { 0x06a8, 0x0458 }, /* Cyrillic_je ј CYRILLIC SMALL LETTER JE */ - { 0x06a9, 0x0459 }, /* Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */ - { 0x06aa, 0x045a }, /* Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */ - { 0x06ab, 0x045b }, /* Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */ - { 0x06ac, 0x045c }, /* Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */ - { 0x06ae, 0x045e }, /* Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */ - { 0x06af, 0x045f }, /* Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */ - { 0x0ce0, 0x05d0 }, /* hebrew_aleph א HEBREW LETTER ALEF */ - { 0x0ce1, 0x05d1 }, /* hebrew_bet ב HEBREW LETTER BET */ - { 0x0ce2, 0x05d2 }, /* hebrew_gimel ג HEBREW LETTER GIMEL */ - { 0x0ce3, 0x05d3 }, /* hebrew_dalet ד HEBREW LETTER DALET */ - { 0x0ce4, 0x05d4 }, /* hebrew_he ה HEBREW LETTER HE */ - { 0x0ce5, 0x05d5 }, /* hebrew_waw ו HEBREW LETTER VAV */ - { 0x0ce6, 0x05d6 }, /* hebrew_zain ז HEBREW LETTER ZAYIN */ - { 0x0ce7, 0x05d7 }, /* hebrew_chet ח HEBREW LETTER HET */ - { 0x0ce8, 0x05d8 }, /* hebrew_tet ט HEBREW LETTER TET */ - { 0x0ce9, 0x05d9 }, /* hebrew_yod י HEBREW LETTER YOD */ - { 0x0cea, 0x05da }, /* hebrew_finalkaph ך HEBREW LETTER FINAL KAF */ - { 0x0ceb, 0x05db }, /* hebrew_kaph כ HEBREW LETTER KAF */ - { 0x0cec, 0x05dc }, /* hebrew_lamed ל HEBREW LETTER LAMED */ - { 0x0ced, 0x05dd }, /* hebrew_finalmem ם HEBREW LETTER FINAL MEM */ - { 0x0cee, 0x05de }, /* hebrew_mem מ HEBREW LETTER MEM */ - { 0x0cef, 0x05df }, /* hebrew_finalnun ן HEBREW LETTER FINAL NUN */ - { 0x0cf0, 0x05e0 }, /* hebrew_nun נ HEBREW LETTER NUN */ - { 0x0cf1, 0x05e1 }, /* hebrew_samech ס HEBREW LETTER SAMEKH */ - { 0x0cf2, 0x05e2 }, /* hebrew_ayin ע HEBREW LETTER AYIN */ - { 0x0cf3, 0x05e3 }, /* hebrew_finalpe ף HEBREW LETTER FINAL PE */ - { 0x0cf4, 0x05e4 }, /* hebrew_pe פ HEBREW LETTER PE */ - { 0x0cf5, 0x05e5 }, /* hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */ - { 0x0cf6, 0x05e6 }, /* hebrew_zade צ HEBREW LETTER TSADI */ - { 0x0cf7, 0x05e7 }, /* hebrew_qoph ק HEBREW LETTER QOF */ - { 0x0cf8, 0x05e8 }, /* hebrew_resh ר HEBREW LETTER RESH */ - { 0x0cf9, 0x05e9 }, /* hebrew_shin ש HEBREW LETTER SHIN */ - { 0x0cfa, 0x05ea }, /* hebrew_taw ת HEBREW LETTER TAV */ - { 0x05ac, 0x060c }, /* Arabic_comma ، ARABIC COMMA */ - { 0x05bb, 0x061b }, /* Arabic_semicolon ؛ ARABIC SEMICOLON */ - { 0x05bf, 0x061f }, /* Arabic_question_mark ؟ ARABIC QUESTION MARK */ - { 0x05c1, 0x0621 }, /* Arabic_hamza ء ARABIC LETTER HAMZA */ - { 0x05c2, 0x0622 }, /* Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */ - { 0x05c3, 0x0623 }, /* Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */ - { 0x05c4, 0x0624 }, /* Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */ - { 0x05c5, 0x0625 }, /* Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */ - { 0x05c6, 0x0626 }, /* Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */ - { 0x05c7, 0x0627 }, /* Arabic_alef ا ARABIC LETTER ALEF */ - { 0x05c8, 0x0628 }, /* Arabic_beh ب ARABIC LETTER BEH */ - { 0x05c9, 0x0629 }, /* Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */ - { 0x05ca, 0x062a }, /* Arabic_teh ت ARABIC LETTER TEH */ - { 0x05cb, 0x062b }, /* Arabic_theh ث ARABIC LETTER THEH */ - { 0x05cc, 0x062c }, /* Arabic_jeem ج ARABIC LETTER JEEM */ - { 0x05cd, 0x062d }, /* Arabic_hah ح ARABIC LETTER HAH */ - { 0x05ce, 0x062e }, /* Arabic_khah خ ARABIC LETTER KHAH */ - { 0x05cf, 0x062f }, /* Arabic_dal د ARABIC LETTER DAL */ - { 0x05d0, 0x0630 }, /* Arabic_thal ذ ARABIC LETTER THAL */ - { 0x05d1, 0x0631 }, /* Arabic_ra ر ARABIC LETTER REH */ - { 0x05d2, 0x0632 }, /* Arabic_zain ز ARABIC LETTER ZAIN */ - { 0x05d3, 0x0633 }, /* Arabic_seen س ARABIC LETTER SEEN */ - { 0x05d4, 0x0634 }, /* Arabic_sheen ش ARABIC LETTER SHEEN */ - { 0x05d5, 0x0635 }, /* Arabic_sad ص ARABIC LETTER SAD */ - { 0x05d6, 0x0636 }, /* Arabic_dad ض ARABIC LETTER DAD */ - { 0x05d7, 0x0637 }, /* Arabic_tah ط ARABIC LETTER TAH */ - { 0x05d8, 0x0638 }, /* Arabic_zah ظ ARABIC LETTER ZAH */ - { 0x05d9, 0x0639 }, /* Arabic_ain ع ARABIC LETTER AIN */ - { 0x05da, 0x063a }, /* Arabic_ghain غ ARABIC LETTER GHAIN */ - { 0x05e0, 0x0640 }, /* Arabic_tatweel ـ ARABIC TATWEEL */ - { 0x05e1, 0x0641 }, /* Arabic_feh ف ARABIC LETTER FEH */ - { 0x05e2, 0x0642 }, /* Arabic_qaf ق ARABIC LETTER QAF */ - { 0x05e3, 0x0643 }, /* Arabic_kaf ك ARABIC LETTER KAF */ - { 0x05e4, 0x0644 }, /* Arabic_lam ل ARABIC LETTER LAM */ - { 0x05e5, 0x0645 }, /* Arabic_meem م ARABIC LETTER MEEM */ - { 0x05e6, 0x0646 }, /* Arabic_noon ن ARABIC LETTER NOON */ - { 0x05e7, 0x0647 }, /* Arabic_ha ه ARABIC LETTER HEH */ - { 0x05e8, 0x0648 }, /* Arabic_waw و ARABIC LETTER WAW */ - { 0x05e9, 0x0649 }, /* Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */ - { 0x05ea, 0x064a }, /* Arabic_yeh ي ARABIC LETTER YEH */ - { 0x05eb, 0x064b }, /* Arabic_fathatan ً ARABIC FATHATAN */ - { 0x05ec, 0x064c }, /* Arabic_dammatan ٌ ARABIC DAMMATAN */ - { 0x05ed, 0x064d }, /* Arabic_kasratan ٍ ARABIC KASRATAN */ - { 0x05ee, 0x064e }, /* Arabic_fatha َ ARABIC FATHA */ - { 0x05ef, 0x064f }, /* Arabic_damma ُ ARABIC DAMMA */ - { 0x05f0, 0x0650 }, /* Arabic_kasra ِ ARABIC KASRA */ - { 0x05f1, 0x0651 }, /* Arabic_shadda ّ ARABIC SHADDA */ - { 0x05f2, 0x0652 }, /* Arabic_sukun ْ ARABIC SUKUN */ - { 0x0da1, 0x0e01 }, /* Thai_kokai ก THAI CHARACTER KO KAI */ - { 0x0da2, 0x0e02 }, /* Thai_khokhai ข THAI CHARACTER KHO KHAI */ - { 0x0da3, 0x0e03 }, /* Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */ - { 0x0da4, 0x0e04 }, /* Thai_khokhwai ค THAI CHARACTER KHO KHWAI */ - { 0x0da5, 0x0e05 }, /* Thai_khokhon ฅ THAI CHARACTER KHO KHON */ - { 0x0da6, 0x0e06 }, /* Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */ - { 0x0da7, 0x0e07 }, /* Thai_ngongu ง THAI CHARACTER NGO NGU */ - { 0x0da8, 0x0e08 }, /* Thai_chochan จ THAI CHARACTER CHO CHAN */ - { 0x0da9, 0x0e09 }, /* Thai_choching ฉ THAI CHARACTER CHO CHING */ - { 0x0daa, 0x0e0a }, /* Thai_chochang ช THAI CHARACTER CHO CHANG */ - { 0x0dab, 0x0e0b }, /* Thai_soso ซ THAI CHARACTER SO SO */ - { 0x0dac, 0x0e0c }, /* Thai_chochoe ฌ THAI CHARACTER CHO CHOE */ - { 0x0dad, 0x0e0d }, /* Thai_yoying ญ THAI CHARACTER YO YING */ - { 0x0dae, 0x0e0e }, /* Thai_dochada ฎ THAI CHARACTER DO CHADA */ - { 0x0daf, 0x0e0f }, /* Thai_topatak ฏ THAI CHARACTER TO PATAK */ - { 0x0db0, 0x0e10 }, /* Thai_thothan ฐ THAI CHARACTER THO THAN */ - { 0x0db1, 0x0e11 }, /* Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */ - { 0x0db2, 0x0e12 }, /* Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */ - { 0x0db3, 0x0e13 }, /* Thai_nonen ณ THAI CHARACTER NO NEN */ - { 0x0db4, 0x0e14 }, /* Thai_dodek ด THAI CHARACTER DO DEK */ - { 0x0db5, 0x0e15 }, /* Thai_totao ต THAI CHARACTER TO TAO */ - { 0x0db6, 0x0e16 }, /* Thai_thothung ถ THAI CHARACTER THO THUNG */ - { 0x0db7, 0x0e17 }, /* Thai_thothahan ท THAI CHARACTER THO THAHAN */ - { 0x0db8, 0x0e18 }, /* Thai_thothong ธ THAI CHARACTER THO THONG */ - { 0x0db9, 0x0e19 }, /* Thai_nonu น THAI CHARACTER NO NU */ - { 0x0dba, 0x0e1a }, /* Thai_bobaimai บ THAI CHARACTER BO BAIMAI */ - { 0x0dbb, 0x0e1b }, /* Thai_popla ป THAI CHARACTER PO PLA */ - { 0x0dbc, 0x0e1c }, /* Thai_phophung ผ THAI CHARACTER PHO PHUNG */ - { 0x0dbd, 0x0e1d }, /* Thai_fofa ฝ THAI CHARACTER FO FA */ - { 0x0dbe, 0x0e1e }, /* Thai_phophan พ THAI CHARACTER PHO PHAN */ - { 0x0dbf, 0x0e1f }, /* Thai_fofan ฟ THAI CHARACTER FO FAN */ - { 0x0dc0, 0x0e20 }, /* Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */ - { 0x0dc1, 0x0e21 }, /* Thai_moma ม THAI CHARACTER MO MA */ - { 0x0dc2, 0x0e22 }, /* Thai_yoyak ย THAI CHARACTER YO YAK */ - { 0x0dc3, 0x0e23 }, /* Thai_rorua ร THAI CHARACTER RO RUA */ - { 0x0dc4, 0x0e24 }, /* Thai_ru ฤ THAI CHARACTER RU */ - { 0x0dc5, 0x0e25 }, /* Thai_loling ล THAI CHARACTER LO LING */ - { 0x0dc6, 0x0e26 }, /* Thai_lu ฦ THAI CHARACTER LU */ - { 0x0dc7, 0x0e27 }, /* Thai_wowaen ว THAI CHARACTER WO WAEN */ - { 0x0dc8, 0x0e28 }, /* Thai_sosala ศ THAI CHARACTER SO SALA */ - { 0x0dc9, 0x0e29 }, /* Thai_sorusi ษ THAI CHARACTER SO RUSI */ - { 0x0dca, 0x0e2a }, /* Thai_sosua ส THAI CHARACTER SO SUA */ - { 0x0dcb, 0x0e2b }, /* Thai_hohip ห THAI CHARACTER HO HIP */ - { 0x0dcc, 0x0e2c }, /* Thai_lochula ฬ THAI CHARACTER LO CHULA */ - { 0x0dcd, 0x0e2d }, /* Thai_oang อ THAI CHARACTER O ANG */ - { 0x0dce, 0x0e2e }, /* Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */ - { 0x0dcf, 0x0e2f }, /* Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */ - { 0x0dd0, 0x0e30 }, /* Thai_saraa ะ THAI CHARACTER SARA A */ - { 0x0dd1, 0x0e31 }, /* Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */ - { 0x0dd2, 0x0e32 }, /* Thai_saraaa า THAI CHARACTER SARA AA */ - { 0x0dd3, 0x0e33 }, /* Thai_saraam ำ THAI CHARACTER SARA AM */ - { 0x0dd4, 0x0e34 }, /* Thai_sarai ิ THAI CHARACTER SARA I */ - { 0x0dd5, 0x0e35 }, /* Thai_saraii ี THAI CHARACTER SARA II */ - { 0x0dd6, 0x0e36 }, /* Thai_saraue ึ THAI CHARACTER SARA UE */ - { 0x0dd7, 0x0e37 }, /* Thai_sarauee ื THAI CHARACTER SARA UEE */ - { 0x0dd8, 0x0e38 }, /* Thai_sarau ุ THAI CHARACTER SARA U */ - { 0x0dd9, 0x0e39 }, /* Thai_sarauu ู THAI CHARACTER SARA UU */ - { 0x0dda, 0x0e3a }, /* Thai_phinthu ฺ THAI CHARACTER PHINTHU */ - { 0x0ddf, 0x0e3f }, /* Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */ - { 0x0de0, 0x0e40 }, /* Thai_sarae เ THAI CHARACTER SARA E */ - { 0x0de1, 0x0e41 }, /* Thai_saraae แ THAI CHARACTER SARA AE */ - { 0x0de2, 0x0e42 }, /* Thai_sarao โ THAI CHARACTER SARA O */ - { 0x0de3, 0x0e43 }, /* Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */ - { 0x0de4, 0x0e44 }, /* Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */ - { 0x0de5, 0x0e45 }, /* Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */ - { 0x0de6, 0x0e46 }, /* Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */ - { 0x0de7, 0x0e47 }, /* Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */ - { 0x0de8, 0x0e48 }, /* Thai_maiek ่ THAI CHARACTER MAI EK */ - { 0x0de9, 0x0e49 }, /* Thai_maitho ้ THAI CHARACTER MAI THO */ - { 0x0dea, 0x0e4a }, /* Thai_maitri ๊ THAI CHARACTER MAI TRI */ - { 0x0deb, 0x0e4b }, /* Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */ - { 0x0dec, 0x0e4c }, /* Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */ - { 0x0ded, 0x0e4d }, /* Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */ - { 0x0df0, 0x0e50 }, /* Thai_leksun ๐ THAI DIGIT ZERO */ - { 0x0df1, 0x0e51 }, /* Thai_leknung ๑ THAI DIGIT ONE */ - { 0x0df2, 0x0e52 }, /* Thai_leksong ๒ THAI DIGIT TWO */ - { 0x0df3, 0x0e53 }, /* Thai_leksam ๓ THAI DIGIT THREE */ - { 0x0df4, 0x0e54 }, /* Thai_leksi ๔ THAI DIGIT FOUR */ - { 0x0df5, 0x0e55 }, /* Thai_lekha ๕ THAI DIGIT FIVE */ - { 0x0df6, 0x0e56 }, /* Thai_lekhok ๖ THAI DIGIT SIX */ - { 0x0df7, 0x0e57 }, /* Thai_lekchet ๗ THAI DIGIT SEVEN */ - { 0x0df8, 0x0e58 }, /* Thai_lekpaet ๘ THAI DIGIT EIGHT */ - { 0x0df9, 0x0e59 }, /* Thai_lekkao ๙ THAI DIGIT NINE */ - { 0x0ed4, 0x11a8 }, /* Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */ - { 0x0ed5, 0x11a9 }, /* Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */ - { 0x0ed6, 0x11aa }, /* Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */ - { 0x0ed7, 0x11ab }, /* Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */ - { 0x0ed8, 0x11ac }, /* Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */ - { 0x0ed9, 0x11ad }, /* Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */ - { 0x0eda, 0x11ae }, /* Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */ - { 0x0edb, 0x11af }, /* Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */ - { 0x0edc, 0x11b0 }, /* Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */ - { 0x0edd, 0x11b1 }, /* Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */ - { 0x0ede, 0x11b2 }, /* Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */ - { 0x0edf, 0x11b3 }, /* Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */ - { 0x0ee0, 0x11b4 }, /* Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */ - { 0x0ee1, 0x11b5 }, /* Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */ - { 0x0ee2, 0x11b6 }, /* Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */ - { 0x0ee3, 0x11b7 }, /* Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */ - { 0x0ee4, 0x11b8 }, /* Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */ - { 0x0ee5, 0x11b9 }, /* Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */ - { 0x0ee6, 0x11ba }, /* Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */ - { 0x0ee7, 0x11bb }, /* Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */ - { 0x0ee8, 0x11bc }, /* Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */ - { 0x0ee9, 0x11bd }, /* Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */ - { 0x0eea, 0x11be }, /* Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */ - { 0x0eeb, 0x11bf }, /* Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */ - { 0x0eec, 0x11c0 }, /* Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */ - { 0x0eed, 0x11c1 }, /* Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */ - { 0x0eee, 0x11c2 }, /* Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */ - { 0x0ef8, 0x11eb }, /* Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */ - { 0x0efa, 0x11f9 }, /* Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */ - { 0x0aa2, 0x2002 }, /* enspace   EN SPACE */ - { 0x0aa1, 0x2003 }, /* emspace   EM SPACE */ - { 0x0aa3, 0x2004 }, /* em3space   THREE-PER-EM SPACE */ - { 0x0aa4, 0x2005 }, /* em4space   FOUR-PER-EM SPACE */ - { 0x0aa5, 0x2007 }, /* digitspace   FIGURE SPACE */ - { 0x0aa6, 0x2008 }, /* punctspace   PUNCTUATION SPACE */ - { 0x0aa7, 0x2009 }, /* thinspace   THIN SPACE */ - { 0x0aa8, 0x200a }, /* hairspace   HAIR SPACE */ - { 0x0abb, 0x2012 }, /* figdash ‒ FIGURE DASH */ - { 0x0aaa, 0x2013 }, /* endash – EN DASH */ - { 0x0aa9, 0x2014 }, /* emdash — EM DASH */ - { 0x07af, 0x2015 }, /* Greek_horizbar ― HORIZONTAL BAR */ - { 0x0cdf, 0x2017 }, /* hebrew_doublelowline ‗ DOUBLE LOW LINE */ - { 0x0ad0, 0x2018 }, /* leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */ - { 0x0ad1, 0x2019 }, /* rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */ - { 0x0afd, 0x201a }, /* singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */ - { 0x0ad2, 0x201c }, /* leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */ - { 0x0ad3, 0x201d }, /* rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */ - { 0x0afe, 0x201e }, /* doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */ - { 0x0af1, 0x2020 }, /* dagger † DAGGER */ - { 0x0af2, 0x2021 }, /* doubledagger ‡ DOUBLE DAGGER */ - { 0x0ae6, 0x2022 }, /* enfilledcircbullet • BULLET */ - { 0x0aae, 0x2026 }, /* ellipsis … HORIZONTAL ELLIPSIS */ - { 0x0ad6, 0x2032 }, /* minutes ′ PRIME */ - { 0x0ad7, 0x2033 }, /* seconds ″ DOUBLE PRIME */ - { 0x0afc, 0x2038 }, /* caret ‸ CARET */ - { 0x047e, 0x203e }, /* overline ‾ OVERLINE */ - { 0x20a0, 0x20a0 }, /* EcuSign ₠ EURO-CURRENCY SIGN */ - { 0x20a1, 0x20a1 }, /* ColonSign ₡ COLON SIGN */ - { 0x20a2, 0x20a2 }, /* CruzeiroSign ₢ CRUZEIRO SIGN */ - { 0x20a3, 0x20a3 }, /* FFrancSign ₣ FRENCH FRANC SIGN */ - { 0x20a4, 0x20a4 }, /* LiraSign ₤ LIRA SIGN */ - { 0x20a5, 0x20a5 }, /* MillSign ₥ MILL SIGN */ - { 0x20a6, 0x20a6 }, /* NairaSign ₦ NAIRA SIGN */ - { 0x20a7, 0x20a7 }, /* PesetaSign ₧ PESETA SIGN */ - { 0x20a8, 0x20a8 }, /* RupeeSign ₨ RUPEE SIGN */ - { 0x0eff, 0x20a9 }, /* Korean_Won ₩ WON SIGN */ - { 0x20a9, 0x20a9 }, /* WonSign ₩ WON SIGN */ - { 0x20aa, 0x20aa }, /* NewSheqelSign ₪ NEW SHEQEL SIGN */ - { 0x20ab, 0x20ab }, /* DongSign ₫ DONG SIGN */ - { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */ - { 0x0ab8, 0x2105 }, /* careof ℅ CARE OF */ - { 0x06b0, 0x2116 }, /* numerosign № NUMERO SIGN */ - { 0x0afb, 0x2117 }, /* phonographcopyright ℗ SOUND RECORDING COPYRIGHT */ - { 0x0ad4, 0x211e }, /* prescription ℞ PRESCRIPTION TAKE */ - { 0x0ac9, 0x2122 }, /* trademark ™ TRADE MARK SIGN */ - { 0x0ab0, 0x2153 }, /* onethird ⅓ VULGAR FRACTION ONE THIRD */ - { 0x0ab1, 0x2154 }, /* twothirds ⅔ VULGAR FRACTION TWO THIRDS */ - { 0x0ab2, 0x2155 }, /* onefifth ⅕ VULGAR FRACTION ONE FIFTH */ - { 0x0ab3, 0x2156 }, /* twofifths ⅖ VULGAR FRACTION TWO FIFTHS */ - { 0x0ab4, 0x2157 }, /* threefifths ⅗ VULGAR FRACTION THREE FIFTHS */ - { 0x0ab5, 0x2158 }, /* fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */ - { 0x0ab6, 0x2159 }, /* onesixth ⅙ VULGAR FRACTION ONE SIXTH */ - { 0x0ab7, 0x215a }, /* fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */ - { 0x0ac3, 0x215b }, /* oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */ - { 0x0ac4, 0x215c }, /* threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */ - { 0x0ac5, 0x215d }, /* fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */ - { 0x0ac6, 0x215e }, /* seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */ - { 0x08fb, 0x2190 }, /* leftarrow ← LEFTWARDS ARROW */ - { 0x08fc, 0x2191 }, /* uparrow ↑ UPWARDS ARROW */ - { 0x08fd, 0x2192 }, /* rightarrow → RIGHTWARDS ARROW */ - { 0x08fe, 0x2193 }, /* downarrow ↓ DOWNWARDS ARROW */ - { 0x08ce, 0x21d2 }, /* implies ⇒ RIGHTWARDS DOUBLE ARROW */ - { 0x08cd, 0x21d4 }, /* ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */ - { 0x08ef, 0x2202 }, /* partialderivative ∂ PARTIAL DIFFERENTIAL */ - { 0x08c5, 0x2207 }, /* nabla ∇ NABLA */ - { 0x0bca, 0x2218 }, /* jot ∘ RING OPERATOR */ - { 0x08d6, 0x221a }, /* radical √ SQUARE ROOT */ - { 0x08c1, 0x221d }, /* variation ∝ PROPORTIONAL TO */ - { 0x08c2, 0x221e }, /* infinity ∞ INFINITY */ - { 0x08de, 0x2227 }, /* logicaland ∧ LOGICAL AND */ - { 0x0ba9, 0x2227 }, /* upcaret ∧ LOGICAL AND */ - { 0x08df, 0x2228 }, /* logicalor ∨ LOGICAL OR */ - { 0x0ba8, 0x2228 }, /* downcaret ∨ LOGICAL OR */ - { 0x08dc, 0x2229 }, /* intersection ∩ INTERSECTION */ - { 0x0bc3, 0x2229 }, /* upshoe ∩ INTERSECTION */ - { 0x08dd, 0x222a }, /* union ∪ UNION */ - { 0x0bd6, 0x222a }, /* downshoe ∪ UNION */ - { 0x08bf, 0x222b }, /* integral ∫ INTEGRAL */ - { 0x08c0, 0x2234 }, /* therefore ∴ THEREFORE */ - { 0x08c8, 0x2245 }, /* approximate ≅ APPROXIMATELY EQUAL TO */ - { 0x08bd, 0x2260 }, /* notequal ≠ NOT EQUAL TO */ - { 0x08cf, 0x2261 }, /* identical ≡ IDENTICAL TO */ - { 0x08bc, 0x2264 }, /* lessthanequal ≤ LESS-THAN OR EQUAL TO */ - { 0x08be, 0x2265 }, /* greaterthanequal ≥ GREATER-THAN OR EQUAL TO */ - { 0x08da, 0x2282 }, /* includedin ⊂ SUBSET OF */ - { 0x0bda, 0x2282 }, /* leftshoe ⊂ SUBSET OF */ - { 0x08db, 0x2283 }, /* includes ⊃ SUPERSET OF */ - { 0x0bd8, 0x2283 }, /* rightshoe ⊃ SUPERSET OF */ - { 0x0bfc, 0x22a2 }, /* righttack ⊢ RIGHT TACK */ - { 0x0bdc, 0x22a3 }, /* lefttack ⊣ LEFT TACK */ - { 0x0bc2, 0x22a4 }, /* downtack ⊤ DOWN TACK */ - { 0x0bce, 0x22a5 }, /* uptack ⊥ UP TACK */ - { 0x0bd3, 0x2308 }, /* upstile ⌈ LEFT CEILING */ - { 0x0bc4, 0x230a }, /* downstile ⌊ LEFT FLOOR */ - { 0x0afa, 0x2315 }, /* telephonerecorder ⌕ TELEPHONE RECORDER */ - { 0x08a4, 0x2320 }, /* topintegral ⌠ TOP HALF INTEGRAL */ - { 0x08a5, 0x2321 }, /* botintegral ⌡ BOTTOM HALF INTEGRAL */ - { 0x0abc, 0x2329 }, /* leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */ - { 0x0abe, 0x232a }, /* rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */ - { 0x0bcc, 0x2395 }, /* quad ⎕ APL FUNCTIONAL SYMBOL QUAD (Unicode 3.0) */ - { 0x09e2, 0x2409 }, /* ht ␉ SYMBOL FOR HORIZONTAL TABULATION */ - { 0x09e5, 0x240a }, /* lf ␊ SYMBOL FOR LINE FEED */ - { 0x09e9, 0x240b }, /* vt ␋ SYMBOL FOR VERTICAL TABULATION */ - { 0x09e3, 0x240c }, /* ff ␌ SYMBOL FOR FORM FEED */ - { 0x09e4, 0x240d }, /* cr ␍ SYMBOL FOR CARRIAGE RETURN */ - { 0x09df, 0x2422 }, /* blank ␢ BLANK SYMBOL */ - { 0x09e8, 0x2424 }, /* nl ␤ SYMBOL FOR NEWLINE */ - { 0x09f1, 0x2500 }, /* horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */ - { 0x08a6, 0x2502 }, /* vertconnector │ BOX DRAWINGS LIGHT VERTICAL */ - { 0x09f8, 0x2502 }, /* vertbar │ BOX DRAWINGS LIGHT VERTICAL */ - { 0x09ec, 0x250c }, /* upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ - { 0x09eb, 0x2510 }, /* uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */ - { 0x09ed, 0x2514 }, /* lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */ - { 0x09ea, 0x2518 }, /* lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */ - { 0x09f4, 0x251c }, /* leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ - { 0x09f5, 0x2524 }, /* rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */ - { 0x09f7, 0x252c }, /* topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ - { 0x09f6, 0x2534 }, /* bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */ - { 0x09ee, 0x253c }, /* crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ - { 0x09e1, 0x2592 }, /* checkerboard ▒ MEDIUM SHADE */ - { 0x0adf, 0x25a0 }, /* emfilledrect ■ BLACK SQUARE */ - { 0x0acf, 0x25a1 }, /* emopenrectangle □ WHITE SQUARE */ - { 0x0ae7, 0x25aa }, /* enfilledsqbullet ▪ BLACK SMALL SQUARE */ - { 0x0ae1, 0x25ab }, /* enopensquarebullet ▫ WHITE SMALL SQUARE */ - { 0x0adb, 0x25ac }, /* filledrectbullet ▬ BLACK RECTANGLE */ - { 0x0ae2, 0x25ad }, /* openrectbullet ▭ WHITE RECTANGLE */ - { 0x0ae8, 0x25b2 }, /* filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */ - { 0x0ae3, 0x25b3 }, /* opentribulletup △ WHITE UP-POINTING TRIANGLE */ - { 0x0add, 0x25b6 }, /* filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */ - { 0x0acd, 0x25b7 }, /* rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */ - { 0x0ae9, 0x25bc }, /* filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */ - { 0x0ae4, 0x25bd }, /* opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */ - { 0x0adc, 0x25c0 }, /* filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */ - { 0x0acc, 0x25c1 }, /* leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */ - { 0x09e0, 0x25c6 }, /* soliddiamond ◆ BLACK DIAMOND */ - { 0x0ace, 0x25cb }, /* emopencircle ○ WHITE CIRCLE */ - { 0x0bcf, 0x25cb }, /* circle ○ WHITE CIRCLE */ - { 0x0ade, 0x25cf }, /* emfilledcircle ● BLACK CIRCLE */ - { 0x0ae0, 0x25e6 }, /* enopencircbullet ◦ WHITE BULLET */ - { 0x0ae5, 0x2606 }, /* openstar ☆ WHITE STAR */ - { 0x0af9, 0x260e }, /* telephone ☎ BLACK TELEPHONE */ - { 0x0aca, 0x2613 }, /* signaturemark ☓ SALTIRE */ - { 0x0aea, 0x261c }, /* leftpointer ☜ WHITE LEFT POINTING INDEX */ - { 0x0aeb, 0x261e }, /* rightpointer ☞ WHITE RIGHT POINTING INDEX */ - { 0x0af8, 0x2640 }, /* femalesymbol ♀ FEMALE SIGN */ - { 0x0af7, 0x2642 }, /* malesymbol ♂ MALE SIGN */ - { 0x0aec, 0x2663 }, /* club ♣ BLACK CLUB SUIT */ - { 0x0aee, 0x2665 }, /* heart ♥ BLACK HEART SUIT */ - { 0x0aed, 0x2666 }, /* diamond ♦ BLACK DIAMOND SUIT */ - { 0x0af6, 0x266d }, /* musicalflat ♭ MUSIC FLAT SIGN */ - { 0x0af5, 0x266f }, /* musicalsharp ♯ MUSIC SHARP SIGN */ - { 0x0af3, 0x2713 }, /* checkmark ✓ CHECK MARK */ - { 0x0af4, 0x2717 }, /* ballotcross ✗ BALLOT X */ - { 0x0ad9, 0x271d }, /* latincross ✝ LATIN CROSS */ - { 0x0af0, 0x2720 }, /* maltesecross ✠ MALTESE CROSS */ - { 0x04a4, 0x3001 }, /* kana_comma 、 IDEOGRAPHIC COMMA */ - { 0x04a1, 0x3002 }, /* kana_fullstop 。 IDEOGRAPHIC FULL STOP */ - { 0x04a2, 0x300c }, /* kana_openingbracket 「 LEFT CORNER BRACKET */ - { 0x04a3, 0x300d }, /* kana_closingbracket 」 RIGHT CORNER BRACKET */ - { 0x04de, 0x309b }, /* voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */ - { 0x04df, 0x309c }, /* semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ - { 0x04a7, 0x30a1 }, /* kana_a ァ KATAKANA LETTER SMALL A */ - { 0x04b1, 0x30a2 }, /* kana_A ア KATAKANA LETTER A */ - { 0x04a8, 0x30a3 }, /* kana_i ィ KATAKANA LETTER SMALL I */ - { 0x04b2, 0x30a4 }, /* kana_I イ KATAKANA LETTER I */ - { 0x04a9, 0x30a5 }, /* kana_u ゥ KATAKANA LETTER SMALL U */ - { 0x04b3, 0x30a6 }, /* kana_U ウ KATAKANA LETTER U */ - { 0x04aa, 0x30a7 }, /* kana_e ェ KATAKANA LETTER SMALL E */ - { 0x04b4, 0x30a8 }, /* kana_E エ KATAKANA LETTER E */ - { 0x04ab, 0x30a9 }, /* kana_o ォ KATAKANA LETTER SMALL O */ - { 0x04b5, 0x30aa }, /* kana_O オ KATAKANA LETTER O */ - { 0x04b6, 0x30ab }, /* kana_KA カ KATAKANA LETTER KA */ - { 0x04b7, 0x30ad }, /* kana_KI キ KATAKANA LETTER KI */ - { 0x04b8, 0x30af }, /* kana_KU ク KATAKANA LETTER KU */ - { 0x04b9, 0x30b1 }, /* kana_KE ケ KATAKANA LETTER KE */ - { 0x04ba, 0x30b3 }, /* kana_KO コ KATAKANA LETTER KO */ - { 0x04bb, 0x30b5 }, /* kana_SA サ KATAKANA LETTER SA */ - { 0x04bc, 0x30b7 }, /* kana_SHI シ KATAKANA LETTER SI */ - { 0x04bd, 0x30b9 }, /* kana_SU ス KATAKANA LETTER SU */ - { 0x04be, 0x30bb }, /* kana_SE セ KATAKANA LETTER SE */ - { 0x04bf, 0x30bd }, /* kana_SO ソ KATAKANA LETTER SO */ - { 0x04c0, 0x30bf }, /* kana_TA タ KATAKANA LETTER TA */ - { 0x04c1, 0x30c1 }, /* kana_CHI チ KATAKANA LETTER TI */ - { 0x04af, 0x30c3 }, /* kana_tsu ッ KATAKANA LETTER SMALL TU */ - { 0x04c2, 0x30c4 }, /* kana_TSU ツ KATAKANA LETTER TU */ - { 0x04c3, 0x30c6 }, /* kana_TE テ KATAKANA LETTER TE */ - { 0x04c4, 0x30c8 }, /* kana_TO ト KATAKANA LETTER TO */ - { 0x04c5, 0x30ca }, /* kana_NA ナ KATAKANA LETTER NA */ - { 0x04c6, 0x30cb }, /* kana_NI ニ KATAKANA LETTER NI */ - { 0x04c7, 0x30cc }, /* kana_NU ヌ KATAKANA LETTER NU */ - { 0x04c8, 0x30cd }, /* kana_NE ネ KATAKANA LETTER NE */ - { 0x04c9, 0x30ce }, /* kana_NO ノ KATAKANA LETTER NO */ - { 0x04ca, 0x30cf }, /* kana_HA ハ KATAKANA LETTER HA */ - { 0x04cb, 0x30d2 }, /* kana_HI ヒ KATAKANA LETTER HI */ - { 0x04cc, 0x30d5 }, /* kana_FU フ KATAKANA LETTER HU */ - { 0x04cd, 0x30d8 }, /* kana_HE ヘ KATAKANA LETTER HE */ - { 0x04ce, 0x30db }, /* kana_HO ホ KATAKANA LETTER HO */ - { 0x04cf, 0x30de }, /* kana_MA マ KATAKANA LETTER MA */ - { 0x04d0, 0x30df }, /* kana_MI ミ KATAKANA LETTER MI */ - { 0x04d1, 0x30e0 }, /* kana_MU ム KATAKANA LETTER MU */ - { 0x04d2, 0x30e1 }, /* kana_ME メ KATAKANA LETTER ME */ - { 0x04d3, 0x30e2 }, /* kana_MO モ KATAKANA LETTER MO */ - { 0x04ac, 0x30e3 }, /* kana_ya ャ KATAKANA LETTER SMALL YA */ - { 0x04d4, 0x30e4 }, /* kana_YA ヤ KATAKANA LETTER YA */ - { 0x04ad, 0x30e5 }, /* kana_yu ュ KATAKANA LETTER SMALL YU */ - { 0x04d5, 0x30e6 }, /* kana_YU ユ KATAKANA LETTER YU */ - { 0x04ae, 0x30e7 }, /* kana_yo ョ KATAKANA LETTER SMALL YO */ - { 0x04d6, 0x30e8 }, /* kana_YO ヨ KATAKANA LETTER YO */ - { 0x04d7, 0x30e9 }, /* kana_RA ラ KATAKANA LETTER RA */ - { 0x04d8, 0x30ea }, /* kana_RI リ KATAKANA LETTER RI */ - { 0x04d9, 0x30eb }, /* kana_RU ル KATAKANA LETTER RU */ - { 0x04da, 0x30ec }, /* kana_RE レ KATAKANA LETTER RE */ - { 0x04db, 0x30ed }, /* kana_RO ロ KATAKANA LETTER RO */ - { 0x04dc, 0x30ef }, /* kana_WA ワ KATAKANA LETTER WA */ - { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */ - { 0x04dd, 0x30f3 }, /* kana_N ン KATAKANA LETTER N */ - { 0x04a5, 0x30fb }, /* kana_conjunctive ・ KATAKANA MIDDLE DOT */ - { 0x04b0, 0x30fc }, /* prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */ - { 0x0ea1, 0x3131 }, /* Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */ - { 0x0ea2, 0x3132 }, /* Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */ - { 0x0ea3, 0x3133 }, /* Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */ - { 0x0ea4, 0x3134 }, /* Hangul_Nieun ㄴ HANGUL LETTER NIEUN */ - { 0x0ea5, 0x3135 }, /* Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */ - { 0x0ea6, 0x3136 }, /* Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */ - { 0x0ea7, 0x3137 }, /* Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */ - { 0x0ea8, 0x3138 }, /* Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */ - { 0x0ea9, 0x3139 }, /* Hangul_Rieul ㄹ HANGUL LETTER RIEUL */ - { 0x0eaa, 0x313a }, /* Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */ - { 0x0eab, 0x313b }, /* Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */ - { 0x0eac, 0x313c }, /* Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */ - { 0x0ead, 0x313d }, /* Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */ - { 0x0eae, 0x313e }, /* Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */ - { 0x0eaf, 0x313f }, /* Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */ - { 0x0eb0, 0x3140 }, /* Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */ - { 0x0eb1, 0x3141 }, /* Hangul_Mieum ㅁ HANGUL LETTER MIEUM */ - { 0x0eb2, 0x3142 }, /* Hangul_Pieub ㅂ HANGUL LETTER PIEUP */ - { 0x0eb3, 0x3143 }, /* Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */ - { 0x0eb4, 0x3144 }, /* Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */ - { 0x0eb5, 0x3145 }, /* Hangul_Sios ㅅ HANGUL LETTER SIOS */ - { 0x0eb6, 0x3146 }, /* Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */ - { 0x0eb7, 0x3147 }, /* Hangul_Ieung ㅇ HANGUL LETTER IEUNG */ - { 0x0eb8, 0x3148 }, /* Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */ - { 0x0eb9, 0x3149 }, /* Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */ - { 0x0eba, 0x314a }, /* Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */ - { 0x0ebb, 0x314b }, /* Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */ - { 0x0ebc, 0x314c }, /* Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */ - { 0x0ebd, 0x314d }, /* Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */ - { 0x0ebe, 0x314e }, /* Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */ - { 0x0ebf, 0x314f }, /* Hangul_A ㅏ HANGUL LETTER A */ - { 0x0ec0, 0x3150 }, /* Hangul_AE ㅐ HANGUL LETTER AE */ - { 0x0ec1, 0x3151 }, /* Hangul_YA ㅑ HANGUL LETTER YA */ - { 0x0ec2, 0x3152 }, /* Hangul_YAE ㅒ HANGUL LETTER YAE */ - { 0x0ec3, 0x3153 }, /* Hangul_EO ㅓ HANGUL LETTER EO */ - { 0x0ec4, 0x3154 }, /* Hangul_E ㅔ HANGUL LETTER E */ - { 0x0ec5, 0x3155 }, /* Hangul_YEO ㅕ HANGUL LETTER YEO */ - { 0x0ec6, 0x3156 }, /* Hangul_YE ㅖ HANGUL LETTER YE */ - { 0x0ec7, 0x3157 }, /* Hangul_O ㅗ HANGUL LETTER O */ - { 0x0ec8, 0x3158 }, /* Hangul_WA ㅘ HANGUL LETTER WA */ - { 0x0ec9, 0x3159 }, /* Hangul_WAE ㅙ HANGUL LETTER WAE */ - { 0x0eca, 0x315a }, /* Hangul_OE ㅚ HANGUL LETTER OE */ - { 0x0ecb, 0x315b }, /* Hangul_YO ㅛ HANGUL LETTER YO */ - { 0x0ecc, 0x315c }, /* Hangul_U ㅜ HANGUL LETTER U */ - { 0x0ecd, 0x315d }, /* Hangul_WEO ㅝ HANGUL LETTER WEO */ - { 0x0ece, 0x315e }, /* Hangul_WE ㅞ HANGUL LETTER WE */ - { 0x0ecf, 0x315f }, /* Hangul_WI ㅟ HANGUL LETTER WI */ - { 0x0ed0, 0x3160 }, /* Hangul_YU ㅠ HANGUL LETTER YU */ - { 0x0ed1, 0x3161 }, /* Hangul_EU ㅡ HANGUL LETTER EU */ - { 0x0ed2, 0x3162 }, /* Hangul_YI ㅢ HANGUL LETTER YI */ - { 0x0ed3, 0x3163 }, /* Hangul_I ㅣ HANGUL LETTER I */ - { 0x0eef, 0x316d }, /* Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */ - { 0x0ef0, 0x3171 }, /* Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */ - { 0x0ef1, 0x3178 }, /* Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */ - { 0x0ef2, 0x317f }, /* Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */ - { 0x0ef4, 0x3184 }, /* Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */ - { 0x0ef5, 0x3186 }, /* Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */ - { 0x0ef6, 0x318d }, /* Hangul_AraeA ㆍ HANGUL LETTER ARAEA */ - { 0x0ef7, 0x318e }, /* Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */ -}; - -#endif // KEYDATA_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/keyserver_x11.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/keyserver_x11.h deleted file mode 100644 index e735210e3..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/keyserver_x11.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - Copyright (C) 2001 Ellis Whitehead - - Win32 port: - Copyright (C) 2004 Jaroslaw Staniek - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. - */ - -#ifndef KEYSERVER_X11_H -#define KEYSERVER_X11_H - -#include - -struct TransKey { - int keySymQt; - uint keySymX; -}; - -static const TransKey g_rgQtToSymX[] = { - { Qt::Key_Escape, XK_Escape }, - { Qt::Key_Tab, XK_Tab }, - { Qt::Key_Backtab, XK_ISO_Left_Tab }, - { Qt::Key_Backspace, XK_BackSpace }, - { Qt::Key_Return, XK_Return }, - { Qt::Key_Enter, XK_KP_Enter }, - { Qt::Key_Insert, XK_Insert }, - { Qt::Key_Delete, XK_Delete }, - { Qt::Key_Pause, XK_Pause }, -#ifdef sun - { Qt::Key_Print, XK_F22 }, -#else - { Qt::Key_Print, XK_Print }, -#endif - { Qt::Key_SysReq, XK_Sys_Req }, - { Qt::Key_Home, XK_Home }, - { Qt::Key_End, XK_End }, - { Qt::Key_Left, XK_Left }, - { Qt::Key_Up, XK_Up }, - { Qt::Key_Right, XK_Right }, - { Qt::Key_Down, XK_Down }, - //{ Qt::Key_Shift, 0 }, - //{ Qt::Key_Control, 0 }, - //{ Qt::Key_Meta, 0 }, - //{ Qt::Key_Alt, 0 }, - { Qt::Key_CapsLock, XK_Caps_Lock }, - { Qt::Key_NumLock, XK_Num_Lock }, - { Qt::Key_ScrollLock, XK_Scroll_Lock }, - { Qt::Key_F1, XK_F1 }, - { Qt::Key_F2, XK_F2 }, - { Qt::Key_F3, XK_F3 }, - { Qt::Key_F4, XK_F4 }, - { Qt::Key_F5, XK_F5 }, - { Qt::Key_F6, XK_F6 }, - { Qt::Key_F7, XK_F7 }, - { Qt::Key_F8, XK_F8 }, - { Qt::Key_F9, XK_F9 }, - { Qt::Key_F10, XK_F10 }, - { Qt::Key_F11, XK_F11 }, - { Qt::Key_F12, XK_F12 }, - { Qt::Key_F13, XK_F13 }, - { Qt::Key_F14, XK_F14 }, - { Qt::Key_F15, XK_F15 }, - { Qt::Key_F16, XK_F16 }, - { Qt::Key_F17, XK_F17 }, - { Qt::Key_F18, XK_F18 }, - { Qt::Key_F19, XK_F19 }, - { Qt::Key_F20, XK_F20 }, - { Qt::Key_F21, XK_F21 }, - { Qt::Key_F22, XK_F22 }, - { Qt::Key_F23, XK_F23 }, - { Qt::Key_F24, XK_F24 }, - { Qt::Key_F25, XK_F25 }, - { Qt::Key_F26, XK_F26 }, - { Qt::Key_F27, XK_F27 }, - { Qt::Key_F28, XK_F28 }, - { Qt::Key_F29, XK_F29 }, - { Qt::Key_F30, XK_F30 }, - { Qt::Key_F31, XK_F31 }, - { Qt::Key_F32, XK_F32 }, - { Qt::Key_F33, XK_F33 }, - { Qt::Key_F34, XK_F34 }, - { Qt::Key_F35, XK_F35 }, - { Qt::Key_Super_L, XK_Super_L }, - { Qt::Key_Super_R, XK_Super_R }, - { Qt::Key_Menu, XK_Menu }, - { Qt::Key_Hyper_L, XK_Hyper_L }, - { Qt::Key_Hyper_R, XK_Hyper_R }, - { Qt::Key_Help, XK_Help }, - - { '/', XK_KP_Divide }, - { '*', XK_KP_Multiply }, - { '-', XK_KP_Subtract }, - { '+', XK_KP_Add }, - { Qt::Key_Return, XK_KP_Enter }, - {Qt::Key_Multi_key, XK_Multi_key}, - {Qt::Key_Codeinput, XK_Codeinput}, - {Qt::Key_SingleCandidate, XK_SingleCandidate}, - {Qt::Key_MultipleCandidate, XK_MultipleCandidate}, - {Qt::Key_PreviousCandidate, XK_PreviousCandidate}, - {Qt::Key_Mode_switch, XK_Mode_switch}, - {Qt::Key_Kanji, XK_Kanji}, - {Qt::Key_Muhenkan, XK_Muhenkan}, - {Qt::Key_Henkan, XK_Henkan}, - {Qt::Key_Romaji, XK_Romaji}, - {Qt::Key_Hiragana, XK_Hiragana}, - {Qt::Key_Katakana, XK_Katakana}, - {Qt::Key_Hiragana_Katakana, XK_Hiragana_Katakana}, - {Qt::Key_Zenkaku, XK_Zenkaku}, - {Qt::Key_Hankaku, XK_Hankaku}, - {Qt::Key_Zenkaku_Hankaku, XK_Zenkaku_Hankaku}, - {Qt::Key_Touroku, XK_Touroku}, - {Qt::Key_Massyo, XK_Massyo}, - {Qt::Key_Kana_Lock, XK_Kana_Lock}, - {Qt::Key_Kana_Shift, XK_Kana_Shift}, - {Qt::Key_Eisu_Shift, XK_Eisu_Shift}, - {Qt::Key_Eisu_toggle, XK_Eisu_toggle}, - {Qt::Key_Hangul, XK_Hangul}, - {Qt::Key_Hangul_Start, XK_Hangul_Start}, - {Qt::Key_Hangul_End, XK_Hangul_End}, - {Qt::Key_Hangul_Hanja, XK_Hangul_Hanja}, - {Qt::Key_Hangul_Jamo, XK_Hangul_Jamo}, - {Qt::Key_Hangul_Romaja, XK_Hangul_Romaja}, - {Qt::Key_Hangul_Jeonja, XK_Hangul_Jeonja}, - {Qt::Key_Hangul_Banja, XK_Hangul_Banja}, - {Qt::Key_Hangul_PreHanja, XK_Hangul_PreHanja}, - {Qt::Key_Hangul_PostHanja, XK_Hangul_PostHanja}, - {Qt::Key_Hangul_Special, XK_Hangul_Special}, -}; - -#include - -inline int map_sym_to_qt(uint keySym) -{ - if (keySym < 0x1000) { - if (keySym >= 'a' && keySym <= 'z') - return QChar(keySym).toUpper().unicode(); - return keySym; - } -#ifdef Q_WS_WIN - if (keySym < 0x3000) - return keySym; -#else - if (keySym < 0x3000) - return keySym | Qt::UNICODE_ACCEL; - - for (uint i = 0; i < sizeof(g_rgQtToSymX) / sizeof(TransKey); i++) - if (g_rgQtToSymX[i].keySymX == keySym) - return g_rgQtToSymX[i].keySymQt; -#endif - return Qt::Key_unknown; -} - -static bool symToKeyQt(uint keySym, int& keyQt) -{ - keyQt = map_sym_to_qt(keySym); - return (keyQt != Qt::Key_unknown); -} - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/keyuni.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/keyuni.cpp deleted file mode 100644 index a4dec94c7..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/keyuni.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2013 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#include -#include "keyuni.h" -#include "keydata.h" - -uint32_t -FcitxKeySymToUnicode (uint32_t keyval) -{ - int min = 0; - int max = sizeof (gdk_keysym_to_unicode_tab) / sizeof(gdk_keysym_to_unicode_tab[0]) - 1; - int mid; - - /* First check for Latin-1 characters (1:1 mapping) */ - if ((keyval >= 0x0020 && keyval <= 0x007e) || - (keyval >= 0x00a0 && keyval <= 0x00ff)) - return keyval; - - /* Also check for directly encoded 24-bit UCS characters: - */ - if ((keyval & 0xff000000) == 0x01000000) - return keyval & 0x00ffffff; - - /* binary search in table */ - while (max >= min) { - mid = (min + max) / 2; - if (gdk_keysym_to_unicode_tab[mid].keysym < keyval) - min = mid + 1; - else if (gdk_keysym_to_unicode_tab[mid].keysym > keyval) - max = mid - 1; - else { - /* found it */ - return gdk_keysym_to_unicode_tab[mid].ucs; - } - } - - /* No matching Unicode value found */ - return 0; -} diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/keyuni.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/keyuni.h deleted file mode 100644 index 02af14d12..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/keyuni.h +++ /dev/null @@ -1,29 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2013 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef KEYUNI_H -#define KEYUNI_H - -#include - -quint32 -FcitxKeySymToUnicode (quint32 keyval); - - -#endif // KEYUNI_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/main.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/main.cpp deleted file mode 100644 index d522818f9..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/main.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2013 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#include "main.h" - - -QStringList QFcitxPlatformInputContextPlugin::keys() const -{ - return QStringList(QStringLiteral("fcitx")); - -} - -QFcitxPlatformInputContext *QFcitxPlatformInputContextPlugin::create(const QString& system, const QStringList& paramList) -{ - Q_UNUSED(paramList); - if (system.compare(system, QStringLiteral("fcitx"), Qt::CaseInsensitive) == 0) - return new QFcitxPlatformInputContext; - return 0; -} diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/main.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/main.h deleted file mode 100644 index 9938da17b..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/main.h +++ /dev/null @@ -1,37 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2013 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef MAIN_H -#define MAIN_H - -#include -#include - -#include "qfcitxplatforminputcontext.h" - -class QFcitxPlatformInputContextPlugin : public QPlatformInputContextPlugin -{ - Q_OBJECT -public: - Q_PLUGIN_METADATA(IID QPlatformInputContextFactoryInterface_iid FILE "fcitx.json") - QStringList keys() const; - QFcitxPlatformInputContext *create(const QString& system, const QStringList& paramList); -}; - -#endif // MAIN_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/qfcitxplatforminputcontext.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/qfcitxplatforminputcontext.cpp deleted file mode 100644 index adbf1bdb9..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/qfcitxplatforminputcontext.cpp +++ /dev/null @@ -1,770 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2011~2013 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "keyserver_x11.h" - -#include "qfcitxplatforminputcontext.h" -#include "fcitxqtinputcontextproxy.h" -#include "fcitxqtinputmethodproxy.h" -#include "fcitxqtconnection.h" -#include "keyuni.h" -#include "utils.h" - -static bool key_filtered = false; - -static bool -get_boolean_env(const char *name, - bool defval) -{ - const char *value = getenv(name); - - if (value == NULL) - return defval; - - if (strcmp(value, "") == 0 || - strcmp(value, "0") == 0 || - strcmp(value, "false") == 0 || - strcmp(value, "False") == 0 || - strcmp(value, "FALSE") == 0) - return false; - - return true; -} - -static inline const char* -get_locale() -{ - const char* locale = getenv("LC_ALL"); - if (!locale) - locale = getenv("LC_CTYPE"); - if (!locale) - locale = getenv("LANG"); - if (!locale) - locale = "C"; - - return locale; -} - -struct xkb_context* _xkb_context_new_helper() -{ - struct xkb_context* context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); - if (context) { - xkb_context_set_log_level(context, XKB_LOG_LEVEL_CRITICAL); - } - - return context; -} - -QFcitxPlatformInputContext::QFcitxPlatformInputContext() : - m_connection(new FcitxQtConnection(this)), - m_improxy(0), - m_n_compose(0), - m_cursorPos(0), - m_useSurroundingText(false), - m_syncMode(true), - m_lastWId(0), - m_destroy(false), - m_xkbContext(_xkb_context_new_helper()), - m_xkbComposeTable(m_xkbContext ? xkb_compose_table_new_from_locale(m_xkbContext.data(), get_locale(), XKB_COMPOSE_COMPILE_NO_FLAGS) : 0), - m_xkbComposeState(m_xkbComposeTable ? xkb_compose_state_new(m_xkbComposeTable.data(), XKB_COMPOSE_STATE_NO_FLAGS) : 0) -{ - FcitxQtFormattedPreedit::registerMetaType(); - - memset(m_compose_buffer, 0, sizeof(uint) * (MAX_COMPOSE_LEN + 1)); - connect(m_connection, SIGNAL(connected()), this, SLOT(connected())); - connect(m_connection, SIGNAL(disconnected()), this, SLOT(cleanUp())); - - m_connection->startConnection(); -} - -QFcitxPlatformInputContext::~QFcitxPlatformInputContext() -{ - m_destroy = true; - cleanUp(); -} - -void QFcitxPlatformInputContext::connected() -{ - if (!m_connection->isConnected()) - return; - - // qDebug() << "create Input Context" << m_connection->name(); - if (m_improxy) { - delete m_improxy; - m_improxy = 0; - } - m_improxy = new FcitxQtInputMethodProxy(m_connection->serviceName(), QLatin1String("/inputmethod"), *m_connection->connection(), this); - - QWindow* w = qApp->focusWindow(); - if (w) - createICData(w); -} - -void QFcitxPlatformInputContext::cleanUp() -{ - for(QHash::const_iterator i = m_icMap.constBegin(), - e = m_icMap.constEnd(); i != e; ++i) { - FcitxQtICData* data = i.value(); - - if (data->proxy) - delete data->proxy; - } - - m_icMap.clear(); - - if (m_improxy) { - delete m_improxy; - m_improxy = 0; - } - - if (!m_destroy) { - commitPreedit(); - } -} - -bool QFcitxPlatformInputContext::isValid() const -{ - return true; -} - -void QFcitxPlatformInputContext::invokeAction(QInputMethod::Action action, int cursorPosition) -{ - if (action == QInputMethod::Click - && (cursorPosition <= 0 || cursorPosition >= m_preedit.length()) - ) - { - // qDebug() << action << cursorPosition; - commitPreedit(); - } -} - -void QFcitxPlatformInputContext::commitPreedit() -{ - QObject *input = qApp->focusObject(); - if (!input) - return; - if (m_commitPreedit.length() <= 0) - return; - QInputMethodEvent e; - e.setCommitString(m_commitPreedit); - QCoreApplication::sendEvent(input, &e); - m_commitPreedit.clear(); -} - - -void QFcitxPlatformInputContext::reset() -{ - commitPreedit(); - FcitxQtInputContextProxy* proxy = validIC(); - if (proxy) - proxy->Reset(); - if (m_xkbComposeState) { - xkb_compose_state_reset(m_xkbComposeState.data()); - } - QPlatformInputContext::reset(); -} - -void QFcitxPlatformInputContext::update(Qt::InputMethodQueries queries ) -{ - QWindow* window = qApp->focusWindow(); - FcitxQtInputContextProxy* proxy = validICByWindow(window); - if (!proxy) - return; - - FcitxQtICData* data = m_icMap.value(window->winId()); - - QInputMethod *method = qApp->inputMethod(); - QObject *input = qApp->focusObject(); - if (!input) - return; - - QInputMethodQueryEvent query(queries); - QGuiApplication::sendEvent(input, &query); - - if (queries & Qt::ImCursorRectangle) { - cursorRectChanged(); - } - - if (queries & Qt::ImHints) { - Qt::InputMethodHints hints = Qt::InputMethodHints(query.value(Qt::ImHints).toUInt()); - - -#define CHECK_HINTS(_HINTS, _CAPACITY) \ - if (hints & _HINTS) \ - addCapacity(data, _CAPACITY); \ - else \ - removeCapacity(data, _CAPACITY); - - CHECK_HINTS(Qt::ImhNoAutoUppercase, CAPACITY_NOAUTOUPPERCASE) - CHECK_HINTS(Qt::ImhPreferNumbers, CAPACITY_NUMBER) - CHECK_HINTS(Qt::ImhPreferUppercase, CAPACITY_UPPERCASE) - CHECK_HINTS(Qt::ImhPreferLowercase, CAPACITY_LOWERCASE) - CHECK_HINTS(Qt::ImhNoPredictiveText, CAPACITY_NO_SPELLCHECK) - CHECK_HINTS(Qt::ImhDigitsOnly, CAPACITY_DIGIT) - CHECK_HINTS(Qt::ImhFormattedNumbersOnly, CAPACITY_NUMBER) - CHECK_HINTS(Qt::ImhUppercaseOnly, CAPACITY_UPPERCASE) - CHECK_HINTS(Qt::ImhLowercaseOnly, CAPACITY_LOWERCASE) - CHECK_HINTS(Qt::ImhDialableCharactersOnly, CAPACITY_DIALABLE) - CHECK_HINTS(Qt::ImhEmailCharactersOnly, CAPACITY_EMAIL) - } - - bool setSurrounding = false; - do { - if (!m_useSurroundingText) - break; - if (!((queries & Qt::ImSurroundingText) && (queries & Qt::ImCursorPosition))) - break; - if (data->capacity.testFlag(CAPACITY_PASSWORD)) - break; - QVariant var = query.value(Qt::ImSurroundingText); - QVariant var1 = query.value(Qt::ImCursorPosition); - QVariant var2 = query.value(Qt::ImAnchorPosition); - if (!var.isValid() || !var1.isValid()) - break; - QString text = var.toString(); - /* we don't want to waste too much memory here */ -#define SURROUNDING_THRESHOLD 4096 - if (text.length() < SURROUNDING_THRESHOLD) { - if (_utf8_check_string(text.toUtf8().data())) { - addCapacity(data, CAPACITY_SURROUNDING_TEXT); - - int cursor = var1.toInt(); - int anchor; - if (var2.isValid()) - anchor = var2.toInt(); - else - anchor = cursor; - if (data->surroundingText != text) { - data->surroundingText = text; - proxy->SetSurroundingText(text, cursor, anchor); - } - else { - if (data->surroundingAnchor != anchor || - data->surroundingCursor != cursor) - proxy->SetSurroundingTextPosition(cursor, anchor); - } - data->surroundingCursor = cursor; - data->surroundingAnchor = anchor; - setSurrounding = true; - } - } - if (!setSurrounding) { - data->surroundingAnchor = -1; - data->surroundingCursor = -1; - data->surroundingText = QString::null; - removeCapacity(data, CAPACITY_SURROUNDING_TEXT); - } - } while(0); -} - -void QFcitxPlatformInputContext::commit() -{ - QPlatformInputContext::commit(); -} - -void QFcitxPlatformInputContext::setFocusObject(QObject* object) -{ - FcitxQtInputContextProxy* proxy = validICByWId(m_lastWId); - if (proxy) { - proxy->FocusOut(); - } - - QWindow *window = qApp->focusWindow(); - if (window) { - m_lastWId = window->winId(); - } else { - m_lastWId = 0; - return; - } - proxy = validICByWindow(window); - if (proxy) - proxy->FocusIn(); - else { - FcitxQtICData* data = m_icMap.value(window->winId()); - if (!data) { - createICData(window); - return; - } - } -} - -void QFcitxPlatformInputContext::windowDestroyed(QObject* object) -{ - /* access QWindow is not possible here, so we use our own map to do so */ - WId wid = m_windowToWidMap.take(object); - if (!wid) - return; - FcitxQtICData* data = m_icMap.take(wid); - if (!data) - return; - - delete data; - // qDebug() << "Window Destroyed and we destroy IC correctly, horray!"; -} - -void QFcitxPlatformInputContext::cursorRectChanged() -{ - QWindow *inputWindow = qApp->focusWindow(); - if (!inputWindow) - return; - FcitxQtInputContextProxy* proxy = validICByWindow(inputWindow); - if (!proxy) - return; - - FcitxQtICData* data = m_icMap.value(inputWindow->winId()); - - QRect r = qApp->inputMethod()->cursorRectangle().toRect(); - if(!r.isValid()) - return; - - r.moveTopLeft(inputWindow->mapToGlobal(r.topLeft())); - - qreal scale = inputWindow->devicePixelRatio(); - if (data->rect != r) { - data->rect = r; - proxy->SetCursorRect(r.x() * scale, r.y() * scale, - r.width() * scale, r.height() * scale); - } -} - -void QFcitxPlatformInputContext::createInputContext(WId w) -{ - if (!m_connection->isConnected()) - return; - - // qDebug() << "create Input Context" << m_connection->connection()->name(); - - if (m_improxy) { - delete m_improxy; - m_improxy = NULL; - } - m_improxy = new FcitxQtInputMethodProxy(m_connection->serviceName(), QLatin1String("/inputmethod"), *m_connection->connection(), this); - - if (!m_improxy->isValid()) - return; - - QFileInfo info(QCoreApplication::applicationFilePath()); - QDBusPendingReply< int, bool, uint, uint, uint, uint > result = m_improxy->CreateICv3(info.fileName(), QCoreApplication::applicationPid()); - QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(result); - watcher->setProperty("wid", (qulonglong) w); - connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(createInputContextFinished(QDBusPendingCallWatcher*))); -} - -void QFcitxPlatformInputContext::createInputContextFinished(QDBusPendingCallWatcher* watcher) -{ - WId w = watcher->property("wid").toULongLong(); - FcitxQtICData* data = m_icMap.value(w); - if (!data) - return; - - QDBusPendingReply< int, bool, uint, uint, uint, uint > result = *watcher; - - do { - if (result.isError()) { - break; - } - - if (!m_connection->isConnected()) - break; - - int id = qdbus_cast(result.argumentAt(0)); - QString path = QString("/inputcontext_%1").arg(id); - if (data->proxy) { - delete data->proxy; - } - data->proxy = new FcitxQtInputContextProxy(m_connection->serviceName(), path, *m_connection->connection(), this); - connect(data->proxy, SIGNAL(CommitString(QString)), this, SLOT(commitString(QString))); - connect(data->proxy, SIGNAL(ForwardKey(uint, uint, int)), this, SLOT(forwardKey(uint, uint, int))); - connect(data->proxy, SIGNAL(UpdateFormattedPreedit(FcitxQtFormattedPreeditList,int)), this, SLOT(updateFormattedPreedit(FcitxQtFormattedPreeditList,int))); - connect(data->proxy, SIGNAL(DeleteSurroundingText(int,uint)), this, SLOT(deleteSurroundingText(int,uint))); - - if (data->proxy->isValid()) { - QWindow* window = qApp->focusWindow(); - if (window && window->winId() == w) - data->proxy->FocusIn(); - } - - QFlags flag; - flag |= CAPACITY_PREEDIT; - flag |= CAPACITY_FORMATTED_PREEDIT; - flag |= CAPACITY_CLIENT_UNFOCUS_COMMIT; - m_useSurroundingText = get_boolean_env("FCITX_QT_ENABLE_SURROUNDING_TEXT", true); - if (m_useSurroundingText) - flag |= CAPACITY_SURROUNDING_TEXT; - - /* - * event loop will cause some problem, so we tries to use async way. - */ - m_syncMode = get_boolean_env("FCITX_QT_USE_SYNC", false); - - addCapacity(data, flag, true); - } while(0); - delete watcher; -} - -void QFcitxPlatformInputContext::updateCapacity(FcitxQtICData* data) -{ - if (!data->proxy || !data->proxy->isValid()) - return; - - QDBusPendingReply< void > result = data->proxy->SetCapacity((uint) data->capacity); -} - -void QFcitxPlatformInputContext::commitString(const QString& str) -{ - m_cursorPos = 0; - m_preeditList.clear(); - m_commitPreedit.clear(); - QObject *input = qApp->focusObject(); - if (!input) - return; - - QInputMethodEvent event; - event.setCommitString(str); - QCoreApplication::sendEvent(input, &event); -} - -void QFcitxPlatformInputContext::updateFormattedPreedit(const FcitxQtFormattedPreeditList& preeditList, int cursorPos) -{ - QObject *input = qApp->focusObject(); - if (!input) - return; - if (cursorPos == m_cursorPos && preeditList == m_preeditList) - return; - m_preeditList = preeditList; - m_cursorPos = cursorPos; - QString str, commitStr; - int pos = 0; - QList attrList; - Q_FOREACH(const FcitxQtFormattedPreedit& preedit, preeditList) - { - str += preedit.string(); - if (!(preedit.format() & MSG_DONOT_COMMIT_WHEN_UNFOCUS)) - commitStr += preedit.string(); - QTextCharFormat format; - if ((preedit.format() & MSG_NOUNDERLINE) == 0) { - format.setUnderlineStyle(QTextCharFormat::DashUnderline); - } - if (preedit.format() & MSG_HIGHLIGHT) { - QBrush brush; - QPalette palette; - palette = QGuiApplication::palette(); - format.setBackground(QBrush(QColor(palette.color(QPalette::Active, QPalette::Highlight)))); - format.setForeground(QBrush(QColor(palette.color(QPalette::Active, QPalette::HighlightedText)))); - } - attrList.append(QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, pos, preedit.string().length(), format)); - pos += preedit.string().length(); - } - - QByteArray array = str.toUtf8(); - array.truncate(cursorPos); - cursorPos = QString::fromUtf8(array).length(); - - attrList.append(QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, cursorPos, 1, 0)); - m_preedit = str; - m_commitPreedit = commitStr; - QInputMethodEvent event(str, attrList); - QCoreApplication::sendEvent(input, &event); - update(Qt::ImCursorRectangle); -} - -void QFcitxPlatformInputContext::deleteSurroundingText(int offset, uint nchar) -{ - QObject *input = qApp->focusObject(); - if (!input) - return; - - QInputMethodEvent event; - event.setCommitString("", offset, nchar); - QCoreApplication::sendEvent(input, &event); -} - -void QFcitxPlatformInputContext::forwardKey(uint keyval, uint state, int type) -{ - QObject *input = qApp->focusObject(); - if (input != NULL) { - key_filtered = true; - QKeyEvent *keyevent = createKeyEvent(keyval, state, type); - QCoreApplication::sendEvent(input, keyevent); - delete keyevent; - key_filtered = false; - } -} - -void QFcitxPlatformInputContext::createICData(QWindow* w) -{ - FcitxQtICData* data = m_icMap.value(w->winId()); - if (!data) { - data = new FcitxQtICData; - m_icMap[w->winId()] = data; - m_windowToWidMap[w] = w->winId(); - connect(w, SIGNAL(destroyed(QObject*)), this, SLOT(windowDestroyed(QObject*))); - } - createInputContext(w->winId()); -} - -QKeyEvent* QFcitxPlatformInputContext::createKeyEvent(uint keyval, uint state, int type) -{ - Qt::KeyboardModifiers qstate = Qt::NoModifier; - - int count = 1; - if (state & FcitxKeyState_Alt) { - qstate |= Qt::AltModifier; - count ++; - } - - if (state & FcitxKeyState_Shift) { - qstate |= Qt::ShiftModifier; - count ++; - } - - if (state & FcitxKeyState_Ctrl) { - qstate |= Qt::ControlModifier; - count ++; - } - - int key; - symToKeyQt(keyval, key); - - QKeyEvent* keyevent = new QKeyEvent( - (type == FCITX_PRESS_KEY) ? (QEvent::KeyPress) : (QEvent::KeyRelease), - key, - qstate, - QString(), - false, - count - ); - - return keyevent; -} - -bool QFcitxPlatformInputContext::filterEvent(const QEvent* event) -{ - do { - if (event->type() != QEvent::KeyPress && event->type() != QEvent::KeyRelease) { - break; - } - - const QKeyEvent* keyEvent = static_cast(event); - quint32 keyval = keyEvent->nativeVirtualKey(); - quint32 keycode = keyEvent->nativeScanCode(); - quint32 state = keyEvent->nativeModifiers(); - bool press = keyEvent->type() == QEvent::KeyPress; - - if (key_filtered) { - break; - } - - if (!inputMethodAccepted()) - break; - - QObject *input = qApp->focusObject(); - - if (!input) { - break; - } - - FcitxQtInputContextProxy* proxy = validICByWindow(qApp->focusWindow()); - - if (!proxy) { - if (filterEventFallback(keyval, keycode, state, press)) { - return true; - } else { - break; - } - } - - proxy->FocusIn(); - - QDBusPendingReply< int > reply = proxy->ProcessKeyEvent(keyval, - keycode, - state, - (press) ? FCITX_PRESS_KEY : FCITX_RELEASE_KEY, - QDateTime::currentDateTime().toTime_t()); - - - if (Q_UNLIKELY(m_syncMode)) { - reply.waitForFinished(); - - if (!m_connection->isConnected() || !reply.isFinished() || reply.isError() || reply.value() <= 0) { - if (filterEventFallback(keyval, keycode, state, press)) { - return true; - } else { - break; - } - } else { - update(Qt::ImCursorRectangle); - return true; - } - } - else { - ProcessKeyWatcher* watcher = new ProcessKeyWatcher(*keyEvent, qApp->focusWindow(), reply, this); - connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), - this, SLOT(processKeyEventFinished(QDBusPendingCallWatcher*))); - return true; - } - } while(0); - return QPlatformInputContext::filterEvent(event); -} - -void QFcitxPlatformInputContext::processKeyEventFinished(QDBusPendingCallWatcher* w) -{ - ProcessKeyWatcher* watcher = static_cast(w); - QDBusPendingReply< int > result(*watcher); - bool filtered = false; - - QWindow* window = watcher->window(); - // if window is already destroyed, we can only throw this event away. - if (!window) { - return; - } - - const QKeyEvent& keyEvent = watcher->event(); - - // use same variable name as in QXcbKeyboard::handleKeyEvent - QEvent::Type type = keyEvent.type(); - int qtcode = keyEvent.key(); - Qt::KeyboardModifiers modifiers = keyEvent.modifiers(); - quint32 code = keyEvent.nativeScanCode(); - quint32 sym = keyEvent.nativeVirtualKey(); - quint32 state = keyEvent.nativeModifiers(); - QString string = keyEvent.text(); - bool isAutoRepeat = keyEvent.isAutoRepeat(); - ulong time = keyEvent.timestamp(); - - if (result.isError() || result.value() <= 0) { - filtered = filterEventFallback(sym, code, state, type == QEvent::KeyPress); - } else { - filtered = true; - } - - if (!result.isError()) { - update(Qt::ImCursorRectangle); - } - - if (!filtered) { - // copied from QXcbKeyboard::handleKeyEvent() - if (type == QEvent::KeyPress && qtcode == Qt::Key_Menu) { - const QPoint globalPos = window->screen()->handle()->cursor()->pos(); - const QPoint pos = window->mapFromGlobal(globalPos); QWindowSystemInterface::handleContextMenuEvent(window, false, pos, globalPos, modifiers); - } - QWindowSystemInterface::handleExtendedKeyEvent(window, time, type, qtcode, modifiers, - code, sym, state, string, isAutoRepeat); - } - - delete watcher; -} - - -bool QFcitxPlatformInputContext::filterEventFallback(uint keyval, uint keycode, uint state, bool press) -{ - Q_UNUSED(keycode); - if (processCompose(keyval, state, (press) ? FCITX_PRESS_KEY : FCITX_RELEASE_KEY)) { - return true; - } - return false; -} - -FcitxQtInputContextProxy* QFcitxPlatformInputContext::validIC() -{ - if (m_icMap.isEmpty()) { - return 0; - } - QWindow* window = qApp->focusWindow(); - return validICByWindow(window); -} - -FcitxQtInputContextProxy* QFcitxPlatformInputContext::validICByWId(WId wid) -{ - if (m_icMap.isEmpty()) { - return 0; - } - FcitxQtICData* icData = m_icMap.value(wid); - if (!icData) - return 0; - if (icData->proxy.isNull()) { - return 0; - } else if (icData->proxy->isValid()) { - return icData->proxy.data(); - } - return 0; -} - -FcitxQtInputContextProxy* QFcitxPlatformInputContext::validICByWindow(QWindow* w) -{ - if (!w) { - return 0; - } - - if (m_icMap.isEmpty()) { - return 0; - } - return validICByWId(w->winId()); -} - - -bool QFcitxPlatformInputContext::processCompose(uint keyval, uint state, FcitxKeyEventType event) -{ - Q_UNUSED(state); - - if (!m_xkbComposeTable || event == FCITX_RELEASE_KEY) - return false; - - struct xkb_compose_state* xkbComposeState = m_xkbComposeState.data(); - - enum xkb_compose_feed_result result = xkb_compose_state_feed(xkbComposeState, keyval); - if (result == XKB_COMPOSE_FEED_IGNORED) { - return false; - } - - enum xkb_compose_status status = xkb_compose_state_get_status(xkbComposeState); - if (status == XKB_COMPOSE_NOTHING) { - return 0; - } else if (status == XKB_COMPOSE_COMPOSED) { - char buffer[] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0'}; - int length = xkb_compose_state_get_utf8(xkbComposeState, buffer, sizeof(buffer)); - xkb_compose_state_reset(xkbComposeState); - if (length != 0) { - commitString(QString::fromUtf8(buffer)); - } - - } else if (status == XKB_COMPOSE_CANCELLED) { - xkb_compose_state_reset(xkbComposeState); - } - - return true; -} - - -// kate: indent-mode cstyle; space-indent on; indent-width 0; diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/qfcitxplatforminputcontext.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/qfcitxplatforminputcontext.h deleted file mode 100644 index 137127891..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/qfcitxplatforminputcontext.h +++ /dev/null @@ -1,269 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2013 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef QFCITXPLATFORMINPUTCONTEXT_H -#define QFCITXPLATFORMINPUTCONTEXT_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "fcitxqtformattedpreedit.h" -#include "fcitxqtinputcontextproxy.h" - -#define MAX_COMPOSE_LEN 7 - -class FcitxQtConnection; -class QFileSystemWatcher; -enum FcitxKeyEventType { - FCITX_PRESS_KEY, - FCITX_RELEASE_KEY -}; - -enum FcitxCapacityFlags { - CAPACITY_NONE = 0, - CAPACITY_CLIENT_SIDE_UI = (1 << 0), - CAPACITY_PREEDIT = (1 << 1), - CAPACITY_CLIENT_SIDE_CONTROL_STATE = (1 << 2), - CAPACITY_PASSWORD = (1 << 3), - CAPACITY_FORMATTED_PREEDIT = (1 << 4), - CAPACITY_CLIENT_UNFOCUS_COMMIT = (1 << 5), - CAPACITY_SURROUNDING_TEXT = (1 << 6), - CAPACITY_EMAIL = (1 << 7), - CAPACITY_DIGIT = (1 << 8), - CAPACITY_UPPERCASE = (1 << 9), - CAPACITY_LOWERCASE = (1 << 10), - CAPACITY_NOAUTOUPPERCASE = (1 << 11), - CAPACITY_URL = (1 << 12), - CAPACITY_DIALABLE = (1 << 13), - CAPACITY_NUMBER = (1 << 14), - CAPACITY_NO_ON_SCREEN_KEYBOARD = (1 << 15), - CAPACITY_SPELLCHECK = (1 << 16), - CAPACITY_NO_SPELLCHECK = (1 << 17), - CAPACITY_WORD_COMPLETION = (1 << 18), - CAPACITY_UPPERCASE_WORDS = (1 << 19), - CAPACITY_UPPERCASE_SENTENCES = (1 << 20), - CAPACITY_ALPHA = (1 << 21), - CAPACITY_NAME = (1 << 22) -} ; - -/** message type and flags */ -enum FcitxMessageType { - MSG_TYPE_FIRST = 0, - MSG_TYPE_LAST = 6, - MSG_TIPS = 0, /**< Hint Text */ - MSG_INPUT = 1, /**< User Input */ - MSG_INDEX = 2, /**< Index Number */ - MSG_FIRSTCAND = 3, /**< First candidate */ - MSG_USERPHR = 4, /**< User Phrase */ - MSG_CODE = 5, /**< Typed character */ - MSG_OTHER = 6, /**< Other Text */ - MSG_NOUNDERLINE = (1 << 3), /**< backward compatible, no underline is a flag */ - MSG_HIGHLIGHT = (1 << 4), /**< highlight the preedit */ - MSG_DONOT_COMMIT_WHEN_UNFOCUS = (1 << 5), /**< backward compatible */ - MSG_REGULAR_MASK = 0x7 /**< regular color type mask */ -}; - - -enum FcitxKeyState { - FcitxKeyState_None = 0, - FcitxKeyState_Shift = 1 << 0, - FcitxKeyState_CapsLock = 1 << 1, - FcitxKeyState_Ctrl = 1 << 2, - FcitxKeyState_Alt = 1 << 3, - FcitxKeyState_Alt_Shift = FcitxKeyState_Alt | FcitxKeyState_Shift, - FcitxKeyState_Ctrl_Shift = FcitxKeyState_Ctrl | FcitxKeyState_Shift, - FcitxKeyState_Ctrl_Alt = FcitxKeyState_Ctrl | FcitxKeyState_Alt, - FcitxKeyState_Ctrl_Alt_Shift = FcitxKeyState_Ctrl | FcitxKeyState_Alt | FcitxKeyState_Shift, - FcitxKeyState_NumLock = 1 << 4, - FcitxKeyState_Super = 1 << 6, - FcitxKeyState_ScrollLock = 1 << 7, - FcitxKeyState_MousePressed = 1 << 8, - FcitxKeyState_HandledMask = 1 << 24, - FcitxKeyState_IgnoredMask = 1 << 25, - FcitxKeyState_Super2 = 1 << 26, - FcitxKeyState_Hyper = 1 << 27, - FcitxKeyState_Meta = 1 << 28, - FcitxKeyState_UsedMask = 0x5c001fff -}; - -struct FcitxQtICData { - FcitxQtICData() : capacity(0), proxy(0), surroundingAnchor(-1), surroundingCursor(-1) {} - ~FcitxQtICData() { - if (proxy && proxy->isValid()) { - proxy->DestroyIC(); - delete proxy; - } - } - QFlags capacity; - QPointer proxy; - QRect rect; - QString surroundingText; - int surroundingAnchor; - int surroundingCursor; -}; - - -class ProcessKeyWatcher : public QDBusPendingCallWatcher -{ - Q_OBJECT -public: - ProcessKeyWatcher(const QKeyEvent& event, QWindow* window, const QDBusPendingCall &call, QObject *parent = 0) : - QDBusPendingCallWatcher(call, parent) - ,m_event(event.type(), event.key(), event.modifiers(), - event.nativeScanCode(), event.nativeVirtualKey(), event.nativeModifiers(), - event.text(), event.isAutoRepeat(), event.count()) - ,m_window(window) - { - } - - virtual ~ProcessKeyWatcher() { - } - - const QKeyEvent& event() { - return m_event; - } - - QWindow* window() { - return m_window.data(); - } - -private: - QKeyEvent m_event; - QPointer m_window; -}; - -struct XkbContextDeleter -{ - static inline void cleanup(struct xkb_context* pointer) - { - if (pointer) xkb_context_unref(pointer); - } -}; - -struct XkbComposeTableDeleter -{ - static inline void cleanup(struct xkb_compose_table* pointer) - { - if (pointer) xkb_compose_table_unref(pointer); - } -}; - -struct XkbComposeStateDeleter -{ - static inline void cleanup(struct xkb_compose_state* pointer) - { - if (pointer) xkb_compose_state_unref(pointer); - } -}; - -class FcitxQtInputMethodProxy; - -class QFcitxPlatformInputContext : public QPlatformInputContext -{ - Q_OBJECT -public: - QFcitxPlatformInputContext(); - virtual ~QFcitxPlatformInputContext(); - - virtual bool filterEvent(const QEvent* event); - virtual bool isValid() const; - virtual void invokeAction(QInputMethod::Action , int cursorPosition); - virtual void reset(); - virtual void commit(); - virtual void update(Qt::InputMethodQueries quries ); - virtual void setFocusObject(QObject* object); - - -public Q_SLOTS: - void cursorRectChanged(); - void commitString(const QString& str); - void updateFormattedPreedit(const FcitxQtFormattedPreeditList& preeditList, int cursorPos); - void deleteSurroundingText(int offset, uint nchar); - void forwardKey(uint keyval, uint state, int type); - void createInputContextFinished(QDBusPendingCallWatcher* watcher); - void connected(); - void cleanUp(); - void windowDestroyed(QObject* object); - - -private: - void createInputContext(WId w); - bool processCompose(uint keyval, uint state, FcitxKeyEventType event); - bool checkAlgorithmically(); - bool checkCompactTable(const struct _FcitxComposeTableCompact *table); - QKeyEvent* createKeyEvent(uint keyval, uint state, int type); - - - void addCapacity(FcitxQtICData* data, QFlags capacity, bool forceUpdate = false) - { - QFlags< FcitxCapacityFlags > newcaps = data->capacity | capacity; - if (data->capacity != newcaps || forceUpdate) { - data->capacity = newcaps; - updateCapacity(data); - } - } - - void removeCapacity(FcitxQtICData* data, QFlags capacity, bool forceUpdate = false) - { - QFlags< FcitxCapacityFlags > newcaps = data->capacity & (~capacity); - if (data->capacity != newcaps || forceUpdate) { - data->capacity = newcaps; - updateCapacity(data); - } - } - - void updateCapacity(FcitxQtICData* data); - void commitPreedit(); - void createICData(QWindow* w); - FcitxQtInputContextProxy* validIC(); - FcitxQtInputContextProxy* validICByWindow(QWindow* window); - FcitxQtInputContextProxy* validICByWId(WId wid); - bool filterEventFallback(uint keyval, uint keycode, uint state, bool press); - - FcitxQtInputMethodProxy* m_improxy; - uint m_compose_buffer[MAX_COMPOSE_LEN + 1]; - int m_n_compose; - QString m_preedit; - QString m_commitPreedit; - FcitxQtFormattedPreeditList m_preeditList; - int m_cursorPos; - bool m_useSurroundingText; - bool m_syncMode; - FcitxQtConnection* m_connection; - QString m_lastSurroundingText; - int m_lastSurroundingAnchor; - int m_lastSurroundingCursor; - QHash m_icMap; - QHash m_windowToWidMap; - WId m_lastWId; - bool m_destroy; - QScopedPointer m_xkbContext; - QScopedPointer m_xkbComposeTable; - QScopedPointer m_xkbComposeState; -private slots: - void processKeyEventFinished(QDBusPendingCallWatcher*); -}; - -#endif // QFCITXPLATFORMINPUTCONTEXT_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/utils.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/utils.cpp deleted file mode 100644 index fe4eda1d0..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/utils.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2013 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#include "utils.h" -/** check utf8 character */ -#define ISUTF8_CB(c) (((c)&0xc0) == 0x80) - -#define CONT(i) ISUTF8_CB(in[i]) -#define VAL(i, s) ((in[i]&0x3f) << s) - -#define UTF8_LENGTH(Char) \ - ((Char) < 0x80 ? 1 : \ - ((Char) < 0x800 ? 2 : \ - ((Char) < 0x10000 ? 3 : \ - ((Char) < 0x200000 ? 4 : \ - ((Char) < 0x4000000 ? 5 : 6))))) - -#define UNICODE_VALID(Char) \ - ((Char) < 0x110000 && \ - (((Char) & 0xFFFFF800) != 0xD800) && \ - ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \ - ((Char) & 0xFFFE) != 0xFFFE) - -int -_utf8_get_char_extended(const char *s, - int max_len) -{ - const unsigned char*p = (const unsigned char*)s; - int i, len; - unsigned int wc = (unsigned char) * p; - - if (wc < 0x80) { - return wc; - } else if (wc < 0xc0) { - return (unsigned int) - 1; - } else if (wc < 0xe0) { - len = 2; - wc &= 0x1f; - } else if (wc < 0xf0) { - len = 3; - wc &= 0x0f; - } else if (wc < 0xf8) { - len = 4; - wc &= 0x07; - } else if (wc < 0xfc) { - len = 5; - wc &= 0x03; - } else if (wc < 0xfe) { - len = 6; - wc &= 0x01; - } else { - return (unsigned int) - 1; - } - - if (max_len >= 0 && len > max_len) { - for (i = 1; i < max_len; i++) { - if ((((unsigned char *)p)[i] & 0xc0) != 0x80) - return (unsigned int) - 1; - } - - return (unsigned int) - 2; - } - - for (i = 1; i < len; ++i) { - unsigned int ch = ((unsigned char *)p)[i]; - - if ((ch & 0xc0) != 0x80) { - if (ch) - return (unsigned int) - 1; - else - return (unsigned int) - 2; - } - - wc <<= 6; - - wc |= (ch & 0x3f); - } - - if (UTF8_LENGTH(wc) != len) - return (unsigned int) - 1; - - return wc; -} - -int _utf8_get_char_validated(const char *p, - int max_len) -{ - int result; - - if (max_len == 0) - return -2; - - result = _utf8_get_char_extended(p, max_len); - - if (result & 0x80000000) - return result; - else if (!UNICODE_VALID(result)) - return -1; - else - return result; -} - - -char * -_utf8_get_char(const char *i, uint32_t *chr) -{ - const unsigned char* in = (const unsigned char *)i; - if (!(in[0] & 0x80)) { - *(chr) = *(in); - return (char *)in + 1; - } - - /* 2-byte, 0x80-0x7ff */ - if ((in[0] & 0xe0) == 0xc0 && CONT(1)) { - *chr = ((in[0] & 0x1f) << 6) | VAL(1, 0); - return (char *)in + 2; - } - - /* 3-byte, 0x800-0xffff */ - if ((in[0] & 0xf0) == 0xe0 && CONT(1) && CONT(2)) { - *chr = ((in[0] & 0xf) << 12) | VAL(1, 6) | VAL(2, 0); - return (char *)in + 3; - } - - /* 4-byte, 0x10000-0x1FFFFF */ - if ((in[0] & 0xf8) == 0xf0 && CONT(1) && CONT(2) && CONT(3)) { - *chr = ((in[0] & 0x7) << 18) | VAL(1, 12) | VAL(2, 6) | VAL(3, 0); - return (char *)in + 4; - } - - /* 5-byte, 0x200000-0x3FFFFFF */ - if ((in[0] & 0xfc) == 0xf8 && CONT(1) && CONT(2) && CONT(3) && CONT(4)) { - *chr = ((in[0] & 0x3) << 24) | VAL(1, 18) | VAL(2, 12) | VAL(3, 6) | VAL(4, 0); - return (char *)in + 5; - } - - /* 6-byte, 0x400000-0x7FFFFFF */ - if ((in[0] & 0xfe) == 0xfc && CONT(1) && CONT(2) && CONT(3) && CONT(4) && CONT(5)) { - *chr = ((in[0] & 0x1) << 30) | VAL(1, 24) | VAL(2, 18) | VAL(3, 12) | VAL(4, 6) | VAL(5, 0); - return (char *)in + 6; - } - - *chr = *in; - - return (char *)in + 1; -} - - -int _utf8_check_string(const char *s) -{ - while (*s) { - uint32_t chr; - - if (_utf8_get_char_validated(s, 6) < 0) - return 0; - - s = _utf8_get_char(s, &chr); - } - - return 1; -} diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/utils.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/utils.h deleted file mode 100644 index ae0c79cd1..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/utils.h +++ /dev/null @@ -1,35 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2012~2013 by CSSlayer * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * - ***************************************************************************/ - -#ifndef UTILS_H -#define UTILS_H - -#include - -int -_utf8_get_char_extended(const char *s, - int max_len); -int _utf8_get_char_validated(const char *p, - int max_len); -char * -_utf8_get_char(const char *i, uint32_t *chr); -int _utf8_check_string(const char *s); - - -#endif // UTILS_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-compat.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-compat.h deleted file mode 100644 index 299732fdc..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-compat.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright © 2012 Daniel Stone - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone - */ - -#ifndef _XKBCOMMON_COMPAT_H -#define _XKBCOMMON_COMPAT_H - -/** - * Renamed keymap API. - */ -#define xkb_group_index_t xkb_layout_index_t -#define xkb_group_mask_t xkb_layout_mask_t -#define xkb_map_compile_flags xkb_keymap_compile_flags -#define XKB_GROUP_INVALID XKB_LAYOUT_INVALID - -#define XKB_STATE_DEPRESSED \ - (XKB_STATE_MODS_DEPRESSED | XKB_STATE_LAYOUT_DEPRESSED) -#define XKB_STATE_LATCHED \ - (XKB_STATE_MODS_LATCHED | XKB_STATE_LAYOUT_LATCHED) -#define XKB_STATE_LOCKED \ - (XKB_STATE_MODS_LOCKED | XKB_STATE_LAYOUT_LOCKED) -#define XKB_STATE_EFFECTIVE \ - (XKB_STATE_DEPRESSED | XKB_STATE_LATCHED | XKB_STATE_LOCKED | \ - XKB_STATE_MODS_EFFECTIVE | XKB_STATE_LAYOUT_EFFECTIVE) - -#define xkb_map_new_from_names(context, names, flags) \ - xkb_keymap_new_from_names(context, names, flags) -#define xkb_map_new_from_file(context, file, format, flags) \ - xkb_keymap_new_from_file(context, file, format, flags) -#define xkb_map_new_from_string(context, string, format, flags) \ - xkb_keymap_new_from_string(context, string, format, flags) -#define xkb_map_get_as_string(keymap) \ - xkb_keymap_get_as_string(keymap, XKB_KEYMAP_FORMAT_TEXT_V1) -#define xkb_map_ref(keymap) xkb_keymap_ref(keymap) -#define xkb_map_unref(keymap) xkb_keymap_unref(keymap) - -#define xkb_map_num_mods(keymap) xkb_keymap_num_mods(keymap) -#define xkb_map_mod_get_name(keymap, idx) xkb_keymap_mod_get_name(keymap, idx) -#define xkb_map_mod_get_index(keymap, str) xkb_keymap_mod_get_index(keymap, str) -#define xkb_key_mod_index_is_consumed(state, key, mod) \ - xkb_state_mod_index_is_consumed(state, key, mod) -#define xkb_key_mod_mask_remove_consumed(state, key, modmask) \ - xkb_state_mod_mask_remove_consumed(state, key, modmask) - -#define xkb_map_num_groups(keymap) xkb_keymap_num_layouts(keymap) -#define xkb_key_num_groups(keymap, key) \ - xkb_keymap_num_layouts_for_key(keymap, key) -#define xkb_map_group_get_name(keymap, idx) \ - xkb_keymap_layout_get_name(keymap, idx) -#define xkb_map_group_get_index(keymap, str) \ - xkb_keymap_layout_get_index(keymap, str) - -#define xkb_map_num_leds(keymap) xkb_keymap_num_leds(keymap) -#define xkb_map_led_get_name(keymap, idx) xkb_keymap_led_get_name(keymap, idx) -#define xkb_map_led_get_index(keymap, str) \ - xkb_keymap_led_get_index(keymap, str) - -#define xkb_key_repeats(keymap, key) xkb_keymap_key_repeats(keymap, key) - -#define xkb_key_get_syms(state, key, syms_out) \ - xkb_state_key_get_syms(state, key, syms_out) - -#define xkb_state_group_name_is_active(state, name, type) \ - xkb_state_layout_name_is_active(state, name, type) -#define xkb_state_group_index_is_active(state, idx, type) \ - xkb_state_layout_index_is_active(state, idx, type) - -#define xkb_state_serialize_group(state, component) \ - xkb_state_serialize_layout(state, component) - -#define xkb_state_get_map(state) xkb_state_get_keymap(state) - -/* Not needed anymore, since there's NO_FLAGS. */ -#define XKB_MAP_COMPILE_PLACEHOLDER XKB_KEYMAP_COMPILE_NO_FLAGS -#define XKB_MAP_COMPILE_NO_FLAGS XKB_KEYMAP_COMPILE_NO_FLAGS - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-compose.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-compose.h deleted file mode 100644 index 7414c373b..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-compose.h +++ /dev/null @@ -1,488 +0,0 @@ -/* - * Copyright © 2013 Ran Benita - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef _XKBCOMMON_COMPOSE_H -#define _XKBCOMMON_COMPOSE_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @file - * libxkbcommon Compose API - support for Compose and dead-keys. - */ - -/** - * @defgroup compose Compose and dead-keys support - * Support for Compose and dead-keys. - * @since 0.5.0 - * - * @{ - */ - -/** - * @page compose-overview Overview - * @parblock - * - * Compose and dead-keys are a common feature of many keyboard input - * systems. They extend the range of the keysysm that can be produced - * directly from a keyboard by using a sequence of key strokes, instead - * of just one. - * - * Here are some example sequences, in the libX11 Compose file format: - * - * : "á" aacute # LATIN SMALL LETTER A WITH ACUTE - * : "@" at # COMMERCIAL AT - * - * When the user presses a key which produces the `` keysym, - * nothing initially happens (thus the key is dubbed a "dead-key"). But - * when the user enters ``, "á" is "composed", in place of "a". If - * instead the user had entered a keysym which does not follow - * `` in any compose sequence, the sequence is said to be - * "cancelled". - * - * Compose files define many such sequences. For a description of the - * common file format for Compose files, see the Compose(5) man page. - * - * A successfuly-composed sequence has two results: a keysym and a UTF-8 - * string. At least one of the two is defined for each sequence. If only - * a keysym is given, the keysym's string representation is used for the - * result string (using xkb_keysym_to_utf8()). - * - * This library provides low-level support for Compose file parsing and - * processing. Higher-level APIs (such as libX11's `Xutf8LookupString`(3)) - * may be built upon it, or it can be used directly. - * - * @endparblock - */ - -/** - * @page compose-conflicting Conflicting Sequences - * @parblock - * - * To avoid ambiguity, a sequence is not allowed to be a prefix of another. - * In such a case, the conflict is resolved thus: - * - * 1. A longer sequence overrides a shorter one. - * 2. An equal sequence overrides an existing one. - * 3. A shorter sequence does not override a longer one. - * - * Sequences of length 1 are allowed. - * - * @endparblock - */ - -/** - * @page compose-cancellation Cancellation Behavior - * @parblock - * - * What should happen when a sequence is cancelled? For example, consider - * there are only the above sequences, and the input keysyms are - * ` `. There are a few approaches: - * - * 1. Swallow the cancelling keysym; that is, no keysym is produced. - * This is the approach taken by libX11. - * 2. Let the cancelling keysym through; that is, `` is produced. - * 3. Replay the entire sequence; that is, ` ` is produced. - * This is the approach taken by Microsoft Windows (approximately; - * instead of ``, the underlying key is used. This is - * difficult to simulate with XKB keymaps). - * - * You can program whichever approach best fits users' expectations. - * - * @endparblock - */ - -/** - * @struct xkb_compose_table - * Opaque Compose table object. - * - * The compose table holds the definitions of the Compose sequences, as - * gathered from Compose files. It is immutable. - */ -struct xkb_compose_table; - -/** - * @struct xkb_compose_state - * Opaque Compose state object. - * - * The compose state maintains state for compose sequence matching, such - * as which possible sequences are being matched, and the position within - * these sequences. It acts as a simple state machine wherein keysyms are - * the input, and composed keysyms and strings are the output. - * - * The compose state is usually associated with a keyboard device. - */ -struct xkb_compose_state; - -/** Flags affecting Compose file compilation. */ -enum xkb_compose_compile_flags { - /** Do not apply any flags. */ - XKB_COMPOSE_COMPILE_NO_FLAGS = 0 -}; - -/** The recognized Compose file formats. */ -enum xkb_compose_format { - /** The classic libX11 Compose text format, described in Compose(5). */ - XKB_COMPOSE_FORMAT_TEXT_V1 = 1 -}; - -/** - * @page compose-locale Compose Locale - * @parblock - * - * Compose files are locale dependent: - * - Compose files are written for a locale, and the locale is used when - * searching for the appropriate file to use. - * - Compose files may reference the locale internally, with directives - * such as \%L. - * - * As such, functions like xkb_compose_table_new_from_locale() require - * a `locale` parameter. This will usually be the current locale (see - * locale(7) for more details). You may also want to allow the user to - * explicitly configure it, so he can use the Compose file of a given - * locale, but not use that locale for other things. - * - * You may query the current locale as follows: - * @code - * const char *locale; - * locale = setlocale(LC_CTYPE, NULL); - * @endcode - * - * This will only give useful results if the program had previously set - * the current locale using setlocale(3), with `LC_CTYPE` or `LC_ALL` - * and a non-NULL argument. - * - * If you prefer not to use the locale system of the C runtime library, - * you may nevertheless obtain the user's locale directly using - * environment variables, as described in locale(7). For example, - * @code - * locale = getenv("LC_ALL"); - * if (!locale) - * locale = getenv("LC_CTYPE"); - * if (!locale) - * locale = getenv("LANG"); - * if (!locale) - * locale = "C"; - * @endcode - * - * Note that some locales supported by the C standard library may not - * have a Compose file assigned. - * - * @endparblock - */ - -/** - * Create a compose table for a given locale. - * - * The locale is used for searching the file-system for an appropriate - * Compose file. The search order is described in Compose(5). It is - * affected by the following environment variables: - * - * 1. `XCOMPOSEFILE` - see Compose(5). - * 2. `HOME` - see Compose(5). - * 3. `XLOCALEDIR` - if set, used as the base directory for the system's - * X locale files, e.g. `/usr/share/X11/locale`, instead of the - * preconfigured directory. - * - * @param context - * The library context in which to create the compose table. - * @param locale - * The current locale. See @ref compose-locale. - * @param flags - * Optional flags for the compose table, or 0. - * - * @returns A compose table for the given locale, or NULL if the - * compilation failed or a Compose file was not found. - * - * @memberof xkb_compose_table - */ -struct xkb_compose_table * -xkb_compose_table_new_from_locale(struct xkb_context *context, - const char *locale, - enum xkb_compose_compile_flags flags); - -/** - * Create a new compose table from a Compose file. - * - * @param context - * The library context in which to create the compose table. - * @param file - * The Compose file to compile. - * @param locale - * The current locale. See @ref compose-locale. - * @param format - * The text format of the Compose file to compile. - * @param flags - * Optional flags for the compose table, or 0. - * - * @returns A compose table compiled from the given file, or NULL if - * the compilation failed. - * - * @memberof xkb_compose_table - */ -struct xkb_compose_table * -xkb_compose_table_new_from_file(struct xkb_context *context, - FILE *file, - const char *locale, - enum xkb_compose_format format, - enum xkb_compose_compile_flags flags); - -/** - * Create a new compose table from a memory buffer. - * - * This is just like xkb_compose_table_new_from_file(), but instead of - * a file, gets the table as one enormous string. - * - * @see xkb_compose_table_new_from_file() - * @memberof xkb_compose_table - */ -struct xkb_compose_table * -xkb_compose_table_new_from_buffer(struct xkb_context *context, - const char *buffer, size_t length, - const char *locale, - enum xkb_compose_format format, - enum xkb_compose_compile_flags flags); - -/** - * Take a new reference on a compose table. - * - * @returns The passed in object. - * - * @memberof xkb_compose_table - */ -struct xkb_compose_table * -xkb_compose_table_ref(struct xkb_compose_table *table); - -/** - * Release a reference on a compose table, and possibly free it. - * - * @param table The object. If it is NULL, this function does nothing. - * - * @memberof xkb_compose_table - */ -void -xkb_compose_table_unref(struct xkb_compose_table *table); - -/** Flags for compose state creation. */ -enum xkb_compose_state_flags { - /** Do not apply any flags. */ - XKB_COMPOSE_STATE_NO_FLAGS = 0 -}; - -/** - * Create a new compose state object. - * - * @param table - * The compose table the state will use. - * @param flags - * Optional flags for the compose state, or 0. - * - * @returns A new compose state, or NULL on failure. - * - * @memberof xkb_compose_state - */ -struct xkb_compose_state * -xkb_compose_state_new(struct xkb_compose_table *table, - enum xkb_compose_state_flags flags); - -/** - * Take a new reference on a compose state object. - * - * @returns The passed in object. - * - * @memberof xkb_compose_state - */ -struct xkb_compose_state * -xkb_compose_state_ref(struct xkb_compose_state *state); - -/** - * Release a reference on a compose state object, and possibly free it. - * - * @param state The object. If NULL, do nothing. - * - * @memberof xkb_compose_state - */ -void -xkb_compose_state_unref(struct xkb_compose_state *state); - -/** - * Get the compose table which a compose state object is using. - * - * @returns The compose table which was passed to xkb_compose_state_new() - * when creating this state object. - * - * This function does not take a new reference on the compose table; you - * must explicitly reference it yourself if you plan to use it beyond the - * lifetime of the state. - * - * @memberof xkb_compose_state - */ -struct xkb_compose_table * -xkb_compose_state_get_compose_table(struct xkb_compose_state *state); - -/** Status of the Compose sequence state machine. */ -enum xkb_compose_status { - /** The initial state; no sequence has started yet. */ - XKB_COMPOSE_NOTHING, - /** In the middle of a sequence. */ - XKB_COMPOSE_COMPOSING, - /** A complete sequence has been matched. */ - XKB_COMPOSE_COMPOSED, - /** The last sequence was cancelled due to an unmatched keysym. */ - XKB_COMPOSE_CANCELLED -}; - -/** The effect of a keysym fed to xkb_compose_state_feed(). */ -enum xkb_compose_feed_result { - /** The keysym had no effect - it did not affect the status. */ - XKB_COMPOSE_FEED_IGNORED, - /** The keysym started, advanced or cancelled a sequence. */ - XKB_COMPOSE_FEED_ACCEPTED -}; - -/** - * Feed one keysym to the Compose sequence state machine. - * - * This function can advance into a compose sequence, cancel a sequence, - * start a new sequence, or do nothing in particular. The resulting - * status may be observed with xkb_compose_state_get_status(). - * - * Some keysyms, such as keysyms for modifier keys, are ignored - they - * have no effect on the status or otherwise. - * - * The following is a description of the possible status transitions, in - * the format CURRENT STATUS => NEXT STATUS, given a non-ignored input - * keysym `keysym`: - * - @verbatim - NOTHING or CANCELLED or COMPOSED => - NOTHING if keysym does not start a sequence. - COMPOSING if keysym starts a sequence. - COMPOSED if keysym starts and terminates a single-keysym sequence. - - COMPOSING => - COMPOSING if keysym advances any of the currently possible - sequences but does not terminate any of them. - COMPOSED if keysym terminates one of the currently possible - sequences. - CANCELLED if keysym does not advance any of the currently - possible sequences. - @endverbatim - * - * The current Compose formats do not support multiple-keysyms. - * Therefore, if you are using a function such as xkb_state_key_get_syms() - * and it returns more than one keysym, consider feeding XKB_KEY_NoSymbol - * instead. - * - * @param state - * The compose state object. - * @param keysym - * A keysym, usually obtained after a key-press event, with a - * function such as xkb_state_key_get_one_sym(). - * - * @returns Whether the keysym was ignored. This is useful, for example, - * if you want to keep a record of the sequence matched thus far. - * - * @memberof xkb_compose_state - */ -enum xkb_compose_feed_result -xkb_compose_state_feed(struct xkb_compose_state *state, - xkb_keysym_t keysym); - -/** - * Reset the Compose sequence state machine. - * - * The status is set to XKB_COMPOSE_NOTHING, and the current sequence - * is discarded. - * - * @memberof xkb_compose_state - */ -void -xkb_compose_state_reset(struct xkb_compose_state *state); - -/** - * Get the current status of the compose state machine. - * - * @see xkb_compose_status - * @memberof xkb_compose_state - **/ -enum xkb_compose_status -xkb_compose_state_get_status(struct xkb_compose_state *state); - -/** - * Get the result Unicode/UTF-8 string for a composed sequence. - * - * See @ref compose-overview for more details. This function is only - * useful when the status is XKB_COMPOSE_COMPOSED. - * - * @param[in] state - * The compose state. - * @param[out] buffer - * A buffer to write the string into. - * @param[in] size - * Size of the buffer. - * - * @warning If the buffer passed is too small, the string is truncated - * (though still NUL-terminated). - * - * @returns - * The number of bytes required for the string, excluding the NUL byte. - * If the sequence is not complete, or does not have a viable result - * string, returns 0, and sets `buffer` to the empty string (if possible). - * @returns - * You may check if truncation has occurred by comparing the return value - * with the size of `buffer`, similarly to the `snprintf`(3) function. - * You may safely pass NULL and 0 to `buffer` and `size` to find the - * required size (without the NUL-byte). - * - * @memberof xkb_compose_state - **/ -int -xkb_compose_state_get_utf8(struct xkb_compose_state *state, - char *buffer, size_t size); - -/** - * Get the result keysym for a composed sequence. - * - * See @ref compose-overview for more details. This function is only - * useful when the status is XKB_COMPOSE_COMPOSED. - * - * @returns The result keysym. If the sequence is not complete, or does - * not specify a result keysym, returns XKB_KEY_NoSymbol. - * - * @memberof xkb_compose_state - **/ -xkb_keysym_t -xkb_compose_state_get_one_sym(struct xkb_compose_state *state); - -/** @} */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* _XKBCOMMON_COMPOSE_H */ diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-keysyms.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-keysyms.h deleted file mode 100644 index 69c582e45..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-keysyms.h +++ /dev/null @@ -1,3012 +0,0 @@ -#ifndef _XKBCOMMON_KEYSYMS_H -#define _XKBCOMMON_KEYSYMS_H - -/* This file is autogenerated from Makefile.am; please do not commit directly. */ - -#define XKB_KEY_NoSymbol 0x000000 /* Special KeySym */ - -/*********************************************************** -Copyright 1987, 1994, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall -not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization -from The Open Group. - - -Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Digital not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -******************************************************************/ - -/* - * The "X11 Window System Protocol" standard defines in Appendix A the - * keysym codes. These 29-bit integer values identify characters or - * functions associated with each key (e.g., via the visible - * engraving) of a keyboard layout. This file assigns mnemonic macro - * names for these keysyms. - * - * This file is also compiled (by src/util/makekeys.c in libX11) into - * hash tables that can be accessed with X11 library functions such as - * XStringToKeysym() and XKeysymToString(). - * - * Where a keysym corresponds one-to-one to an ISO 10646 / Unicode - * character, this is noted in a comment that provides both the U+xxxx - * Unicode position, as well as the official Unicode name of the - * character. - * - * Where the correspondence is either not one-to-one or semantically - * unclear, the Unicode position and name are enclosed in - * parentheses. Such legacy keysyms should be considered deprecated - * and are not recommended for use in future keyboard mappings. - * - * For any future extension of the keysyms with characters already - * found in ISO 10646 / Unicode, the following algorithm shall be - * used. The new keysym code position will simply be the character's - * Unicode number plus 0x01000000. The keysym values in the range - * 0x01000100 to 0x0110ffff are reserved to represent Unicode - * characters in the range U+0100 to U+10FFFF. - * - * While most newer Unicode-based X11 clients do already accept - * Unicode-mapped keysyms in the range 0x01000100 to 0x0110ffff, it - * will remain necessary for clients -- in the interest of - * compatibility with existing servers -- to also understand the - * existing legacy keysym values in the range 0x0100 to 0x20ff. - * - * Where several mnemonic names are defined for the same keysym in this - * file, all but the first one listed should be considered deprecated. - * - * Mnemonic names for keysyms are defined in this file with lines - * that match one of these Perl regular expressions: - * - * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\* U+([0-9A-F]{4,6}) (.*) \*\/\s*$/ - * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\*\(U+([0-9A-F]{4,6}) (.*)\)\*\/\s*$/ - * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/ - * - * Before adding new keysyms, please do consider the following: In - * addition to the keysym names defined in this file, the - * XStringToKeysym() and XKeysymToString() functions will also handle - * any keysym string of the form "U0020" to "U007E" and "U00A0" to - * "U10FFFF" for all possible Unicode characters. In other words, - * every possible Unicode character has already a keysym string - * defined algorithmically, even if it is not listed here. Therefore, - * defining an additional keysym macro is only necessary where a - * non-hexadecimal mnemonic name is needed, or where the new keysym - * does not represent any existing Unicode character. - * - * When adding new keysyms to this file, do not forget to also update the - * following as needed: - * - * - the mappings in src/KeyBind.c in the repo - * git://anongit.freedesktop.org/xorg/lib/libX11.git - * - * - the protocol specification in specs/keysyms.xml - * in the repo git://anongit.freedesktop.org/xorg/proto/x11proto.git - * - */ - -#define XKB_KEY_VoidSymbol 0xffffff /* Void symbol */ - -/* - * TTY function keys, cleverly chosen to map to ASCII, for convenience of - * programming, but could have been arbitrary (at the cost of lookup - * tables in client code). - */ - -#define XKB_KEY_BackSpace 0xff08 /* Back space, back char */ -#define XKB_KEY_Tab 0xff09 -#define XKB_KEY_Linefeed 0xff0a /* Linefeed, LF */ -#define XKB_KEY_Clear 0xff0b -#define XKB_KEY_Return 0xff0d /* Return, enter */ -#define XKB_KEY_Pause 0xff13 /* Pause, hold */ -#define XKB_KEY_Scroll_Lock 0xff14 -#define XKB_KEY_Sys_Req 0xff15 -#define XKB_KEY_Escape 0xff1b -#define XKB_KEY_Delete 0xffff /* Delete, rubout */ - - - -/* International & multi-key character composition */ - -#define XKB_KEY_Multi_key 0xff20 /* Multi-key character compose */ -#define XKB_KEY_Codeinput 0xff37 -#define XKB_KEY_SingleCandidate 0xff3c -#define XKB_KEY_MultipleCandidate 0xff3d -#define XKB_KEY_PreviousCandidate 0xff3e - -/* Japanese keyboard support */ - -#define XKB_KEY_Kanji 0xff21 /* Kanji, Kanji convert */ -#define XKB_KEY_Muhenkan 0xff22 /* Cancel Conversion */ -#define XKB_KEY_Henkan_Mode 0xff23 /* Start/Stop Conversion */ -#define XKB_KEY_Henkan 0xff23 /* Alias for Henkan_Mode */ -#define XKB_KEY_Romaji 0xff24 /* to Romaji */ -#define XKB_KEY_Hiragana 0xff25 /* to Hiragana */ -#define XKB_KEY_Katakana 0xff26 /* to Katakana */ -#define XKB_KEY_Hiragana_Katakana 0xff27 /* Hiragana/Katakana toggle */ -#define XKB_KEY_Zenkaku 0xff28 /* to Zenkaku */ -#define XKB_KEY_Hankaku 0xff29 /* to Hankaku */ -#define XKB_KEY_Zenkaku_Hankaku 0xff2a /* Zenkaku/Hankaku toggle */ -#define XKB_KEY_Touroku 0xff2b /* Add to Dictionary */ -#define XKB_KEY_Massyo 0xff2c /* Delete from Dictionary */ -#define XKB_KEY_Kana_Lock 0xff2d /* Kana Lock */ -#define XKB_KEY_Kana_Shift 0xff2e /* Kana Shift */ -#define XKB_KEY_Eisu_Shift 0xff2f /* Alphanumeric Shift */ -#define XKB_KEY_Eisu_toggle 0xff30 /* Alphanumeric toggle */ -#define XKB_KEY_Kanji_Bangou 0xff37 /* Codeinput */ -#define XKB_KEY_Zen_Koho 0xff3d /* Multiple/All Candidate(s) */ -#define XKB_KEY_Mae_Koho 0xff3e /* Previous Candidate */ - -/* 0xff31 thru 0xff3f are under XK_KOREAN */ - -/* Cursor control & motion */ - -#define XKB_KEY_Home 0xff50 -#define XKB_KEY_Left 0xff51 /* Move left, left arrow */ -#define XKB_KEY_Up 0xff52 /* Move up, up arrow */ -#define XKB_KEY_Right 0xff53 /* Move right, right arrow */ -#define XKB_KEY_Down 0xff54 /* Move down, down arrow */ -#define XKB_KEY_Prior 0xff55 /* Prior, previous */ -#define XKB_KEY_Page_Up 0xff55 -#define XKB_KEY_Next 0xff56 /* Next */ -#define XKB_KEY_Page_Down 0xff56 -#define XKB_KEY_End 0xff57 /* EOL */ -#define XKB_KEY_Begin 0xff58 /* BOL */ - - -/* Misc functions */ - -#define XKB_KEY_Select 0xff60 /* Select, mark */ -#define XKB_KEY_Print 0xff61 -#define XKB_KEY_Execute 0xff62 /* Execute, run, do */ -#define XKB_KEY_Insert 0xff63 /* Insert, insert here */ -#define XKB_KEY_Undo 0xff65 -#define XKB_KEY_Redo 0xff66 /* Redo, again */ -#define XKB_KEY_Menu 0xff67 -#define XKB_KEY_Find 0xff68 /* Find, search */ -#define XKB_KEY_Cancel 0xff69 /* Cancel, stop, abort, exit */ -#define XKB_KEY_Help 0xff6a /* Help */ -#define XKB_KEY_Break 0xff6b -#define XKB_KEY_Mode_switch 0xff7e /* Character set switch */ -#define XKB_KEY_script_switch 0xff7e /* Alias for mode_switch */ -#define XKB_KEY_Num_Lock 0xff7f - -/* Keypad functions, keypad numbers cleverly chosen to map to ASCII */ - -#define XKB_KEY_KP_Space 0xff80 /* Space */ -#define XKB_KEY_KP_Tab 0xff89 -#define XKB_KEY_KP_Enter 0xff8d /* Enter */ -#define XKB_KEY_KP_F1 0xff91 /* PF1, KP_A, ... */ -#define XKB_KEY_KP_F2 0xff92 -#define XKB_KEY_KP_F3 0xff93 -#define XKB_KEY_KP_F4 0xff94 -#define XKB_KEY_KP_Home 0xff95 -#define XKB_KEY_KP_Left 0xff96 -#define XKB_KEY_KP_Up 0xff97 -#define XKB_KEY_KP_Right 0xff98 -#define XKB_KEY_KP_Down 0xff99 -#define XKB_KEY_KP_Prior 0xff9a -#define XKB_KEY_KP_Page_Up 0xff9a -#define XKB_KEY_KP_Next 0xff9b -#define XKB_KEY_KP_Page_Down 0xff9b -#define XKB_KEY_KP_End 0xff9c -#define XKB_KEY_KP_Begin 0xff9d -#define XKB_KEY_KP_Insert 0xff9e -#define XKB_KEY_KP_Delete 0xff9f -#define XKB_KEY_KP_Equal 0xffbd /* Equals */ -#define XKB_KEY_KP_Multiply 0xffaa -#define XKB_KEY_KP_Add 0xffab -#define XKB_KEY_KP_Separator 0xffac /* Separator, often comma */ -#define XKB_KEY_KP_Subtract 0xffad -#define XKB_KEY_KP_Decimal 0xffae -#define XKB_KEY_KP_Divide 0xffaf - -#define XKB_KEY_KP_0 0xffb0 -#define XKB_KEY_KP_1 0xffb1 -#define XKB_KEY_KP_2 0xffb2 -#define XKB_KEY_KP_3 0xffb3 -#define XKB_KEY_KP_4 0xffb4 -#define XKB_KEY_KP_5 0xffb5 -#define XKB_KEY_KP_6 0xffb6 -#define XKB_KEY_KP_7 0xffb7 -#define XKB_KEY_KP_8 0xffb8 -#define XKB_KEY_KP_9 0xffb9 - - - -/* - * Auxiliary functions; note the duplicate definitions for left and right - * function keys; Sun keyboards and a few other manufacturers have such - * function key groups on the left and/or right sides of the keyboard. - * We've not found a keyboard with more than 35 function keys total. - */ - -#define XKB_KEY_F1 0xffbe -#define XKB_KEY_F2 0xffbf -#define XKB_KEY_F3 0xffc0 -#define XKB_KEY_F4 0xffc1 -#define XKB_KEY_F5 0xffc2 -#define XKB_KEY_F6 0xffc3 -#define XKB_KEY_F7 0xffc4 -#define XKB_KEY_F8 0xffc5 -#define XKB_KEY_F9 0xffc6 -#define XKB_KEY_F10 0xffc7 -#define XKB_KEY_F11 0xffc8 -#define XKB_KEY_L1 0xffc8 -#define XKB_KEY_F12 0xffc9 -#define XKB_KEY_L2 0xffc9 -#define XKB_KEY_F13 0xffca -#define XKB_KEY_L3 0xffca -#define XKB_KEY_F14 0xffcb -#define XKB_KEY_L4 0xffcb -#define XKB_KEY_F15 0xffcc -#define XKB_KEY_L5 0xffcc -#define XKB_KEY_F16 0xffcd -#define XKB_KEY_L6 0xffcd -#define XKB_KEY_F17 0xffce -#define XKB_KEY_L7 0xffce -#define XKB_KEY_F18 0xffcf -#define XKB_KEY_L8 0xffcf -#define XKB_KEY_F19 0xffd0 -#define XKB_KEY_L9 0xffd0 -#define XKB_KEY_F20 0xffd1 -#define XKB_KEY_L10 0xffd1 -#define XKB_KEY_F21 0xffd2 -#define XKB_KEY_R1 0xffd2 -#define XKB_KEY_F22 0xffd3 -#define XKB_KEY_R2 0xffd3 -#define XKB_KEY_F23 0xffd4 -#define XKB_KEY_R3 0xffd4 -#define XKB_KEY_F24 0xffd5 -#define XKB_KEY_R4 0xffd5 -#define XKB_KEY_F25 0xffd6 -#define XKB_KEY_R5 0xffd6 -#define XKB_KEY_F26 0xffd7 -#define XKB_KEY_R6 0xffd7 -#define XKB_KEY_F27 0xffd8 -#define XKB_KEY_R7 0xffd8 -#define XKB_KEY_F28 0xffd9 -#define XKB_KEY_R8 0xffd9 -#define XKB_KEY_F29 0xffda -#define XKB_KEY_R9 0xffda -#define XKB_KEY_F30 0xffdb -#define XKB_KEY_R10 0xffdb -#define XKB_KEY_F31 0xffdc -#define XKB_KEY_R11 0xffdc -#define XKB_KEY_F32 0xffdd -#define XKB_KEY_R12 0xffdd -#define XKB_KEY_F33 0xffde -#define XKB_KEY_R13 0xffde -#define XKB_KEY_F34 0xffdf -#define XKB_KEY_R14 0xffdf -#define XKB_KEY_F35 0xffe0 -#define XKB_KEY_R15 0xffe0 - -/* Modifiers */ - -#define XKB_KEY_Shift_L 0xffe1 /* Left shift */ -#define XKB_KEY_Shift_R 0xffe2 /* Right shift */ -#define XKB_KEY_Control_L 0xffe3 /* Left control */ -#define XKB_KEY_Control_R 0xffe4 /* Right control */ -#define XKB_KEY_Caps_Lock 0xffe5 /* Caps lock */ -#define XKB_KEY_Shift_Lock 0xffe6 /* Shift lock */ - -#define XKB_KEY_Meta_L 0xffe7 /* Left meta */ -#define XKB_KEY_Meta_R 0xffe8 /* Right meta */ -#define XKB_KEY_Alt_L 0xffe9 /* Left alt */ -#define XKB_KEY_Alt_R 0xffea /* Right alt */ -#define XKB_KEY_Super_L 0xffeb /* Left super */ -#define XKB_KEY_Super_R 0xffec /* Right super */ -#define XKB_KEY_Hyper_L 0xffed /* Left hyper */ -#define XKB_KEY_Hyper_R 0xffee /* Right hyper */ - -/* - * Keyboard (XKB) Extension function and modifier keys - * (from Appendix C of "The X Keyboard Extension: Protocol Specification") - * Byte 3 = 0xfe - */ - -#define XKB_KEY_ISO_Lock 0xfe01 -#define XKB_KEY_ISO_Level2_Latch 0xfe02 -#define XKB_KEY_ISO_Level3_Shift 0xfe03 -#define XKB_KEY_ISO_Level3_Latch 0xfe04 -#define XKB_KEY_ISO_Level3_Lock 0xfe05 -#define XKB_KEY_ISO_Level5_Shift 0xfe11 -#define XKB_KEY_ISO_Level5_Latch 0xfe12 -#define XKB_KEY_ISO_Level5_Lock 0xfe13 -#define XKB_KEY_ISO_Group_Shift 0xff7e /* Alias for mode_switch */ -#define XKB_KEY_ISO_Group_Latch 0xfe06 -#define XKB_KEY_ISO_Group_Lock 0xfe07 -#define XKB_KEY_ISO_Next_Group 0xfe08 -#define XKB_KEY_ISO_Next_Group_Lock 0xfe09 -#define XKB_KEY_ISO_Prev_Group 0xfe0a -#define XKB_KEY_ISO_Prev_Group_Lock 0xfe0b -#define XKB_KEY_ISO_First_Group 0xfe0c -#define XKB_KEY_ISO_First_Group_Lock 0xfe0d -#define XKB_KEY_ISO_Last_Group 0xfe0e -#define XKB_KEY_ISO_Last_Group_Lock 0xfe0f - -#define XKB_KEY_ISO_Left_Tab 0xfe20 -#define XKB_KEY_ISO_Move_Line_Up 0xfe21 -#define XKB_KEY_ISO_Move_Line_Down 0xfe22 -#define XKB_KEY_ISO_Partial_Line_Up 0xfe23 -#define XKB_KEY_ISO_Partial_Line_Down 0xfe24 -#define XKB_KEY_ISO_Partial_Space_Left 0xfe25 -#define XKB_KEY_ISO_Partial_Space_Right 0xfe26 -#define XKB_KEY_ISO_Set_Margin_Left 0xfe27 -#define XKB_KEY_ISO_Set_Margin_Right 0xfe28 -#define XKB_KEY_ISO_Release_Margin_Left 0xfe29 -#define XKB_KEY_ISO_Release_Margin_Right 0xfe2a -#define XKB_KEY_ISO_Release_Both_Margins 0xfe2b -#define XKB_KEY_ISO_Fast_Cursor_Left 0xfe2c -#define XKB_KEY_ISO_Fast_Cursor_Right 0xfe2d -#define XKB_KEY_ISO_Fast_Cursor_Up 0xfe2e -#define XKB_KEY_ISO_Fast_Cursor_Down 0xfe2f -#define XKB_KEY_ISO_Continuous_Underline 0xfe30 -#define XKB_KEY_ISO_Discontinuous_Underline 0xfe31 -#define XKB_KEY_ISO_Emphasize 0xfe32 -#define XKB_KEY_ISO_Center_Object 0xfe33 -#define XKB_KEY_ISO_Enter 0xfe34 - -#define XKB_KEY_dead_grave 0xfe50 -#define XKB_KEY_dead_acute 0xfe51 -#define XKB_KEY_dead_circumflex 0xfe52 -#define XKB_KEY_dead_tilde 0xfe53 -#define XKB_KEY_dead_perispomeni 0xfe53 /* alias for dead_tilde */ -#define XKB_KEY_dead_macron 0xfe54 -#define XKB_KEY_dead_breve 0xfe55 -#define XKB_KEY_dead_abovedot 0xfe56 -#define XKB_KEY_dead_diaeresis 0xfe57 -#define XKB_KEY_dead_abovering 0xfe58 -#define XKB_KEY_dead_doubleacute 0xfe59 -#define XKB_KEY_dead_caron 0xfe5a -#define XKB_KEY_dead_cedilla 0xfe5b -#define XKB_KEY_dead_ogonek 0xfe5c -#define XKB_KEY_dead_iota 0xfe5d -#define XKB_KEY_dead_voiced_sound 0xfe5e -#define XKB_KEY_dead_semivoiced_sound 0xfe5f -#define XKB_KEY_dead_belowdot 0xfe60 -#define XKB_KEY_dead_hook 0xfe61 -#define XKB_KEY_dead_horn 0xfe62 -#define XKB_KEY_dead_stroke 0xfe63 -#define XKB_KEY_dead_abovecomma 0xfe64 -#define XKB_KEY_dead_psili 0xfe64 /* alias for dead_abovecomma */ -#define XKB_KEY_dead_abovereversedcomma 0xfe65 -#define XKB_KEY_dead_dasia 0xfe65 /* alias for dead_abovereversedcomma */ -#define XKB_KEY_dead_doublegrave 0xfe66 -#define XKB_KEY_dead_belowring 0xfe67 -#define XKB_KEY_dead_belowmacron 0xfe68 -#define XKB_KEY_dead_belowcircumflex 0xfe69 -#define XKB_KEY_dead_belowtilde 0xfe6a -#define XKB_KEY_dead_belowbreve 0xfe6b -#define XKB_KEY_dead_belowdiaeresis 0xfe6c -#define XKB_KEY_dead_invertedbreve 0xfe6d -#define XKB_KEY_dead_belowcomma 0xfe6e -#define XKB_KEY_dead_currency 0xfe6f - -/* extra dead elements for German T3 layout */ -#define XKB_KEY_dead_lowline 0xfe90 -#define XKB_KEY_dead_aboveverticalline 0xfe91 -#define XKB_KEY_dead_belowverticalline 0xfe92 -#define XKB_KEY_dead_longsolidusoverlay 0xfe93 - -/* dead vowels for universal syllable entry */ -#define XKB_KEY_dead_a 0xfe80 -#define XKB_KEY_dead_A 0xfe81 -#define XKB_KEY_dead_e 0xfe82 -#define XKB_KEY_dead_E 0xfe83 -#define XKB_KEY_dead_i 0xfe84 -#define XKB_KEY_dead_I 0xfe85 -#define XKB_KEY_dead_o 0xfe86 -#define XKB_KEY_dead_O 0xfe87 -#define XKB_KEY_dead_u 0xfe88 -#define XKB_KEY_dead_U 0xfe89 -#define XKB_KEY_dead_small_schwa 0xfe8a -#define XKB_KEY_dead_capital_schwa 0xfe8b - -#define XKB_KEY_dead_greek 0xfe8c - -#define XKB_KEY_First_Virtual_Screen 0xfed0 -#define XKB_KEY_Prev_Virtual_Screen 0xfed1 -#define XKB_KEY_Next_Virtual_Screen 0xfed2 -#define XKB_KEY_Last_Virtual_Screen 0xfed4 -#define XKB_KEY_Terminate_Server 0xfed5 - -#define XKB_KEY_AccessX_Enable 0xfe70 -#define XKB_KEY_AccessX_Feedback_Enable 0xfe71 -#define XKB_KEY_RepeatKeys_Enable 0xfe72 -#define XKB_KEY_SlowKeys_Enable 0xfe73 -#define XKB_KEY_BounceKeys_Enable 0xfe74 -#define XKB_KEY_StickyKeys_Enable 0xfe75 -#define XKB_KEY_MouseKeys_Enable 0xfe76 -#define XKB_KEY_MouseKeys_Accel_Enable 0xfe77 -#define XKB_KEY_Overlay1_Enable 0xfe78 -#define XKB_KEY_Overlay2_Enable 0xfe79 -#define XKB_KEY_AudibleBell_Enable 0xfe7a - -#define XKB_KEY_Pointer_Left 0xfee0 -#define XKB_KEY_Pointer_Right 0xfee1 -#define XKB_KEY_Pointer_Up 0xfee2 -#define XKB_KEY_Pointer_Down 0xfee3 -#define XKB_KEY_Pointer_UpLeft 0xfee4 -#define XKB_KEY_Pointer_UpRight 0xfee5 -#define XKB_KEY_Pointer_DownLeft 0xfee6 -#define XKB_KEY_Pointer_DownRight 0xfee7 -#define XKB_KEY_Pointer_Button_Dflt 0xfee8 -#define XKB_KEY_Pointer_Button1 0xfee9 -#define XKB_KEY_Pointer_Button2 0xfeea -#define XKB_KEY_Pointer_Button3 0xfeeb -#define XKB_KEY_Pointer_Button4 0xfeec -#define XKB_KEY_Pointer_Button5 0xfeed -#define XKB_KEY_Pointer_DblClick_Dflt 0xfeee -#define XKB_KEY_Pointer_DblClick1 0xfeef -#define XKB_KEY_Pointer_DblClick2 0xfef0 -#define XKB_KEY_Pointer_DblClick3 0xfef1 -#define XKB_KEY_Pointer_DblClick4 0xfef2 -#define XKB_KEY_Pointer_DblClick5 0xfef3 -#define XKB_KEY_Pointer_Drag_Dflt 0xfef4 -#define XKB_KEY_Pointer_Drag1 0xfef5 -#define XKB_KEY_Pointer_Drag2 0xfef6 -#define XKB_KEY_Pointer_Drag3 0xfef7 -#define XKB_KEY_Pointer_Drag4 0xfef8 -#define XKB_KEY_Pointer_Drag5 0xfefd - -#define XKB_KEY_Pointer_EnableKeys 0xfef9 -#define XKB_KEY_Pointer_Accelerate 0xfefa -#define XKB_KEY_Pointer_DfltBtnNext 0xfefb -#define XKB_KEY_Pointer_DfltBtnPrev 0xfefc - -/* Single-Stroke Multiple-Character N-Graph Keysyms For The X Input Method */ - -#define XKB_KEY_ch 0xfea0 -#define XKB_KEY_Ch 0xfea1 -#define XKB_KEY_CH 0xfea2 -#define XKB_KEY_c_h 0xfea3 -#define XKB_KEY_C_h 0xfea4 -#define XKB_KEY_C_H 0xfea5 - - -/* - * 3270 Terminal Keys - * Byte 3 = 0xfd - */ - -#define XKB_KEY_3270_Duplicate 0xfd01 -#define XKB_KEY_3270_FieldMark 0xfd02 -#define XKB_KEY_3270_Right2 0xfd03 -#define XKB_KEY_3270_Left2 0xfd04 -#define XKB_KEY_3270_BackTab 0xfd05 -#define XKB_KEY_3270_EraseEOF 0xfd06 -#define XKB_KEY_3270_EraseInput 0xfd07 -#define XKB_KEY_3270_Reset 0xfd08 -#define XKB_KEY_3270_Quit 0xfd09 -#define XKB_KEY_3270_PA1 0xfd0a -#define XKB_KEY_3270_PA2 0xfd0b -#define XKB_KEY_3270_PA3 0xfd0c -#define XKB_KEY_3270_Test 0xfd0d -#define XKB_KEY_3270_Attn 0xfd0e -#define XKB_KEY_3270_CursorBlink 0xfd0f -#define XKB_KEY_3270_AltCursor 0xfd10 -#define XKB_KEY_3270_KeyClick 0xfd11 -#define XKB_KEY_3270_Jump 0xfd12 -#define XKB_KEY_3270_Ident 0xfd13 -#define XKB_KEY_3270_Rule 0xfd14 -#define XKB_KEY_3270_Copy 0xfd15 -#define XKB_KEY_3270_Play 0xfd16 -#define XKB_KEY_3270_Setup 0xfd17 -#define XKB_KEY_3270_Record 0xfd18 -#define XKB_KEY_3270_ChangeScreen 0xfd19 -#define XKB_KEY_3270_DeleteWord 0xfd1a -#define XKB_KEY_3270_ExSelect 0xfd1b -#define XKB_KEY_3270_CursorSelect 0xfd1c -#define XKB_KEY_3270_PrintScreen 0xfd1d -#define XKB_KEY_3270_Enter 0xfd1e - -/* - * Latin 1 - * (ISO/IEC 8859-1 = Unicode U+0020..U+00FF) - * Byte 3 = 0 - */ -#define XKB_KEY_space 0x0020 /* U+0020 SPACE */ -#define XKB_KEY_exclam 0x0021 /* U+0021 EXCLAMATION MARK */ -#define XKB_KEY_quotedbl 0x0022 /* U+0022 QUOTATION MARK */ -#define XKB_KEY_numbersign 0x0023 /* U+0023 NUMBER SIGN */ -#define XKB_KEY_dollar 0x0024 /* U+0024 DOLLAR SIGN */ -#define XKB_KEY_percent 0x0025 /* U+0025 PERCENT SIGN */ -#define XKB_KEY_ampersand 0x0026 /* U+0026 AMPERSAND */ -#define XKB_KEY_apostrophe 0x0027 /* U+0027 APOSTROPHE */ -#define XKB_KEY_quoteright 0x0027 /* deprecated */ -#define XKB_KEY_parenleft 0x0028 /* U+0028 LEFT PARENTHESIS */ -#define XKB_KEY_parenright 0x0029 /* U+0029 RIGHT PARENTHESIS */ -#define XKB_KEY_asterisk 0x002a /* U+002A ASTERISK */ -#define XKB_KEY_plus 0x002b /* U+002B PLUS SIGN */ -#define XKB_KEY_comma 0x002c /* U+002C COMMA */ -#define XKB_KEY_minus 0x002d /* U+002D HYPHEN-MINUS */ -#define XKB_KEY_period 0x002e /* U+002E FULL STOP */ -#define XKB_KEY_slash 0x002f /* U+002F SOLIDUS */ -#define XKB_KEY_0 0x0030 /* U+0030 DIGIT ZERO */ -#define XKB_KEY_1 0x0031 /* U+0031 DIGIT ONE */ -#define XKB_KEY_2 0x0032 /* U+0032 DIGIT TWO */ -#define XKB_KEY_3 0x0033 /* U+0033 DIGIT THREE */ -#define XKB_KEY_4 0x0034 /* U+0034 DIGIT FOUR */ -#define XKB_KEY_5 0x0035 /* U+0035 DIGIT FIVE */ -#define XKB_KEY_6 0x0036 /* U+0036 DIGIT SIX */ -#define XKB_KEY_7 0x0037 /* U+0037 DIGIT SEVEN */ -#define XKB_KEY_8 0x0038 /* U+0038 DIGIT EIGHT */ -#define XKB_KEY_9 0x0039 /* U+0039 DIGIT NINE */ -#define XKB_KEY_colon 0x003a /* U+003A COLON */ -#define XKB_KEY_semicolon 0x003b /* U+003B SEMICOLON */ -#define XKB_KEY_less 0x003c /* U+003C LESS-THAN SIGN */ -#define XKB_KEY_equal 0x003d /* U+003D EQUALS SIGN */ -#define XKB_KEY_greater 0x003e /* U+003E GREATER-THAN SIGN */ -#define XKB_KEY_question 0x003f /* U+003F QUESTION MARK */ -#define XKB_KEY_at 0x0040 /* U+0040 COMMERCIAL AT */ -#define XKB_KEY_A 0x0041 /* U+0041 LATIN CAPITAL LETTER A */ -#define XKB_KEY_B 0x0042 /* U+0042 LATIN CAPITAL LETTER B */ -#define XKB_KEY_C 0x0043 /* U+0043 LATIN CAPITAL LETTER C */ -#define XKB_KEY_D 0x0044 /* U+0044 LATIN CAPITAL LETTER D */ -#define XKB_KEY_E 0x0045 /* U+0045 LATIN CAPITAL LETTER E */ -#define XKB_KEY_F 0x0046 /* U+0046 LATIN CAPITAL LETTER F */ -#define XKB_KEY_G 0x0047 /* U+0047 LATIN CAPITAL LETTER G */ -#define XKB_KEY_H 0x0048 /* U+0048 LATIN CAPITAL LETTER H */ -#define XKB_KEY_I 0x0049 /* U+0049 LATIN CAPITAL LETTER I */ -#define XKB_KEY_J 0x004a /* U+004A LATIN CAPITAL LETTER J */ -#define XKB_KEY_K 0x004b /* U+004B LATIN CAPITAL LETTER K */ -#define XKB_KEY_L 0x004c /* U+004C LATIN CAPITAL LETTER L */ -#define XKB_KEY_M 0x004d /* U+004D LATIN CAPITAL LETTER M */ -#define XKB_KEY_N 0x004e /* U+004E LATIN CAPITAL LETTER N */ -#define XKB_KEY_O 0x004f /* U+004F LATIN CAPITAL LETTER O */ -#define XKB_KEY_P 0x0050 /* U+0050 LATIN CAPITAL LETTER P */ -#define XKB_KEY_Q 0x0051 /* U+0051 LATIN CAPITAL LETTER Q */ -#define XKB_KEY_R 0x0052 /* U+0052 LATIN CAPITAL LETTER R */ -#define XKB_KEY_S 0x0053 /* U+0053 LATIN CAPITAL LETTER S */ -#define XKB_KEY_T 0x0054 /* U+0054 LATIN CAPITAL LETTER T */ -#define XKB_KEY_U 0x0055 /* U+0055 LATIN CAPITAL LETTER U */ -#define XKB_KEY_V 0x0056 /* U+0056 LATIN CAPITAL LETTER V */ -#define XKB_KEY_W 0x0057 /* U+0057 LATIN CAPITAL LETTER W */ -#define XKB_KEY_X 0x0058 /* U+0058 LATIN CAPITAL LETTER X */ -#define XKB_KEY_Y 0x0059 /* U+0059 LATIN CAPITAL LETTER Y */ -#define XKB_KEY_Z 0x005a /* U+005A LATIN CAPITAL LETTER Z */ -#define XKB_KEY_bracketleft 0x005b /* U+005B LEFT SQUARE BRACKET */ -#define XKB_KEY_backslash 0x005c /* U+005C REVERSE SOLIDUS */ -#define XKB_KEY_bracketright 0x005d /* U+005D RIGHT SQUARE BRACKET */ -#define XKB_KEY_asciicircum 0x005e /* U+005E CIRCUMFLEX ACCENT */ -#define XKB_KEY_underscore 0x005f /* U+005F LOW LINE */ -#define XKB_KEY_grave 0x0060 /* U+0060 GRAVE ACCENT */ -#define XKB_KEY_quoteleft 0x0060 /* deprecated */ -#define XKB_KEY_a 0x0061 /* U+0061 LATIN SMALL LETTER A */ -#define XKB_KEY_b 0x0062 /* U+0062 LATIN SMALL LETTER B */ -#define XKB_KEY_c 0x0063 /* U+0063 LATIN SMALL LETTER C */ -#define XKB_KEY_d 0x0064 /* U+0064 LATIN SMALL LETTER D */ -#define XKB_KEY_e 0x0065 /* U+0065 LATIN SMALL LETTER E */ -#define XKB_KEY_f 0x0066 /* U+0066 LATIN SMALL LETTER F */ -#define XKB_KEY_g 0x0067 /* U+0067 LATIN SMALL LETTER G */ -#define XKB_KEY_h 0x0068 /* U+0068 LATIN SMALL LETTER H */ -#define XKB_KEY_i 0x0069 /* U+0069 LATIN SMALL LETTER I */ -#define XKB_KEY_j 0x006a /* U+006A LATIN SMALL LETTER J */ -#define XKB_KEY_k 0x006b /* U+006B LATIN SMALL LETTER K */ -#define XKB_KEY_l 0x006c /* U+006C LATIN SMALL LETTER L */ -#define XKB_KEY_m 0x006d /* U+006D LATIN SMALL LETTER M */ -#define XKB_KEY_n 0x006e /* U+006E LATIN SMALL LETTER N */ -#define XKB_KEY_o 0x006f /* U+006F LATIN SMALL LETTER O */ -#define XKB_KEY_p 0x0070 /* U+0070 LATIN SMALL LETTER P */ -#define XKB_KEY_q 0x0071 /* U+0071 LATIN SMALL LETTER Q */ -#define XKB_KEY_r 0x0072 /* U+0072 LATIN SMALL LETTER R */ -#define XKB_KEY_s 0x0073 /* U+0073 LATIN SMALL LETTER S */ -#define XKB_KEY_t 0x0074 /* U+0074 LATIN SMALL LETTER T */ -#define XKB_KEY_u 0x0075 /* U+0075 LATIN SMALL LETTER U */ -#define XKB_KEY_v 0x0076 /* U+0076 LATIN SMALL LETTER V */ -#define XKB_KEY_w 0x0077 /* U+0077 LATIN SMALL LETTER W */ -#define XKB_KEY_x 0x0078 /* U+0078 LATIN SMALL LETTER X */ -#define XKB_KEY_y 0x0079 /* U+0079 LATIN SMALL LETTER Y */ -#define XKB_KEY_z 0x007a /* U+007A LATIN SMALL LETTER Z */ -#define XKB_KEY_braceleft 0x007b /* U+007B LEFT CURLY BRACKET */ -#define XKB_KEY_bar 0x007c /* U+007C VERTICAL LINE */ -#define XKB_KEY_braceright 0x007d /* U+007D RIGHT CURLY BRACKET */ -#define XKB_KEY_asciitilde 0x007e /* U+007E TILDE */ - -#define XKB_KEY_nobreakspace 0x00a0 /* U+00A0 NO-BREAK SPACE */ -#define XKB_KEY_exclamdown 0x00a1 /* U+00A1 INVERTED EXCLAMATION MARK */ -#define XKB_KEY_cent 0x00a2 /* U+00A2 CENT SIGN */ -#define XKB_KEY_sterling 0x00a3 /* U+00A3 POUND SIGN */ -#define XKB_KEY_currency 0x00a4 /* U+00A4 CURRENCY SIGN */ -#define XKB_KEY_yen 0x00a5 /* U+00A5 YEN SIGN */ -#define XKB_KEY_brokenbar 0x00a6 /* U+00A6 BROKEN BAR */ -#define XKB_KEY_section 0x00a7 /* U+00A7 SECTION SIGN */ -#define XKB_KEY_diaeresis 0x00a8 /* U+00A8 DIAERESIS */ -#define XKB_KEY_copyright 0x00a9 /* U+00A9 COPYRIGHT SIGN */ -#define XKB_KEY_ordfeminine 0x00aa /* U+00AA FEMININE ORDINAL INDICATOR */ -#define XKB_KEY_guillemotleft 0x00ab /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ -#define XKB_KEY_notsign 0x00ac /* U+00AC NOT SIGN */ -#define XKB_KEY_hyphen 0x00ad /* U+00AD SOFT HYPHEN */ -#define XKB_KEY_registered 0x00ae /* U+00AE REGISTERED SIGN */ -#define XKB_KEY_macron 0x00af /* U+00AF MACRON */ -#define XKB_KEY_degree 0x00b0 /* U+00B0 DEGREE SIGN */ -#define XKB_KEY_plusminus 0x00b1 /* U+00B1 PLUS-MINUS SIGN */ -#define XKB_KEY_twosuperior 0x00b2 /* U+00B2 SUPERSCRIPT TWO */ -#define XKB_KEY_threesuperior 0x00b3 /* U+00B3 SUPERSCRIPT THREE */ -#define XKB_KEY_acute 0x00b4 /* U+00B4 ACUTE ACCENT */ -#define XKB_KEY_mu 0x00b5 /* U+00B5 MICRO SIGN */ -#define XKB_KEY_paragraph 0x00b6 /* U+00B6 PILCROW SIGN */ -#define XKB_KEY_periodcentered 0x00b7 /* U+00B7 MIDDLE DOT */ -#define XKB_KEY_cedilla 0x00b8 /* U+00B8 CEDILLA */ -#define XKB_KEY_onesuperior 0x00b9 /* U+00B9 SUPERSCRIPT ONE */ -#define XKB_KEY_masculine 0x00ba /* U+00BA MASCULINE ORDINAL INDICATOR */ -#define XKB_KEY_guillemotright 0x00bb /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ -#define XKB_KEY_onequarter 0x00bc /* U+00BC VULGAR FRACTION ONE QUARTER */ -#define XKB_KEY_onehalf 0x00bd /* U+00BD VULGAR FRACTION ONE HALF */ -#define XKB_KEY_threequarters 0x00be /* U+00BE VULGAR FRACTION THREE QUARTERS */ -#define XKB_KEY_questiondown 0x00bf /* U+00BF INVERTED QUESTION MARK */ -#define XKB_KEY_Agrave 0x00c0 /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ -#define XKB_KEY_Aacute 0x00c1 /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ -#define XKB_KEY_Acircumflex 0x00c2 /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ -#define XKB_KEY_Atilde 0x00c3 /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ -#define XKB_KEY_Adiaeresis 0x00c4 /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ -#define XKB_KEY_Aring 0x00c5 /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ -#define XKB_KEY_AE 0x00c6 /* U+00C6 LATIN CAPITAL LETTER AE */ -#define XKB_KEY_Ccedilla 0x00c7 /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ -#define XKB_KEY_Egrave 0x00c8 /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ -#define XKB_KEY_Eacute 0x00c9 /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ -#define XKB_KEY_Ecircumflex 0x00ca /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ -#define XKB_KEY_Ediaeresis 0x00cb /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ -#define XKB_KEY_Igrave 0x00cc /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ -#define XKB_KEY_Iacute 0x00cd /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ -#define XKB_KEY_Icircumflex 0x00ce /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ -#define XKB_KEY_Idiaeresis 0x00cf /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ -#define XKB_KEY_ETH 0x00d0 /* U+00D0 LATIN CAPITAL LETTER ETH */ -#define XKB_KEY_Eth 0x00d0 /* deprecated */ -#define XKB_KEY_Ntilde 0x00d1 /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ -#define XKB_KEY_Ograve 0x00d2 /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ -#define XKB_KEY_Oacute 0x00d3 /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ -#define XKB_KEY_Ocircumflex 0x00d4 /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ -#define XKB_KEY_Otilde 0x00d5 /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ -#define XKB_KEY_Odiaeresis 0x00d6 /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ -#define XKB_KEY_multiply 0x00d7 /* U+00D7 MULTIPLICATION SIGN */ -#define XKB_KEY_Oslash 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ -#define XKB_KEY_Ooblique 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ -#define XKB_KEY_Ugrave 0x00d9 /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ -#define XKB_KEY_Uacute 0x00da /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ -#define XKB_KEY_Ucircumflex 0x00db /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ -#define XKB_KEY_Udiaeresis 0x00dc /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ -#define XKB_KEY_Yacute 0x00dd /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ -#define XKB_KEY_THORN 0x00de /* U+00DE LATIN CAPITAL LETTER THORN */ -#define XKB_KEY_Thorn 0x00de /* deprecated */ -#define XKB_KEY_ssharp 0x00df /* U+00DF LATIN SMALL LETTER SHARP S */ -#define XKB_KEY_agrave 0x00e0 /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ -#define XKB_KEY_aacute 0x00e1 /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ -#define XKB_KEY_acircumflex 0x00e2 /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ -#define XKB_KEY_atilde 0x00e3 /* U+00E3 LATIN SMALL LETTER A WITH TILDE */ -#define XKB_KEY_adiaeresis 0x00e4 /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ -#define XKB_KEY_aring 0x00e5 /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ -#define XKB_KEY_ae 0x00e6 /* U+00E6 LATIN SMALL LETTER AE */ -#define XKB_KEY_ccedilla 0x00e7 /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ -#define XKB_KEY_egrave 0x00e8 /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ -#define XKB_KEY_eacute 0x00e9 /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ -#define XKB_KEY_ecircumflex 0x00ea /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ -#define XKB_KEY_ediaeresis 0x00eb /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ -#define XKB_KEY_igrave 0x00ec /* U+00EC LATIN SMALL LETTER I WITH GRAVE */ -#define XKB_KEY_iacute 0x00ed /* U+00ED LATIN SMALL LETTER I WITH ACUTE */ -#define XKB_KEY_icircumflex 0x00ee /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ -#define XKB_KEY_idiaeresis 0x00ef /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ -#define XKB_KEY_eth 0x00f0 /* U+00F0 LATIN SMALL LETTER ETH */ -#define XKB_KEY_ntilde 0x00f1 /* U+00F1 LATIN SMALL LETTER N WITH TILDE */ -#define XKB_KEY_ograve 0x00f2 /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ -#define XKB_KEY_oacute 0x00f3 /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ -#define XKB_KEY_ocircumflex 0x00f4 /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ -#define XKB_KEY_otilde 0x00f5 /* U+00F5 LATIN SMALL LETTER O WITH TILDE */ -#define XKB_KEY_odiaeresis 0x00f6 /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ -#define XKB_KEY_division 0x00f7 /* U+00F7 DIVISION SIGN */ -#define XKB_KEY_oslash 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ -#define XKB_KEY_ooblique 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ -#define XKB_KEY_ugrave 0x00f9 /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ -#define XKB_KEY_uacute 0x00fa /* U+00FA LATIN SMALL LETTER U WITH ACUTE */ -#define XKB_KEY_ucircumflex 0x00fb /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ -#define XKB_KEY_udiaeresis 0x00fc /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ -#define XKB_KEY_yacute 0x00fd /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ -#define XKB_KEY_thorn 0x00fe /* U+00FE LATIN SMALL LETTER THORN */ -#define XKB_KEY_ydiaeresis 0x00ff /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ - -/* - * Latin 2 - * Byte 3 = 1 - */ - -#define XKB_KEY_Aogonek 0x01a1 /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */ -#define XKB_KEY_breve 0x01a2 /* U+02D8 BREVE */ -#define XKB_KEY_Lstroke 0x01a3 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */ -#define XKB_KEY_Lcaron 0x01a5 /* U+013D LATIN CAPITAL LETTER L WITH CARON */ -#define XKB_KEY_Sacute 0x01a6 /* U+015A LATIN CAPITAL LETTER S WITH ACUTE */ -#define XKB_KEY_Scaron 0x01a9 /* U+0160 LATIN CAPITAL LETTER S WITH CARON */ -#define XKB_KEY_Scedilla 0x01aa /* U+015E LATIN CAPITAL LETTER S WITH CEDILLA */ -#define XKB_KEY_Tcaron 0x01ab /* U+0164 LATIN CAPITAL LETTER T WITH CARON */ -#define XKB_KEY_Zacute 0x01ac /* U+0179 LATIN CAPITAL LETTER Z WITH ACUTE */ -#define XKB_KEY_Zcaron 0x01ae /* U+017D LATIN CAPITAL LETTER Z WITH CARON */ -#define XKB_KEY_Zabovedot 0x01af /* U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE */ -#define XKB_KEY_aogonek 0x01b1 /* U+0105 LATIN SMALL LETTER A WITH OGONEK */ -#define XKB_KEY_ogonek 0x01b2 /* U+02DB OGONEK */ -#define XKB_KEY_lstroke 0x01b3 /* U+0142 LATIN SMALL LETTER L WITH STROKE */ -#define XKB_KEY_lcaron 0x01b5 /* U+013E LATIN SMALL LETTER L WITH CARON */ -#define XKB_KEY_sacute 0x01b6 /* U+015B LATIN SMALL LETTER S WITH ACUTE */ -#define XKB_KEY_caron 0x01b7 /* U+02C7 CARON */ -#define XKB_KEY_scaron 0x01b9 /* U+0161 LATIN SMALL LETTER S WITH CARON */ -#define XKB_KEY_scedilla 0x01ba /* U+015F LATIN SMALL LETTER S WITH CEDILLA */ -#define XKB_KEY_tcaron 0x01bb /* U+0165 LATIN SMALL LETTER T WITH CARON */ -#define XKB_KEY_zacute 0x01bc /* U+017A LATIN SMALL LETTER Z WITH ACUTE */ -#define XKB_KEY_doubleacute 0x01bd /* U+02DD DOUBLE ACUTE ACCENT */ -#define XKB_KEY_zcaron 0x01be /* U+017E LATIN SMALL LETTER Z WITH CARON */ -#define XKB_KEY_zabovedot 0x01bf /* U+017C LATIN SMALL LETTER Z WITH DOT ABOVE */ -#define XKB_KEY_Racute 0x01c0 /* U+0154 LATIN CAPITAL LETTER R WITH ACUTE */ -#define XKB_KEY_Abreve 0x01c3 /* U+0102 LATIN CAPITAL LETTER A WITH BREVE */ -#define XKB_KEY_Lacute 0x01c5 /* U+0139 LATIN CAPITAL LETTER L WITH ACUTE */ -#define XKB_KEY_Cacute 0x01c6 /* U+0106 LATIN CAPITAL LETTER C WITH ACUTE */ -#define XKB_KEY_Ccaron 0x01c8 /* U+010C LATIN CAPITAL LETTER C WITH CARON */ -#define XKB_KEY_Eogonek 0x01ca /* U+0118 LATIN CAPITAL LETTER E WITH OGONEK */ -#define XKB_KEY_Ecaron 0x01cc /* U+011A LATIN CAPITAL LETTER E WITH CARON */ -#define XKB_KEY_Dcaron 0x01cf /* U+010E LATIN CAPITAL LETTER D WITH CARON */ -#define XKB_KEY_Dstroke 0x01d0 /* U+0110 LATIN CAPITAL LETTER D WITH STROKE */ -#define XKB_KEY_Nacute 0x01d1 /* U+0143 LATIN CAPITAL LETTER N WITH ACUTE */ -#define XKB_KEY_Ncaron 0x01d2 /* U+0147 LATIN CAPITAL LETTER N WITH CARON */ -#define XKB_KEY_Odoubleacute 0x01d5 /* U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ -#define XKB_KEY_Rcaron 0x01d8 /* U+0158 LATIN CAPITAL LETTER R WITH CARON */ -#define XKB_KEY_Uring 0x01d9 /* U+016E LATIN CAPITAL LETTER U WITH RING ABOVE */ -#define XKB_KEY_Udoubleacute 0x01db /* U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ -#define XKB_KEY_Tcedilla 0x01de /* U+0162 LATIN CAPITAL LETTER T WITH CEDILLA */ -#define XKB_KEY_racute 0x01e0 /* U+0155 LATIN SMALL LETTER R WITH ACUTE */ -#define XKB_KEY_abreve 0x01e3 /* U+0103 LATIN SMALL LETTER A WITH BREVE */ -#define XKB_KEY_lacute 0x01e5 /* U+013A LATIN SMALL LETTER L WITH ACUTE */ -#define XKB_KEY_cacute 0x01e6 /* U+0107 LATIN SMALL LETTER C WITH ACUTE */ -#define XKB_KEY_ccaron 0x01e8 /* U+010D LATIN SMALL LETTER C WITH CARON */ -#define XKB_KEY_eogonek 0x01ea /* U+0119 LATIN SMALL LETTER E WITH OGONEK */ -#define XKB_KEY_ecaron 0x01ec /* U+011B LATIN SMALL LETTER E WITH CARON */ -#define XKB_KEY_dcaron 0x01ef /* U+010F LATIN SMALL LETTER D WITH CARON */ -#define XKB_KEY_dstroke 0x01f0 /* U+0111 LATIN SMALL LETTER D WITH STROKE */ -#define XKB_KEY_nacute 0x01f1 /* U+0144 LATIN SMALL LETTER N WITH ACUTE */ -#define XKB_KEY_ncaron 0x01f2 /* U+0148 LATIN SMALL LETTER N WITH CARON */ -#define XKB_KEY_odoubleacute 0x01f5 /* U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE */ -#define XKB_KEY_rcaron 0x01f8 /* U+0159 LATIN SMALL LETTER R WITH CARON */ -#define XKB_KEY_uring 0x01f9 /* U+016F LATIN SMALL LETTER U WITH RING ABOVE */ -#define XKB_KEY_udoubleacute 0x01fb /* U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE */ -#define XKB_KEY_tcedilla 0x01fe /* U+0163 LATIN SMALL LETTER T WITH CEDILLA */ -#define XKB_KEY_abovedot 0x01ff /* U+02D9 DOT ABOVE */ - -/* - * Latin 3 - * Byte 3 = 2 - */ - -#define XKB_KEY_Hstroke 0x02a1 /* U+0126 LATIN CAPITAL LETTER H WITH STROKE */ -#define XKB_KEY_Hcircumflex 0x02a6 /* U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ -#define XKB_KEY_Iabovedot 0x02a9 /* U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE */ -#define XKB_KEY_Gbreve 0x02ab /* U+011E LATIN CAPITAL LETTER G WITH BREVE */ -#define XKB_KEY_Jcircumflex 0x02ac /* U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ -#define XKB_KEY_hstroke 0x02b1 /* U+0127 LATIN SMALL LETTER H WITH STROKE */ -#define XKB_KEY_hcircumflex 0x02b6 /* U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX */ -#define XKB_KEY_idotless 0x02b9 /* U+0131 LATIN SMALL LETTER DOTLESS I */ -#define XKB_KEY_gbreve 0x02bb /* U+011F LATIN SMALL LETTER G WITH BREVE */ -#define XKB_KEY_jcircumflex 0x02bc /* U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX */ -#define XKB_KEY_Cabovedot 0x02c5 /* U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE */ -#define XKB_KEY_Ccircumflex 0x02c6 /* U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ -#define XKB_KEY_Gabovedot 0x02d5 /* U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE */ -#define XKB_KEY_Gcircumflex 0x02d8 /* U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ -#define XKB_KEY_Ubreve 0x02dd /* U+016C LATIN CAPITAL LETTER U WITH BREVE */ -#define XKB_KEY_Scircumflex 0x02de /* U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ -#define XKB_KEY_cabovedot 0x02e5 /* U+010B LATIN SMALL LETTER C WITH DOT ABOVE */ -#define XKB_KEY_ccircumflex 0x02e6 /* U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX */ -#define XKB_KEY_gabovedot 0x02f5 /* U+0121 LATIN SMALL LETTER G WITH DOT ABOVE */ -#define XKB_KEY_gcircumflex 0x02f8 /* U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX */ -#define XKB_KEY_ubreve 0x02fd /* U+016D LATIN SMALL LETTER U WITH BREVE */ -#define XKB_KEY_scircumflex 0x02fe /* U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX */ - - -/* - * Latin 4 - * Byte 3 = 3 - */ - -#define XKB_KEY_kra 0x03a2 /* U+0138 LATIN SMALL LETTER KRA */ -#define XKB_KEY_kappa 0x03a2 /* deprecated */ -#define XKB_KEY_Rcedilla 0x03a3 /* U+0156 LATIN CAPITAL LETTER R WITH CEDILLA */ -#define XKB_KEY_Itilde 0x03a5 /* U+0128 LATIN CAPITAL LETTER I WITH TILDE */ -#define XKB_KEY_Lcedilla 0x03a6 /* U+013B LATIN CAPITAL LETTER L WITH CEDILLA */ -#define XKB_KEY_Emacron 0x03aa /* U+0112 LATIN CAPITAL LETTER E WITH MACRON */ -#define XKB_KEY_Gcedilla 0x03ab /* U+0122 LATIN CAPITAL LETTER G WITH CEDILLA */ -#define XKB_KEY_Tslash 0x03ac /* U+0166 LATIN CAPITAL LETTER T WITH STROKE */ -#define XKB_KEY_rcedilla 0x03b3 /* U+0157 LATIN SMALL LETTER R WITH CEDILLA */ -#define XKB_KEY_itilde 0x03b5 /* U+0129 LATIN SMALL LETTER I WITH TILDE */ -#define XKB_KEY_lcedilla 0x03b6 /* U+013C LATIN SMALL LETTER L WITH CEDILLA */ -#define XKB_KEY_emacron 0x03ba /* U+0113 LATIN SMALL LETTER E WITH MACRON */ -#define XKB_KEY_gcedilla 0x03bb /* U+0123 LATIN SMALL LETTER G WITH CEDILLA */ -#define XKB_KEY_tslash 0x03bc /* U+0167 LATIN SMALL LETTER T WITH STROKE */ -#define XKB_KEY_ENG 0x03bd /* U+014A LATIN CAPITAL LETTER ENG */ -#define XKB_KEY_eng 0x03bf /* U+014B LATIN SMALL LETTER ENG */ -#define XKB_KEY_Amacron 0x03c0 /* U+0100 LATIN CAPITAL LETTER A WITH MACRON */ -#define XKB_KEY_Iogonek 0x03c7 /* U+012E LATIN CAPITAL LETTER I WITH OGONEK */ -#define XKB_KEY_Eabovedot 0x03cc /* U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE */ -#define XKB_KEY_Imacron 0x03cf /* U+012A LATIN CAPITAL LETTER I WITH MACRON */ -#define XKB_KEY_Ncedilla 0x03d1 /* U+0145 LATIN CAPITAL LETTER N WITH CEDILLA */ -#define XKB_KEY_Omacron 0x03d2 /* U+014C LATIN CAPITAL LETTER O WITH MACRON */ -#define XKB_KEY_Kcedilla 0x03d3 /* U+0136 LATIN CAPITAL LETTER K WITH CEDILLA */ -#define XKB_KEY_Uogonek 0x03d9 /* U+0172 LATIN CAPITAL LETTER U WITH OGONEK */ -#define XKB_KEY_Utilde 0x03dd /* U+0168 LATIN CAPITAL LETTER U WITH TILDE */ -#define XKB_KEY_Umacron 0x03de /* U+016A LATIN CAPITAL LETTER U WITH MACRON */ -#define XKB_KEY_amacron 0x03e0 /* U+0101 LATIN SMALL LETTER A WITH MACRON */ -#define XKB_KEY_iogonek 0x03e7 /* U+012F LATIN SMALL LETTER I WITH OGONEK */ -#define XKB_KEY_eabovedot 0x03ec /* U+0117 LATIN SMALL LETTER E WITH DOT ABOVE */ -#define XKB_KEY_imacron 0x03ef /* U+012B LATIN SMALL LETTER I WITH MACRON */ -#define XKB_KEY_ncedilla 0x03f1 /* U+0146 LATIN SMALL LETTER N WITH CEDILLA */ -#define XKB_KEY_omacron 0x03f2 /* U+014D LATIN SMALL LETTER O WITH MACRON */ -#define XKB_KEY_kcedilla 0x03f3 /* U+0137 LATIN SMALL LETTER K WITH CEDILLA */ -#define XKB_KEY_uogonek 0x03f9 /* U+0173 LATIN SMALL LETTER U WITH OGONEK */ -#define XKB_KEY_utilde 0x03fd /* U+0169 LATIN SMALL LETTER U WITH TILDE */ -#define XKB_KEY_umacron 0x03fe /* U+016B LATIN SMALL LETTER U WITH MACRON */ - -/* - * Latin 8 - */ -#define XKB_KEY_Wcircumflex 0x1000174 /* U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ -#define XKB_KEY_wcircumflex 0x1000175 /* U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX */ -#define XKB_KEY_Ycircumflex 0x1000176 /* U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ -#define XKB_KEY_ycircumflex 0x1000177 /* U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX */ -#define XKB_KEY_Babovedot 0x1001e02 /* U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE */ -#define XKB_KEY_babovedot 0x1001e03 /* U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE */ -#define XKB_KEY_Dabovedot 0x1001e0a /* U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE */ -#define XKB_KEY_dabovedot 0x1001e0b /* U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE */ -#define XKB_KEY_Fabovedot 0x1001e1e /* U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE */ -#define XKB_KEY_fabovedot 0x1001e1f /* U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE */ -#define XKB_KEY_Mabovedot 0x1001e40 /* U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE */ -#define XKB_KEY_mabovedot 0x1001e41 /* U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE */ -#define XKB_KEY_Pabovedot 0x1001e56 /* U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE */ -#define XKB_KEY_pabovedot 0x1001e57 /* U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE */ -#define XKB_KEY_Sabovedot 0x1001e60 /* U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE */ -#define XKB_KEY_sabovedot 0x1001e61 /* U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE */ -#define XKB_KEY_Tabovedot 0x1001e6a /* U+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE */ -#define XKB_KEY_tabovedot 0x1001e6b /* U+1E6B LATIN SMALL LETTER T WITH DOT ABOVE */ -#define XKB_KEY_Wgrave 0x1001e80 /* U+1E80 LATIN CAPITAL LETTER W WITH GRAVE */ -#define XKB_KEY_wgrave 0x1001e81 /* U+1E81 LATIN SMALL LETTER W WITH GRAVE */ -#define XKB_KEY_Wacute 0x1001e82 /* U+1E82 LATIN CAPITAL LETTER W WITH ACUTE */ -#define XKB_KEY_wacute 0x1001e83 /* U+1E83 LATIN SMALL LETTER W WITH ACUTE */ -#define XKB_KEY_Wdiaeresis 0x1001e84 /* U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS */ -#define XKB_KEY_wdiaeresis 0x1001e85 /* U+1E85 LATIN SMALL LETTER W WITH DIAERESIS */ -#define XKB_KEY_Ygrave 0x1001ef2 /* U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE */ -#define XKB_KEY_ygrave 0x1001ef3 /* U+1EF3 LATIN SMALL LETTER Y WITH GRAVE */ - -/* - * Latin 9 - * Byte 3 = 0x13 - */ - -#define XKB_KEY_OE 0x13bc /* U+0152 LATIN CAPITAL LIGATURE OE */ -#define XKB_KEY_oe 0x13bd /* U+0153 LATIN SMALL LIGATURE OE */ -#define XKB_KEY_Ydiaeresis 0x13be /* U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS */ - -/* - * Katakana - * Byte 3 = 4 - */ - -#define XKB_KEY_overline 0x047e /* U+203E OVERLINE */ -#define XKB_KEY_kana_fullstop 0x04a1 /* U+3002 IDEOGRAPHIC FULL STOP */ -#define XKB_KEY_kana_openingbracket 0x04a2 /* U+300C LEFT CORNER BRACKET */ -#define XKB_KEY_kana_closingbracket 0x04a3 /* U+300D RIGHT CORNER BRACKET */ -#define XKB_KEY_kana_comma 0x04a4 /* U+3001 IDEOGRAPHIC COMMA */ -#define XKB_KEY_kana_conjunctive 0x04a5 /* U+30FB KATAKANA MIDDLE DOT */ -#define XKB_KEY_kana_middledot 0x04a5 /* deprecated */ -#define XKB_KEY_kana_WO 0x04a6 /* U+30F2 KATAKANA LETTER WO */ -#define XKB_KEY_kana_a 0x04a7 /* U+30A1 KATAKANA LETTER SMALL A */ -#define XKB_KEY_kana_i 0x04a8 /* U+30A3 KATAKANA LETTER SMALL I */ -#define XKB_KEY_kana_u 0x04a9 /* U+30A5 KATAKANA LETTER SMALL U */ -#define XKB_KEY_kana_e 0x04aa /* U+30A7 KATAKANA LETTER SMALL E */ -#define XKB_KEY_kana_o 0x04ab /* U+30A9 KATAKANA LETTER SMALL O */ -#define XKB_KEY_kana_ya 0x04ac /* U+30E3 KATAKANA LETTER SMALL YA */ -#define XKB_KEY_kana_yu 0x04ad /* U+30E5 KATAKANA LETTER SMALL YU */ -#define XKB_KEY_kana_yo 0x04ae /* U+30E7 KATAKANA LETTER SMALL YO */ -#define XKB_KEY_kana_tsu 0x04af /* U+30C3 KATAKANA LETTER SMALL TU */ -#define XKB_KEY_kana_tu 0x04af /* deprecated */ -#define XKB_KEY_prolongedsound 0x04b0 /* U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK */ -#define XKB_KEY_kana_A 0x04b1 /* U+30A2 KATAKANA LETTER A */ -#define XKB_KEY_kana_I 0x04b2 /* U+30A4 KATAKANA LETTER I */ -#define XKB_KEY_kana_U 0x04b3 /* U+30A6 KATAKANA LETTER U */ -#define XKB_KEY_kana_E 0x04b4 /* U+30A8 KATAKANA LETTER E */ -#define XKB_KEY_kana_O 0x04b5 /* U+30AA KATAKANA LETTER O */ -#define XKB_KEY_kana_KA 0x04b6 /* U+30AB KATAKANA LETTER KA */ -#define XKB_KEY_kana_KI 0x04b7 /* U+30AD KATAKANA LETTER KI */ -#define XKB_KEY_kana_KU 0x04b8 /* U+30AF KATAKANA LETTER KU */ -#define XKB_KEY_kana_KE 0x04b9 /* U+30B1 KATAKANA LETTER KE */ -#define XKB_KEY_kana_KO 0x04ba /* U+30B3 KATAKANA LETTER KO */ -#define XKB_KEY_kana_SA 0x04bb /* U+30B5 KATAKANA LETTER SA */ -#define XKB_KEY_kana_SHI 0x04bc /* U+30B7 KATAKANA LETTER SI */ -#define XKB_KEY_kana_SU 0x04bd /* U+30B9 KATAKANA LETTER SU */ -#define XKB_KEY_kana_SE 0x04be /* U+30BB KATAKANA LETTER SE */ -#define XKB_KEY_kana_SO 0x04bf /* U+30BD KATAKANA LETTER SO */ -#define XKB_KEY_kana_TA 0x04c0 /* U+30BF KATAKANA LETTER TA */ -#define XKB_KEY_kana_CHI 0x04c1 /* U+30C1 KATAKANA LETTER TI */ -#define XKB_KEY_kana_TI 0x04c1 /* deprecated */ -#define XKB_KEY_kana_TSU 0x04c2 /* U+30C4 KATAKANA LETTER TU */ -#define XKB_KEY_kana_TU 0x04c2 /* deprecated */ -#define XKB_KEY_kana_TE 0x04c3 /* U+30C6 KATAKANA LETTER TE */ -#define XKB_KEY_kana_TO 0x04c4 /* U+30C8 KATAKANA LETTER TO */ -#define XKB_KEY_kana_NA 0x04c5 /* U+30CA KATAKANA LETTER NA */ -#define XKB_KEY_kana_NI 0x04c6 /* U+30CB KATAKANA LETTER NI */ -#define XKB_KEY_kana_NU 0x04c7 /* U+30CC KATAKANA LETTER NU */ -#define XKB_KEY_kana_NE 0x04c8 /* U+30CD KATAKANA LETTER NE */ -#define XKB_KEY_kana_NO 0x04c9 /* U+30CE KATAKANA LETTER NO */ -#define XKB_KEY_kana_HA 0x04ca /* U+30CF KATAKANA LETTER HA */ -#define XKB_KEY_kana_HI 0x04cb /* U+30D2 KATAKANA LETTER HI */ -#define XKB_KEY_kana_FU 0x04cc /* U+30D5 KATAKANA LETTER HU */ -#define XKB_KEY_kana_HU 0x04cc /* deprecated */ -#define XKB_KEY_kana_HE 0x04cd /* U+30D8 KATAKANA LETTER HE */ -#define XKB_KEY_kana_HO 0x04ce /* U+30DB KATAKANA LETTER HO */ -#define XKB_KEY_kana_MA 0x04cf /* U+30DE KATAKANA LETTER MA */ -#define XKB_KEY_kana_MI 0x04d0 /* U+30DF KATAKANA LETTER MI */ -#define XKB_KEY_kana_MU 0x04d1 /* U+30E0 KATAKANA LETTER MU */ -#define XKB_KEY_kana_ME 0x04d2 /* U+30E1 KATAKANA LETTER ME */ -#define XKB_KEY_kana_MO 0x04d3 /* U+30E2 KATAKANA LETTER MO */ -#define XKB_KEY_kana_YA 0x04d4 /* U+30E4 KATAKANA LETTER YA */ -#define XKB_KEY_kana_YU 0x04d5 /* U+30E6 KATAKANA LETTER YU */ -#define XKB_KEY_kana_YO 0x04d6 /* U+30E8 KATAKANA LETTER YO */ -#define XKB_KEY_kana_RA 0x04d7 /* U+30E9 KATAKANA LETTER RA */ -#define XKB_KEY_kana_RI 0x04d8 /* U+30EA KATAKANA LETTER RI */ -#define XKB_KEY_kana_RU 0x04d9 /* U+30EB KATAKANA LETTER RU */ -#define XKB_KEY_kana_RE 0x04da /* U+30EC KATAKANA LETTER RE */ -#define XKB_KEY_kana_RO 0x04db /* U+30ED KATAKANA LETTER RO */ -#define XKB_KEY_kana_WA 0x04dc /* U+30EF KATAKANA LETTER WA */ -#define XKB_KEY_kana_N 0x04dd /* U+30F3 KATAKANA LETTER N */ -#define XKB_KEY_voicedsound 0x04de /* U+309B KATAKANA-HIRAGANA VOICED SOUND MARK */ -#define XKB_KEY_semivoicedsound 0x04df /* U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ -#define XKB_KEY_kana_switch 0xff7e /* Alias for mode_switch */ - -/* - * Arabic - * Byte 3 = 5 - */ - -#define XKB_KEY_Farsi_0 0x10006f0 /* U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO */ -#define XKB_KEY_Farsi_1 0x10006f1 /* U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE */ -#define XKB_KEY_Farsi_2 0x10006f2 /* U+06F2 EXTENDED ARABIC-INDIC DIGIT TWO */ -#define XKB_KEY_Farsi_3 0x10006f3 /* U+06F3 EXTENDED ARABIC-INDIC DIGIT THREE */ -#define XKB_KEY_Farsi_4 0x10006f4 /* U+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR */ -#define XKB_KEY_Farsi_5 0x10006f5 /* U+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE */ -#define XKB_KEY_Farsi_6 0x10006f6 /* U+06F6 EXTENDED ARABIC-INDIC DIGIT SIX */ -#define XKB_KEY_Farsi_7 0x10006f7 /* U+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN */ -#define XKB_KEY_Farsi_8 0x10006f8 /* U+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT */ -#define XKB_KEY_Farsi_9 0x10006f9 /* U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE */ -#define XKB_KEY_Arabic_percent 0x100066a /* U+066A ARABIC PERCENT SIGN */ -#define XKB_KEY_Arabic_superscript_alef 0x1000670 /* U+0670 ARABIC LETTER SUPERSCRIPT ALEF */ -#define XKB_KEY_Arabic_tteh 0x1000679 /* U+0679 ARABIC LETTER TTEH */ -#define XKB_KEY_Arabic_peh 0x100067e /* U+067E ARABIC LETTER PEH */ -#define XKB_KEY_Arabic_tcheh 0x1000686 /* U+0686 ARABIC LETTER TCHEH */ -#define XKB_KEY_Arabic_ddal 0x1000688 /* U+0688 ARABIC LETTER DDAL */ -#define XKB_KEY_Arabic_rreh 0x1000691 /* U+0691 ARABIC LETTER RREH */ -#define XKB_KEY_Arabic_comma 0x05ac /* U+060C ARABIC COMMA */ -#define XKB_KEY_Arabic_fullstop 0x10006d4 /* U+06D4 ARABIC FULL STOP */ -#define XKB_KEY_Arabic_0 0x1000660 /* U+0660 ARABIC-INDIC DIGIT ZERO */ -#define XKB_KEY_Arabic_1 0x1000661 /* U+0661 ARABIC-INDIC DIGIT ONE */ -#define XKB_KEY_Arabic_2 0x1000662 /* U+0662 ARABIC-INDIC DIGIT TWO */ -#define XKB_KEY_Arabic_3 0x1000663 /* U+0663 ARABIC-INDIC DIGIT THREE */ -#define XKB_KEY_Arabic_4 0x1000664 /* U+0664 ARABIC-INDIC DIGIT FOUR */ -#define XKB_KEY_Arabic_5 0x1000665 /* U+0665 ARABIC-INDIC DIGIT FIVE */ -#define XKB_KEY_Arabic_6 0x1000666 /* U+0666 ARABIC-INDIC DIGIT SIX */ -#define XKB_KEY_Arabic_7 0x1000667 /* U+0667 ARABIC-INDIC DIGIT SEVEN */ -#define XKB_KEY_Arabic_8 0x1000668 /* U+0668 ARABIC-INDIC DIGIT EIGHT */ -#define XKB_KEY_Arabic_9 0x1000669 /* U+0669 ARABIC-INDIC DIGIT NINE */ -#define XKB_KEY_Arabic_semicolon 0x05bb /* U+061B ARABIC SEMICOLON */ -#define XKB_KEY_Arabic_question_mark 0x05bf /* U+061F ARABIC QUESTION MARK */ -#define XKB_KEY_Arabic_hamza 0x05c1 /* U+0621 ARABIC LETTER HAMZA */ -#define XKB_KEY_Arabic_maddaonalef 0x05c2 /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */ -#define XKB_KEY_Arabic_hamzaonalef 0x05c3 /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */ -#define XKB_KEY_Arabic_hamzaonwaw 0x05c4 /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */ -#define XKB_KEY_Arabic_hamzaunderalef 0x05c5 /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */ -#define XKB_KEY_Arabic_hamzaonyeh 0x05c6 /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */ -#define XKB_KEY_Arabic_alef 0x05c7 /* U+0627 ARABIC LETTER ALEF */ -#define XKB_KEY_Arabic_beh 0x05c8 /* U+0628 ARABIC LETTER BEH */ -#define XKB_KEY_Arabic_tehmarbuta 0x05c9 /* U+0629 ARABIC LETTER TEH MARBUTA */ -#define XKB_KEY_Arabic_teh 0x05ca /* U+062A ARABIC LETTER TEH */ -#define XKB_KEY_Arabic_theh 0x05cb /* U+062B ARABIC LETTER THEH */ -#define XKB_KEY_Arabic_jeem 0x05cc /* U+062C ARABIC LETTER JEEM */ -#define XKB_KEY_Arabic_hah 0x05cd /* U+062D ARABIC LETTER HAH */ -#define XKB_KEY_Arabic_khah 0x05ce /* U+062E ARABIC LETTER KHAH */ -#define XKB_KEY_Arabic_dal 0x05cf /* U+062F ARABIC LETTER DAL */ -#define XKB_KEY_Arabic_thal 0x05d0 /* U+0630 ARABIC LETTER THAL */ -#define XKB_KEY_Arabic_ra 0x05d1 /* U+0631 ARABIC LETTER REH */ -#define XKB_KEY_Arabic_zain 0x05d2 /* U+0632 ARABIC LETTER ZAIN */ -#define XKB_KEY_Arabic_seen 0x05d3 /* U+0633 ARABIC LETTER SEEN */ -#define XKB_KEY_Arabic_sheen 0x05d4 /* U+0634 ARABIC LETTER SHEEN */ -#define XKB_KEY_Arabic_sad 0x05d5 /* U+0635 ARABIC LETTER SAD */ -#define XKB_KEY_Arabic_dad 0x05d6 /* U+0636 ARABIC LETTER DAD */ -#define XKB_KEY_Arabic_tah 0x05d7 /* U+0637 ARABIC LETTER TAH */ -#define XKB_KEY_Arabic_zah 0x05d8 /* U+0638 ARABIC LETTER ZAH */ -#define XKB_KEY_Arabic_ain 0x05d9 /* U+0639 ARABIC LETTER AIN */ -#define XKB_KEY_Arabic_ghain 0x05da /* U+063A ARABIC LETTER GHAIN */ -#define XKB_KEY_Arabic_tatweel 0x05e0 /* U+0640 ARABIC TATWEEL */ -#define XKB_KEY_Arabic_feh 0x05e1 /* U+0641 ARABIC LETTER FEH */ -#define XKB_KEY_Arabic_qaf 0x05e2 /* U+0642 ARABIC LETTER QAF */ -#define XKB_KEY_Arabic_kaf 0x05e3 /* U+0643 ARABIC LETTER KAF */ -#define XKB_KEY_Arabic_lam 0x05e4 /* U+0644 ARABIC LETTER LAM */ -#define XKB_KEY_Arabic_meem 0x05e5 /* U+0645 ARABIC LETTER MEEM */ -#define XKB_KEY_Arabic_noon 0x05e6 /* U+0646 ARABIC LETTER NOON */ -#define XKB_KEY_Arabic_ha 0x05e7 /* U+0647 ARABIC LETTER HEH */ -#define XKB_KEY_Arabic_heh 0x05e7 /* deprecated */ -#define XKB_KEY_Arabic_waw 0x05e8 /* U+0648 ARABIC LETTER WAW */ -#define XKB_KEY_Arabic_alefmaksura 0x05e9 /* U+0649 ARABIC LETTER ALEF MAKSURA */ -#define XKB_KEY_Arabic_yeh 0x05ea /* U+064A ARABIC LETTER YEH */ -#define XKB_KEY_Arabic_fathatan 0x05eb /* U+064B ARABIC FATHATAN */ -#define XKB_KEY_Arabic_dammatan 0x05ec /* U+064C ARABIC DAMMATAN */ -#define XKB_KEY_Arabic_kasratan 0x05ed /* U+064D ARABIC KASRATAN */ -#define XKB_KEY_Arabic_fatha 0x05ee /* U+064E ARABIC FATHA */ -#define XKB_KEY_Arabic_damma 0x05ef /* U+064F ARABIC DAMMA */ -#define XKB_KEY_Arabic_kasra 0x05f0 /* U+0650 ARABIC KASRA */ -#define XKB_KEY_Arabic_shadda 0x05f1 /* U+0651 ARABIC SHADDA */ -#define XKB_KEY_Arabic_sukun 0x05f2 /* U+0652 ARABIC SUKUN */ -#define XKB_KEY_Arabic_madda_above 0x1000653 /* U+0653 ARABIC MADDAH ABOVE */ -#define XKB_KEY_Arabic_hamza_above 0x1000654 /* U+0654 ARABIC HAMZA ABOVE */ -#define XKB_KEY_Arabic_hamza_below 0x1000655 /* U+0655 ARABIC HAMZA BELOW */ -#define XKB_KEY_Arabic_jeh 0x1000698 /* U+0698 ARABIC LETTER JEH */ -#define XKB_KEY_Arabic_veh 0x10006a4 /* U+06A4 ARABIC LETTER VEH */ -#define XKB_KEY_Arabic_keheh 0x10006a9 /* U+06A9 ARABIC LETTER KEHEH */ -#define XKB_KEY_Arabic_gaf 0x10006af /* U+06AF ARABIC LETTER GAF */ -#define XKB_KEY_Arabic_noon_ghunna 0x10006ba /* U+06BA ARABIC LETTER NOON GHUNNA */ -#define XKB_KEY_Arabic_heh_doachashmee 0x10006be /* U+06BE ARABIC LETTER HEH DOACHASHMEE */ -#define XKB_KEY_Farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ -#define XKB_KEY_Arabic_farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */ -#define XKB_KEY_Arabic_yeh_baree 0x10006d2 /* U+06D2 ARABIC LETTER YEH BARREE */ -#define XKB_KEY_Arabic_heh_goal 0x10006c1 /* U+06C1 ARABIC LETTER HEH GOAL */ -#define XKB_KEY_Arabic_switch 0xff7e /* Alias for mode_switch */ - -/* - * Cyrillic - * Byte 3 = 6 - */ -#define XKB_KEY_Cyrillic_GHE_bar 0x1000492 /* U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE */ -#define XKB_KEY_Cyrillic_ghe_bar 0x1000493 /* U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE */ -#define XKB_KEY_Cyrillic_ZHE_descender 0x1000496 /* U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */ -#define XKB_KEY_Cyrillic_zhe_descender 0x1000497 /* U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER */ -#define XKB_KEY_Cyrillic_KA_descender 0x100049a /* U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER */ -#define XKB_KEY_Cyrillic_ka_descender 0x100049b /* U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER */ -#define XKB_KEY_Cyrillic_KA_vertstroke 0x100049c /* U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */ -#define XKB_KEY_Cyrillic_ka_vertstroke 0x100049d /* U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE */ -#define XKB_KEY_Cyrillic_EN_descender 0x10004a2 /* U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER */ -#define XKB_KEY_Cyrillic_en_descender 0x10004a3 /* U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER */ -#define XKB_KEY_Cyrillic_U_straight 0x10004ae /* U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U */ -#define XKB_KEY_Cyrillic_u_straight 0x10004af /* U+04AF CYRILLIC SMALL LETTER STRAIGHT U */ -#define XKB_KEY_Cyrillic_U_straight_bar 0x10004b0 /* U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */ -#define XKB_KEY_Cyrillic_u_straight_bar 0x10004b1 /* U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE */ -#define XKB_KEY_Cyrillic_HA_descender 0x10004b2 /* U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER */ -#define XKB_KEY_Cyrillic_ha_descender 0x10004b3 /* U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER */ -#define XKB_KEY_Cyrillic_CHE_descender 0x10004b6 /* U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */ -#define XKB_KEY_Cyrillic_che_descender 0x10004b7 /* U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER */ -#define XKB_KEY_Cyrillic_CHE_vertstroke 0x10004b8 /* U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */ -#define XKB_KEY_Cyrillic_che_vertstroke 0x10004b9 /* U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE */ -#define XKB_KEY_Cyrillic_SHHA 0x10004ba /* U+04BA CYRILLIC CAPITAL LETTER SHHA */ -#define XKB_KEY_Cyrillic_shha 0x10004bb /* U+04BB CYRILLIC SMALL LETTER SHHA */ - -#define XKB_KEY_Cyrillic_SCHWA 0x10004d8 /* U+04D8 CYRILLIC CAPITAL LETTER SCHWA */ -#define XKB_KEY_Cyrillic_schwa 0x10004d9 /* U+04D9 CYRILLIC SMALL LETTER SCHWA */ -#define XKB_KEY_Cyrillic_I_macron 0x10004e2 /* U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON */ -#define XKB_KEY_Cyrillic_i_macron 0x10004e3 /* U+04E3 CYRILLIC SMALL LETTER I WITH MACRON */ -#define XKB_KEY_Cyrillic_O_bar 0x10004e8 /* U+04E8 CYRILLIC CAPITAL LETTER BARRED O */ -#define XKB_KEY_Cyrillic_o_bar 0x10004e9 /* U+04E9 CYRILLIC SMALL LETTER BARRED O */ -#define XKB_KEY_Cyrillic_U_macron 0x10004ee /* U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON */ -#define XKB_KEY_Cyrillic_u_macron 0x10004ef /* U+04EF CYRILLIC SMALL LETTER U WITH MACRON */ - -#define XKB_KEY_Serbian_dje 0x06a1 /* U+0452 CYRILLIC SMALL LETTER DJE */ -#define XKB_KEY_Macedonia_gje 0x06a2 /* U+0453 CYRILLIC SMALL LETTER GJE */ -#define XKB_KEY_Cyrillic_io 0x06a3 /* U+0451 CYRILLIC SMALL LETTER IO */ -#define XKB_KEY_Ukrainian_ie 0x06a4 /* U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE */ -#define XKB_KEY_Ukranian_je 0x06a4 /* deprecated */ -#define XKB_KEY_Macedonia_dse 0x06a5 /* U+0455 CYRILLIC SMALL LETTER DZE */ -#define XKB_KEY_Ukrainian_i 0x06a6 /* U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ -#define XKB_KEY_Ukranian_i 0x06a6 /* deprecated */ -#define XKB_KEY_Ukrainian_yi 0x06a7 /* U+0457 CYRILLIC SMALL LETTER YI */ -#define XKB_KEY_Ukranian_yi 0x06a7 /* deprecated */ -#define XKB_KEY_Cyrillic_je 0x06a8 /* U+0458 CYRILLIC SMALL LETTER JE */ -#define XKB_KEY_Serbian_je 0x06a8 /* deprecated */ -#define XKB_KEY_Cyrillic_lje 0x06a9 /* U+0459 CYRILLIC SMALL LETTER LJE */ -#define XKB_KEY_Serbian_lje 0x06a9 /* deprecated */ -#define XKB_KEY_Cyrillic_nje 0x06aa /* U+045A CYRILLIC SMALL LETTER NJE */ -#define XKB_KEY_Serbian_nje 0x06aa /* deprecated */ -#define XKB_KEY_Serbian_tshe 0x06ab /* U+045B CYRILLIC SMALL LETTER TSHE */ -#define XKB_KEY_Macedonia_kje 0x06ac /* U+045C CYRILLIC SMALL LETTER KJE */ -#define XKB_KEY_Ukrainian_ghe_with_upturn 0x06ad /* U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN */ -#define XKB_KEY_Byelorussian_shortu 0x06ae /* U+045E CYRILLIC SMALL LETTER SHORT U */ -#define XKB_KEY_Cyrillic_dzhe 0x06af /* U+045F CYRILLIC SMALL LETTER DZHE */ -#define XKB_KEY_Serbian_dze 0x06af /* deprecated */ -#define XKB_KEY_numerosign 0x06b0 /* U+2116 NUMERO SIGN */ -#define XKB_KEY_Serbian_DJE 0x06b1 /* U+0402 CYRILLIC CAPITAL LETTER DJE */ -#define XKB_KEY_Macedonia_GJE 0x06b2 /* U+0403 CYRILLIC CAPITAL LETTER GJE */ -#define XKB_KEY_Cyrillic_IO 0x06b3 /* U+0401 CYRILLIC CAPITAL LETTER IO */ -#define XKB_KEY_Ukrainian_IE 0x06b4 /* U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE */ -#define XKB_KEY_Ukranian_JE 0x06b4 /* deprecated */ -#define XKB_KEY_Macedonia_DSE 0x06b5 /* U+0405 CYRILLIC CAPITAL LETTER DZE */ -#define XKB_KEY_Ukrainian_I 0x06b6 /* U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ -#define XKB_KEY_Ukranian_I 0x06b6 /* deprecated */ -#define XKB_KEY_Ukrainian_YI 0x06b7 /* U+0407 CYRILLIC CAPITAL LETTER YI */ -#define XKB_KEY_Ukranian_YI 0x06b7 /* deprecated */ -#define XKB_KEY_Cyrillic_JE 0x06b8 /* U+0408 CYRILLIC CAPITAL LETTER JE */ -#define XKB_KEY_Serbian_JE 0x06b8 /* deprecated */ -#define XKB_KEY_Cyrillic_LJE 0x06b9 /* U+0409 CYRILLIC CAPITAL LETTER LJE */ -#define XKB_KEY_Serbian_LJE 0x06b9 /* deprecated */ -#define XKB_KEY_Cyrillic_NJE 0x06ba /* U+040A CYRILLIC CAPITAL LETTER NJE */ -#define XKB_KEY_Serbian_NJE 0x06ba /* deprecated */ -#define XKB_KEY_Serbian_TSHE 0x06bb /* U+040B CYRILLIC CAPITAL LETTER TSHE */ -#define XKB_KEY_Macedonia_KJE 0x06bc /* U+040C CYRILLIC CAPITAL LETTER KJE */ -#define XKB_KEY_Ukrainian_GHE_WITH_UPTURN 0x06bd /* U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ -#define XKB_KEY_Byelorussian_SHORTU 0x06be /* U+040E CYRILLIC CAPITAL LETTER SHORT U */ -#define XKB_KEY_Cyrillic_DZHE 0x06bf /* U+040F CYRILLIC CAPITAL LETTER DZHE */ -#define XKB_KEY_Serbian_DZE 0x06bf /* deprecated */ -#define XKB_KEY_Cyrillic_yu 0x06c0 /* U+044E CYRILLIC SMALL LETTER YU */ -#define XKB_KEY_Cyrillic_a 0x06c1 /* U+0430 CYRILLIC SMALL LETTER A */ -#define XKB_KEY_Cyrillic_be 0x06c2 /* U+0431 CYRILLIC SMALL LETTER BE */ -#define XKB_KEY_Cyrillic_tse 0x06c3 /* U+0446 CYRILLIC SMALL LETTER TSE */ -#define XKB_KEY_Cyrillic_de 0x06c4 /* U+0434 CYRILLIC SMALL LETTER DE */ -#define XKB_KEY_Cyrillic_ie 0x06c5 /* U+0435 CYRILLIC SMALL LETTER IE */ -#define XKB_KEY_Cyrillic_ef 0x06c6 /* U+0444 CYRILLIC SMALL LETTER EF */ -#define XKB_KEY_Cyrillic_ghe 0x06c7 /* U+0433 CYRILLIC SMALL LETTER GHE */ -#define XKB_KEY_Cyrillic_ha 0x06c8 /* U+0445 CYRILLIC SMALL LETTER HA */ -#define XKB_KEY_Cyrillic_i 0x06c9 /* U+0438 CYRILLIC SMALL LETTER I */ -#define XKB_KEY_Cyrillic_shorti 0x06ca /* U+0439 CYRILLIC SMALL LETTER SHORT I */ -#define XKB_KEY_Cyrillic_ka 0x06cb /* U+043A CYRILLIC SMALL LETTER KA */ -#define XKB_KEY_Cyrillic_el 0x06cc /* U+043B CYRILLIC SMALL LETTER EL */ -#define XKB_KEY_Cyrillic_em 0x06cd /* U+043C CYRILLIC SMALL LETTER EM */ -#define XKB_KEY_Cyrillic_en 0x06ce /* U+043D CYRILLIC SMALL LETTER EN */ -#define XKB_KEY_Cyrillic_o 0x06cf /* U+043E CYRILLIC SMALL LETTER O */ -#define XKB_KEY_Cyrillic_pe 0x06d0 /* U+043F CYRILLIC SMALL LETTER PE */ -#define XKB_KEY_Cyrillic_ya 0x06d1 /* U+044F CYRILLIC SMALL LETTER YA */ -#define XKB_KEY_Cyrillic_er 0x06d2 /* U+0440 CYRILLIC SMALL LETTER ER */ -#define XKB_KEY_Cyrillic_es 0x06d3 /* U+0441 CYRILLIC SMALL LETTER ES */ -#define XKB_KEY_Cyrillic_te 0x06d4 /* U+0442 CYRILLIC SMALL LETTER TE */ -#define XKB_KEY_Cyrillic_u 0x06d5 /* U+0443 CYRILLIC SMALL LETTER U */ -#define XKB_KEY_Cyrillic_zhe 0x06d6 /* U+0436 CYRILLIC SMALL LETTER ZHE */ -#define XKB_KEY_Cyrillic_ve 0x06d7 /* U+0432 CYRILLIC SMALL LETTER VE */ -#define XKB_KEY_Cyrillic_softsign 0x06d8 /* U+044C CYRILLIC SMALL LETTER SOFT SIGN */ -#define XKB_KEY_Cyrillic_yeru 0x06d9 /* U+044B CYRILLIC SMALL LETTER YERU */ -#define XKB_KEY_Cyrillic_ze 0x06da /* U+0437 CYRILLIC SMALL LETTER ZE */ -#define XKB_KEY_Cyrillic_sha 0x06db /* U+0448 CYRILLIC SMALL LETTER SHA */ -#define XKB_KEY_Cyrillic_e 0x06dc /* U+044D CYRILLIC SMALL LETTER E */ -#define XKB_KEY_Cyrillic_shcha 0x06dd /* U+0449 CYRILLIC SMALL LETTER SHCHA */ -#define XKB_KEY_Cyrillic_che 0x06de /* U+0447 CYRILLIC SMALL LETTER CHE */ -#define XKB_KEY_Cyrillic_hardsign 0x06df /* U+044A CYRILLIC SMALL LETTER HARD SIGN */ -#define XKB_KEY_Cyrillic_YU 0x06e0 /* U+042E CYRILLIC CAPITAL LETTER YU */ -#define XKB_KEY_Cyrillic_A 0x06e1 /* U+0410 CYRILLIC CAPITAL LETTER A */ -#define XKB_KEY_Cyrillic_BE 0x06e2 /* U+0411 CYRILLIC CAPITAL LETTER BE */ -#define XKB_KEY_Cyrillic_TSE 0x06e3 /* U+0426 CYRILLIC CAPITAL LETTER TSE */ -#define XKB_KEY_Cyrillic_DE 0x06e4 /* U+0414 CYRILLIC CAPITAL LETTER DE */ -#define XKB_KEY_Cyrillic_IE 0x06e5 /* U+0415 CYRILLIC CAPITAL LETTER IE */ -#define XKB_KEY_Cyrillic_EF 0x06e6 /* U+0424 CYRILLIC CAPITAL LETTER EF */ -#define XKB_KEY_Cyrillic_GHE 0x06e7 /* U+0413 CYRILLIC CAPITAL LETTER GHE */ -#define XKB_KEY_Cyrillic_HA 0x06e8 /* U+0425 CYRILLIC CAPITAL LETTER HA */ -#define XKB_KEY_Cyrillic_I 0x06e9 /* U+0418 CYRILLIC CAPITAL LETTER I */ -#define XKB_KEY_Cyrillic_SHORTI 0x06ea /* U+0419 CYRILLIC CAPITAL LETTER SHORT I */ -#define XKB_KEY_Cyrillic_KA 0x06eb /* U+041A CYRILLIC CAPITAL LETTER KA */ -#define XKB_KEY_Cyrillic_EL 0x06ec /* U+041B CYRILLIC CAPITAL LETTER EL */ -#define XKB_KEY_Cyrillic_EM 0x06ed /* U+041C CYRILLIC CAPITAL LETTER EM */ -#define XKB_KEY_Cyrillic_EN 0x06ee /* U+041D CYRILLIC CAPITAL LETTER EN */ -#define XKB_KEY_Cyrillic_O 0x06ef /* U+041E CYRILLIC CAPITAL LETTER O */ -#define XKB_KEY_Cyrillic_PE 0x06f0 /* U+041F CYRILLIC CAPITAL LETTER PE */ -#define XKB_KEY_Cyrillic_YA 0x06f1 /* U+042F CYRILLIC CAPITAL LETTER YA */ -#define XKB_KEY_Cyrillic_ER 0x06f2 /* U+0420 CYRILLIC CAPITAL LETTER ER */ -#define XKB_KEY_Cyrillic_ES 0x06f3 /* U+0421 CYRILLIC CAPITAL LETTER ES */ -#define XKB_KEY_Cyrillic_TE 0x06f4 /* U+0422 CYRILLIC CAPITAL LETTER TE */ -#define XKB_KEY_Cyrillic_U 0x06f5 /* U+0423 CYRILLIC CAPITAL LETTER U */ -#define XKB_KEY_Cyrillic_ZHE 0x06f6 /* U+0416 CYRILLIC CAPITAL LETTER ZHE */ -#define XKB_KEY_Cyrillic_VE 0x06f7 /* U+0412 CYRILLIC CAPITAL LETTER VE */ -#define XKB_KEY_Cyrillic_SOFTSIGN 0x06f8 /* U+042C CYRILLIC CAPITAL LETTER SOFT SIGN */ -#define XKB_KEY_Cyrillic_YERU 0x06f9 /* U+042B CYRILLIC CAPITAL LETTER YERU */ -#define XKB_KEY_Cyrillic_ZE 0x06fa /* U+0417 CYRILLIC CAPITAL LETTER ZE */ -#define XKB_KEY_Cyrillic_SHA 0x06fb /* U+0428 CYRILLIC CAPITAL LETTER SHA */ -#define XKB_KEY_Cyrillic_E 0x06fc /* U+042D CYRILLIC CAPITAL LETTER E */ -#define XKB_KEY_Cyrillic_SHCHA 0x06fd /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */ -#define XKB_KEY_Cyrillic_CHE 0x06fe /* U+0427 CYRILLIC CAPITAL LETTER CHE */ -#define XKB_KEY_Cyrillic_HARDSIGN 0x06ff /* U+042A CYRILLIC CAPITAL LETTER HARD SIGN */ - -/* - * Greek - * (based on an early draft of, and not quite identical to, ISO/IEC 8859-7) - * Byte 3 = 7 - */ - -#define XKB_KEY_Greek_ALPHAaccent 0x07a1 /* U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS */ -#define XKB_KEY_Greek_EPSILONaccent 0x07a2 /* U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS */ -#define XKB_KEY_Greek_ETAaccent 0x07a3 /* U+0389 GREEK CAPITAL LETTER ETA WITH TONOS */ -#define XKB_KEY_Greek_IOTAaccent 0x07a4 /* U+038A GREEK CAPITAL LETTER IOTA WITH TONOS */ -#define XKB_KEY_Greek_IOTAdieresis 0x07a5 /* U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ -#define XKB_KEY_Greek_IOTAdiaeresis 0x07a5 /* old typo */ -#define XKB_KEY_Greek_OMICRONaccent 0x07a7 /* U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS */ -#define XKB_KEY_Greek_UPSILONaccent 0x07a8 /* U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS */ -#define XKB_KEY_Greek_UPSILONdieresis 0x07a9 /* U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ -#define XKB_KEY_Greek_OMEGAaccent 0x07ab /* U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS */ -#define XKB_KEY_Greek_accentdieresis 0x07ae /* U+0385 GREEK DIALYTIKA TONOS */ -#define XKB_KEY_Greek_horizbar 0x07af /* U+2015 HORIZONTAL BAR */ -#define XKB_KEY_Greek_alphaaccent 0x07b1 /* U+03AC GREEK SMALL LETTER ALPHA WITH TONOS */ -#define XKB_KEY_Greek_epsilonaccent 0x07b2 /* U+03AD GREEK SMALL LETTER EPSILON WITH TONOS */ -#define XKB_KEY_Greek_etaaccent 0x07b3 /* U+03AE GREEK SMALL LETTER ETA WITH TONOS */ -#define XKB_KEY_Greek_iotaaccent 0x07b4 /* U+03AF GREEK SMALL LETTER IOTA WITH TONOS */ -#define XKB_KEY_Greek_iotadieresis 0x07b5 /* U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA */ -#define XKB_KEY_Greek_iotaaccentdieresis 0x07b6 /* U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ -#define XKB_KEY_Greek_omicronaccent 0x07b7 /* U+03CC GREEK SMALL LETTER OMICRON WITH TONOS */ -#define XKB_KEY_Greek_upsilonaccent 0x07b8 /* U+03CD GREEK SMALL LETTER UPSILON WITH TONOS */ -#define XKB_KEY_Greek_upsilondieresis 0x07b9 /* U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ -#define XKB_KEY_Greek_upsilonaccentdieresis 0x07ba /* U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ -#define XKB_KEY_Greek_omegaaccent 0x07bb /* U+03CE GREEK SMALL LETTER OMEGA WITH TONOS */ -#define XKB_KEY_Greek_ALPHA 0x07c1 /* U+0391 GREEK CAPITAL LETTER ALPHA */ -#define XKB_KEY_Greek_BETA 0x07c2 /* U+0392 GREEK CAPITAL LETTER BETA */ -#define XKB_KEY_Greek_GAMMA 0x07c3 /* U+0393 GREEK CAPITAL LETTER GAMMA */ -#define XKB_KEY_Greek_DELTA 0x07c4 /* U+0394 GREEK CAPITAL LETTER DELTA */ -#define XKB_KEY_Greek_EPSILON 0x07c5 /* U+0395 GREEK CAPITAL LETTER EPSILON */ -#define XKB_KEY_Greek_ZETA 0x07c6 /* U+0396 GREEK CAPITAL LETTER ZETA */ -#define XKB_KEY_Greek_ETA 0x07c7 /* U+0397 GREEK CAPITAL LETTER ETA */ -#define XKB_KEY_Greek_THETA 0x07c8 /* U+0398 GREEK CAPITAL LETTER THETA */ -#define XKB_KEY_Greek_IOTA 0x07c9 /* U+0399 GREEK CAPITAL LETTER IOTA */ -#define XKB_KEY_Greek_KAPPA 0x07ca /* U+039A GREEK CAPITAL LETTER KAPPA */ -#define XKB_KEY_Greek_LAMDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ -#define XKB_KEY_Greek_LAMBDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */ -#define XKB_KEY_Greek_MU 0x07cc /* U+039C GREEK CAPITAL LETTER MU */ -#define XKB_KEY_Greek_NU 0x07cd /* U+039D GREEK CAPITAL LETTER NU */ -#define XKB_KEY_Greek_XI 0x07ce /* U+039E GREEK CAPITAL LETTER XI */ -#define XKB_KEY_Greek_OMICRON 0x07cf /* U+039F GREEK CAPITAL LETTER OMICRON */ -#define XKB_KEY_Greek_PI 0x07d0 /* U+03A0 GREEK CAPITAL LETTER PI */ -#define XKB_KEY_Greek_RHO 0x07d1 /* U+03A1 GREEK CAPITAL LETTER RHO */ -#define XKB_KEY_Greek_SIGMA 0x07d2 /* U+03A3 GREEK CAPITAL LETTER SIGMA */ -#define XKB_KEY_Greek_TAU 0x07d4 /* U+03A4 GREEK CAPITAL LETTER TAU */ -#define XKB_KEY_Greek_UPSILON 0x07d5 /* U+03A5 GREEK CAPITAL LETTER UPSILON */ -#define XKB_KEY_Greek_PHI 0x07d6 /* U+03A6 GREEK CAPITAL LETTER PHI */ -#define XKB_KEY_Greek_CHI 0x07d7 /* U+03A7 GREEK CAPITAL LETTER CHI */ -#define XKB_KEY_Greek_PSI 0x07d8 /* U+03A8 GREEK CAPITAL LETTER PSI */ -#define XKB_KEY_Greek_OMEGA 0x07d9 /* U+03A9 GREEK CAPITAL LETTER OMEGA */ -#define XKB_KEY_Greek_alpha 0x07e1 /* U+03B1 GREEK SMALL LETTER ALPHA */ -#define XKB_KEY_Greek_beta 0x07e2 /* U+03B2 GREEK SMALL LETTER BETA */ -#define XKB_KEY_Greek_gamma 0x07e3 /* U+03B3 GREEK SMALL LETTER GAMMA */ -#define XKB_KEY_Greek_delta 0x07e4 /* U+03B4 GREEK SMALL LETTER DELTA */ -#define XKB_KEY_Greek_epsilon 0x07e5 /* U+03B5 GREEK SMALL LETTER EPSILON */ -#define XKB_KEY_Greek_zeta 0x07e6 /* U+03B6 GREEK SMALL LETTER ZETA */ -#define XKB_KEY_Greek_eta 0x07e7 /* U+03B7 GREEK SMALL LETTER ETA */ -#define XKB_KEY_Greek_theta 0x07e8 /* U+03B8 GREEK SMALL LETTER THETA */ -#define XKB_KEY_Greek_iota 0x07e9 /* U+03B9 GREEK SMALL LETTER IOTA */ -#define XKB_KEY_Greek_kappa 0x07ea /* U+03BA GREEK SMALL LETTER KAPPA */ -#define XKB_KEY_Greek_lamda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ -#define XKB_KEY_Greek_lambda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */ -#define XKB_KEY_Greek_mu 0x07ec /* U+03BC GREEK SMALL LETTER MU */ -#define XKB_KEY_Greek_nu 0x07ed /* U+03BD GREEK SMALL LETTER NU */ -#define XKB_KEY_Greek_xi 0x07ee /* U+03BE GREEK SMALL LETTER XI */ -#define XKB_KEY_Greek_omicron 0x07ef /* U+03BF GREEK SMALL LETTER OMICRON */ -#define XKB_KEY_Greek_pi 0x07f0 /* U+03C0 GREEK SMALL LETTER PI */ -#define XKB_KEY_Greek_rho 0x07f1 /* U+03C1 GREEK SMALL LETTER RHO */ -#define XKB_KEY_Greek_sigma 0x07f2 /* U+03C3 GREEK SMALL LETTER SIGMA */ -#define XKB_KEY_Greek_finalsmallsigma 0x07f3 /* U+03C2 GREEK SMALL LETTER FINAL SIGMA */ -#define XKB_KEY_Greek_tau 0x07f4 /* U+03C4 GREEK SMALL LETTER TAU */ -#define XKB_KEY_Greek_upsilon 0x07f5 /* U+03C5 GREEK SMALL LETTER UPSILON */ -#define XKB_KEY_Greek_phi 0x07f6 /* U+03C6 GREEK SMALL LETTER PHI */ -#define XKB_KEY_Greek_chi 0x07f7 /* U+03C7 GREEK SMALL LETTER CHI */ -#define XKB_KEY_Greek_psi 0x07f8 /* U+03C8 GREEK SMALL LETTER PSI */ -#define XKB_KEY_Greek_omega 0x07f9 /* U+03C9 GREEK SMALL LETTER OMEGA */ -#define XKB_KEY_Greek_switch 0xff7e /* Alias for mode_switch */ - -/* - * Technical - * (from the DEC VT330/VT420 Technical Character Set, http://vt100.net/charsets/technical.html) - * Byte 3 = 8 - */ - -#define XKB_KEY_leftradical 0x08a1 /* U+23B7 RADICAL SYMBOL BOTTOM */ -#define XKB_KEY_topleftradical 0x08a2 /*(U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT)*/ -#define XKB_KEY_horizconnector 0x08a3 /*(U+2500 BOX DRAWINGS LIGHT HORIZONTAL)*/ -#define XKB_KEY_topintegral 0x08a4 /* U+2320 TOP HALF INTEGRAL */ -#define XKB_KEY_botintegral 0x08a5 /* U+2321 BOTTOM HALF INTEGRAL */ -#define XKB_KEY_vertconnector 0x08a6 /*(U+2502 BOX DRAWINGS LIGHT VERTICAL)*/ -#define XKB_KEY_topleftsqbracket 0x08a7 /* U+23A1 LEFT SQUARE BRACKET UPPER CORNER */ -#define XKB_KEY_botleftsqbracket 0x08a8 /* U+23A3 LEFT SQUARE BRACKET LOWER CORNER */ -#define XKB_KEY_toprightsqbracket 0x08a9 /* U+23A4 RIGHT SQUARE BRACKET UPPER CORNER */ -#define XKB_KEY_botrightsqbracket 0x08aa /* U+23A6 RIGHT SQUARE BRACKET LOWER CORNER */ -#define XKB_KEY_topleftparens 0x08ab /* U+239B LEFT PARENTHESIS UPPER HOOK */ -#define XKB_KEY_botleftparens 0x08ac /* U+239D LEFT PARENTHESIS LOWER HOOK */ -#define XKB_KEY_toprightparens 0x08ad /* U+239E RIGHT PARENTHESIS UPPER HOOK */ -#define XKB_KEY_botrightparens 0x08ae /* U+23A0 RIGHT PARENTHESIS LOWER HOOK */ -#define XKB_KEY_leftmiddlecurlybrace 0x08af /* U+23A8 LEFT CURLY BRACKET MIDDLE PIECE */ -#define XKB_KEY_rightmiddlecurlybrace 0x08b0 /* U+23AC RIGHT CURLY BRACKET MIDDLE PIECE */ -#define XKB_KEY_topleftsummation 0x08b1 -#define XKB_KEY_botleftsummation 0x08b2 -#define XKB_KEY_topvertsummationconnector 0x08b3 -#define XKB_KEY_botvertsummationconnector 0x08b4 -#define XKB_KEY_toprightsummation 0x08b5 -#define XKB_KEY_botrightsummation 0x08b6 -#define XKB_KEY_rightmiddlesummation 0x08b7 -#define XKB_KEY_lessthanequal 0x08bc /* U+2264 LESS-THAN OR EQUAL TO */ -#define XKB_KEY_notequal 0x08bd /* U+2260 NOT EQUAL TO */ -#define XKB_KEY_greaterthanequal 0x08be /* U+2265 GREATER-THAN OR EQUAL TO */ -#define XKB_KEY_integral 0x08bf /* U+222B INTEGRAL */ -#define XKB_KEY_therefore 0x08c0 /* U+2234 THEREFORE */ -#define XKB_KEY_variation 0x08c1 /* U+221D PROPORTIONAL TO */ -#define XKB_KEY_infinity 0x08c2 /* U+221E INFINITY */ -#define XKB_KEY_nabla 0x08c5 /* U+2207 NABLA */ -#define XKB_KEY_approximate 0x08c8 /* U+223C TILDE OPERATOR */ -#define XKB_KEY_similarequal 0x08c9 /* U+2243 ASYMPTOTICALLY EQUAL TO */ -#define XKB_KEY_ifonlyif 0x08cd /* U+21D4 LEFT RIGHT DOUBLE ARROW */ -#define XKB_KEY_implies 0x08ce /* U+21D2 RIGHTWARDS DOUBLE ARROW */ -#define XKB_KEY_identical 0x08cf /* U+2261 IDENTICAL TO */ -#define XKB_KEY_radical 0x08d6 /* U+221A SQUARE ROOT */ -#define XKB_KEY_includedin 0x08da /* U+2282 SUBSET OF */ -#define XKB_KEY_includes 0x08db /* U+2283 SUPERSET OF */ -#define XKB_KEY_intersection 0x08dc /* U+2229 INTERSECTION */ -#define XKB_KEY_union 0x08dd /* U+222A UNION */ -#define XKB_KEY_logicaland 0x08de /* U+2227 LOGICAL AND */ -#define XKB_KEY_logicalor 0x08df /* U+2228 LOGICAL OR */ -#define XKB_KEY_partialderivative 0x08ef /* U+2202 PARTIAL DIFFERENTIAL */ -#define XKB_KEY_function 0x08f6 /* U+0192 LATIN SMALL LETTER F WITH HOOK */ -#define XKB_KEY_leftarrow 0x08fb /* U+2190 LEFTWARDS ARROW */ -#define XKB_KEY_uparrow 0x08fc /* U+2191 UPWARDS ARROW */ -#define XKB_KEY_rightarrow 0x08fd /* U+2192 RIGHTWARDS ARROW */ -#define XKB_KEY_downarrow 0x08fe /* U+2193 DOWNWARDS ARROW */ - -/* - * Special - * (from the DEC VT100 Special Graphics Character Set) - * Byte 3 = 9 - */ - -#define XKB_KEY_blank 0x09df -#define XKB_KEY_soliddiamond 0x09e0 /* U+25C6 BLACK DIAMOND */ -#define XKB_KEY_checkerboard 0x09e1 /* U+2592 MEDIUM SHADE */ -#define XKB_KEY_ht 0x09e2 /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */ -#define XKB_KEY_ff 0x09e3 /* U+240C SYMBOL FOR FORM FEED */ -#define XKB_KEY_cr 0x09e4 /* U+240D SYMBOL FOR CARRIAGE RETURN */ -#define XKB_KEY_lf 0x09e5 /* U+240A SYMBOL FOR LINE FEED */ -#define XKB_KEY_nl 0x09e8 /* U+2424 SYMBOL FOR NEWLINE */ -#define XKB_KEY_vt 0x09e9 /* U+240B SYMBOL FOR VERTICAL TABULATION */ -#define XKB_KEY_lowrightcorner 0x09ea /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */ -#define XKB_KEY_uprightcorner 0x09eb /* U+2510 BOX DRAWINGS LIGHT DOWN AND LEFT */ -#define XKB_KEY_upleftcorner 0x09ec /* U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT */ -#define XKB_KEY_lowleftcorner 0x09ed /* U+2514 BOX DRAWINGS LIGHT UP AND RIGHT */ -#define XKB_KEY_crossinglines 0x09ee /* U+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ -#define XKB_KEY_horizlinescan1 0x09ef /* U+23BA HORIZONTAL SCAN LINE-1 */ -#define XKB_KEY_horizlinescan3 0x09f0 /* U+23BB HORIZONTAL SCAN LINE-3 */ -#define XKB_KEY_horizlinescan5 0x09f1 /* U+2500 BOX DRAWINGS LIGHT HORIZONTAL */ -#define XKB_KEY_horizlinescan7 0x09f2 /* U+23BC HORIZONTAL SCAN LINE-7 */ -#define XKB_KEY_horizlinescan9 0x09f3 /* U+23BD HORIZONTAL SCAN LINE-9 */ -#define XKB_KEY_leftt 0x09f4 /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ -#define XKB_KEY_rightt 0x09f5 /* U+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT */ -#define XKB_KEY_bott 0x09f6 /* U+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL */ -#define XKB_KEY_topt 0x09f7 /* U+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ -#define XKB_KEY_vertbar 0x09f8 /* U+2502 BOX DRAWINGS LIGHT VERTICAL */ - -/* - * Publishing - * (these are probably from a long forgotten DEC Publishing - * font that once shipped with DECwrite) - * Byte 3 = 0x0a - */ - -#define XKB_KEY_emspace 0x0aa1 /* U+2003 EM SPACE */ -#define XKB_KEY_enspace 0x0aa2 /* U+2002 EN SPACE */ -#define XKB_KEY_em3space 0x0aa3 /* U+2004 THREE-PER-EM SPACE */ -#define XKB_KEY_em4space 0x0aa4 /* U+2005 FOUR-PER-EM SPACE */ -#define XKB_KEY_digitspace 0x0aa5 /* U+2007 FIGURE SPACE */ -#define XKB_KEY_punctspace 0x0aa6 /* U+2008 PUNCTUATION SPACE */ -#define XKB_KEY_thinspace 0x0aa7 /* U+2009 THIN SPACE */ -#define XKB_KEY_hairspace 0x0aa8 /* U+200A HAIR SPACE */ -#define XKB_KEY_emdash 0x0aa9 /* U+2014 EM DASH */ -#define XKB_KEY_endash 0x0aaa /* U+2013 EN DASH */ -#define XKB_KEY_signifblank 0x0aac /*(U+2423 OPEN BOX)*/ -#define XKB_KEY_ellipsis 0x0aae /* U+2026 HORIZONTAL ELLIPSIS */ -#define XKB_KEY_doubbaselinedot 0x0aaf /* U+2025 TWO DOT LEADER */ -#define XKB_KEY_onethird 0x0ab0 /* U+2153 VULGAR FRACTION ONE THIRD */ -#define XKB_KEY_twothirds 0x0ab1 /* U+2154 VULGAR FRACTION TWO THIRDS */ -#define XKB_KEY_onefifth 0x0ab2 /* U+2155 VULGAR FRACTION ONE FIFTH */ -#define XKB_KEY_twofifths 0x0ab3 /* U+2156 VULGAR FRACTION TWO FIFTHS */ -#define XKB_KEY_threefifths 0x0ab4 /* U+2157 VULGAR FRACTION THREE FIFTHS */ -#define XKB_KEY_fourfifths 0x0ab5 /* U+2158 VULGAR FRACTION FOUR FIFTHS */ -#define XKB_KEY_onesixth 0x0ab6 /* U+2159 VULGAR FRACTION ONE SIXTH */ -#define XKB_KEY_fivesixths 0x0ab7 /* U+215A VULGAR FRACTION FIVE SIXTHS */ -#define XKB_KEY_careof 0x0ab8 /* U+2105 CARE OF */ -#define XKB_KEY_figdash 0x0abb /* U+2012 FIGURE DASH */ -#define XKB_KEY_leftanglebracket 0x0abc /*(U+27E8 MATHEMATICAL LEFT ANGLE BRACKET)*/ -#define XKB_KEY_decimalpoint 0x0abd /*(U+002E FULL STOP)*/ -#define XKB_KEY_rightanglebracket 0x0abe /*(U+27E9 MATHEMATICAL RIGHT ANGLE BRACKET)*/ -#define XKB_KEY_marker 0x0abf -#define XKB_KEY_oneeighth 0x0ac3 /* U+215B VULGAR FRACTION ONE EIGHTH */ -#define XKB_KEY_threeeighths 0x0ac4 /* U+215C VULGAR FRACTION THREE EIGHTHS */ -#define XKB_KEY_fiveeighths 0x0ac5 /* U+215D VULGAR FRACTION FIVE EIGHTHS */ -#define XKB_KEY_seveneighths 0x0ac6 /* U+215E VULGAR FRACTION SEVEN EIGHTHS */ -#define XKB_KEY_trademark 0x0ac9 /* U+2122 TRADE MARK SIGN */ -#define XKB_KEY_signaturemark 0x0aca /*(U+2613 SALTIRE)*/ -#define XKB_KEY_trademarkincircle 0x0acb -#define XKB_KEY_leftopentriangle 0x0acc /*(U+25C1 WHITE LEFT-POINTING TRIANGLE)*/ -#define XKB_KEY_rightopentriangle 0x0acd /*(U+25B7 WHITE RIGHT-POINTING TRIANGLE)*/ -#define XKB_KEY_emopencircle 0x0ace /*(U+25CB WHITE CIRCLE)*/ -#define XKB_KEY_emopenrectangle 0x0acf /*(U+25AF WHITE VERTICAL RECTANGLE)*/ -#define XKB_KEY_leftsinglequotemark 0x0ad0 /* U+2018 LEFT SINGLE QUOTATION MARK */ -#define XKB_KEY_rightsinglequotemark 0x0ad1 /* U+2019 RIGHT SINGLE QUOTATION MARK */ -#define XKB_KEY_leftdoublequotemark 0x0ad2 /* U+201C LEFT DOUBLE QUOTATION MARK */ -#define XKB_KEY_rightdoublequotemark 0x0ad3 /* U+201D RIGHT DOUBLE QUOTATION MARK */ -#define XKB_KEY_prescription 0x0ad4 /* U+211E PRESCRIPTION TAKE */ -#define XKB_KEY_permille 0x0ad5 /* U+2030 PER MILLE SIGN */ -#define XKB_KEY_minutes 0x0ad6 /* U+2032 PRIME */ -#define XKB_KEY_seconds 0x0ad7 /* U+2033 DOUBLE PRIME */ -#define XKB_KEY_latincross 0x0ad9 /* U+271D LATIN CROSS */ -#define XKB_KEY_hexagram 0x0ada -#define XKB_KEY_filledrectbullet 0x0adb /*(U+25AC BLACK RECTANGLE)*/ -#define XKB_KEY_filledlefttribullet 0x0adc /*(U+25C0 BLACK LEFT-POINTING TRIANGLE)*/ -#define XKB_KEY_filledrighttribullet 0x0add /*(U+25B6 BLACK RIGHT-POINTING TRIANGLE)*/ -#define XKB_KEY_emfilledcircle 0x0ade /*(U+25CF BLACK CIRCLE)*/ -#define XKB_KEY_emfilledrect 0x0adf /*(U+25AE BLACK VERTICAL RECTANGLE)*/ -#define XKB_KEY_enopencircbullet 0x0ae0 /*(U+25E6 WHITE BULLET)*/ -#define XKB_KEY_enopensquarebullet 0x0ae1 /*(U+25AB WHITE SMALL SQUARE)*/ -#define XKB_KEY_openrectbullet 0x0ae2 /*(U+25AD WHITE RECTANGLE)*/ -#define XKB_KEY_opentribulletup 0x0ae3 /*(U+25B3 WHITE UP-POINTING TRIANGLE)*/ -#define XKB_KEY_opentribulletdown 0x0ae4 /*(U+25BD WHITE DOWN-POINTING TRIANGLE)*/ -#define XKB_KEY_openstar 0x0ae5 /*(U+2606 WHITE STAR)*/ -#define XKB_KEY_enfilledcircbullet 0x0ae6 /*(U+2022 BULLET)*/ -#define XKB_KEY_enfilledsqbullet 0x0ae7 /*(U+25AA BLACK SMALL SQUARE)*/ -#define XKB_KEY_filledtribulletup 0x0ae8 /*(U+25B2 BLACK UP-POINTING TRIANGLE)*/ -#define XKB_KEY_filledtribulletdown 0x0ae9 /*(U+25BC BLACK DOWN-POINTING TRIANGLE)*/ -#define XKB_KEY_leftpointer 0x0aea /*(U+261C WHITE LEFT POINTING INDEX)*/ -#define XKB_KEY_rightpointer 0x0aeb /*(U+261E WHITE RIGHT POINTING INDEX)*/ -#define XKB_KEY_club 0x0aec /* U+2663 BLACK CLUB SUIT */ -#define XKB_KEY_diamond 0x0aed /* U+2666 BLACK DIAMOND SUIT */ -#define XKB_KEY_heart 0x0aee /* U+2665 BLACK HEART SUIT */ -#define XKB_KEY_maltesecross 0x0af0 /* U+2720 MALTESE CROSS */ -#define XKB_KEY_dagger 0x0af1 /* U+2020 DAGGER */ -#define XKB_KEY_doubledagger 0x0af2 /* U+2021 DOUBLE DAGGER */ -#define XKB_KEY_checkmark 0x0af3 /* U+2713 CHECK MARK */ -#define XKB_KEY_ballotcross 0x0af4 /* U+2717 BALLOT X */ -#define XKB_KEY_musicalsharp 0x0af5 /* U+266F MUSIC SHARP SIGN */ -#define XKB_KEY_musicalflat 0x0af6 /* U+266D MUSIC FLAT SIGN */ -#define XKB_KEY_malesymbol 0x0af7 /* U+2642 MALE SIGN */ -#define XKB_KEY_femalesymbol 0x0af8 /* U+2640 FEMALE SIGN */ -#define XKB_KEY_telephone 0x0af9 /* U+260E BLACK TELEPHONE */ -#define XKB_KEY_telephonerecorder 0x0afa /* U+2315 TELEPHONE RECORDER */ -#define XKB_KEY_phonographcopyright 0x0afb /* U+2117 SOUND RECORDING COPYRIGHT */ -#define XKB_KEY_caret 0x0afc /* U+2038 CARET */ -#define XKB_KEY_singlelowquotemark 0x0afd /* U+201A SINGLE LOW-9 QUOTATION MARK */ -#define XKB_KEY_doublelowquotemark 0x0afe /* U+201E DOUBLE LOW-9 QUOTATION MARK */ -#define XKB_KEY_cursor 0x0aff - -/* - * APL - * Byte 3 = 0x0b - */ - -#define XKB_KEY_leftcaret 0x0ba3 /*(U+003C LESS-THAN SIGN)*/ -#define XKB_KEY_rightcaret 0x0ba6 /*(U+003E GREATER-THAN SIGN)*/ -#define XKB_KEY_downcaret 0x0ba8 /*(U+2228 LOGICAL OR)*/ -#define XKB_KEY_upcaret 0x0ba9 /*(U+2227 LOGICAL AND)*/ -#define XKB_KEY_overbar 0x0bc0 /*(U+00AF MACRON)*/ -#define XKB_KEY_downtack 0x0bc2 /* U+22A4 DOWN TACK */ -#define XKB_KEY_upshoe 0x0bc3 /*(U+2229 INTERSECTION)*/ -#define XKB_KEY_downstile 0x0bc4 /* U+230A LEFT FLOOR */ -#define XKB_KEY_underbar 0x0bc6 /*(U+005F LOW LINE)*/ -#define XKB_KEY_jot 0x0bca /* U+2218 RING OPERATOR */ -#define XKB_KEY_quad 0x0bcc /* U+2395 APL FUNCTIONAL SYMBOL QUAD */ -#define XKB_KEY_uptack 0x0bce /* U+22A5 UP TACK */ -#define XKB_KEY_circle 0x0bcf /* U+25CB WHITE CIRCLE */ -#define XKB_KEY_upstile 0x0bd3 /* U+2308 LEFT CEILING */ -#define XKB_KEY_downshoe 0x0bd6 /*(U+222A UNION)*/ -#define XKB_KEY_rightshoe 0x0bd8 /*(U+2283 SUPERSET OF)*/ -#define XKB_KEY_leftshoe 0x0bda /*(U+2282 SUBSET OF)*/ -#define XKB_KEY_lefttack 0x0bdc /* U+22A3 LEFT TACK */ -#define XKB_KEY_righttack 0x0bfc /* U+22A2 RIGHT TACK */ - -/* - * Hebrew - * Byte 3 = 0x0c - */ - -#define XKB_KEY_hebrew_doublelowline 0x0cdf /* U+2017 DOUBLE LOW LINE */ -#define XKB_KEY_hebrew_aleph 0x0ce0 /* U+05D0 HEBREW LETTER ALEF */ -#define XKB_KEY_hebrew_bet 0x0ce1 /* U+05D1 HEBREW LETTER BET */ -#define XKB_KEY_hebrew_beth 0x0ce1 /* deprecated */ -#define XKB_KEY_hebrew_gimel 0x0ce2 /* U+05D2 HEBREW LETTER GIMEL */ -#define XKB_KEY_hebrew_gimmel 0x0ce2 /* deprecated */ -#define XKB_KEY_hebrew_dalet 0x0ce3 /* U+05D3 HEBREW LETTER DALET */ -#define XKB_KEY_hebrew_daleth 0x0ce3 /* deprecated */ -#define XKB_KEY_hebrew_he 0x0ce4 /* U+05D4 HEBREW LETTER HE */ -#define XKB_KEY_hebrew_waw 0x0ce5 /* U+05D5 HEBREW LETTER VAV */ -#define XKB_KEY_hebrew_zain 0x0ce6 /* U+05D6 HEBREW LETTER ZAYIN */ -#define XKB_KEY_hebrew_zayin 0x0ce6 /* deprecated */ -#define XKB_KEY_hebrew_chet 0x0ce7 /* U+05D7 HEBREW LETTER HET */ -#define XKB_KEY_hebrew_het 0x0ce7 /* deprecated */ -#define XKB_KEY_hebrew_tet 0x0ce8 /* U+05D8 HEBREW LETTER TET */ -#define XKB_KEY_hebrew_teth 0x0ce8 /* deprecated */ -#define XKB_KEY_hebrew_yod 0x0ce9 /* U+05D9 HEBREW LETTER YOD */ -#define XKB_KEY_hebrew_finalkaph 0x0cea /* U+05DA HEBREW LETTER FINAL KAF */ -#define XKB_KEY_hebrew_kaph 0x0ceb /* U+05DB HEBREW LETTER KAF */ -#define XKB_KEY_hebrew_lamed 0x0cec /* U+05DC HEBREW LETTER LAMED */ -#define XKB_KEY_hebrew_finalmem 0x0ced /* U+05DD HEBREW LETTER FINAL MEM */ -#define XKB_KEY_hebrew_mem 0x0cee /* U+05DE HEBREW LETTER MEM */ -#define XKB_KEY_hebrew_finalnun 0x0cef /* U+05DF HEBREW LETTER FINAL NUN */ -#define XKB_KEY_hebrew_nun 0x0cf0 /* U+05E0 HEBREW LETTER NUN */ -#define XKB_KEY_hebrew_samech 0x0cf1 /* U+05E1 HEBREW LETTER SAMEKH */ -#define XKB_KEY_hebrew_samekh 0x0cf1 /* deprecated */ -#define XKB_KEY_hebrew_ayin 0x0cf2 /* U+05E2 HEBREW LETTER AYIN */ -#define XKB_KEY_hebrew_finalpe 0x0cf3 /* U+05E3 HEBREW LETTER FINAL PE */ -#define XKB_KEY_hebrew_pe 0x0cf4 /* U+05E4 HEBREW LETTER PE */ -#define XKB_KEY_hebrew_finalzade 0x0cf5 /* U+05E5 HEBREW LETTER FINAL TSADI */ -#define XKB_KEY_hebrew_finalzadi 0x0cf5 /* deprecated */ -#define XKB_KEY_hebrew_zade 0x0cf6 /* U+05E6 HEBREW LETTER TSADI */ -#define XKB_KEY_hebrew_zadi 0x0cf6 /* deprecated */ -#define XKB_KEY_hebrew_qoph 0x0cf7 /* U+05E7 HEBREW LETTER QOF */ -#define XKB_KEY_hebrew_kuf 0x0cf7 /* deprecated */ -#define XKB_KEY_hebrew_resh 0x0cf8 /* U+05E8 HEBREW LETTER RESH */ -#define XKB_KEY_hebrew_shin 0x0cf9 /* U+05E9 HEBREW LETTER SHIN */ -#define XKB_KEY_hebrew_taw 0x0cfa /* U+05EA HEBREW LETTER TAV */ -#define XKB_KEY_hebrew_taf 0x0cfa /* deprecated */ -#define XKB_KEY_Hebrew_switch 0xff7e /* Alias for mode_switch */ - -/* - * Thai - * Byte 3 = 0x0d - */ - -#define XKB_KEY_Thai_kokai 0x0da1 /* U+0E01 THAI CHARACTER KO KAI */ -#define XKB_KEY_Thai_khokhai 0x0da2 /* U+0E02 THAI CHARACTER KHO KHAI */ -#define XKB_KEY_Thai_khokhuat 0x0da3 /* U+0E03 THAI CHARACTER KHO KHUAT */ -#define XKB_KEY_Thai_khokhwai 0x0da4 /* U+0E04 THAI CHARACTER KHO KHWAI */ -#define XKB_KEY_Thai_khokhon 0x0da5 /* U+0E05 THAI CHARACTER KHO KHON */ -#define XKB_KEY_Thai_khorakhang 0x0da6 /* U+0E06 THAI CHARACTER KHO RAKHANG */ -#define XKB_KEY_Thai_ngongu 0x0da7 /* U+0E07 THAI CHARACTER NGO NGU */ -#define XKB_KEY_Thai_chochan 0x0da8 /* U+0E08 THAI CHARACTER CHO CHAN */ -#define XKB_KEY_Thai_choching 0x0da9 /* U+0E09 THAI CHARACTER CHO CHING */ -#define XKB_KEY_Thai_chochang 0x0daa /* U+0E0A THAI CHARACTER CHO CHANG */ -#define XKB_KEY_Thai_soso 0x0dab /* U+0E0B THAI CHARACTER SO SO */ -#define XKB_KEY_Thai_chochoe 0x0dac /* U+0E0C THAI CHARACTER CHO CHOE */ -#define XKB_KEY_Thai_yoying 0x0dad /* U+0E0D THAI CHARACTER YO YING */ -#define XKB_KEY_Thai_dochada 0x0dae /* U+0E0E THAI CHARACTER DO CHADA */ -#define XKB_KEY_Thai_topatak 0x0daf /* U+0E0F THAI CHARACTER TO PATAK */ -#define XKB_KEY_Thai_thothan 0x0db0 /* U+0E10 THAI CHARACTER THO THAN */ -#define XKB_KEY_Thai_thonangmontho 0x0db1 /* U+0E11 THAI CHARACTER THO NANGMONTHO */ -#define XKB_KEY_Thai_thophuthao 0x0db2 /* U+0E12 THAI CHARACTER THO PHUTHAO */ -#define XKB_KEY_Thai_nonen 0x0db3 /* U+0E13 THAI CHARACTER NO NEN */ -#define XKB_KEY_Thai_dodek 0x0db4 /* U+0E14 THAI CHARACTER DO DEK */ -#define XKB_KEY_Thai_totao 0x0db5 /* U+0E15 THAI CHARACTER TO TAO */ -#define XKB_KEY_Thai_thothung 0x0db6 /* U+0E16 THAI CHARACTER THO THUNG */ -#define XKB_KEY_Thai_thothahan 0x0db7 /* U+0E17 THAI CHARACTER THO THAHAN */ -#define XKB_KEY_Thai_thothong 0x0db8 /* U+0E18 THAI CHARACTER THO THONG */ -#define XKB_KEY_Thai_nonu 0x0db9 /* U+0E19 THAI CHARACTER NO NU */ -#define XKB_KEY_Thai_bobaimai 0x0dba /* U+0E1A THAI CHARACTER BO BAIMAI */ -#define XKB_KEY_Thai_popla 0x0dbb /* U+0E1B THAI CHARACTER PO PLA */ -#define XKB_KEY_Thai_phophung 0x0dbc /* U+0E1C THAI CHARACTER PHO PHUNG */ -#define XKB_KEY_Thai_fofa 0x0dbd /* U+0E1D THAI CHARACTER FO FA */ -#define XKB_KEY_Thai_phophan 0x0dbe /* U+0E1E THAI CHARACTER PHO PHAN */ -#define XKB_KEY_Thai_fofan 0x0dbf /* U+0E1F THAI CHARACTER FO FAN */ -#define XKB_KEY_Thai_phosamphao 0x0dc0 /* U+0E20 THAI CHARACTER PHO SAMPHAO */ -#define XKB_KEY_Thai_moma 0x0dc1 /* U+0E21 THAI CHARACTER MO MA */ -#define XKB_KEY_Thai_yoyak 0x0dc2 /* U+0E22 THAI CHARACTER YO YAK */ -#define XKB_KEY_Thai_rorua 0x0dc3 /* U+0E23 THAI CHARACTER RO RUA */ -#define XKB_KEY_Thai_ru 0x0dc4 /* U+0E24 THAI CHARACTER RU */ -#define XKB_KEY_Thai_loling 0x0dc5 /* U+0E25 THAI CHARACTER LO LING */ -#define XKB_KEY_Thai_lu 0x0dc6 /* U+0E26 THAI CHARACTER LU */ -#define XKB_KEY_Thai_wowaen 0x0dc7 /* U+0E27 THAI CHARACTER WO WAEN */ -#define XKB_KEY_Thai_sosala 0x0dc8 /* U+0E28 THAI CHARACTER SO SALA */ -#define XKB_KEY_Thai_sorusi 0x0dc9 /* U+0E29 THAI CHARACTER SO RUSI */ -#define XKB_KEY_Thai_sosua 0x0dca /* U+0E2A THAI CHARACTER SO SUA */ -#define XKB_KEY_Thai_hohip 0x0dcb /* U+0E2B THAI CHARACTER HO HIP */ -#define XKB_KEY_Thai_lochula 0x0dcc /* U+0E2C THAI CHARACTER LO CHULA */ -#define XKB_KEY_Thai_oang 0x0dcd /* U+0E2D THAI CHARACTER O ANG */ -#define XKB_KEY_Thai_honokhuk 0x0dce /* U+0E2E THAI CHARACTER HO NOKHUK */ -#define XKB_KEY_Thai_paiyannoi 0x0dcf /* U+0E2F THAI CHARACTER PAIYANNOI */ -#define XKB_KEY_Thai_saraa 0x0dd0 /* U+0E30 THAI CHARACTER SARA A */ -#define XKB_KEY_Thai_maihanakat 0x0dd1 /* U+0E31 THAI CHARACTER MAI HAN-AKAT */ -#define XKB_KEY_Thai_saraaa 0x0dd2 /* U+0E32 THAI CHARACTER SARA AA */ -#define XKB_KEY_Thai_saraam 0x0dd3 /* U+0E33 THAI CHARACTER SARA AM */ -#define XKB_KEY_Thai_sarai 0x0dd4 /* U+0E34 THAI CHARACTER SARA I */ -#define XKB_KEY_Thai_saraii 0x0dd5 /* U+0E35 THAI CHARACTER SARA II */ -#define XKB_KEY_Thai_saraue 0x0dd6 /* U+0E36 THAI CHARACTER SARA UE */ -#define XKB_KEY_Thai_sarauee 0x0dd7 /* U+0E37 THAI CHARACTER SARA UEE */ -#define XKB_KEY_Thai_sarau 0x0dd8 /* U+0E38 THAI CHARACTER SARA U */ -#define XKB_KEY_Thai_sarauu 0x0dd9 /* U+0E39 THAI CHARACTER SARA UU */ -#define XKB_KEY_Thai_phinthu 0x0dda /* U+0E3A THAI CHARACTER PHINTHU */ -#define XKB_KEY_Thai_maihanakat_maitho 0x0dde -#define XKB_KEY_Thai_baht 0x0ddf /* U+0E3F THAI CURRENCY SYMBOL BAHT */ -#define XKB_KEY_Thai_sarae 0x0de0 /* U+0E40 THAI CHARACTER SARA E */ -#define XKB_KEY_Thai_saraae 0x0de1 /* U+0E41 THAI CHARACTER SARA AE */ -#define XKB_KEY_Thai_sarao 0x0de2 /* U+0E42 THAI CHARACTER SARA O */ -#define XKB_KEY_Thai_saraaimaimuan 0x0de3 /* U+0E43 THAI CHARACTER SARA AI MAIMUAN */ -#define XKB_KEY_Thai_saraaimaimalai 0x0de4 /* U+0E44 THAI CHARACTER SARA AI MAIMALAI */ -#define XKB_KEY_Thai_lakkhangyao 0x0de5 /* U+0E45 THAI CHARACTER LAKKHANGYAO */ -#define XKB_KEY_Thai_maiyamok 0x0de6 /* U+0E46 THAI CHARACTER MAIYAMOK */ -#define XKB_KEY_Thai_maitaikhu 0x0de7 /* U+0E47 THAI CHARACTER MAITAIKHU */ -#define XKB_KEY_Thai_maiek 0x0de8 /* U+0E48 THAI CHARACTER MAI EK */ -#define XKB_KEY_Thai_maitho 0x0de9 /* U+0E49 THAI CHARACTER MAI THO */ -#define XKB_KEY_Thai_maitri 0x0dea /* U+0E4A THAI CHARACTER MAI TRI */ -#define XKB_KEY_Thai_maichattawa 0x0deb /* U+0E4B THAI CHARACTER MAI CHATTAWA */ -#define XKB_KEY_Thai_thanthakhat 0x0dec /* U+0E4C THAI CHARACTER THANTHAKHAT */ -#define XKB_KEY_Thai_nikhahit 0x0ded /* U+0E4D THAI CHARACTER NIKHAHIT */ -#define XKB_KEY_Thai_leksun 0x0df0 /* U+0E50 THAI DIGIT ZERO */ -#define XKB_KEY_Thai_leknung 0x0df1 /* U+0E51 THAI DIGIT ONE */ -#define XKB_KEY_Thai_leksong 0x0df2 /* U+0E52 THAI DIGIT TWO */ -#define XKB_KEY_Thai_leksam 0x0df3 /* U+0E53 THAI DIGIT THREE */ -#define XKB_KEY_Thai_leksi 0x0df4 /* U+0E54 THAI DIGIT FOUR */ -#define XKB_KEY_Thai_lekha 0x0df5 /* U+0E55 THAI DIGIT FIVE */ -#define XKB_KEY_Thai_lekhok 0x0df6 /* U+0E56 THAI DIGIT SIX */ -#define XKB_KEY_Thai_lekchet 0x0df7 /* U+0E57 THAI DIGIT SEVEN */ -#define XKB_KEY_Thai_lekpaet 0x0df8 /* U+0E58 THAI DIGIT EIGHT */ -#define XKB_KEY_Thai_lekkao 0x0df9 /* U+0E59 THAI DIGIT NINE */ - -/* - * Korean - * Byte 3 = 0x0e - */ - - -#define XKB_KEY_Hangul 0xff31 /* Hangul start/stop(toggle) */ -#define XKB_KEY_Hangul_Start 0xff32 /* Hangul start */ -#define XKB_KEY_Hangul_End 0xff33 /* Hangul end, English start */ -#define XKB_KEY_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */ -#define XKB_KEY_Hangul_Jamo 0xff35 /* Hangul Jamo mode */ -#define XKB_KEY_Hangul_Romaja 0xff36 /* Hangul Romaja mode */ -#define XKB_KEY_Hangul_Codeinput 0xff37 /* Hangul code input mode */ -#define XKB_KEY_Hangul_Jeonja 0xff38 /* Jeonja mode */ -#define XKB_KEY_Hangul_Banja 0xff39 /* Banja mode */ -#define XKB_KEY_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */ -#define XKB_KEY_Hangul_PostHanja 0xff3b /* Post Hanja conversion */ -#define XKB_KEY_Hangul_SingleCandidate 0xff3c /* Single candidate */ -#define XKB_KEY_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */ -#define XKB_KEY_Hangul_PreviousCandidate 0xff3e /* Previous candidate */ -#define XKB_KEY_Hangul_Special 0xff3f /* Special symbols */ -#define XKB_KEY_Hangul_switch 0xff7e /* Alias for mode_switch */ - -/* Hangul Consonant Characters */ -#define XKB_KEY_Hangul_Kiyeog 0x0ea1 -#define XKB_KEY_Hangul_SsangKiyeog 0x0ea2 -#define XKB_KEY_Hangul_KiyeogSios 0x0ea3 -#define XKB_KEY_Hangul_Nieun 0x0ea4 -#define XKB_KEY_Hangul_NieunJieuj 0x0ea5 -#define XKB_KEY_Hangul_NieunHieuh 0x0ea6 -#define XKB_KEY_Hangul_Dikeud 0x0ea7 -#define XKB_KEY_Hangul_SsangDikeud 0x0ea8 -#define XKB_KEY_Hangul_Rieul 0x0ea9 -#define XKB_KEY_Hangul_RieulKiyeog 0x0eaa -#define XKB_KEY_Hangul_RieulMieum 0x0eab -#define XKB_KEY_Hangul_RieulPieub 0x0eac -#define XKB_KEY_Hangul_RieulSios 0x0ead -#define XKB_KEY_Hangul_RieulTieut 0x0eae -#define XKB_KEY_Hangul_RieulPhieuf 0x0eaf -#define XKB_KEY_Hangul_RieulHieuh 0x0eb0 -#define XKB_KEY_Hangul_Mieum 0x0eb1 -#define XKB_KEY_Hangul_Pieub 0x0eb2 -#define XKB_KEY_Hangul_SsangPieub 0x0eb3 -#define XKB_KEY_Hangul_PieubSios 0x0eb4 -#define XKB_KEY_Hangul_Sios 0x0eb5 -#define XKB_KEY_Hangul_SsangSios 0x0eb6 -#define XKB_KEY_Hangul_Ieung 0x0eb7 -#define XKB_KEY_Hangul_Jieuj 0x0eb8 -#define XKB_KEY_Hangul_SsangJieuj 0x0eb9 -#define XKB_KEY_Hangul_Cieuc 0x0eba -#define XKB_KEY_Hangul_Khieuq 0x0ebb -#define XKB_KEY_Hangul_Tieut 0x0ebc -#define XKB_KEY_Hangul_Phieuf 0x0ebd -#define XKB_KEY_Hangul_Hieuh 0x0ebe - -/* Hangul Vowel Characters */ -#define XKB_KEY_Hangul_A 0x0ebf -#define XKB_KEY_Hangul_AE 0x0ec0 -#define XKB_KEY_Hangul_YA 0x0ec1 -#define XKB_KEY_Hangul_YAE 0x0ec2 -#define XKB_KEY_Hangul_EO 0x0ec3 -#define XKB_KEY_Hangul_E 0x0ec4 -#define XKB_KEY_Hangul_YEO 0x0ec5 -#define XKB_KEY_Hangul_YE 0x0ec6 -#define XKB_KEY_Hangul_O 0x0ec7 -#define XKB_KEY_Hangul_WA 0x0ec8 -#define XKB_KEY_Hangul_WAE 0x0ec9 -#define XKB_KEY_Hangul_OE 0x0eca -#define XKB_KEY_Hangul_YO 0x0ecb -#define XKB_KEY_Hangul_U 0x0ecc -#define XKB_KEY_Hangul_WEO 0x0ecd -#define XKB_KEY_Hangul_WE 0x0ece -#define XKB_KEY_Hangul_WI 0x0ecf -#define XKB_KEY_Hangul_YU 0x0ed0 -#define XKB_KEY_Hangul_EU 0x0ed1 -#define XKB_KEY_Hangul_YI 0x0ed2 -#define XKB_KEY_Hangul_I 0x0ed3 - -/* Hangul syllable-final (JongSeong) Characters */ -#define XKB_KEY_Hangul_J_Kiyeog 0x0ed4 -#define XKB_KEY_Hangul_J_SsangKiyeog 0x0ed5 -#define XKB_KEY_Hangul_J_KiyeogSios 0x0ed6 -#define XKB_KEY_Hangul_J_Nieun 0x0ed7 -#define XKB_KEY_Hangul_J_NieunJieuj 0x0ed8 -#define XKB_KEY_Hangul_J_NieunHieuh 0x0ed9 -#define XKB_KEY_Hangul_J_Dikeud 0x0eda -#define XKB_KEY_Hangul_J_Rieul 0x0edb -#define XKB_KEY_Hangul_J_RieulKiyeog 0x0edc -#define XKB_KEY_Hangul_J_RieulMieum 0x0edd -#define XKB_KEY_Hangul_J_RieulPieub 0x0ede -#define XKB_KEY_Hangul_J_RieulSios 0x0edf -#define XKB_KEY_Hangul_J_RieulTieut 0x0ee0 -#define XKB_KEY_Hangul_J_RieulPhieuf 0x0ee1 -#define XKB_KEY_Hangul_J_RieulHieuh 0x0ee2 -#define XKB_KEY_Hangul_J_Mieum 0x0ee3 -#define XKB_KEY_Hangul_J_Pieub 0x0ee4 -#define XKB_KEY_Hangul_J_PieubSios 0x0ee5 -#define XKB_KEY_Hangul_J_Sios 0x0ee6 -#define XKB_KEY_Hangul_J_SsangSios 0x0ee7 -#define XKB_KEY_Hangul_J_Ieung 0x0ee8 -#define XKB_KEY_Hangul_J_Jieuj 0x0ee9 -#define XKB_KEY_Hangul_J_Cieuc 0x0eea -#define XKB_KEY_Hangul_J_Khieuq 0x0eeb -#define XKB_KEY_Hangul_J_Tieut 0x0eec -#define XKB_KEY_Hangul_J_Phieuf 0x0eed -#define XKB_KEY_Hangul_J_Hieuh 0x0eee - -/* Ancient Hangul Consonant Characters */ -#define XKB_KEY_Hangul_RieulYeorinHieuh 0x0eef -#define XKB_KEY_Hangul_SunkyeongeumMieum 0x0ef0 -#define XKB_KEY_Hangul_SunkyeongeumPieub 0x0ef1 -#define XKB_KEY_Hangul_PanSios 0x0ef2 -#define XKB_KEY_Hangul_KkogjiDalrinIeung 0x0ef3 -#define XKB_KEY_Hangul_SunkyeongeumPhieuf 0x0ef4 -#define XKB_KEY_Hangul_YeorinHieuh 0x0ef5 - -/* Ancient Hangul Vowel Characters */ -#define XKB_KEY_Hangul_AraeA 0x0ef6 -#define XKB_KEY_Hangul_AraeAE 0x0ef7 - -/* Ancient Hangul syllable-final (JongSeong) Characters */ -#define XKB_KEY_Hangul_J_PanSios 0x0ef8 -#define XKB_KEY_Hangul_J_KkogjiDalrinIeung 0x0ef9 -#define XKB_KEY_Hangul_J_YeorinHieuh 0x0efa - -/* Korean currency symbol */ -#define XKB_KEY_Korean_Won 0x0eff /*(U+20A9 WON SIGN)*/ - - -/* - * Armenian - */ - -#define XKB_KEY_Armenian_ligature_ew 0x1000587 /* U+0587 ARMENIAN SMALL LIGATURE ECH YIWN */ -#define XKB_KEY_Armenian_full_stop 0x1000589 /* U+0589 ARMENIAN FULL STOP */ -#define XKB_KEY_Armenian_verjaket 0x1000589 /* U+0589 ARMENIAN FULL STOP */ -#define XKB_KEY_Armenian_separation_mark 0x100055d /* U+055D ARMENIAN COMMA */ -#define XKB_KEY_Armenian_but 0x100055d /* U+055D ARMENIAN COMMA */ -#define XKB_KEY_Armenian_hyphen 0x100058a /* U+058A ARMENIAN HYPHEN */ -#define XKB_KEY_Armenian_yentamna 0x100058a /* U+058A ARMENIAN HYPHEN */ -#define XKB_KEY_Armenian_exclam 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ -#define XKB_KEY_Armenian_amanak 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */ -#define XKB_KEY_Armenian_accent 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ -#define XKB_KEY_Armenian_shesht 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */ -#define XKB_KEY_Armenian_question 0x100055e /* U+055E ARMENIAN QUESTION MARK */ -#define XKB_KEY_Armenian_paruyk 0x100055e /* U+055E ARMENIAN QUESTION MARK */ -#define XKB_KEY_Armenian_AYB 0x1000531 /* U+0531 ARMENIAN CAPITAL LETTER AYB */ -#define XKB_KEY_Armenian_ayb 0x1000561 /* U+0561 ARMENIAN SMALL LETTER AYB */ -#define XKB_KEY_Armenian_BEN 0x1000532 /* U+0532 ARMENIAN CAPITAL LETTER BEN */ -#define XKB_KEY_Armenian_ben 0x1000562 /* U+0562 ARMENIAN SMALL LETTER BEN */ -#define XKB_KEY_Armenian_GIM 0x1000533 /* U+0533 ARMENIAN CAPITAL LETTER GIM */ -#define XKB_KEY_Armenian_gim 0x1000563 /* U+0563 ARMENIAN SMALL LETTER GIM */ -#define XKB_KEY_Armenian_DA 0x1000534 /* U+0534 ARMENIAN CAPITAL LETTER DA */ -#define XKB_KEY_Armenian_da 0x1000564 /* U+0564 ARMENIAN SMALL LETTER DA */ -#define XKB_KEY_Armenian_YECH 0x1000535 /* U+0535 ARMENIAN CAPITAL LETTER ECH */ -#define XKB_KEY_Armenian_yech 0x1000565 /* U+0565 ARMENIAN SMALL LETTER ECH */ -#define XKB_KEY_Armenian_ZA 0x1000536 /* U+0536 ARMENIAN CAPITAL LETTER ZA */ -#define XKB_KEY_Armenian_za 0x1000566 /* U+0566 ARMENIAN SMALL LETTER ZA */ -#define XKB_KEY_Armenian_E 0x1000537 /* U+0537 ARMENIAN CAPITAL LETTER EH */ -#define XKB_KEY_Armenian_e 0x1000567 /* U+0567 ARMENIAN SMALL LETTER EH */ -#define XKB_KEY_Armenian_AT 0x1000538 /* U+0538 ARMENIAN CAPITAL LETTER ET */ -#define XKB_KEY_Armenian_at 0x1000568 /* U+0568 ARMENIAN SMALL LETTER ET */ -#define XKB_KEY_Armenian_TO 0x1000539 /* U+0539 ARMENIAN CAPITAL LETTER TO */ -#define XKB_KEY_Armenian_to 0x1000569 /* U+0569 ARMENIAN SMALL LETTER TO */ -#define XKB_KEY_Armenian_ZHE 0x100053a /* U+053A ARMENIAN CAPITAL LETTER ZHE */ -#define XKB_KEY_Armenian_zhe 0x100056a /* U+056A ARMENIAN SMALL LETTER ZHE */ -#define XKB_KEY_Armenian_INI 0x100053b /* U+053B ARMENIAN CAPITAL LETTER INI */ -#define XKB_KEY_Armenian_ini 0x100056b /* U+056B ARMENIAN SMALL LETTER INI */ -#define XKB_KEY_Armenian_LYUN 0x100053c /* U+053C ARMENIAN CAPITAL LETTER LIWN */ -#define XKB_KEY_Armenian_lyun 0x100056c /* U+056C ARMENIAN SMALL LETTER LIWN */ -#define XKB_KEY_Armenian_KHE 0x100053d /* U+053D ARMENIAN CAPITAL LETTER XEH */ -#define XKB_KEY_Armenian_khe 0x100056d /* U+056D ARMENIAN SMALL LETTER XEH */ -#define XKB_KEY_Armenian_TSA 0x100053e /* U+053E ARMENIAN CAPITAL LETTER CA */ -#define XKB_KEY_Armenian_tsa 0x100056e /* U+056E ARMENIAN SMALL LETTER CA */ -#define XKB_KEY_Armenian_KEN 0x100053f /* U+053F ARMENIAN CAPITAL LETTER KEN */ -#define XKB_KEY_Armenian_ken 0x100056f /* U+056F ARMENIAN SMALL LETTER KEN */ -#define XKB_KEY_Armenian_HO 0x1000540 /* U+0540 ARMENIAN CAPITAL LETTER HO */ -#define XKB_KEY_Armenian_ho 0x1000570 /* U+0570 ARMENIAN SMALL LETTER HO */ -#define XKB_KEY_Armenian_DZA 0x1000541 /* U+0541 ARMENIAN CAPITAL LETTER JA */ -#define XKB_KEY_Armenian_dza 0x1000571 /* U+0571 ARMENIAN SMALL LETTER JA */ -#define XKB_KEY_Armenian_GHAT 0x1000542 /* U+0542 ARMENIAN CAPITAL LETTER GHAD */ -#define XKB_KEY_Armenian_ghat 0x1000572 /* U+0572 ARMENIAN SMALL LETTER GHAD */ -#define XKB_KEY_Armenian_TCHE 0x1000543 /* U+0543 ARMENIAN CAPITAL LETTER CHEH */ -#define XKB_KEY_Armenian_tche 0x1000573 /* U+0573 ARMENIAN SMALL LETTER CHEH */ -#define XKB_KEY_Armenian_MEN 0x1000544 /* U+0544 ARMENIAN CAPITAL LETTER MEN */ -#define XKB_KEY_Armenian_men 0x1000574 /* U+0574 ARMENIAN SMALL LETTER MEN */ -#define XKB_KEY_Armenian_HI 0x1000545 /* U+0545 ARMENIAN CAPITAL LETTER YI */ -#define XKB_KEY_Armenian_hi 0x1000575 /* U+0575 ARMENIAN SMALL LETTER YI */ -#define XKB_KEY_Armenian_NU 0x1000546 /* U+0546 ARMENIAN CAPITAL LETTER NOW */ -#define XKB_KEY_Armenian_nu 0x1000576 /* U+0576 ARMENIAN SMALL LETTER NOW */ -#define XKB_KEY_Armenian_SHA 0x1000547 /* U+0547 ARMENIAN CAPITAL LETTER SHA */ -#define XKB_KEY_Armenian_sha 0x1000577 /* U+0577 ARMENIAN SMALL LETTER SHA */ -#define XKB_KEY_Armenian_VO 0x1000548 /* U+0548 ARMENIAN CAPITAL LETTER VO */ -#define XKB_KEY_Armenian_vo 0x1000578 /* U+0578 ARMENIAN SMALL LETTER VO */ -#define XKB_KEY_Armenian_CHA 0x1000549 /* U+0549 ARMENIAN CAPITAL LETTER CHA */ -#define XKB_KEY_Armenian_cha 0x1000579 /* U+0579 ARMENIAN SMALL LETTER CHA */ -#define XKB_KEY_Armenian_PE 0x100054a /* U+054A ARMENIAN CAPITAL LETTER PEH */ -#define XKB_KEY_Armenian_pe 0x100057a /* U+057A ARMENIAN SMALL LETTER PEH */ -#define XKB_KEY_Armenian_JE 0x100054b /* U+054B ARMENIAN CAPITAL LETTER JHEH */ -#define XKB_KEY_Armenian_je 0x100057b /* U+057B ARMENIAN SMALL LETTER JHEH */ -#define XKB_KEY_Armenian_RA 0x100054c /* U+054C ARMENIAN CAPITAL LETTER RA */ -#define XKB_KEY_Armenian_ra 0x100057c /* U+057C ARMENIAN SMALL LETTER RA */ -#define XKB_KEY_Armenian_SE 0x100054d /* U+054D ARMENIAN CAPITAL LETTER SEH */ -#define XKB_KEY_Armenian_se 0x100057d /* U+057D ARMENIAN SMALL LETTER SEH */ -#define XKB_KEY_Armenian_VEV 0x100054e /* U+054E ARMENIAN CAPITAL LETTER VEW */ -#define XKB_KEY_Armenian_vev 0x100057e /* U+057E ARMENIAN SMALL LETTER VEW */ -#define XKB_KEY_Armenian_TYUN 0x100054f /* U+054F ARMENIAN CAPITAL LETTER TIWN */ -#define XKB_KEY_Armenian_tyun 0x100057f /* U+057F ARMENIAN SMALL LETTER TIWN */ -#define XKB_KEY_Armenian_RE 0x1000550 /* U+0550 ARMENIAN CAPITAL LETTER REH */ -#define XKB_KEY_Armenian_re 0x1000580 /* U+0580 ARMENIAN SMALL LETTER REH */ -#define XKB_KEY_Armenian_TSO 0x1000551 /* U+0551 ARMENIAN CAPITAL LETTER CO */ -#define XKB_KEY_Armenian_tso 0x1000581 /* U+0581 ARMENIAN SMALL LETTER CO */ -#define XKB_KEY_Armenian_VYUN 0x1000552 /* U+0552 ARMENIAN CAPITAL LETTER YIWN */ -#define XKB_KEY_Armenian_vyun 0x1000582 /* U+0582 ARMENIAN SMALL LETTER YIWN */ -#define XKB_KEY_Armenian_PYUR 0x1000553 /* U+0553 ARMENIAN CAPITAL LETTER PIWR */ -#define XKB_KEY_Armenian_pyur 0x1000583 /* U+0583 ARMENIAN SMALL LETTER PIWR */ -#define XKB_KEY_Armenian_KE 0x1000554 /* U+0554 ARMENIAN CAPITAL LETTER KEH */ -#define XKB_KEY_Armenian_ke 0x1000584 /* U+0584 ARMENIAN SMALL LETTER KEH */ -#define XKB_KEY_Armenian_O 0x1000555 /* U+0555 ARMENIAN CAPITAL LETTER OH */ -#define XKB_KEY_Armenian_o 0x1000585 /* U+0585 ARMENIAN SMALL LETTER OH */ -#define XKB_KEY_Armenian_FE 0x1000556 /* U+0556 ARMENIAN CAPITAL LETTER FEH */ -#define XKB_KEY_Armenian_fe 0x1000586 /* U+0586 ARMENIAN SMALL LETTER FEH */ -#define XKB_KEY_Armenian_apostrophe 0x100055a /* U+055A ARMENIAN APOSTROPHE */ - -/* - * Georgian - */ - -#define XKB_KEY_Georgian_an 0x10010d0 /* U+10D0 GEORGIAN LETTER AN */ -#define XKB_KEY_Georgian_ban 0x10010d1 /* U+10D1 GEORGIAN LETTER BAN */ -#define XKB_KEY_Georgian_gan 0x10010d2 /* U+10D2 GEORGIAN LETTER GAN */ -#define XKB_KEY_Georgian_don 0x10010d3 /* U+10D3 GEORGIAN LETTER DON */ -#define XKB_KEY_Georgian_en 0x10010d4 /* U+10D4 GEORGIAN LETTER EN */ -#define XKB_KEY_Georgian_vin 0x10010d5 /* U+10D5 GEORGIAN LETTER VIN */ -#define XKB_KEY_Georgian_zen 0x10010d6 /* U+10D6 GEORGIAN LETTER ZEN */ -#define XKB_KEY_Georgian_tan 0x10010d7 /* U+10D7 GEORGIAN LETTER TAN */ -#define XKB_KEY_Georgian_in 0x10010d8 /* U+10D8 GEORGIAN LETTER IN */ -#define XKB_KEY_Georgian_kan 0x10010d9 /* U+10D9 GEORGIAN LETTER KAN */ -#define XKB_KEY_Georgian_las 0x10010da /* U+10DA GEORGIAN LETTER LAS */ -#define XKB_KEY_Georgian_man 0x10010db /* U+10DB GEORGIAN LETTER MAN */ -#define XKB_KEY_Georgian_nar 0x10010dc /* U+10DC GEORGIAN LETTER NAR */ -#define XKB_KEY_Georgian_on 0x10010dd /* U+10DD GEORGIAN LETTER ON */ -#define XKB_KEY_Georgian_par 0x10010de /* U+10DE GEORGIAN LETTER PAR */ -#define XKB_KEY_Georgian_zhar 0x10010df /* U+10DF GEORGIAN LETTER ZHAR */ -#define XKB_KEY_Georgian_rae 0x10010e0 /* U+10E0 GEORGIAN LETTER RAE */ -#define XKB_KEY_Georgian_san 0x10010e1 /* U+10E1 GEORGIAN LETTER SAN */ -#define XKB_KEY_Georgian_tar 0x10010e2 /* U+10E2 GEORGIAN LETTER TAR */ -#define XKB_KEY_Georgian_un 0x10010e3 /* U+10E3 GEORGIAN LETTER UN */ -#define XKB_KEY_Georgian_phar 0x10010e4 /* U+10E4 GEORGIAN LETTER PHAR */ -#define XKB_KEY_Georgian_khar 0x10010e5 /* U+10E5 GEORGIAN LETTER KHAR */ -#define XKB_KEY_Georgian_ghan 0x10010e6 /* U+10E6 GEORGIAN LETTER GHAN */ -#define XKB_KEY_Georgian_qar 0x10010e7 /* U+10E7 GEORGIAN LETTER QAR */ -#define XKB_KEY_Georgian_shin 0x10010e8 /* U+10E8 GEORGIAN LETTER SHIN */ -#define XKB_KEY_Georgian_chin 0x10010e9 /* U+10E9 GEORGIAN LETTER CHIN */ -#define XKB_KEY_Georgian_can 0x10010ea /* U+10EA GEORGIAN LETTER CAN */ -#define XKB_KEY_Georgian_jil 0x10010eb /* U+10EB GEORGIAN LETTER JIL */ -#define XKB_KEY_Georgian_cil 0x10010ec /* U+10EC GEORGIAN LETTER CIL */ -#define XKB_KEY_Georgian_char 0x10010ed /* U+10ED GEORGIAN LETTER CHAR */ -#define XKB_KEY_Georgian_xan 0x10010ee /* U+10EE GEORGIAN LETTER XAN */ -#define XKB_KEY_Georgian_jhan 0x10010ef /* U+10EF GEORGIAN LETTER JHAN */ -#define XKB_KEY_Georgian_hae 0x10010f0 /* U+10F0 GEORGIAN LETTER HAE */ -#define XKB_KEY_Georgian_he 0x10010f1 /* U+10F1 GEORGIAN LETTER HE */ -#define XKB_KEY_Georgian_hie 0x10010f2 /* U+10F2 GEORGIAN LETTER HIE */ -#define XKB_KEY_Georgian_we 0x10010f3 /* U+10F3 GEORGIAN LETTER WE */ -#define XKB_KEY_Georgian_har 0x10010f4 /* U+10F4 GEORGIAN LETTER HAR */ -#define XKB_KEY_Georgian_hoe 0x10010f5 /* U+10F5 GEORGIAN LETTER HOE */ -#define XKB_KEY_Georgian_fi 0x10010f6 /* U+10F6 GEORGIAN LETTER FI */ - -/* - * Azeri (and other Turkic or Caucasian languages) - */ - -/* latin */ -#define XKB_KEY_Xabovedot 0x1001e8a /* U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE */ -#define XKB_KEY_Ibreve 0x100012c /* U+012C LATIN CAPITAL LETTER I WITH BREVE */ -#define XKB_KEY_Zstroke 0x10001b5 /* U+01B5 LATIN CAPITAL LETTER Z WITH STROKE */ -#define XKB_KEY_Gcaron 0x10001e6 /* U+01E6 LATIN CAPITAL LETTER G WITH CARON */ -#define XKB_KEY_Ocaron 0x10001d1 /* U+01D2 LATIN CAPITAL LETTER O WITH CARON */ -#define XKB_KEY_Obarred 0x100019f /* U+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE */ -#define XKB_KEY_xabovedot 0x1001e8b /* U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE */ -#define XKB_KEY_ibreve 0x100012d /* U+012D LATIN SMALL LETTER I WITH BREVE */ -#define XKB_KEY_zstroke 0x10001b6 /* U+01B6 LATIN SMALL LETTER Z WITH STROKE */ -#define XKB_KEY_gcaron 0x10001e7 /* U+01E7 LATIN SMALL LETTER G WITH CARON */ -#define XKB_KEY_ocaron 0x10001d2 /* U+01D2 LATIN SMALL LETTER O WITH CARON */ -#define XKB_KEY_obarred 0x1000275 /* U+0275 LATIN SMALL LETTER BARRED O */ -#define XKB_KEY_SCHWA 0x100018f /* U+018F LATIN CAPITAL LETTER SCHWA */ -#define XKB_KEY_schwa 0x1000259 /* U+0259 LATIN SMALL LETTER SCHWA */ -#define XKB_KEY_EZH 0x10001b7 /* U+01B7 LATIN CAPITAL LETTER EZH */ -#define XKB_KEY_ezh 0x1000292 /* U+0292 LATIN SMALL LETTER EZH */ -/* those are not really Caucasus */ -/* For Inupiak */ -#define XKB_KEY_Lbelowdot 0x1001e36 /* U+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW */ -#define XKB_KEY_lbelowdot 0x1001e37 /* U+1E37 LATIN SMALL LETTER L WITH DOT BELOW */ - -/* - * Vietnamese - */ - -#define XKB_KEY_Abelowdot 0x1001ea0 /* U+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW */ -#define XKB_KEY_abelowdot 0x1001ea1 /* U+1EA1 LATIN SMALL LETTER A WITH DOT BELOW */ -#define XKB_KEY_Ahook 0x1001ea2 /* U+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE */ -#define XKB_KEY_ahook 0x1001ea3 /* U+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE */ -#define XKB_KEY_Acircumflexacute 0x1001ea4 /* U+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ -#define XKB_KEY_acircumflexacute 0x1001ea5 /* U+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */ -#define XKB_KEY_Acircumflexgrave 0x1001ea6 /* U+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ -#define XKB_KEY_acircumflexgrave 0x1001ea7 /* U+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */ -#define XKB_KEY_Acircumflexhook 0x1001ea8 /* U+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ -#define XKB_KEY_acircumflexhook 0x1001ea9 /* U+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ -#define XKB_KEY_Acircumflextilde 0x1001eaa /* U+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ -#define XKB_KEY_acircumflextilde 0x1001eab /* U+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */ -#define XKB_KEY_Acircumflexbelowdot 0x1001eac /* U+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ -#define XKB_KEY_acircumflexbelowdot 0x1001ead /* U+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ -#define XKB_KEY_Abreveacute 0x1001eae /* U+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ -#define XKB_KEY_abreveacute 0x1001eaf /* U+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE */ -#define XKB_KEY_Abrevegrave 0x1001eb0 /* U+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ -#define XKB_KEY_abrevegrave 0x1001eb1 /* U+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE */ -#define XKB_KEY_Abrevehook 0x1001eb2 /* U+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ -#define XKB_KEY_abrevehook 0x1001eb3 /* U+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */ -#define XKB_KEY_Abrevetilde 0x1001eb4 /* U+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ -#define XKB_KEY_abrevetilde 0x1001eb5 /* U+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE */ -#define XKB_KEY_Abrevebelowdot 0x1001eb6 /* U+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ -#define XKB_KEY_abrevebelowdot 0x1001eb7 /* U+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */ -#define XKB_KEY_Ebelowdot 0x1001eb8 /* U+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW */ -#define XKB_KEY_ebelowdot 0x1001eb9 /* U+1EB9 LATIN SMALL LETTER E WITH DOT BELOW */ -#define XKB_KEY_Ehook 0x1001eba /* U+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE */ -#define XKB_KEY_ehook 0x1001ebb /* U+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE */ -#define XKB_KEY_Etilde 0x1001ebc /* U+1EBC LATIN CAPITAL LETTER E WITH TILDE */ -#define XKB_KEY_etilde 0x1001ebd /* U+1EBD LATIN SMALL LETTER E WITH TILDE */ -#define XKB_KEY_Ecircumflexacute 0x1001ebe /* U+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ -#define XKB_KEY_ecircumflexacute 0x1001ebf /* U+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */ -#define XKB_KEY_Ecircumflexgrave 0x1001ec0 /* U+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ -#define XKB_KEY_ecircumflexgrave 0x1001ec1 /* U+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */ -#define XKB_KEY_Ecircumflexhook 0x1001ec2 /* U+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ -#define XKB_KEY_ecircumflexhook 0x1001ec3 /* U+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ -#define XKB_KEY_Ecircumflextilde 0x1001ec4 /* U+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ -#define XKB_KEY_ecircumflextilde 0x1001ec5 /* U+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */ -#define XKB_KEY_Ecircumflexbelowdot 0x1001ec6 /* U+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ -#define XKB_KEY_ecircumflexbelowdot 0x1001ec7 /* U+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ -#define XKB_KEY_Ihook 0x1001ec8 /* U+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE */ -#define XKB_KEY_ihook 0x1001ec9 /* U+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE */ -#define XKB_KEY_Ibelowdot 0x1001eca /* U+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW */ -#define XKB_KEY_ibelowdot 0x1001ecb /* U+1ECB LATIN SMALL LETTER I WITH DOT BELOW */ -#define XKB_KEY_Obelowdot 0x1001ecc /* U+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW */ -#define XKB_KEY_obelowdot 0x1001ecd /* U+1ECD LATIN SMALL LETTER O WITH DOT BELOW */ -#define XKB_KEY_Ohook 0x1001ece /* U+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE */ -#define XKB_KEY_ohook 0x1001ecf /* U+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE */ -#define XKB_KEY_Ocircumflexacute 0x1001ed0 /* U+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ -#define XKB_KEY_ocircumflexacute 0x1001ed1 /* U+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */ -#define XKB_KEY_Ocircumflexgrave 0x1001ed2 /* U+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ -#define XKB_KEY_ocircumflexgrave 0x1001ed3 /* U+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */ -#define XKB_KEY_Ocircumflexhook 0x1001ed4 /* U+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ -#define XKB_KEY_ocircumflexhook 0x1001ed5 /* U+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ -#define XKB_KEY_Ocircumflextilde 0x1001ed6 /* U+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ -#define XKB_KEY_ocircumflextilde 0x1001ed7 /* U+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */ -#define XKB_KEY_Ocircumflexbelowdot 0x1001ed8 /* U+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ -#define XKB_KEY_ocircumflexbelowdot 0x1001ed9 /* U+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ -#define XKB_KEY_Ohornacute 0x1001eda /* U+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ -#define XKB_KEY_ohornacute 0x1001edb /* U+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE */ -#define XKB_KEY_Ohorngrave 0x1001edc /* U+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ -#define XKB_KEY_ohorngrave 0x1001edd /* U+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE */ -#define XKB_KEY_Ohornhook 0x1001ede /* U+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ -#define XKB_KEY_ohornhook 0x1001edf /* U+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */ -#define XKB_KEY_Ohorntilde 0x1001ee0 /* U+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE */ -#define XKB_KEY_ohorntilde 0x1001ee1 /* U+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE */ -#define XKB_KEY_Ohornbelowdot 0x1001ee2 /* U+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ -#define XKB_KEY_ohornbelowdot 0x1001ee3 /* U+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW */ -#define XKB_KEY_Ubelowdot 0x1001ee4 /* U+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW */ -#define XKB_KEY_ubelowdot 0x1001ee5 /* U+1EE5 LATIN SMALL LETTER U WITH DOT BELOW */ -#define XKB_KEY_Uhook 0x1001ee6 /* U+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE */ -#define XKB_KEY_uhook 0x1001ee7 /* U+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE */ -#define XKB_KEY_Uhornacute 0x1001ee8 /* U+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ -#define XKB_KEY_uhornacute 0x1001ee9 /* U+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE */ -#define XKB_KEY_Uhorngrave 0x1001eea /* U+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ -#define XKB_KEY_uhorngrave 0x1001eeb /* U+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE */ -#define XKB_KEY_Uhornhook 0x1001eec /* U+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ -#define XKB_KEY_uhornhook 0x1001eed /* U+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */ -#define XKB_KEY_Uhorntilde 0x1001eee /* U+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE */ -#define XKB_KEY_uhorntilde 0x1001eef /* U+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE */ -#define XKB_KEY_Uhornbelowdot 0x1001ef0 /* U+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ -#define XKB_KEY_uhornbelowdot 0x1001ef1 /* U+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */ -#define XKB_KEY_Ybelowdot 0x1001ef4 /* U+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW */ -#define XKB_KEY_ybelowdot 0x1001ef5 /* U+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW */ -#define XKB_KEY_Yhook 0x1001ef6 /* U+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ -#define XKB_KEY_yhook 0x1001ef7 /* U+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE */ -#define XKB_KEY_Ytilde 0x1001ef8 /* U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE */ -#define XKB_KEY_ytilde 0x1001ef9 /* U+1EF9 LATIN SMALL LETTER Y WITH TILDE */ -#define XKB_KEY_Ohorn 0x10001a0 /* U+01A0 LATIN CAPITAL LETTER O WITH HORN */ -#define XKB_KEY_ohorn 0x10001a1 /* U+01A1 LATIN SMALL LETTER O WITH HORN */ -#define XKB_KEY_Uhorn 0x10001af /* U+01AF LATIN CAPITAL LETTER U WITH HORN */ -#define XKB_KEY_uhorn 0x10001b0 /* U+01B0 LATIN SMALL LETTER U WITH HORN */ - - -#define XKB_KEY_EcuSign 0x10020a0 /* U+20A0 EURO-CURRENCY SIGN */ -#define XKB_KEY_ColonSign 0x10020a1 /* U+20A1 COLON SIGN */ -#define XKB_KEY_CruzeiroSign 0x10020a2 /* U+20A2 CRUZEIRO SIGN */ -#define XKB_KEY_FFrancSign 0x10020a3 /* U+20A3 FRENCH FRANC SIGN */ -#define XKB_KEY_LiraSign 0x10020a4 /* U+20A4 LIRA SIGN */ -#define XKB_KEY_MillSign 0x10020a5 /* U+20A5 MILL SIGN */ -#define XKB_KEY_NairaSign 0x10020a6 /* U+20A6 NAIRA SIGN */ -#define XKB_KEY_PesetaSign 0x10020a7 /* U+20A7 PESETA SIGN */ -#define XKB_KEY_RupeeSign 0x10020a8 /* U+20A8 RUPEE SIGN */ -#define XKB_KEY_WonSign 0x10020a9 /* U+20A9 WON SIGN */ -#define XKB_KEY_NewSheqelSign 0x10020aa /* U+20AA NEW SHEQEL SIGN */ -#define XKB_KEY_DongSign 0x10020ab /* U+20AB DONG SIGN */ -#define XKB_KEY_EuroSign 0x20ac /* U+20AC EURO SIGN */ - -/* one, two and three are defined above. */ -#define XKB_KEY_zerosuperior 0x1002070 /* U+2070 SUPERSCRIPT ZERO */ -#define XKB_KEY_foursuperior 0x1002074 /* U+2074 SUPERSCRIPT FOUR */ -#define XKB_KEY_fivesuperior 0x1002075 /* U+2075 SUPERSCRIPT FIVE */ -#define XKB_KEY_sixsuperior 0x1002076 /* U+2076 SUPERSCRIPT SIX */ -#define XKB_KEY_sevensuperior 0x1002077 /* U+2077 SUPERSCRIPT SEVEN */ -#define XKB_KEY_eightsuperior 0x1002078 /* U+2078 SUPERSCRIPT EIGHT */ -#define XKB_KEY_ninesuperior 0x1002079 /* U+2079 SUPERSCRIPT NINE */ -#define XKB_KEY_zerosubscript 0x1002080 /* U+2080 SUBSCRIPT ZERO */ -#define XKB_KEY_onesubscript 0x1002081 /* U+2081 SUBSCRIPT ONE */ -#define XKB_KEY_twosubscript 0x1002082 /* U+2082 SUBSCRIPT TWO */ -#define XKB_KEY_threesubscript 0x1002083 /* U+2083 SUBSCRIPT THREE */ -#define XKB_KEY_foursubscript 0x1002084 /* U+2084 SUBSCRIPT FOUR */ -#define XKB_KEY_fivesubscript 0x1002085 /* U+2085 SUBSCRIPT FIVE */ -#define XKB_KEY_sixsubscript 0x1002086 /* U+2086 SUBSCRIPT SIX */ -#define XKB_KEY_sevensubscript 0x1002087 /* U+2087 SUBSCRIPT SEVEN */ -#define XKB_KEY_eightsubscript 0x1002088 /* U+2088 SUBSCRIPT EIGHT */ -#define XKB_KEY_ninesubscript 0x1002089 /* U+2089 SUBSCRIPT NINE */ -#define XKB_KEY_partdifferential 0x1002202 /* U+2202 PARTIAL DIFFERENTIAL */ -#define XKB_KEY_emptyset 0x1002205 /* U+2205 NULL SET */ -#define XKB_KEY_elementof 0x1002208 /* U+2208 ELEMENT OF */ -#define XKB_KEY_notelementof 0x1002209 /* U+2209 NOT AN ELEMENT OF */ -#define XKB_KEY_containsas 0x100220B /* U+220B CONTAINS AS MEMBER */ -#define XKB_KEY_squareroot 0x100221A /* U+221A SQUARE ROOT */ -#define XKB_KEY_cuberoot 0x100221B /* U+221B CUBE ROOT */ -#define XKB_KEY_fourthroot 0x100221C /* U+221C FOURTH ROOT */ -#define XKB_KEY_dintegral 0x100222C /* U+222C DOUBLE INTEGRAL */ -#define XKB_KEY_tintegral 0x100222D /* U+222D TRIPLE INTEGRAL */ -#define XKB_KEY_because 0x1002235 /* U+2235 BECAUSE */ -#define XKB_KEY_approxeq 0x1002248 /* U+2245 ALMOST EQUAL TO */ -#define XKB_KEY_notapproxeq 0x1002247 /* U+2247 NOT ALMOST EQUAL TO */ -#define XKB_KEY_notidentical 0x1002262 /* U+2262 NOT IDENTICAL TO */ -#define XKB_KEY_stricteq 0x1002263 /* U+2263 STRICTLY EQUIVALENT TO */ - -#define XKB_KEY_braille_dot_1 0xfff1 -#define XKB_KEY_braille_dot_2 0xfff2 -#define XKB_KEY_braille_dot_3 0xfff3 -#define XKB_KEY_braille_dot_4 0xfff4 -#define XKB_KEY_braille_dot_5 0xfff5 -#define XKB_KEY_braille_dot_6 0xfff6 -#define XKB_KEY_braille_dot_7 0xfff7 -#define XKB_KEY_braille_dot_8 0xfff8 -#define XKB_KEY_braille_dot_9 0xfff9 -#define XKB_KEY_braille_dot_10 0xfffa -#define XKB_KEY_braille_blank 0x1002800 /* U+2800 BRAILLE PATTERN BLANK */ -#define XKB_KEY_braille_dots_1 0x1002801 /* U+2801 BRAILLE PATTERN DOTS-1 */ -#define XKB_KEY_braille_dots_2 0x1002802 /* U+2802 BRAILLE PATTERN DOTS-2 */ -#define XKB_KEY_braille_dots_12 0x1002803 /* U+2803 BRAILLE PATTERN DOTS-12 */ -#define XKB_KEY_braille_dots_3 0x1002804 /* U+2804 BRAILLE PATTERN DOTS-3 */ -#define XKB_KEY_braille_dots_13 0x1002805 /* U+2805 BRAILLE PATTERN DOTS-13 */ -#define XKB_KEY_braille_dots_23 0x1002806 /* U+2806 BRAILLE PATTERN DOTS-23 */ -#define XKB_KEY_braille_dots_123 0x1002807 /* U+2807 BRAILLE PATTERN DOTS-123 */ -#define XKB_KEY_braille_dots_4 0x1002808 /* U+2808 BRAILLE PATTERN DOTS-4 */ -#define XKB_KEY_braille_dots_14 0x1002809 /* U+2809 BRAILLE PATTERN DOTS-14 */ -#define XKB_KEY_braille_dots_24 0x100280a /* U+280a BRAILLE PATTERN DOTS-24 */ -#define XKB_KEY_braille_dots_124 0x100280b /* U+280b BRAILLE PATTERN DOTS-124 */ -#define XKB_KEY_braille_dots_34 0x100280c /* U+280c BRAILLE PATTERN DOTS-34 */ -#define XKB_KEY_braille_dots_134 0x100280d /* U+280d BRAILLE PATTERN DOTS-134 */ -#define XKB_KEY_braille_dots_234 0x100280e /* U+280e BRAILLE PATTERN DOTS-234 */ -#define XKB_KEY_braille_dots_1234 0x100280f /* U+280f BRAILLE PATTERN DOTS-1234 */ -#define XKB_KEY_braille_dots_5 0x1002810 /* U+2810 BRAILLE PATTERN DOTS-5 */ -#define XKB_KEY_braille_dots_15 0x1002811 /* U+2811 BRAILLE PATTERN DOTS-15 */ -#define XKB_KEY_braille_dots_25 0x1002812 /* U+2812 BRAILLE PATTERN DOTS-25 */ -#define XKB_KEY_braille_dots_125 0x1002813 /* U+2813 BRAILLE PATTERN DOTS-125 */ -#define XKB_KEY_braille_dots_35 0x1002814 /* U+2814 BRAILLE PATTERN DOTS-35 */ -#define XKB_KEY_braille_dots_135 0x1002815 /* U+2815 BRAILLE PATTERN DOTS-135 */ -#define XKB_KEY_braille_dots_235 0x1002816 /* U+2816 BRAILLE PATTERN DOTS-235 */ -#define XKB_KEY_braille_dots_1235 0x1002817 /* U+2817 BRAILLE PATTERN DOTS-1235 */ -#define XKB_KEY_braille_dots_45 0x1002818 /* U+2818 BRAILLE PATTERN DOTS-45 */ -#define XKB_KEY_braille_dots_145 0x1002819 /* U+2819 BRAILLE PATTERN DOTS-145 */ -#define XKB_KEY_braille_dots_245 0x100281a /* U+281a BRAILLE PATTERN DOTS-245 */ -#define XKB_KEY_braille_dots_1245 0x100281b /* U+281b BRAILLE PATTERN DOTS-1245 */ -#define XKB_KEY_braille_dots_345 0x100281c /* U+281c BRAILLE PATTERN DOTS-345 */ -#define XKB_KEY_braille_dots_1345 0x100281d /* U+281d BRAILLE PATTERN DOTS-1345 */ -#define XKB_KEY_braille_dots_2345 0x100281e /* U+281e BRAILLE PATTERN DOTS-2345 */ -#define XKB_KEY_braille_dots_12345 0x100281f /* U+281f BRAILLE PATTERN DOTS-12345 */ -#define XKB_KEY_braille_dots_6 0x1002820 /* U+2820 BRAILLE PATTERN DOTS-6 */ -#define XKB_KEY_braille_dots_16 0x1002821 /* U+2821 BRAILLE PATTERN DOTS-16 */ -#define XKB_KEY_braille_dots_26 0x1002822 /* U+2822 BRAILLE PATTERN DOTS-26 */ -#define XKB_KEY_braille_dots_126 0x1002823 /* U+2823 BRAILLE PATTERN DOTS-126 */ -#define XKB_KEY_braille_dots_36 0x1002824 /* U+2824 BRAILLE PATTERN DOTS-36 */ -#define XKB_KEY_braille_dots_136 0x1002825 /* U+2825 BRAILLE PATTERN DOTS-136 */ -#define XKB_KEY_braille_dots_236 0x1002826 /* U+2826 BRAILLE PATTERN DOTS-236 */ -#define XKB_KEY_braille_dots_1236 0x1002827 /* U+2827 BRAILLE PATTERN DOTS-1236 */ -#define XKB_KEY_braille_dots_46 0x1002828 /* U+2828 BRAILLE PATTERN DOTS-46 */ -#define XKB_KEY_braille_dots_146 0x1002829 /* U+2829 BRAILLE PATTERN DOTS-146 */ -#define XKB_KEY_braille_dots_246 0x100282a /* U+282a BRAILLE PATTERN DOTS-246 */ -#define XKB_KEY_braille_dots_1246 0x100282b /* U+282b BRAILLE PATTERN DOTS-1246 */ -#define XKB_KEY_braille_dots_346 0x100282c /* U+282c BRAILLE PATTERN DOTS-346 */ -#define XKB_KEY_braille_dots_1346 0x100282d /* U+282d BRAILLE PATTERN DOTS-1346 */ -#define XKB_KEY_braille_dots_2346 0x100282e /* U+282e BRAILLE PATTERN DOTS-2346 */ -#define XKB_KEY_braille_dots_12346 0x100282f /* U+282f BRAILLE PATTERN DOTS-12346 */ -#define XKB_KEY_braille_dots_56 0x1002830 /* U+2830 BRAILLE PATTERN DOTS-56 */ -#define XKB_KEY_braille_dots_156 0x1002831 /* U+2831 BRAILLE PATTERN DOTS-156 */ -#define XKB_KEY_braille_dots_256 0x1002832 /* U+2832 BRAILLE PATTERN DOTS-256 */ -#define XKB_KEY_braille_dots_1256 0x1002833 /* U+2833 BRAILLE PATTERN DOTS-1256 */ -#define XKB_KEY_braille_dots_356 0x1002834 /* U+2834 BRAILLE PATTERN DOTS-356 */ -#define XKB_KEY_braille_dots_1356 0x1002835 /* U+2835 BRAILLE PATTERN DOTS-1356 */ -#define XKB_KEY_braille_dots_2356 0x1002836 /* U+2836 BRAILLE PATTERN DOTS-2356 */ -#define XKB_KEY_braille_dots_12356 0x1002837 /* U+2837 BRAILLE PATTERN DOTS-12356 */ -#define XKB_KEY_braille_dots_456 0x1002838 /* U+2838 BRAILLE PATTERN DOTS-456 */ -#define XKB_KEY_braille_dots_1456 0x1002839 /* U+2839 BRAILLE PATTERN DOTS-1456 */ -#define XKB_KEY_braille_dots_2456 0x100283a /* U+283a BRAILLE PATTERN DOTS-2456 */ -#define XKB_KEY_braille_dots_12456 0x100283b /* U+283b BRAILLE PATTERN DOTS-12456 */ -#define XKB_KEY_braille_dots_3456 0x100283c /* U+283c BRAILLE PATTERN DOTS-3456 */ -#define XKB_KEY_braille_dots_13456 0x100283d /* U+283d BRAILLE PATTERN DOTS-13456 */ -#define XKB_KEY_braille_dots_23456 0x100283e /* U+283e BRAILLE PATTERN DOTS-23456 */ -#define XKB_KEY_braille_dots_123456 0x100283f /* U+283f BRAILLE PATTERN DOTS-123456 */ -#define XKB_KEY_braille_dots_7 0x1002840 /* U+2840 BRAILLE PATTERN DOTS-7 */ -#define XKB_KEY_braille_dots_17 0x1002841 /* U+2841 BRAILLE PATTERN DOTS-17 */ -#define XKB_KEY_braille_dots_27 0x1002842 /* U+2842 BRAILLE PATTERN DOTS-27 */ -#define XKB_KEY_braille_dots_127 0x1002843 /* U+2843 BRAILLE PATTERN DOTS-127 */ -#define XKB_KEY_braille_dots_37 0x1002844 /* U+2844 BRAILLE PATTERN DOTS-37 */ -#define XKB_KEY_braille_dots_137 0x1002845 /* U+2845 BRAILLE PATTERN DOTS-137 */ -#define XKB_KEY_braille_dots_237 0x1002846 /* U+2846 BRAILLE PATTERN DOTS-237 */ -#define XKB_KEY_braille_dots_1237 0x1002847 /* U+2847 BRAILLE PATTERN DOTS-1237 */ -#define XKB_KEY_braille_dots_47 0x1002848 /* U+2848 BRAILLE PATTERN DOTS-47 */ -#define XKB_KEY_braille_dots_147 0x1002849 /* U+2849 BRAILLE PATTERN DOTS-147 */ -#define XKB_KEY_braille_dots_247 0x100284a /* U+284a BRAILLE PATTERN DOTS-247 */ -#define XKB_KEY_braille_dots_1247 0x100284b /* U+284b BRAILLE PATTERN DOTS-1247 */ -#define XKB_KEY_braille_dots_347 0x100284c /* U+284c BRAILLE PATTERN DOTS-347 */ -#define XKB_KEY_braille_dots_1347 0x100284d /* U+284d BRAILLE PATTERN DOTS-1347 */ -#define XKB_KEY_braille_dots_2347 0x100284e /* U+284e BRAILLE PATTERN DOTS-2347 */ -#define XKB_KEY_braille_dots_12347 0x100284f /* U+284f BRAILLE PATTERN DOTS-12347 */ -#define XKB_KEY_braille_dots_57 0x1002850 /* U+2850 BRAILLE PATTERN DOTS-57 */ -#define XKB_KEY_braille_dots_157 0x1002851 /* U+2851 BRAILLE PATTERN DOTS-157 */ -#define XKB_KEY_braille_dots_257 0x1002852 /* U+2852 BRAILLE PATTERN DOTS-257 */ -#define XKB_KEY_braille_dots_1257 0x1002853 /* U+2853 BRAILLE PATTERN DOTS-1257 */ -#define XKB_KEY_braille_dots_357 0x1002854 /* U+2854 BRAILLE PATTERN DOTS-357 */ -#define XKB_KEY_braille_dots_1357 0x1002855 /* U+2855 BRAILLE PATTERN DOTS-1357 */ -#define XKB_KEY_braille_dots_2357 0x1002856 /* U+2856 BRAILLE PATTERN DOTS-2357 */ -#define XKB_KEY_braille_dots_12357 0x1002857 /* U+2857 BRAILLE PATTERN DOTS-12357 */ -#define XKB_KEY_braille_dots_457 0x1002858 /* U+2858 BRAILLE PATTERN DOTS-457 */ -#define XKB_KEY_braille_dots_1457 0x1002859 /* U+2859 BRAILLE PATTERN DOTS-1457 */ -#define XKB_KEY_braille_dots_2457 0x100285a /* U+285a BRAILLE PATTERN DOTS-2457 */ -#define XKB_KEY_braille_dots_12457 0x100285b /* U+285b BRAILLE PATTERN DOTS-12457 */ -#define XKB_KEY_braille_dots_3457 0x100285c /* U+285c BRAILLE PATTERN DOTS-3457 */ -#define XKB_KEY_braille_dots_13457 0x100285d /* U+285d BRAILLE PATTERN DOTS-13457 */ -#define XKB_KEY_braille_dots_23457 0x100285e /* U+285e BRAILLE PATTERN DOTS-23457 */ -#define XKB_KEY_braille_dots_123457 0x100285f /* U+285f BRAILLE PATTERN DOTS-123457 */ -#define XKB_KEY_braille_dots_67 0x1002860 /* U+2860 BRAILLE PATTERN DOTS-67 */ -#define XKB_KEY_braille_dots_167 0x1002861 /* U+2861 BRAILLE PATTERN DOTS-167 */ -#define XKB_KEY_braille_dots_267 0x1002862 /* U+2862 BRAILLE PATTERN DOTS-267 */ -#define XKB_KEY_braille_dots_1267 0x1002863 /* U+2863 BRAILLE PATTERN DOTS-1267 */ -#define XKB_KEY_braille_dots_367 0x1002864 /* U+2864 BRAILLE PATTERN DOTS-367 */ -#define XKB_KEY_braille_dots_1367 0x1002865 /* U+2865 BRAILLE PATTERN DOTS-1367 */ -#define XKB_KEY_braille_dots_2367 0x1002866 /* U+2866 BRAILLE PATTERN DOTS-2367 */ -#define XKB_KEY_braille_dots_12367 0x1002867 /* U+2867 BRAILLE PATTERN DOTS-12367 */ -#define XKB_KEY_braille_dots_467 0x1002868 /* U+2868 BRAILLE PATTERN DOTS-467 */ -#define XKB_KEY_braille_dots_1467 0x1002869 /* U+2869 BRAILLE PATTERN DOTS-1467 */ -#define XKB_KEY_braille_dots_2467 0x100286a /* U+286a BRAILLE PATTERN DOTS-2467 */ -#define XKB_KEY_braille_dots_12467 0x100286b /* U+286b BRAILLE PATTERN DOTS-12467 */ -#define XKB_KEY_braille_dots_3467 0x100286c /* U+286c BRAILLE PATTERN DOTS-3467 */ -#define XKB_KEY_braille_dots_13467 0x100286d /* U+286d BRAILLE PATTERN DOTS-13467 */ -#define XKB_KEY_braille_dots_23467 0x100286e /* U+286e BRAILLE PATTERN DOTS-23467 */ -#define XKB_KEY_braille_dots_123467 0x100286f /* U+286f BRAILLE PATTERN DOTS-123467 */ -#define XKB_KEY_braille_dots_567 0x1002870 /* U+2870 BRAILLE PATTERN DOTS-567 */ -#define XKB_KEY_braille_dots_1567 0x1002871 /* U+2871 BRAILLE PATTERN DOTS-1567 */ -#define XKB_KEY_braille_dots_2567 0x1002872 /* U+2872 BRAILLE PATTERN DOTS-2567 */ -#define XKB_KEY_braille_dots_12567 0x1002873 /* U+2873 BRAILLE PATTERN DOTS-12567 */ -#define XKB_KEY_braille_dots_3567 0x1002874 /* U+2874 BRAILLE PATTERN DOTS-3567 */ -#define XKB_KEY_braille_dots_13567 0x1002875 /* U+2875 BRAILLE PATTERN DOTS-13567 */ -#define XKB_KEY_braille_dots_23567 0x1002876 /* U+2876 BRAILLE PATTERN DOTS-23567 */ -#define XKB_KEY_braille_dots_123567 0x1002877 /* U+2877 BRAILLE PATTERN DOTS-123567 */ -#define XKB_KEY_braille_dots_4567 0x1002878 /* U+2878 BRAILLE PATTERN DOTS-4567 */ -#define XKB_KEY_braille_dots_14567 0x1002879 /* U+2879 BRAILLE PATTERN DOTS-14567 */ -#define XKB_KEY_braille_dots_24567 0x100287a /* U+287a BRAILLE PATTERN DOTS-24567 */ -#define XKB_KEY_braille_dots_124567 0x100287b /* U+287b BRAILLE PATTERN DOTS-124567 */ -#define XKB_KEY_braille_dots_34567 0x100287c /* U+287c BRAILLE PATTERN DOTS-34567 */ -#define XKB_KEY_braille_dots_134567 0x100287d /* U+287d BRAILLE PATTERN DOTS-134567 */ -#define XKB_KEY_braille_dots_234567 0x100287e /* U+287e BRAILLE PATTERN DOTS-234567 */ -#define XKB_KEY_braille_dots_1234567 0x100287f /* U+287f BRAILLE PATTERN DOTS-1234567 */ -#define XKB_KEY_braille_dots_8 0x1002880 /* U+2880 BRAILLE PATTERN DOTS-8 */ -#define XKB_KEY_braille_dots_18 0x1002881 /* U+2881 BRAILLE PATTERN DOTS-18 */ -#define XKB_KEY_braille_dots_28 0x1002882 /* U+2882 BRAILLE PATTERN DOTS-28 */ -#define XKB_KEY_braille_dots_128 0x1002883 /* U+2883 BRAILLE PATTERN DOTS-128 */ -#define XKB_KEY_braille_dots_38 0x1002884 /* U+2884 BRAILLE PATTERN DOTS-38 */ -#define XKB_KEY_braille_dots_138 0x1002885 /* U+2885 BRAILLE PATTERN DOTS-138 */ -#define XKB_KEY_braille_dots_238 0x1002886 /* U+2886 BRAILLE PATTERN DOTS-238 */ -#define XKB_KEY_braille_dots_1238 0x1002887 /* U+2887 BRAILLE PATTERN DOTS-1238 */ -#define XKB_KEY_braille_dots_48 0x1002888 /* U+2888 BRAILLE PATTERN DOTS-48 */ -#define XKB_KEY_braille_dots_148 0x1002889 /* U+2889 BRAILLE PATTERN DOTS-148 */ -#define XKB_KEY_braille_dots_248 0x100288a /* U+288a BRAILLE PATTERN DOTS-248 */ -#define XKB_KEY_braille_dots_1248 0x100288b /* U+288b BRAILLE PATTERN DOTS-1248 */ -#define XKB_KEY_braille_dots_348 0x100288c /* U+288c BRAILLE PATTERN DOTS-348 */ -#define XKB_KEY_braille_dots_1348 0x100288d /* U+288d BRAILLE PATTERN DOTS-1348 */ -#define XKB_KEY_braille_dots_2348 0x100288e /* U+288e BRAILLE PATTERN DOTS-2348 */ -#define XKB_KEY_braille_dots_12348 0x100288f /* U+288f BRAILLE PATTERN DOTS-12348 */ -#define XKB_KEY_braille_dots_58 0x1002890 /* U+2890 BRAILLE PATTERN DOTS-58 */ -#define XKB_KEY_braille_dots_158 0x1002891 /* U+2891 BRAILLE PATTERN DOTS-158 */ -#define XKB_KEY_braille_dots_258 0x1002892 /* U+2892 BRAILLE PATTERN DOTS-258 */ -#define XKB_KEY_braille_dots_1258 0x1002893 /* U+2893 BRAILLE PATTERN DOTS-1258 */ -#define XKB_KEY_braille_dots_358 0x1002894 /* U+2894 BRAILLE PATTERN DOTS-358 */ -#define XKB_KEY_braille_dots_1358 0x1002895 /* U+2895 BRAILLE PATTERN DOTS-1358 */ -#define XKB_KEY_braille_dots_2358 0x1002896 /* U+2896 BRAILLE PATTERN DOTS-2358 */ -#define XKB_KEY_braille_dots_12358 0x1002897 /* U+2897 BRAILLE PATTERN DOTS-12358 */ -#define XKB_KEY_braille_dots_458 0x1002898 /* U+2898 BRAILLE PATTERN DOTS-458 */ -#define XKB_KEY_braille_dots_1458 0x1002899 /* U+2899 BRAILLE PATTERN DOTS-1458 */ -#define XKB_KEY_braille_dots_2458 0x100289a /* U+289a BRAILLE PATTERN DOTS-2458 */ -#define XKB_KEY_braille_dots_12458 0x100289b /* U+289b BRAILLE PATTERN DOTS-12458 */ -#define XKB_KEY_braille_dots_3458 0x100289c /* U+289c BRAILLE PATTERN DOTS-3458 */ -#define XKB_KEY_braille_dots_13458 0x100289d /* U+289d BRAILLE PATTERN DOTS-13458 */ -#define XKB_KEY_braille_dots_23458 0x100289e /* U+289e BRAILLE PATTERN DOTS-23458 */ -#define XKB_KEY_braille_dots_123458 0x100289f /* U+289f BRAILLE PATTERN DOTS-123458 */ -#define XKB_KEY_braille_dots_68 0x10028a0 /* U+28a0 BRAILLE PATTERN DOTS-68 */ -#define XKB_KEY_braille_dots_168 0x10028a1 /* U+28a1 BRAILLE PATTERN DOTS-168 */ -#define XKB_KEY_braille_dots_268 0x10028a2 /* U+28a2 BRAILLE PATTERN DOTS-268 */ -#define XKB_KEY_braille_dots_1268 0x10028a3 /* U+28a3 BRAILLE PATTERN DOTS-1268 */ -#define XKB_KEY_braille_dots_368 0x10028a4 /* U+28a4 BRAILLE PATTERN DOTS-368 */ -#define XKB_KEY_braille_dots_1368 0x10028a5 /* U+28a5 BRAILLE PATTERN DOTS-1368 */ -#define XKB_KEY_braille_dots_2368 0x10028a6 /* U+28a6 BRAILLE PATTERN DOTS-2368 */ -#define XKB_KEY_braille_dots_12368 0x10028a7 /* U+28a7 BRAILLE PATTERN DOTS-12368 */ -#define XKB_KEY_braille_dots_468 0x10028a8 /* U+28a8 BRAILLE PATTERN DOTS-468 */ -#define XKB_KEY_braille_dots_1468 0x10028a9 /* U+28a9 BRAILLE PATTERN DOTS-1468 */ -#define XKB_KEY_braille_dots_2468 0x10028aa /* U+28aa BRAILLE PATTERN DOTS-2468 */ -#define XKB_KEY_braille_dots_12468 0x10028ab /* U+28ab BRAILLE PATTERN DOTS-12468 */ -#define XKB_KEY_braille_dots_3468 0x10028ac /* U+28ac BRAILLE PATTERN DOTS-3468 */ -#define XKB_KEY_braille_dots_13468 0x10028ad /* U+28ad BRAILLE PATTERN DOTS-13468 */ -#define XKB_KEY_braille_dots_23468 0x10028ae /* U+28ae BRAILLE PATTERN DOTS-23468 */ -#define XKB_KEY_braille_dots_123468 0x10028af /* U+28af BRAILLE PATTERN DOTS-123468 */ -#define XKB_KEY_braille_dots_568 0x10028b0 /* U+28b0 BRAILLE PATTERN DOTS-568 */ -#define XKB_KEY_braille_dots_1568 0x10028b1 /* U+28b1 BRAILLE PATTERN DOTS-1568 */ -#define XKB_KEY_braille_dots_2568 0x10028b2 /* U+28b2 BRAILLE PATTERN DOTS-2568 */ -#define XKB_KEY_braille_dots_12568 0x10028b3 /* U+28b3 BRAILLE PATTERN DOTS-12568 */ -#define XKB_KEY_braille_dots_3568 0x10028b4 /* U+28b4 BRAILLE PATTERN DOTS-3568 */ -#define XKB_KEY_braille_dots_13568 0x10028b5 /* U+28b5 BRAILLE PATTERN DOTS-13568 */ -#define XKB_KEY_braille_dots_23568 0x10028b6 /* U+28b6 BRAILLE PATTERN DOTS-23568 */ -#define XKB_KEY_braille_dots_123568 0x10028b7 /* U+28b7 BRAILLE PATTERN DOTS-123568 */ -#define XKB_KEY_braille_dots_4568 0x10028b8 /* U+28b8 BRAILLE PATTERN DOTS-4568 */ -#define XKB_KEY_braille_dots_14568 0x10028b9 /* U+28b9 BRAILLE PATTERN DOTS-14568 */ -#define XKB_KEY_braille_dots_24568 0x10028ba /* U+28ba BRAILLE PATTERN DOTS-24568 */ -#define XKB_KEY_braille_dots_124568 0x10028bb /* U+28bb BRAILLE PATTERN DOTS-124568 */ -#define XKB_KEY_braille_dots_34568 0x10028bc /* U+28bc BRAILLE PATTERN DOTS-34568 */ -#define XKB_KEY_braille_dots_134568 0x10028bd /* U+28bd BRAILLE PATTERN DOTS-134568 */ -#define XKB_KEY_braille_dots_234568 0x10028be /* U+28be BRAILLE PATTERN DOTS-234568 */ -#define XKB_KEY_braille_dots_1234568 0x10028bf /* U+28bf BRAILLE PATTERN DOTS-1234568 */ -#define XKB_KEY_braille_dots_78 0x10028c0 /* U+28c0 BRAILLE PATTERN DOTS-78 */ -#define XKB_KEY_braille_dots_178 0x10028c1 /* U+28c1 BRAILLE PATTERN DOTS-178 */ -#define XKB_KEY_braille_dots_278 0x10028c2 /* U+28c2 BRAILLE PATTERN DOTS-278 */ -#define XKB_KEY_braille_dots_1278 0x10028c3 /* U+28c3 BRAILLE PATTERN DOTS-1278 */ -#define XKB_KEY_braille_dots_378 0x10028c4 /* U+28c4 BRAILLE PATTERN DOTS-378 */ -#define XKB_KEY_braille_dots_1378 0x10028c5 /* U+28c5 BRAILLE PATTERN DOTS-1378 */ -#define XKB_KEY_braille_dots_2378 0x10028c6 /* U+28c6 BRAILLE PATTERN DOTS-2378 */ -#define XKB_KEY_braille_dots_12378 0x10028c7 /* U+28c7 BRAILLE PATTERN DOTS-12378 */ -#define XKB_KEY_braille_dots_478 0x10028c8 /* U+28c8 BRAILLE PATTERN DOTS-478 */ -#define XKB_KEY_braille_dots_1478 0x10028c9 /* U+28c9 BRAILLE PATTERN DOTS-1478 */ -#define XKB_KEY_braille_dots_2478 0x10028ca /* U+28ca BRAILLE PATTERN DOTS-2478 */ -#define XKB_KEY_braille_dots_12478 0x10028cb /* U+28cb BRAILLE PATTERN DOTS-12478 */ -#define XKB_KEY_braille_dots_3478 0x10028cc /* U+28cc BRAILLE PATTERN DOTS-3478 */ -#define XKB_KEY_braille_dots_13478 0x10028cd /* U+28cd BRAILLE PATTERN DOTS-13478 */ -#define XKB_KEY_braille_dots_23478 0x10028ce /* U+28ce BRAILLE PATTERN DOTS-23478 */ -#define XKB_KEY_braille_dots_123478 0x10028cf /* U+28cf BRAILLE PATTERN DOTS-123478 */ -#define XKB_KEY_braille_dots_578 0x10028d0 /* U+28d0 BRAILLE PATTERN DOTS-578 */ -#define XKB_KEY_braille_dots_1578 0x10028d1 /* U+28d1 BRAILLE PATTERN DOTS-1578 */ -#define XKB_KEY_braille_dots_2578 0x10028d2 /* U+28d2 BRAILLE PATTERN DOTS-2578 */ -#define XKB_KEY_braille_dots_12578 0x10028d3 /* U+28d3 BRAILLE PATTERN DOTS-12578 */ -#define XKB_KEY_braille_dots_3578 0x10028d4 /* U+28d4 BRAILLE PATTERN DOTS-3578 */ -#define XKB_KEY_braille_dots_13578 0x10028d5 /* U+28d5 BRAILLE PATTERN DOTS-13578 */ -#define XKB_KEY_braille_dots_23578 0x10028d6 /* U+28d6 BRAILLE PATTERN DOTS-23578 */ -#define XKB_KEY_braille_dots_123578 0x10028d7 /* U+28d7 BRAILLE PATTERN DOTS-123578 */ -#define XKB_KEY_braille_dots_4578 0x10028d8 /* U+28d8 BRAILLE PATTERN DOTS-4578 */ -#define XKB_KEY_braille_dots_14578 0x10028d9 /* U+28d9 BRAILLE PATTERN DOTS-14578 */ -#define XKB_KEY_braille_dots_24578 0x10028da /* U+28da BRAILLE PATTERN DOTS-24578 */ -#define XKB_KEY_braille_dots_124578 0x10028db /* U+28db BRAILLE PATTERN DOTS-124578 */ -#define XKB_KEY_braille_dots_34578 0x10028dc /* U+28dc BRAILLE PATTERN DOTS-34578 */ -#define XKB_KEY_braille_dots_134578 0x10028dd /* U+28dd BRAILLE PATTERN DOTS-134578 */ -#define XKB_KEY_braille_dots_234578 0x10028de /* U+28de BRAILLE PATTERN DOTS-234578 */ -#define XKB_KEY_braille_dots_1234578 0x10028df /* U+28df BRAILLE PATTERN DOTS-1234578 */ -#define XKB_KEY_braille_dots_678 0x10028e0 /* U+28e0 BRAILLE PATTERN DOTS-678 */ -#define XKB_KEY_braille_dots_1678 0x10028e1 /* U+28e1 BRAILLE PATTERN DOTS-1678 */ -#define XKB_KEY_braille_dots_2678 0x10028e2 /* U+28e2 BRAILLE PATTERN DOTS-2678 */ -#define XKB_KEY_braille_dots_12678 0x10028e3 /* U+28e3 BRAILLE PATTERN DOTS-12678 */ -#define XKB_KEY_braille_dots_3678 0x10028e4 /* U+28e4 BRAILLE PATTERN DOTS-3678 */ -#define XKB_KEY_braille_dots_13678 0x10028e5 /* U+28e5 BRAILLE PATTERN DOTS-13678 */ -#define XKB_KEY_braille_dots_23678 0x10028e6 /* U+28e6 BRAILLE PATTERN DOTS-23678 */ -#define XKB_KEY_braille_dots_123678 0x10028e7 /* U+28e7 BRAILLE PATTERN DOTS-123678 */ -#define XKB_KEY_braille_dots_4678 0x10028e8 /* U+28e8 BRAILLE PATTERN DOTS-4678 */ -#define XKB_KEY_braille_dots_14678 0x10028e9 /* U+28e9 BRAILLE PATTERN DOTS-14678 */ -#define XKB_KEY_braille_dots_24678 0x10028ea /* U+28ea BRAILLE PATTERN DOTS-24678 */ -#define XKB_KEY_braille_dots_124678 0x10028eb /* U+28eb BRAILLE PATTERN DOTS-124678 */ -#define XKB_KEY_braille_dots_34678 0x10028ec /* U+28ec BRAILLE PATTERN DOTS-34678 */ -#define XKB_KEY_braille_dots_134678 0x10028ed /* U+28ed BRAILLE PATTERN DOTS-134678 */ -#define XKB_KEY_braille_dots_234678 0x10028ee /* U+28ee BRAILLE PATTERN DOTS-234678 */ -#define XKB_KEY_braille_dots_1234678 0x10028ef /* U+28ef BRAILLE PATTERN DOTS-1234678 */ -#define XKB_KEY_braille_dots_5678 0x10028f0 /* U+28f0 BRAILLE PATTERN DOTS-5678 */ -#define XKB_KEY_braille_dots_15678 0x10028f1 /* U+28f1 BRAILLE PATTERN DOTS-15678 */ -#define XKB_KEY_braille_dots_25678 0x10028f2 /* U+28f2 BRAILLE PATTERN DOTS-25678 */ -#define XKB_KEY_braille_dots_125678 0x10028f3 /* U+28f3 BRAILLE PATTERN DOTS-125678 */ -#define XKB_KEY_braille_dots_35678 0x10028f4 /* U+28f4 BRAILLE PATTERN DOTS-35678 */ -#define XKB_KEY_braille_dots_135678 0x10028f5 /* U+28f5 BRAILLE PATTERN DOTS-135678 */ -#define XKB_KEY_braille_dots_235678 0x10028f6 /* U+28f6 BRAILLE PATTERN DOTS-235678 */ -#define XKB_KEY_braille_dots_1235678 0x10028f7 /* U+28f7 BRAILLE PATTERN DOTS-1235678 */ -#define XKB_KEY_braille_dots_45678 0x10028f8 /* U+28f8 BRAILLE PATTERN DOTS-45678 */ -#define XKB_KEY_braille_dots_145678 0x10028f9 /* U+28f9 BRAILLE PATTERN DOTS-145678 */ -#define XKB_KEY_braille_dots_245678 0x10028fa /* U+28fa BRAILLE PATTERN DOTS-245678 */ -#define XKB_KEY_braille_dots_1245678 0x10028fb /* U+28fb BRAILLE PATTERN DOTS-1245678 */ -#define XKB_KEY_braille_dots_345678 0x10028fc /* U+28fc BRAILLE PATTERN DOTS-345678 */ -#define XKB_KEY_braille_dots_1345678 0x10028fd /* U+28fd BRAILLE PATTERN DOTS-1345678 */ -#define XKB_KEY_braille_dots_2345678 0x10028fe /* U+28fe BRAILLE PATTERN DOTS-2345678 */ -#define XKB_KEY_braille_dots_12345678 0x10028ff /* U+28ff BRAILLE PATTERN DOTS-12345678 */ - -/* - * Sinhala (http://unicode.org/charts/PDF/U0D80.pdf) - * http://www.nongnu.org/sinhala/doc/transliteration/sinhala-transliteration_6.html - */ - -#define XKB_KEY_Sinh_ng 0x1000d82 /* U+0D82 SINHALA ANUSVARAYA */ -#define XKB_KEY_Sinh_h2 0x1000d83 /* U+0D83 SINHALA VISARGAYA */ -#define XKB_KEY_Sinh_a 0x1000d85 /* U+0D85 SINHALA AYANNA */ -#define XKB_KEY_Sinh_aa 0x1000d86 /* U+0D86 SINHALA AAYANNA */ -#define XKB_KEY_Sinh_ae 0x1000d87 /* U+0D87 SINHALA AEYANNA */ -#define XKB_KEY_Sinh_aee 0x1000d88 /* U+0D88 SINHALA AEEYANNA */ -#define XKB_KEY_Sinh_i 0x1000d89 /* U+0D89 SINHALA IYANNA */ -#define XKB_KEY_Sinh_ii 0x1000d8a /* U+0D8A SINHALA IIYANNA */ -#define XKB_KEY_Sinh_u 0x1000d8b /* U+0D8B SINHALA UYANNA */ -#define XKB_KEY_Sinh_uu 0x1000d8c /* U+0D8C SINHALA UUYANNA */ -#define XKB_KEY_Sinh_ri 0x1000d8d /* U+0D8D SINHALA IRUYANNA */ -#define XKB_KEY_Sinh_rii 0x1000d8e /* U+0D8E SINHALA IRUUYANNA */ -#define XKB_KEY_Sinh_lu 0x1000d8f /* U+0D8F SINHALA ILUYANNA */ -#define XKB_KEY_Sinh_luu 0x1000d90 /* U+0D90 SINHALA ILUUYANNA */ -#define XKB_KEY_Sinh_e 0x1000d91 /* U+0D91 SINHALA EYANNA */ -#define XKB_KEY_Sinh_ee 0x1000d92 /* U+0D92 SINHALA EEYANNA */ -#define XKB_KEY_Sinh_ai 0x1000d93 /* U+0D93 SINHALA AIYANNA */ -#define XKB_KEY_Sinh_o 0x1000d94 /* U+0D94 SINHALA OYANNA */ -#define XKB_KEY_Sinh_oo 0x1000d95 /* U+0D95 SINHALA OOYANNA */ -#define XKB_KEY_Sinh_au 0x1000d96 /* U+0D96 SINHALA AUYANNA */ -#define XKB_KEY_Sinh_ka 0x1000d9a /* U+0D9A SINHALA KAYANNA */ -#define XKB_KEY_Sinh_kha 0x1000d9b /* U+0D9B SINHALA MAHA. KAYANNA */ -#define XKB_KEY_Sinh_ga 0x1000d9c /* U+0D9C SINHALA GAYANNA */ -#define XKB_KEY_Sinh_gha 0x1000d9d /* U+0D9D SINHALA MAHA. GAYANNA */ -#define XKB_KEY_Sinh_ng2 0x1000d9e /* U+0D9E SINHALA KANTAJA NAASIKYAYA */ -#define XKB_KEY_Sinh_nga 0x1000d9f /* U+0D9F SINHALA SANYAKA GAYANNA */ -#define XKB_KEY_Sinh_ca 0x1000da0 /* U+0DA0 SINHALA CAYANNA */ -#define XKB_KEY_Sinh_cha 0x1000da1 /* U+0DA1 SINHALA MAHA. CAYANNA */ -#define XKB_KEY_Sinh_ja 0x1000da2 /* U+0DA2 SINHALA JAYANNA */ -#define XKB_KEY_Sinh_jha 0x1000da3 /* U+0DA3 SINHALA MAHA. JAYANNA */ -#define XKB_KEY_Sinh_nya 0x1000da4 /* U+0DA4 SINHALA TAALUJA NAASIKYAYA */ -#define XKB_KEY_Sinh_jnya 0x1000da5 /* U+0DA5 SINHALA TAALUJA SANYOOGA NAASIKYAYA */ -#define XKB_KEY_Sinh_nja 0x1000da6 /* U+0DA6 SINHALA SANYAKA JAYANNA */ -#define XKB_KEY_Sinh_tta 0x1000da7 /* U+0DA7 SINHALA TTAYANNA */ -#define XKB_KEY_Sinh_ttha 0x1000da8 /* U+0DA8 SINHALA MAHA. TTAYANNA */ -#define XKB_KEY_Sinh_dda 0x1000da9 /* U+0DA9 SINHALA DDAYANNA */ -#define XKB_KEY_Sinh_ddha 0x1000daa /* U+0DAA SINHALA MAHA. DDAYANNA */ -#define XKB_KEY_Sinh_nna 0x1000dab /* U+0DAB SINHALA MUURDHAJA NAYANNA */ -#define XKB_KEY_Sinh_ndda 0x1000dac /* U+0DAC SINHALA SANYAKA DDAYANNA */ -#define XKB_KEY_Sinh_tha 0x1000dad /* U+0DAD SINHALA TAYANNA */ -#define XKB_KEY_Sinh_thha 0x1000dae /* U+0DAE SINHALA MAHA. TAYANNA */ -#define XKB_KEY_Sinh_dha 0x1000daf /* U+0DAF SINHALA DAYANNA */ -#define XKB_KEY_Sinh_dhha 0x1000db0 /* U+0DB0 SINHALA MAHA. DAYANNA */ -#define XKB_KEY_Sinh_na 0x1000db1 /* U+0DB1 SINHALA DANTAJA NAYANNA */ -#define XKB_KEY_Sinh_ndha 0x1000db3 /* U+0DB3 SINHALA SANYAKA DAYANNA */ -#define XKB_KEY_Sinh_pa 0x1000db4 /* U+0DB4 SINHALA PAYANNA */ -#define XKB_KEY_Sinh_pha 0x1000db5 /* U+0DB5 SINHALA MAHA. PAYANNA */ -#define XKB_KEY_Sinh_ba 0x1000db6 /* U+0DB6 SINHALA BAYANNA */ -#define XKB_KEY_Sinh_bha 0x1000db7 /* U+0DB7 SINHALA MAHA. BAYANNA */ -#define XKB_KEY_Sinh_ma 0x1000db8 /* U+0DB8 SINHALA MAYANNA */ -#define XKB_KEY_Sinh_mba 0x1000db9 /* U+0DB9 SINHALA AMBA BAYANNA */ -#define XKB_KEY_Sinh_ya 0x1000dba /* U+0DBA SINHALA YAYANNA */ -#define XKB_KEY_Sinh_ra 0x1000dbb /* U+0DBB SINHALA RAYANNA */ -#define XKB_KEY_Sinh_la 0x1000dbd /* U+0DBD SINHALA DANTAJA LAYANNA */ -#define XKB_KEY_Sinh_va 0x1000dc0 /* U+0DC0 SINHALA VAYANNA */ -#define XKB_KEY_Sinh_sha 0x1000dc1 /* U+0DC1 SINHALA TAALUJA SAYANNA */ -#define XKB_KEY_Sinh_ssha 0x1000dc2 /* U+0DC2 SINHALA MUURDHAJA SAYANNA */ -#define XKB_KEY_Sinh_sa 0x1000dc3 /* U+0DC3 SINHALA DANTAJA SAYANNA */ -#define XKB_KEY_Sinh_ha 0x1000dc4 /* U+0DC4 SINHALA HAYANNA */ -#define XKB_KEY_Sinh_lla 0x1000dc5 /* U+0DC5 SINHALA MUURDHAJA LAYANNA */ -#define XKB_KEY_Sinh_fa 0x1000dc6 /* U+0DC6 SINHALA FAYANNA */ -#define XKB_KEY_Sinh_al 0x1000dca /* U+0DCA SINHALA AL-LAKUNA */ -#define XKB_KEY_Sinh_aa2 0x1000dcf /* U+0DCF SINHALA AELA-PILLA */ -#define XKB_KEY_Sinh_ae2 0x1000dd0 /* U+0DD0 SINHALA AEDA-PILLA */ -#define XKB_KEY_Sinh_aee2 0x1000dd1 /* U+0DD1 SINHALA DIGA AEDA-PILLA */ -#define XKB_KEY_Sinh_i2 0x1000dd2 /* U+0DD2 SINHALA IS-PILLA */ -#define XKB_KEY_Sinh_ii2 0x1000dd3 /* U+0DD3 SINHALA DIGA IS-PILLA */ -#define XKB_KEY_Sinh_u2 0x1000dd4 /* U+0DD4 SINHALA PAA-PILLA */ -#define XKB_KEY_Sinh_uu2 0x1000dd6 /* U+0DD6 SINHALA DIGA PAA-PILLA */ -#define XKB_KEY_Sinh_ru2 0x1000dd8 /* U+0DD8 SINHALA GAETTA-PILLA */ -#define XKB_KEY_Sinh_e2 0x1000dd9 /* U+0DD9 SINHALA KOMBUVA */ -#define XKB_KEY_Sinh_ee2 0x1000dda /* U+0DDA SINHALA DIGA KOMBUVA */ -#define XKB_KEY_Sinh_ai2 0x1000ddb /* U+0DDB SINHALA KOMBU DEKA */ -#define XKB_KEY_Sinh_o2 0x1000ddc /* U+0DDC SINHALA KOMBUVA HAA AELA-PILLA*/ -#define XKB_KEY_Sinh_oo2 0x1000ddd /* U+0DDD SINHALA KOMBUVA HAA DIGA AELA-PILLA*/ -#define XKB_KEY_Sinh_au2 0x1000dde /* U+0DDE SINHALA KOMBUVA HAA GAYANUKITTA */ -#define XKB_KEY_Sinh_lu2 0x1000ddf /* U+0DDF SINHALA GAYANUKITTA */ -#define XKB_KEY_Sinh_ruu2 0x1000df2 /* U+0DF2 SINHALA DIGA GAETTA-PILLA */ -#define XKB_KEY_Sinh_luu2 0x1000df3 /* U+0DF3 SINHALA DIGA GAYANUKITTA */ -#define XKB_KEY_Sinh_kunddaliya 0x1000df4 /* U+0DF4 SINHALA KUNDDALIYA */ -/* - * XFree86 vendor specific keysyms. - * - * The XFree86 keysym range is 0x10080001 - 0x1008FFFF. - * - * When adding new entries, the xc/lib/XKeysymDB file should also be - * updated to make the new entries visible to Xlib. - */ - -/* - * ModeLock - * - * This one is old, and not really used any more since XKB offers this - * functionality. - */ - -#define XKB_KEY_XF86ModeLock 0x1008FF01 /* Mode Switch Lock */ - -/* - * Note, 0x1008FF07 - 0x1008FF0F are free and should be used for misc new - * keysyms that don't fit into any of the groups below. - * - * 0x1008FF64, 0x1008FF6F, 0x1008FF71, 0x1008FF83 are no longer used, - * and should be used first for new keysyms. - * - * Check in keysymdef.h for generic symbols before adding new XFree86-specific - * symbols here. - * - * X.Org will not be adding to the XF86 set of keysyms, though they have - * been adopted and are considered a "standard" part of X keysym definitions. - * XFree86 never properly commented these keysyms, so we have done our - * best to explain the semantic meaning of these keys. - * - * XFree86 has removed their mail archives of the period, that might have - * shed more light on some of these definitions. Until/unless we resurrect - * these archives, these are from memory and usage. - */ - - -/* Backlight controls. */ -#define XKB_KEY_XF86MonBrightnessUp 0x1008FF02 /* Monitor/panel brightness */ -#define XKB_KEY_XF86MonBrightnessDown 0x1008FF03 /* Monitor/panel brightness */ -#define XKB_KEY_XF86KbdLightOnOff 0x1008FF04 /* Keyboards may be lit */ -#define XKB_KEY_XF86KbdBrightnessUp 0x1008FF05 /* Keyboards may be lit */ -#define XKB_KEY_XF86KbdBrightnessDown 0x1008FF06 /* Keyboards may be lit */ - -/* - * Keys found on some "Internet" keyboards. - */ -#define XKB_KEY_XF86Standby 0x1008FF10 /* System into standby mode */ -#define XKB_KEY_XF86AudioLowerVolume 0x1008FF11 /* Volume control down */ -#define XKB_KEY_XF86AudioMute 0x1008FF12 /* Mute sound from the system */ -#define XKB_KEY_XF86AudioRaiseVolume 0x1008FF13 /* Volume control up */ -#define XKB_KEY_XF86AudioPlay 0x1008FF14 /* Start playing of audio > */ -#define XKB_KEY_XF86AudioStop 0x1008FF15 /* Stop playing audio */ -#define XKB_KEY_XF86AudioPrev 0x1008FF16 /* Previous track */ -#define XKB_KEY_XF86AudioNext 0x1008FF17 /* Next track */ -#define XKB_KEY_XF86HomePage 0x1008FF18 /* Display user's home page */ -#define XKB_KEY_XF86Mail 0x1008FF19 /* Invoke user's mail program */ -#define XKB_KEY_XF86Start 0x1008FF1A /* Start application */ -#define XKB_KEY_XF86Search 0x1008FF1B /* Search */ -#define XKB_KEY_XF86AudioRecord 0x1008FF1C /* Record audio application */ - -/* These are sometimes found on PDA's (e.g. Palm, PocketPC or elsewhere) */ -#define XKB_KEY_XF86Calculator 0x1008FF1D /* Invoke calculator program */ -#define XKB_KEY_XF86Memo 0x1008FF1E /* Invoke Memo taking program */ -#define XKB_KEY_XF86ToDoList 0x1008FF1F /* Invoke To Do List program */ -#define XKB_KEY_XF86Calendar 0x1008FF20 /* Invoke Calendar program */ -#define XKB_KEY_XF86PowerDown 0x1008FF21 /* Deep sleep the system */ -#define XKB_KEY_XF86ContrastAdjust 0x1008FF22 /* Adjust screen contrast */ -#define XKB_KEY_XF86RockerUp 0x1008FF23 /* Rocker switches exist up */ -#define XKB_KEY_XF86RockerDown 0x1008FF24 /* and down */ -#define XKB_KEY_XF86RockerEnter 0x1008FF25 /* and let you press them */ - -/* Some more "Internet" keyboard symbols */ -#define XKB_KEY_XF86Back 0x1008FF26 /* Like back on a browser */ -#define XKB_KEY_XF86Forward 0x1008FF27 /* Like forward on a browser */ -#define XKB_KEY_XF86Stop 0x1008FF28 /* Stop current operation */ -#define XKB_KEY_XF86Refresh 0x1008FF29 /* Refresh the page */ -#define XKB_KEY_XF86PowerOff 0x1008FF2A /* Power off system entirely */ -#define XKB_KEY_XF86WakeUp 0x1008FF2B /* Wake up system from sleep */ -#define XKB_KEY_XF86Eject 0x1008FF2C /* Eject device (e.g. DVD) */ -#define XKB_KEY_XF86ScreenSaver 0x1008FF2D /* Invoke screensaver */ -#define XKB_KEY_XF86WWW 0x1008FF2E /* Invoke web browser */ -#define XKB_KEY_XF86Sleep 0x1008FF2F /* Put system to sleep */ -#define XKB_KEY_XF86Favorites 0x1008FF30 /* Show favorite locations */ -#define XKB_KEY_XF86AudioPause 0x1008FF31 /* Pause audio playing */ -#define XKB_KEY_XF86AudioMedia 0x1008FF32 /* Launch media collection app */ -#define XKB_KEY_XF86MyComputer 0x1008FF33 /* Display "My Computer" window */ -#define XKB_KEY_XF86VendorHome 0x1008FF34 /* Display vendor home web site */ -#define XKB_KEY_XF86LightBulb 0x1008FF35 /* Light bulb keys exist */ -#define XKB_KEY_XF86Shop 0x1008FF36 /* Display shopping web site */ -#define XKB_KEY_XF86History 0x1008FF37 /* Show history of web surfing */ -#define XKB_KEY_XF86OpenURL 0x1008FF38 /* Open selected URL */ -#define XKB_KEY_XF86AddFavorite 0x1008FF39 /* Add URL to favorites list */ -#define XKB_KEY_XF86HotLinks 0x1008FF3A /* Show "hot" links */ -#define XKB_KEY_XF86BrightnessAdjust 0x1008FF3B /* Invoke brightness adj. UI */ -#define XKB_KEY_XF86Finance 0x1008FF3C /* Display financial site */ -#define XKB_KEY_XF86Community 0x1008FF3D /* Display user's community */ -#define XKB_KEY_XF86AudioRewind 0x1008FF3E /* "rewind" audio track */ -#define XKB_KEY_XF86BackForward 0x1008FF3F /* ??? */ -#define XKB_KEY_XF86Launch0 0x1008FF40 /* Launch Application */ -#define XKB_KEY_XF86Launch1 0x1008FF41 /* Launch Application */ -#define XKB_KEY_XF86Launch2 0x1008FF42 /* Launch Application */ -#define XKB_KEY_XF86Launch3 0x1008FF43 /* Launch Application */ -#define XKB_KEY_XF86Launch4 0x1008FF44 /* Launch Application */ -#define XKB_KEY_XF86Launch5 0x1008FF45 /* Launch Application */ -#define XKB_KEY_XF86Launch6 0x1008FF46 /* Launch Application */ -#define XKB_KEY_XF86Launch7 0x1008FF47 /* Launch Application */ -#define XKB_KEY_XF86Launch8 0x1008FF48 /* Launch Application */ -#define XKB_KEY_XF86Launch9 0x1008FF49 /* Launch Application */ -#define XKB_KEY_XF86LaunchA 0x1008FF4A /* Launch Application */ -#define XKB_KEY_XF86LaunchB 0x1008FF4B /* Launch Application */ -#define XKB_KEY_XF86LaunchC 0x1008FF4C /* Launch Application */ -#define XKB_KEY_XF86LaunchD 0x1008FF4D /* Launch Application */ -#define XKB_KEY_XF86LaunchE 0x1008FF4E /* Launch Application */ -#define XKB_KEY_XF86LaunchF 0x1008FF4F /* Launch Application */ - -#define XKB_KEY_XF86ApplicationLeft 0x1008FF50 /* switch to application, left */ -#define XKB_KEY_XF86ApplicationRight 0x1008FF51 /* switch to application, right*/ -#define XKB_KEY_XF86Book 0x1008FF52 /* Launch bookreader */ -#define XKB_KEY_XF86CD 0x1008FF53 /* Launch CD/DVD player */ -#define XKB_KEY_XF86Calculater 0x1008FF54 /* Launch Calculater */ -#define XKB_KEY_XF86Clear 0x1008FF55 /* Clear window, screen */ -#define XKB_KEY_XF86Close 0x1008FF56 /* Close window */ -#define XKB_KEY_XF86Copy 0x1008FF57 /* Copy selection */ -#define XKB_KEY_XF86Cut 0x1008FF58 /* Cut selection */ -#define XKB_KEY_XF86Display 0x1008FF59 /* Output switch key */ -#define XKB_KEY_XF86DOS 0x1008FF5A /* Launch DOS (emulation) */ -#define XKB_KEY_XF86Documents 0x1008FF5B /* Open documents window */ -#define XKB_KEY_XF86Excel 0x1008FF5C /* Launch spread sheet */ -#define XKB_KEY_XF86Explorer 0x1008FF5D /* Launch file explorer */ -#define XKB_KEY_XF86Game 0x1008FF5E /* Launch game */ -#define XKB_KEY_XF86Go 0x1008FF5F /* Go to URL */ -#define XKB_KEY_XF86iTouch 0x1008FF60 /* Logitch iTouch- don't use */ -#define XKB_KEY_XF86LogOff 0x1008FF61 /* Log off system */ -#define XKB_KEY_XF86Market 0x1008FF62 /* ?? */ -#define XKB_KEY_XF86Meeting 0x1008FF63 /* enter meeting in calendar */ -#define XKB_KEY_XF86MenuKB 0x1008FF65 /* distingush keyboard from PB */ -#define XKB_KEY_XF86MenuPB 0x1008FF66 /* distinuish PB from keyboard */ -#define XKB_KEY_XF86MySites 0x1008FF67 /* Favourites */ -#define XKB_KEY_XF86New 0x1008FF68 /* New (folder, document... */ -#define XKB_KEY_XF86News 0x1008FF69 /* News */ -#define XKB_KEY_XF86OfficeHome 0x1008FF6A /* Office home (old Staroffice)*/ -#define XKB_KEY_XF86Open 0x1008FF6B /* Open */ -#define XKB_KEY_XF86Option 0x1008FF6C /* ?? */ -#define XKB_KEY_XF86Paste 0x1008FF6D /* Paste */ -#define XKB_KEY_XF86Phone 0x1008FF6E /* Launch phone; dial number */ -#define XKB_KEY_XF86Q 0x1008FF70 /* Compaq's Q - don't use */ -#define XKB_KEY_XF86Reply 0x1008FF72 /* Reply e.g., mail */ -#define XKB_KEY_XF86Reload 0x1008FF73 /* Reload web page, file, etc. */ -#define XKB_KEY_XF86RotateWindows 0x1008FF74 /* Rotate windows e.g. xrandr */ -#define XKB_KEY_XF86RotationPB 0x1008FF75 /* don't use */ -#define XKB_KEY_XF86RotationKB 0x1008FF76 /* don't use */ -#define XKB_KEY_XF86Save 0x1008FF77 /* Save (file, document, state */ -#define XKB_KEY_XF86ScrollUp 0x1008FF78 /* Scroll window/contents up */ -#define XKB_KEY_XF86ScrollDown 0x1008FF79 /* Scrool window/contentd down */ -#define XKB_KEY_XF86ScrollClick 0x1008FF7A /* Use XKB mousekeys instead */ -#define XKB_KEY_XF86Send 0x1008FF7B /* Send mail, file, object */ -#define XKB_KEY_XF86Spell 0x1008FF7C /* Spell checker */ -#define XKB_KEY_XF86SplitScreen 0x1008FF7D /* Split window or screen */ -#define XKB_KEY_XF86Support 0x1008FF7E /* Get support (??) */ -#define XKB_KEY_XF86TaskPane 0x1008FF7F /* Show tasks */ -#define XKB_KEY_XF86Terminal 0x1008FF80 /* Launch terminal emulator */ -#define XKB_KEY_XF86Tools 0x1008FF81 /* toolbox of desktop/app. */ -#define XKB_KEY_XF86Travel 0x1008FF82 /* ?? */ -#define XKB_KEY_XF86UserPB 0x1008FF84 /* ?? */ -#define XKB_KEY_XF86User1KB 0x1008FF85 /* ?? */ -#define XKB_KEY_XF86User2KB 0x1008FF86 /* ?? */ -#define XKB_KEY_XF86Video 0x1008FF87 /* Launch video player */ -#define XKB_KEY_XF86WheelButton 0x1008FF88 /* button from a mouse wheel */ -#define XKB_KEY_XF86Word 0x1008FF89 /* Launch word processor */ -#define XKB_KEY_XF86Xfer 0x1008FF8A -#define XKB_KEY_XF86ZoomIn 0x1008FF8B /* zoom in view, map, etc. */ -#define XKB_KEY_XF86ZoomOut 0x1008FF8C /* zoom out view, map, etc. */ - -#define XKB_KEY_XF86Away 0x1008FF8D /* mark yourself as away */ -#define XKB_KEY_XF86Messenger 0x1008FF8E /* as in instant messaging */ -#define XKB_KEY_XF86WebCam 0x1008FF8F /* Launch web camera app. */ -#define XKB_KEY_XF86MailForward 0x1008FF90 /* Forward in mail */ -#define XKB_KEY_XF86Pictures 0x1008FF91 /* Show pictures */ -#define XKB_KEY_XF86Music 0x1008FF92 /* Launch music application */ - -#define XKB_KEY_XF86Battery 0x1008FF93 /* Display battery information */ -#define XKB_KEY_XF86Bluetooth 0x1008FF94 /* Enable/disable Bluetooth */ -#define XKB_KEY_XF86WLAN 0x1008FF95 /* Enable/disable WLAN */ -#define XKB_KEY_XF86UWB 0x1008FF96 /* Enable/disable UWB */ - -#define XKB_KEY_XF86AudioForward 0x1008FF97 /* fast-forward audio track */ -#define XKB_KEY_XF86AudioRepeat 0x1008FF98 /* toggle repeat mode */ -#define XKB_KEY_XF86AudioRandomPlay 0x1008FF99 /* toggle shuffle mode */ -#define XKB_KEY_XF86Subtitle 0x1008FF9A /* cycle through subtitle */ -#define XKB_KEY_XF86AudioCycleTrack 0x1008FF9B /* cycle through audio tracks */ -#define XKB_KEY_XF86CycleAngle 0x1008FF9C /* cycle through angles */ -#define XKB_KEY_XF86FrameBack 0x1008FF9D /* video: go one frame back */ -#define XKB_KEY_XF86FrameForward 0x1008FF9E /* video: go one frame forward */ -#define XKB_KEY_XF86Time 0x1008FF9F /* display, or shows an entry for time seeking */ -#define XKB_KEY_XF86Select 0x1008FFA0 /* Select button on joypads and remotes */ -#define XKB_KEY_XF86View 0x1008FFA1 /* Show a view options/properties */ -#define XKB_KEY_XF86TopMenu 0x1008FFA2 /* Go to a top-level menu in a video */ - -#define XKB_KEY_XF86Red 0x1008FFA3 /* Red button */ -#define XKB_KEY_XF86Green 0x1008FFA4 /* Green button */ -#define XKB_KEY_XF86Yellow 0x1008FFA5 /* Yellow button */ -#define XKB_KEY_XF86Blue 0x1008FFA6 /* Blue button */ - -#define XKB_KEY_XF86Suspend 0x1008FFA7 /* Sleep to RAM */ -#define XKB_KEY_XF86Hibernate 0x1008FFA8 /* Sleep to disk */ -#define XKB_KEY_XF86TouchpadToggle 0x1008FFA9 /* Toggle between touchpad/trackstick */ -#define XKB_KEY_XF86TouchpadOn 0x1008FFB0 /* The touchpad got switched on */ -#define XKB_KEY_XF86TouchpadOff 0x1008FFB1 /* The touchpad got switched off */ - -#define XKB_KEY_XF86AudioMicMute 0x1008FFB2 /* Mute the Mic from the system */ - -/* Keys for special action keys (hot keys) */ -/* Virtual terminals on some operating systems */ -#define XKB_KEY_XF86Switch_VT_1 0x1008FE01 -#define XKB_KEY_XF86Switch_VT_2 0x1008FE02 -#define XKB_KEY_XF86Switch_VT_3 0x1008FE03 -#define XKB_KEY_XF86Switch_VT_4 0x1008FE04 -#define XKB_KEY_XF86Switch_VT_5 0x1008FE05 -#define XKB_KEY_XF86Switch_VT_6 0x1008FE06 -#define XKB_KEY_XF86Switch_VT_7 0x1008FE07 -#define XKB_KEY_XF86Switch_VT_8 0x1008FE08 -#define XKB_KEY_XF86Switch_VT_9 0x1008FE09 -#define XKB_KEY_XF86Switch_VT_10 0x1008FE0A -#define XKB_KEY_XF86Switch_VT_11 0x1008FE0B -#define XKB_KEY_XF86Switch_VT_12 0x1008FE0C - -#define XKB_KEY_XF86Ungrab 0x1008FE20 /* force ungrab */ -#define XKB_KEY_XF86ClearGrab 0x1008FE21 /* kill application with grab */ -#define XKB_KEY_XF86Next_VMode 0x1008FE22 /* next video mode available */ -#define XKB_KEY_XF86Prev_VMode 0x1008FE23 /* prev. video mode available */ -#define XKB_KEY_XF86LogWindowTree 0x1008FE24 /* print window tree to log */ -#define XKB_KEY_XF86LogGrabInfo 0x1008FE25 /* print all active grabs to log */ -/* - * Copyright (c) 1991, Oracle and/or its affiliates. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -/************************************************************ - -Copyright 1991, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - -***********************************************************/ - -/* - * Floating Accent - */ - -#define XKB_KEY_SunFA_Grave 0x1005FF00 -#define XKB_KEY_SunFA_Circum 0x1005FF01 -#define XKB_KEY_SunFA_Tilde 0x1005FF02 -#define XKB_KEY_SunFA_Acute 0x1005FF03 -#define XKB_KEY_SunFA_Diaeresis 0x1005FF04 -#define XKB_KEY_SunFA_Cedilla 0x1005FF05 - -/* - * Miscellaneous Functions - */ - -#define XKB_KEY_SunF36 0x1005FF10 /* Labeled F11 */ -#define XKB_KEY_SunF37 0x1005FF11 /* Labeled F12 */ - -#define XKB_KEY_SunSys_Req 0x1005FF60 -#define XKB_KEY_SunPrint_Screen 0x0000FF61 /* Same as XK_Print */ - -/* - * International & Multi-Key Character Composition - */ - -#define XKB_KEY_SunCompose 0x0000FF20 /* Same as XK_Multi_key */ -#define XKB_KEY_SunAltGraph 0x0000FF7E /* Same as XK_Mode_switch */ - -/* - * Cursor Control - */ - -#define XKB_KEY_SunPageUp 0x0000FF55 /* Same as XK_Prior */ -#define XKB_KEY_SunPageDown 0x0000FF56 /* Same as XK_Next */ - -/* - * Open Look Functions - */ - -#define XKB_KEY_SunUndo 0x0000FF65 /* Same as XK_Undo */ -#define XKB_KEY_SunAgain 0x0000FF66 /* Same as XK_Redo */ -#define XKB_KEY_SunFind 0x0000FF68 /* Same as XK_Find */ -#define XKB_KEY_SunStop 0x0000FF69 /* Same as XK_Cancel */ -#define XKB_KEY_SunProps 0x1005FF70 -#define XKB_KEY_SunFront 0x1005FF71 -#define XKB_KEY_SunCopy 0x1005FF72 -#define XKB_KEY_SunOpen 0x1005FF73 -#define XKB_KEY_SunPaste 0x1005FF74 -#define XKB_KEY_SunCut 0x1005FF75 - -#define XKB_KEY_SunPowerSwitch 0x1005FF76 -#define XKB_KEY_SunAudioLowerVolume 0x1005FF77 -#define XKB_KEY_SunAudioMute 0x1005FF78 -#define XKB_KEY_SunAudioRaiseVolume 0x1005FF79 -#define XKB_KEY_SunVideoDegauss 0x1005FF7A -#define XKB_KEY_SunVideoLowerBrightness 0x1005FF7B -#define XKB_KEY_SunVideoRaiseBrightness 0x1005FF7C -#define XKB_KEY_SunPowerSwitchShift 0x1005FF7D -/*********************************************************** - -Copyright 1988, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - - -Copyright 1988 by Digital Equipment Corporation, Maynard, Massachusetts. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Digital not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -******************************************************************/ - -/* - * DEC private keysyms - * (29th bit set) - */ - -/* two-key compose sequence initiators, chosen to map to Latin1 characters */ - -#define XKB_KEY_Dring_accent 0x1000FEB0 -#define XKB_KEY_Dcircumflex_accent 0x1000FE5E -#define XKB_KEY_Dcedilla_accent 0x1000FE2C -#define XKB_KEY_Dacute_accent 0x1000FE27 -#define XKB_KEY_Dgrave_accent 0x1000FE60 -#define XKB_KEY_Dtilde 0x1000FE7E -#define XKB_KEY_Ddiaeresis 0x1000FE22 - -/* special keysym for LK2** "Remove" key on editing keypad */ - -#define XKB_KEY_DRemove 0x1000FF00 /* Remove */ -/* - -Copyright 1987, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall -not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization -from The Open Group. - -Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the names of Hewlett Packard -or Digital not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -HEWLETT-PACKARD MAKES NO WARRANTY OF ANY KIND WITH REGARD -TO THIS SOFWARE, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. Hewlett-Packard shall not be liable for errors -contained herein or direct, indirect, special, incidental or -consequential damages in connection with the furnishing, -performance, or use of this material. - -*/ - - - -#define XKB_KEY_hpClearLine 0x1000FF6F -#define XKB_KEY_hpInsertLine 0x1000FF70 -#define XKB_KEY_hpDeleteLine 0x1000FF71 -#define XKB_KEY_hpInsertChar 0x1000FF72 -#define XKB_KEY_hpDeleteChar 0x1000FF73 -#define XKB_KEY_hpBackTab 0x1000FF74 -#define XKB_KEY_hpKP_BackTab 0x1000FF75 -#define XKB_KEY_hpModelock1 0x1000FF48 -#define XKB_KEY_hpModelock2 0x1000FF49 -#define XKB_KEY_hpReset 0x1000FF6C -#define XKB_KEY_hpSystem 0x1000FF6D -#define XKB_KEY_hpUser 0x1000FF6E -#define XKB_KEY_hpmute_acute 0x100000A8 -#define XKB_KEY_hpmute_grave 0x100000A9 -#define XKB_KEY_hpmute_asciicircum 0x100000AA -#define XKB_KEY_hpmute_diaeresis 0x100000AB -#define XKB_KEY_hpmute_asciitilde 0x100000AC -#define XKB_KEY_hplira 0x100000AF -#define XKB_KEY_hpguilder 0x100000BE -#define XKB_KEY_hpYdiaeresis 0x100000EE -#define XKB_KEY_hpIO 0x100000EE -#define XKB_KEY_hplongminus 0x100000F6 -#define XKB_KEY_hpblock 0x100000FC - - - -#define XKB_KEY_osfCopy 0x1004FF02 -#define XKB_KEY_osfCut 0x1004FF03 -#define XKB_KEY_osfPaste 0x1004FF04 -#define XKB_KEY_osfBackTab 0x1004FF07 -#define XKB_KEY_osfBackSpace 0x1004FF08 -#define XKB_KEY_osfClear 0x1004FF0B -#define XKB_KEY_osfEscape 0x1004FF1B -#define XKB_KEY_osfAddMode 0x1004FF31 -#define XKB_KEY_osfPrimaryPaste 0x1004FF32 -#define XKB_KEY_osfQuickPaste 0x1004FF33 -#define XKB_KEY_osfPageLeft 0x1004FF40 -#define XKB_KEY_osfPageUp 0x1004FF41 -#define XKB_KEY_osfPageDown 0x1004FF42 -#define XKB_KEY_osfPageRight 0x1004FF43 -#define XKB_KEY_osfActivate 0x1004FF44 -#define XKB_KEY_osfMenuBar 0x1004FF45 -#define XKB_KEY_osfLeft 0x1004FF51 -#define XKB_KEY_osfUp 0x1004FF52 -#define XKB_KEY_osfRight 0x1004FF53 -#define XKB_KEY_osfDown 0x1004FF54 -#define XKB_KEY_osfEndLine 0x1004FF57 -#define XKB_KEY_osfBeginLine 0x1004FF58 -#define XKB_KEY_osfEndData 0x1004FF59 -#define XKB_KEY_osfBeginData 0x1004FF5A -#define XKB_KEY_osfPrevMenu 0x1004FF5B -#define XKB_KEY_osfNextMenu 0x1004FF5C -#define XKB_KEY_osfPrevField 0x1004FF5D -#define XKB_KEY_osfNextField 0x1004FF5E -#define XKB_KEY_osfSelect 0x1004FF60 -#define XKB_KEY_osfInsert 0x1004FF63 -#define XKB_KEY_osfUndo 0x1004FF65 -#define XKB_KEY_osfMenu 0x1004FF67 -#define XKB_KEY_osfCancel 0x1004FF69 -#define XKB_KEY_osfHelp 0x1004FF6A -#define XKB_KEY_osfSelectAll 0x1004FF71 -#define XKB_KEY_osfDeselectAll 0x1004FF72 -#define XKB_KEY_osfReselect 0x1004FF73 -#define XKB_KEY_osfExtend 0x1004FF74 -#define XKB_KEY_osfRestore 0x1004FF78 -#define XKB_KEY_osfDelete 0x1004FFFF - - - -/************************************************************** - * The use of the following macros is deprecated. - * They are listed below only for backwards compatibility. - */ -#define XKB_KEY_Reset 0x1000FF6C -#define XKB_KEY_System 0x1000FF6D -#define XKB_KEY_User 0x1000FF6E -#define XKB_KEY_ClearLine 0x1000FF6F -#define XKB_KEY_InsertLine 0x1000FF70 -#define XKB_KEY_DeleteLine 0x1000FF71 -#define XKB_KEY_InsertChar 0x1000FF72 -#define XKB_KEY_DeleteChar 0x1000FF73 -#define XKB_KEY_BackTab 0x1000FF74 -#define XKB_KEY_KP_BackTab 0x1000FF75 -#define XKB_KEY_Ext16bit_L 0x1000FF76 -#define XKB_KEY_Ext16bit_R 0x1000FF77 -#define XKB_KEY_mute_acute 0x100000a8 -#define XKB_KEY_mute_grave 0x100000a9 -#define XKB_KEY_mute_asciicircum 0x100000aa -#define XKB_KEY_mute_diaeresis 0x100000ab -#define XKB_KEY_mute_asciitilde 0x100000ac -#define XKB_KEY_lira 0x100000af -#define XKB_KEY_guilder 0x100000be -#define XKB_KEY_IO 0x100000ee -#define XKB_KEY_longminus 0x100000f6 -#define XKB_KEY_block 0x100000fc - - - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-names.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-names.h deleted file mode 100644 index ecb551ff1..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-names.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright © 2012 Intel Corporation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone - */ - -#ifndef _XKBCOMMON_NAMES_H -#define _XKBCOMMON_NAMES_H - -/** - * @file - * @brief Predefined names for common modifiers and LEDs. - */ - -#define XKB_MOD_NAME_SHIFT "Shift" -#define XKB_MOD_NAME_CAPS "Lock" -#define XKB_MOD_NAME_CTRL "Control" -#define XKB_MOD_NAME_ALT "Mod1" -#define XKB_MOD_NAME_NUM "Mod2" -#define XKB_MOD_NAME_LOGO "Mod4" - -#define XKB_LED_NAME_CAPS "Caps Lock" -#define XKB_LED_NAME_NUM "Num Lock" -#define XKB_LED_NAME_SCROLL "Scroll Lock" - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-x11.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-x11.h deleted file mode 100644 index 015831568..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon-x11.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright © 2013 Ran Benita - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef _XKBCOMMON_X11_H -#define _XKBCOMMON_X11_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @file - * libxkbcommon-x11 API - Additional X11 support for xkbcommon. - */ - -/** - * @defgroup x11 X11 support - * Additional X11 support for xkbcommon. - * @since 0.4.0 - * - * @{ - */ - -/** - * @page x11-overview Overview - * @parblock - * - * The xkbcommon-x11 module provides a means for creating an xkb_keymap - * corresponding to the currently active keymap on the X server. To do - * so, it queries the XKB X11 extension using the xcb-xkb library. It - * can be used as a replacement for Xlib's keyboard handling. - * - * Following is an example workflow using xkbcommon-x11. A complete - * example may be found in the test/interactive-x11.c file in the - * xkbcommon source repository. On startup: - * - * 1. Connect to the X server using xcb_connect(). - * 2. Setup the XKB X11 extension. You can do this either by using the - * xcb_xkb_use_extension() request directly, or by using the - * xkb_x11_setup_xkb_extension() helper function. - * - * The XKB extension supports using separate keymaps and states for - * different keyboard devices. The devices are identified by an integer - * device ID and are managed by another X11 extension, XInput (or its - * successor, XInput2). The original X11 protocol only had one keyboard - * device, called the "core keyboard", which is still supported as a - * "virtual device". - * - * 3. We will use the core keyboard as an example. To get its device ID, - * use either the xcb_xkb_get_device_info() request directly, or the - * xkb_x11_get_core_keyboard_device_id() helper function. - * 4. Create an initial xkb_keymap for this device, using the - * xkb_x11_keymap_new_from_device() function. - * 5. Create an initial xkb_state for this device, using the - * xkb_x11_state_new_from_device() function. - * - * @note At this point, you may consider setting various XKB controls and - * XKB per-client flags. For example, enabling detectable autorepeat: \n - * http://www.x.org/releases/current/doc/kbproto/xkbproto.html#Detectable_Autorepeat - * - * Next, you need to react to state changes (e.g. a modifier was pressed, - * the layout was changed) and to keymap changes (e.g. a tool like xkbcomp, - * setxkbmap or xmodmap was used): - * - * 6. Select to listen to at least the following XKB events: - * NewKeyboardNotify, MapNotify, StateNotify; using the - * xcb_xkb_select_events_aux() request. - * 7. When NewKeyboardNotify or MapNotify are received, recreate the - * xkb_keymap and xkb_state as described above. - * 8. When StateNotify is received, update the xkb_state accordingly - * using the xkb_state_update_mask() function. - * - * @note It is also possible to use the KeyPress/KeyRelease @p state - * field to find the effective modifier and layout state, instead of - * using XkbStateNotify: \n - * http://www.x.org/releases/current/doc/kbproto/xkbproto.html#Computing_A_State_Field_from_an_XKB_State - * \n However, XkbStateNotify is more accurate. - * - * @note There is no need to call xkb_state_update_key(); the state is - * already synchronized. - * - * Finally, when a key event is received, you can use ordinary xkbcommon - * functions, like xkb_state_key_get_one_sym() and xkb_state_key_get_utf8(), - * as you normally would. - * - * @endparblock - */ - -/** - * The minimal compatible major version of the XKB X11 extension which - * this library can use. - */ -#define XKB_X11_MIN_MAJOR_XKB_VERSION 1 -/** - * The minimal compatible minor version of the XKB X11 extension which - * this library can use (for the minimal major version). - */ -#define XKB_X11_MIN_MINOR_XKB_VERSION 0 - -/** Flags for the xkb_x11_setup_xkb_extension() function. */ -enum xkb_x11_setup_xkb_extension_flags { - /** Do not apply any flags. */ - XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS = 0 -}; - -/** - * Setup the XKB X11 extension for this X client. - * - * The xkbcommon-x11 library uses various XKB requests. Before doing so, - * an X client must notify the server that it will be using the extension. - * This function (or an XCB equivalent) must be called before any other - * function in this library is used. - * - * Some X servers may not support or disable the XKB extension. If you - * want to support such servers, you need to use a different fallback. - * - * You may call this function several times; it is idempotent. - * - * @param connection - * An XCB connection to the X server. - * @param major_xkb_version - * See @p minor_xkb_version. - * @param minor_xkb_version - * The XKB extension version to request. To operate correctly, you - * must have (major_xkb_version, minor_xkb_version) >= - * (XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION), - * though this is not enforced. - * @param flags - * Optional flags, or 0. - * @param[out] major_xkb_version_out - * See @p minor_xkb_version_out. - * @param[out] minor_xkb_version_out - * Backfilled with the compatible XKB extension version numbers picked - * by the server. Can be NULL. - * @param[out] base_event_out - * Backfilled with the XKB base (also known as first) event code, needed - * to distinguish XKB events. Can be NULL. - * @param[out] base_error_out - * Backfilled with the XKB base (also known as first) error code, needed - * to distinguish XKB errors. Can be NULL. - * - * @returns 1 on success, or 0 on failure. - */ -int -xkb_x11_setup_xkb_extension(xcb_connection_t *connection, - uint16_t major_xkb_version, - uint16_t minor_xkb_version, - enum xkb_x11_setup_xkb_extension_flags flags, - uint16_t *major_xkb_version_out, - uint16_t *minor_xkb_version_out, - uint8_t *base_event_out, - uint8_t *base_error_out); - -/** - * Get the keyboard device ID of the core X11 keyboard. - * - * @param connection An XCB connection to the X server. - * - * @returns A device ID which may be used with other xkb_x11_* functions, - * or -1 on failure. - */ -int32_t -xkb_x11_get_core_keyboard_device_id(xcb_connection_t *connection); - -/** - * Create a keymap from an X11 keyboard device. - * - * This function queries the X server with various requests, fetches the - * details of the active keymap on a keyboard device, and creates an - * xkb_keymap from these details. - * - * @param context - * The context in which to create the keymap. - * @param connection - * An XCB connection to the X server. - * @param device_id - * An XInput 1 device ID (in the range 0-255) with input class KEY. - * Passing values outside of this range is an error. - * @param flags - * Optional flags for the keymap, or 0. - * - * @returns A keymap retrieved from the X server, or NULL on failure. - * - * @memberof xkb_keymap - */ -struct xkb_keymap * -xkb_x11_keymap_new_from_device(struct xkb_context *context, - xcb_connection_t *connection, - int32_t device_id, - enum xkb_keymap_compile_flags flags); - -/** - * Create a new keyboard state object from an X11 keyboard device. - * - * This function is the same as xkb_state_new(), only pre-initialized - * with the state of the device at the time this function is called. - * - * @param keymap - * The keymap for which to create the state. - * @param connection - * An XCB connection to the X server. - * @param device_id - * An XInput 1 device ID (in the range 0-255) with input class KEY. - * Passing values outside of this range is an error. - * - * @returns A new keyboard state object, or NULL on failure. - * - * @memberof xkb_state - */ -struct xkb_state * -xkb_x11_state_new_from_device(struct xkb_keymap *keymap, - xcb_connection_t *connection, - int32_t device_id); - -/** @} */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* _XKBCOMMON_X11_H */ diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon.h deleted file mode 100644 index f0c92028f..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/fcitx/xkbcommon/xkbcommon.h +++ /dev/null @@ -1,1723 +0,0 @@ -/* - * Copyright 1985, 1987, 1990, 1998 The Open Group - * Copyright 2008 Dan Nicholson - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Except as contained in this notice, the names of the authors or their - * institutions shall not be used in advertising or otherwise to promote the - * sale, use or other dealings in this Software without prior written - * authorization from the authors. - */ - -/************************************************************ - * Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -/* - * Copyright © 2009-2012 Daniel Stone - * Copyright © 2012 Intel Corporation - * Copyright © 2012 Ran Benita - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Daniel Stone - */ - -#ifndef _XKBCOMMON_H_ -#define _XKBCOMMON_H_ - -#include -#include -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @file - * Main libxkbcommon API. - */ - -/** - * @struct xkb_context - * Opaque top level library context object. - * - * The context contains various general library data and state, like - * logging level and include paths. - * - * Objects are created in a specific context, and multiple contexts may - * coexist simultaneously. Objects from different contexts are completely - * separated and do not share any memory or state. - */ -struct xkb_context; - -/** - * @struct xkb_keymap - * Opaque compiled keymap object. - * - * The keymap object holds all of the static keyboard information obtained - * from compiling XKB files. - * - * A keymap is immutable after it is created (besides reference counts, etc.); - * if you need to change it, you must create a new one. - */ -struct xkb_keymap; - -/** - * @struct xkb_state - * Opaque keyboard state object. - * - * State objects contain the active state of a keyboard (or keyboards), such - * as the currently effective layout and the active modifiers. It acts as a - * simple state machine, wherein key presses and releases are the input, and - * key symbols (keysyms) are the output. - */ -struct xkb_state; - -/** - * A number used to represent a physical key on a keyboard. - * - * A standard PC-compatible keyboard might have 102 keys. An appropriate - * keymap would assign each of them a keycode, by which the user should - * refer to the key throughout the library. - * - * Historically, the X11 protocol, and consequentially the XKB protocol, - * assign only 8 bits for keycodes. This limits the number of different - * keys that can be used simultaneously in a single keymap to 256 - * (disregarding other limitations). This library does not share this limit; - * keycodes beyond 255 ('extended keycodes') are not treated specially. - * Keymaps and applications which are compatible with X11 should not use - * these keycodes. - * - * The values of specific keycodes are determined by the keymap and the - * underlying input system. For example, with an X11-compatible keymap - * and Linux evdev scan codes (see linux/input.h), a fixed offset is used: - * - * @code - * xkb_keycode_t keycode_A = KEY_A + 8; - * @endcode - * - * @sa xkb_keycode_is_legal_ext() xkb_keycode_is_legal_x11() - */ -typedef uint32_t xkb_keycode_t; - -/** - * A number used to represent the symbols generated from a key on a keyboard. - * - * A key, represented by a keycode, may generate different symbols according - * to keyboard state. For example, on a QWERTY keyboard, pressing the key - * labled \ generates the symbol 'a'. If the Shift key is held, it - * generates the symbol 'A'. If a different layout is used, say Greek, - * it generates the symbol 'α'. And so on. - * - * Each such symbol is represented by a keysym. Note that keysyms are - * somewhat more general, in that they can also represent some "function", - * such as "Left" or "Right" for the arrow keys. For more information, - * see: - * http://www.x.org/releases/X11R7.7/doc/xproto/x11protocol.html#keysym_encoding - * - * Specifically named keysyms can be found in the - * xkbcommon/xkbcommon-keysyms.h header file. Their name does not include - * the XKB_KEY_ prefix. - * - * Besides those, any Unicode/ISO 10646 character in the range U0100 to - * U10FFFF can be represented by a keysym value in the range 0x01000100 to - * 0x0110FFFF. The name of Unicode keysyms is "U", e.g. "UA1B2". - * - * The name of other unnamed keysyms is the hexadecimal representation of - * their value, e.g. "0xabcd1234". - * - * Keysym names are case-sensitive. - */ -typedef uint32_t xkb_keysym_t; - -/** - * Index of a keyboard layout. - * - * The layout index is a state component which detemines which keyboard - * layout is active. These may be different alphabets, different key - * arrangements, etc. - * - * Layout indices are consecutive. The first layout has index 0. - * - * Each layout is not required to have a name, and the names are not - * guaranteed to be unique (though they are usually provided and unique). - * Therefore, it is not safe to use the name as a unique identifier for a - * layout. Layout names are case-sensitive. - * - * Layouts are also called "groups" by XKB. - * - * @sa xkb_keymap_num_layouts() xkb_keymap_num_layouts_for_key() - */ -typedef uint32_t xkb_layout_index_t; -/** A mask of layout indices. */ -typedef uint32_t xkb_layout_mask_t; - -/** - * Index of a shift level. - * - * Any key, in any layout, can have several shift levels. Each - * shift level can assign different keysyms to the key. The shift level - * to use is chosen according to the current keyboard state; for example, - * if no keys are pressed, the first level may be used; if the Left Shift - * key is pressed, the second; if Num Lock is pressed, the third; and - * many such combinations are possible (see xkb_mod_index_t). - * - * Level indices are consecutive. The first level has index 0. - */ -typedef uint32_t xkb_level_index_t; - -/** - * Index of a modifier. - * - * A @e modifier is a state component which changes the way keys are - * interpreted. A keymap defines a set of modifiers, such as Alt, Shift, - * Num Lock or Meta, and specifies which keys may @e activate which - * modifiers (in a many-to-many relationship, i.e. a key can activate - * several modifiers, and a modifier may be activated by several keys. - * Different keymaps do this differently). - * - * When retrieving the keysyms for a key, the active modifier set is - * consulted; this detemines the correct shift level to use within the - * currently active layout (see xkb_level_index_t). - * - * Modifier indices are consecutive. The first modifier has index 0. - * - * Each modifier must have a name, and the names are unique. Therefore, it - * is safe to use the name as a unique identifier for a modifier. The names - * of some common modifiers are provided in the xkbcommon/xkbcommon-names.h - * header file. Modifier names are case-sensitive. - * - * @sa xkb_keymap_num_mods() - */ -typedef uint32_t xkb_mod_index_t; -/** A mask of modifier indices. */ -typedef uint32_t xkb_mod_mask_t; - -/** - * Index of a keyboard LED. - * - * LEDs are logical objects which may be @e active or @e inactive. They - * typically correspond to the lights on the keyboard. Their state is - * determined by the current keyboard state. - * - * LED indices are non-consecutive. The first LED has index 0. - * - * Each LED must have a name, and the names are unique. Therefore, - * it is safe to use the name as a unique identifier for a LED. The names - * of some common LEDs are provided in the xkbcommon/xkbcommon-names.h - * header file. LED names are case-sensitive. - * - * @warning A given keymap may specify an exact index for a given LED. - * Therefore, LED indexing is not necessarily sequential, as opposed to - * modifiers and layouts. This means that when iterating over the LEDs - * in a keymap using e.g. xkb_keymap_num_leds(), some indices might be - * invalid. Given such an index, functions like xkb_keymap_led_get_name() - * will return NULL, and xkb_state_led_index_is_active() will return -1. - * - * LEDs are also called "indicators" by XKB. - * - * @sa xkb_keymap_num_leds() - */ -typedef uint32_t xkb_led_index_t; -/** A mask of LED indices. */ -typedef uint32_t xkb_led_mask_t; - -#define XKB_KEYCODE_INVALID (0xffffffff) -#define XKB_LAYOUT_INVALID (0xffffffff) -#define XKB_LEVEL_INVALID (0xffffffff) -#define XKB_MOD_INVALID (0xffffffff) -#define XKB_LED_INVALID (0xffffffff) - -#define XKB_KEYCODE_MAX (0xffffffff - 1) - -/** - * Test whether a value is a valid extended keycode. - * @sa xkb_keycode_t - **/ -#define xkb_keycode_is_legal_ext(key) (key <= XKB_KEYCODE_MAX) - -/** - * Test whether a value is a valid X11 keycode. - * @sa xkb_keycode_t - */ -#define xkb_keycode_is_legal_x11(key) (key >= 8 && key <= 255) - -/** - * Names to compile a keymap with, also known as RMLVO. - * - * The names are the common configuration values by which a user picks - * a keymap. - * - * If the entire struct is NULL, then each field is taken to be NULL. - * You should prefer passing NULL instead of choosing your own defaults. - */ -struct xkb_rule_names { - /** - * The rules file to use. The rules file describes how to interpret - * the values of the model, layout, variant and options fields. - * - * If NULL or the empty string "", a default value is used. - * If the XKB_DEFAULT_RULES environment variable is set, it is used - * as the default. Otherwise the system default is used. - */ - const char *rules; - /** - * The keyboard model by which to interpret keycodes and LEDs. - * - * If NULL or the empty string "", a default value is used. - * If the XKB_DEFAULT_MODEL environment variable is set, it is used - * as the default. Otherwise the system default is used. - */ - const char *model; - /** - * A comma separated list of layouts (languages) to include in the - * keymap. - * - * If NULL or the empty string "", a default value is used. - * If the XKB_DEFAULT_LAYOUT environment variable is set, it is used - * as the default. Otherwise the system default is used. - */ - const char *layout; - /** - * A comma separated list of variants, one per layout, which may - * modify or augment the respective layout in various ways. - * - * If NULL or the empty string "", and a default value is also used - * for the layout, a default value is used. Otherwise no variant is - * used. - * If the XKB_DEFAULT_VARIANT environment variable is set, it is used - * as the default. Otherwise the system default is used. - */ - const char *variant; - /** - * A comma separated list of options, through which the user specifies - * non-layout related preferences, like which key combinations are used - * for switching layouts, or which key is the Compose key. - * - * If NULL, a default value is used. If the empty string "", no - * options are used. - * If the XKB_DEFAULT_OPTIONS environment variable is set, it is used - * as the default. Otherwise the system default is used. - */ - const char *options; -}; - -/** - * @defgroup keysyms Keysyms - * Utility functions related to keysyms. - * - * @{ - */ - -/** - * @page keysym-transformations Keysym Transformations - * - * Keysym translation is subject to several "keysym transformations", - * as described in the XKB specification. These are: - * - * - Capitalization transformation. If the Caps Lock modifier is - * active and was not consumed by the translation process, a single - * keysym is transformed to its upper-case form (if applicable). - * Similarly, the UTF-8/UTF-32 string produced is capitalized. - * - * This is described in: - * http://www.x.org/releases/current/doc/kbproto/xkbproto.html#Interpreting_the_Lock_Modifier - * - * - Control transformation. If the Control modifier is active and - * was not consumed by the translation process, the string produced - * is transformed to its matching ASCII control character (if - * applicable). Keysyms are not affected. - * - * This is described in: - * http://www.x.org/releases/current/doc/kbproto/xkbproto.html#Interpreting_the_Control_Modifier - * - * Each relevant function discusses which transformations it performs. - * - * These transformations are not applicable when a key produces multiple - * keysyms. - */ - - -/** - * Get the name of a keysym. - * - * For a description of how keysyms are named, see @ref xkb_keysym_t. - * - * @param[in] keysym The keysym. - * @param[out] buffer A string buffer to write the name into. - * @param[in] size Size of the buffer. - * - * @warning If the buffer passed is too small, the string is truncated - * (though still NUL-terminated); a size of at least 64 bytes is recommended. - * - * @returns The number of bytes in the name, excluding the NUL byte. If - * the keysym is invalid, returns -1. - * - * You may check if truncation has occurred by comparing the return value - * with the length of buffer, similarly to the snprintf(3) function. - * - * @sa xkb_keysym_t - */ -int -xkb_keysym_get_name(xkb_keysym_t keysym, char *buffer, size_t size); - -/** Flags for xkb_keysym_from_name(). */ -enum xkb_keysym_flags { - /** Do not apply any flags. */ - XKB_KEYSYM_NO_FLAGS = 0, - /** Find keysym by case-insensitive search. */ - XKB_KEYSYM_CASE_INSENSITIVE = (1 << 0) -}; - -/** - * Get a keysym from its name. - * - * @param name The name of a keysym. See remarks in xkb_keysym_get_name(); - * this function will accept any name returned by that function. - * @param flags A set of flags controlling how the search is done. If - * invalid flags are passed, this will fail with XKB_KEY_NoSymbol. - * - * If you use the XKB_KEYSYM_CASE_INSENSITIVE flag and two keysym names - * differ only by case, then the lower-case keysym is returned. For - * instance, for KEY_a and KEY_A, this function would return KEY_a for the - * case-insensitive search. If this functionality is needed, it is - * recommended to first call this function without this flag; and if that - * fails, only then to try with this flag, while possibly warning the user - * he had misspelled the name, and might get wrong results. - * - * @returns The keysym. If the name is invalid, returns XKB_KEY_NoSymbol. - * - * @sa xkb_keysym_t - */ -xkb_keysym_t -xkb_keysym_from_name(const char *name, enum xkb_keysym_flags flags); - -/** - * Get the Unicode/UTF-8 representation of a keysym. - * - * @param[in] keysym The keysym. - * @param[out] buffer A buffer to write the UTF-8 string into. - * @param[in] size The size of buffer. Must be at least 7. - * - * @returns The number of bytes written to the buffer (including the - * terminating byte). If the keysym does not have a Unicode - * representation, returns 0. If the buffer is too small, returns -1. - * - * This function does not perform any @ref keysym-transformations. - * Therefore, prefer to use xkb_state_key_get_utf8() if possible. - * - * @sa xkb_state_key_get_utf8() - */ -int -xkb_keysym_to_utf8(xkb_keysym_t keysym, char *buffer, size_t size); - -/** - * Get the Unicode/UTF-32 representation of a keysym. - * - * @returns The Unicode/UTF-32 representation of keysym, which is also - * compatible with UCS-4. If the keysym does not have a Unicode - * representation, returns 0. - * - * This function does not perform any @ref keysym-transformations. - * Therefore, prefer to use xkb_state_key_get_utf32() if possible. - * - * @sa xkb_state_key_get_utf32() - */ -uint32_t -xkb_keysym_to_utf32(xkb_keysym_t keysym); - -/** @} */ - -/** - * @defgroup context Library Context - * Creating, destroying and using library contexts. - * - * Every keymap compilation request must have a context associated with - * it. The context keeps around state such as the include path. - * - * @{ - */ - -/** Flags for context creation. */ -enum xkb_context_flags { - /** Do not apply any context flags. */ - XKB_CONTEXT_NO_FLAGS = 0, - /** Create this context with an empty include path. */ - XKB_CONTEXT_NO_DEFAULT_INCLUDES = (1 << 0), - /** - * Don't take RMLVO names from the environment. - * @since 0.3.0 - */ - XKB_CONTEXT_NO_ENVIRONMENT_NAMES = (1 << 1) -}; - -/** - * Create a new context. - * - * @param flags Optional flags for the context, or 0. - * - * @returns A new context, or NULL on failure. - * - * The user may set some environment variables to affect default values in - * the context. See e.g. xkb_context_set_log_level() and - * xkb_context_set_log_verbosity(). - * - * @memberof xkb_context - */ -struct xkb_context * -xkb_context_new(enum xkb_context_flags flags); - -/** - * Take a new reference on a context. - * - * @returns The passed in context. - * - * @memberof xkb_context - */ -struct xkb_context * -xkb_context_ref(struct xkb_context *context); - -/** - * Release a reference on a context, and possibly free it. - * - * @param context The context. If it is NULL, this function does nothing. - * - * @memberof xkb_context - */ -void -xkb_context_unref(struct xkb_context *context); - -/** - * Store custom user data in the context. - * - * This may be useful in conjunction with xkb_context_set_log_fn() or other - * callbacks. - * - * @memberof xkb_context - */ -void -xkb_context_set_user_data(struct xkb_context *context, void *user_data); - -/** - * Retrieves stored user data from the context. - * - * @returns The stored user data. If the user data wasn't set, or the - * passed in context is NULL, returns NULL. - * - * This may be useful to access private user data from callbacks like a - * custom logging function. - * - * @memberof xkb_context - **/ -void * -xkb_context_get_user_data(struct xkb_context *context); - -/** @} */ - -/** - * @defgroup include-path Include Paths - * Manipulating the include paths in a context. - * - * The include paths are the file-system paths that are searched when an - * include statement is encountered during keymap compilation. - * In most cases, the default include paths are sufficient. - * - * @{ - */ - -/** - * Append a new entry to the context's include path. - * - * @returns 1 on success, or 0 if the include path could not be added or is - * inaccessible. - * - * @memberof xkb_context - */ -int -xkb_context_include_path_append(struct xkb_context *context, const char *path); - -/** - * Append the default include paths to the context's include path. - * - * @returns 1 on success, or 0 if the primary include path could not be added. - * - * @memberof xkb_context - */ -int -xkb_context_include_path_append_default(struct xkb_context *context); - -/** - * Reset the context's include path to the default. - * - * Removes all entries from the context's include path, and inserts the - * default paths. - * - * @returns 1 on success, or 0 if the primary include path could not be added. - * - * @memberof xkb_context - */ -int -xkb_context_include_path_reset_defaults(struct xkb_context *context); - -/** - * Remove all entries from the context's include path. - * - * @memberof xkb_context - */ -void -xkb_context_include_path_clear(struct xkb_context *context); - -/** - * Get the number of paths in the context's include path. - * - * @memberof xkb_context - */ -unsigned int -xkb_context_num_include_paths(struct xkb_context *context); - -/** - * Get a specific include path from the context's include path. - * - * @returns The include path at the specified index. If the index is - * invalid, returns NULL. - * - * @memberof xkb_context - */ -const char * -xkb_context_include_path_get(struct xkb_context *context, unsigned int index); - -/** @} */ - -/** - * @defgroup logging Logging Handling - * Manipulating how logging from this library is handled. - * - * @{ - */ - -/** Specifies a logging level. */ -enum xkb_log_level { - XKB_LOG_LEVEL_CRITICAL = 10, /**< Log critical internal errors only. */ - XKB_LOG_LEVEL_ERROR = 20, /**< Log all errors. */ - XKB_LOG_LEVEL_WARNING = 30, /**< Log warnings and errors. */ - XKB_LOG_LEVEL_INFO = 40, /**< Log information, warnings, and errors. */ - XKB_LOG_LEVEL_DEBUG = 50 /**< Log everything. */ -}; - -/** - * Set the current logging level. - * - * @param context The context in which to set the logging level. - * @param level The logging level to use. Only messages from this level - * and below will be logged. - * - * The default level is XKB_LOG_LEVEL_ERROR. The environment variable - * XKB_LOG_LEVEL, if set in the time the context was created, overrides the - * default value. It may be specified as a level number or name. - * - * @memberof xkb_context - */ -void -xkb_context_set_log_level(struct xkb_context *context, - enum xkb_log_level level); - -/** - * Get the current logging level. - * - * @memberof xkb_context - */ -enum xkb_log_level -xkb_context_get_log_level(struct xkb_context *context); - -/** - * Sets the current logging verbosity. - * - * The library can generate a number of warnings which are not helpful to - * ordinary users of the library. The verbosity may be increased if more - * information is desired (e.g. when developing a new keymap). - * - * The default verbosity is 0. The environment variable XKB_LOG_VERBOSITY, - * if set in the time the context was created, overrides the default value. - * - * @param context The context in which to use the set verbosity. - * @param verbosity The verbosity to use. Currently used values are - * 1 to 10, higher values being more verbose. 0 would result in no verbose - * messages being logged. - * - * Most verbose messages are of level XKB_LOG_LEVEL_WARNING or lower. - * - * @memberof xkb_context - */ -void -xkb_context_set_log_verbosity(struct xkb_context *context, int verbosity); - -/** - * Get the current logging verbosity of the context. - * - * @memberof xkb_context - */ -int -xkb_context_get_log_verbosity(struct xkb_context *context); - -/** - * Set a custom function to handle logging messages. - * - * @param context The context in which to use the set logging function. - * @param log_fn The function that will be called for logging messages. - * Passing NULL restores the default function, which logs to stderr. - * - * By default, log messages from this library are printed to stderr. This - * function allows you to replace the default behavior with a custom - * handler. The handler is only called with messages which match the - * current logging level and verbosity settings for the context. - * level is the logging level of the message. @a format and @a args are - * the same as in the vprintf(3) function. - * - * You may use xkb_context_set_user_data() on the context, and then call - * xkb_context_get_user_data() from within the logging function to provide - * it with additional private context. - * - * @memberof xkb_context - */ -void -xkb_context_set_log_fn(struct xkb_context *context, - void (*log_fn)(struct xkb_context *context, - enum xkb_log_level level, - const char *format, va_list args)); - -/** @} */ - -/** - * @defgroup keymap Keymap Creation - * Creating and destroying keymaps. - * - * @{ - */ - -/** Flags for keymap compilation. */ -enum xkb_keymap_compile_flags { - /** Do not apply any flags. */ - XKB_KEYMAP_COMPILE_NO_FLAGS = 0 -}; - -/** - * Create a keymap from RMLVO names. - * - * The primary keymap entry point: creates a new XKB keymap from a set of - * RMLVO (Rules + Model + Layouts + Variants + Options) names. - * - * @param context The context in which to create the keymap. - * @param names The RMLVO names to use. See xkb_rule_names. - * @param flags Optional flags for the keymap, or 0. - * - * @returns A keymap compiled according to the RMLVO names, or NULL if - * the compilation failed. - * - * @sa xkb_rule_names - * @memberof xkb_keymap - */ -struct xkb_keymap * -xkb_keymap_new_from_names(struct xkb_context *context, - const struct xkb_rule_names *names, - enum xkb_keymap_compile_flags flags); - -/** The possible keymap formats. */ -enum xkb_keymap_format { - /** The current/classic XKB text format, as generated by xkbcomp -xkb. */ - XKB_KEYMAP_FORMAT_TEXT_V1 = 1 -}; - -/** - * Create a keymap from a keymap file. - * - * @param context The context in which to create the keymap. - * @param file The keymap file to compile. - * @param format The text format of the keymap file to compile. - * @param flags Optional flags for the keymap, or 0. - * - * @returns A keymap compiled from the given XKB keymap file, or NULL if - * the compilation failed. - * - * The file must contain a complete keymap. For example, in the - * XKB_KEYMAP_FORMAT_TEXT_V1 format, this means the file must contain one - * top level '%xkb_keymap' section, which in turn contains other required - * sections. - * - * @memberof xkb_keymap - */ -struct xkb_keymap * -xkb_keymap_new_from_file(struct xkb_context *context, FILE *file, - enum xkb_keymap_format format, - enum xkb_keymap_compile_flags flags); - -/** - * Create a keymap from a keymap string. - * - * This is just like xkb_keymap_new_from_file(), but instead of a file, gets - * the keymap as one enormous string. - * - * @see xkb_keymap_new_from_file() - * @memberof xkb_keymap - */ -struct xkb_keymap * -xkb_keymap_new_from_string(struct xkb_context *context, const char *string, - enum xkb_keymap_format format, - enum xkb_keymap_compile_flags flags); - -/** - * Create a keymap from a memory buffer. - * - * This is just like xkb_keymap_new_from_string(), but takes a length argument - * so the input string does not have to be zero-terminated. - * - * @see xkb_keymap_new_from_string() - * @memberof xkb_keymap - * @since 0.3.0 - */ -struct xkb_keymap * -xkb_keymap_new_from_buffer(struct xkb_context *context, const char *buffer, - size_t length, enum xkb_keymap_format format, - enum xkb_keymap_compile_flags flags); - -/** - * Take a new reference on a keymap. - * - * @returns The passed in keymap. - * - * @memberof xkb_keymap - */ -struct xkb_keymap * -xkb_keymap_ref(struct xkb_keymap *keymap); - -/** - * Release a reference on a keymap, and possibly free it. - * - * @param keymap The keymap. If it is NULL, this function does nothing. - * - * @memberof xkb_keymap - */ -void -xkb_keymap_unref(struct xkb_keymap *keymap); - -/** - * Get the keymap as a string in the format from which it was created. - * @sa xkb_keymap_get_as_string() - **/ -#define XKB_KEYMAP_USE_ORIGINAL_FORMAT ((enum xkb_keymap_format) -1) - -/** - * Get the compiled keymap as a string. - * - * @param keymap The keymap to get as a string. - * @param format The keymap format to use for the string. You can pass - * in the special value XKB_KEYMAP_USE_ORIGINAL_FORMAT to use the format - * from which the keymap was originally created. - * - * @returns The keymap as a NUL-terminated string, or NULL if unsuccessful. - * - * The returned string may be fed back into xkb_map_new_from_string() to get - * the exact same keymap (possibly in another process, etc.). - * - * The returned string is dynamically allocated and should be freed by the - * caller. - * - * @memberof xkb_keymap - */ -char * -xkb_keymap_get_as_string(struct xkb_keymap *keymap, - enum xkb_keymap_format format); - -/** @} */ - -/** - * @defgroup components Keymap Components - * Enumeration of state components in a keymap. - * - * @{ - */ - -/** - * Get the minimum keycode in the keymap. - * - * @sa xkb_keycode_t - * @memberof xkb_keymap - * @since 0.3.1 - */ -xkb_keycode_t -xkb_keymap_min_keycode(struct xkb_keymap *keymap); - -/** - * Get the maximum keycode in the keymap. - * - * @sa xkb_keycode_t - * @memberof xkb_keymap - * @since 0.3.1 - */ -xkb_keycode_t -xkb_keymap_max_keycode(struct xkb_keymap *keymap); - -/** - * The iterator used by xkb_keymap_key_for_each(). - * - * @sa xkb_keymap_key_for_each - * @memberof xkb_keymap - * @since 0.3.1 - */ -typedef void -(*xkb_keymap_key_iter_t)(struct xkb_keymap *keymap, xkb_keycode_t key, - void *data); - -/** - * Run a specified function for every valid keycode in the keymap. If a - * keymap is sparse, this function may be called fewer than - * (max_keycode - min_keycode + 1) times. - * - * @sa xkb_keymap_min_keycode() xkb_keymap_max_keycode() xkb_keycode_t - * @memberof xkb_keymap - * @since 0.3.1 - */ -void -xkb_keymap_key_for_each(struct xkb_keymap *keymap, xkb_keymap_key_iter_t iter, - void *data); - -/** - * Get the number of modifiers in the keymap. - * - * @sa xkb_mod_index_t - * @memberof xkb_keymap - */ -xkb_mod_index_t -xkb_keymap_num_mods(struct xkb_keymap *keymap); - -/** - * Get the name of a modifier by index. - * - * @returns The name. If the index is invalid, returns NULL. - * - * @sa xkb_mod_index_t - * @memberof xkb_keymap - */ -const char * -xkb_keymap_mod_get_name(struct xkb_keymap *keymap, xkb_mod_index_t idx); - -/** - * Get the index of a modifier by name. - * - * @returns The index. If no modifier with this name exists, returns - * XKB_MOD_INVALID. - * - * @sa xkb_mod_index_t - * @memberof xkb_keymap - */ -xkb_mod_index_t -xkb_keymap_mod_get_index(struct xkb_keymap *keymap, const char *name); - -/** - * Get the number of layouts in the keymap. - * - * @sa xkb_layout_index_t xkb_rule_names xkb_keymap_num_layouts_for_key() - * @memberof xkb_keymap - */ -xkb_layout_index_t -xkb_keymap_num_layouts(struct xkb_keymap *keymap); - -/** - * Get the name of a layout by index. - * - * @returns The name. If the index is invalid, or the layout does not have - * a name, returns NULL. - * - * @sa xkb_layout_index_t - * @memberof xkb_keymap - */ -const char * -xkb_keymap_layout_get_name(struct xkb_keymap *keymap, xkb_layout_index_t idx); - -/** - * Get the index of a layout by name. - * - * @returns The index. If no layout exists with this name, returns - * XKB_LAYOUT_INVALID. If more than one layout in the keymap has this name, - * returns the lowest index among them. - * - * @memberof xkb_keymap - */ -xkb_layout_index_t -xkb_keymap_layout_get_index(struct xkb_keymap *keymap, const char *name); - -/** - * Get the number of LEDs in the keymap. - * - * @warning The range [ 0...xkb_keymap_num_leds() ) includes all of the LEDs - * in the keymap, but may also contain inactive LEDs. When iterating over - * this range, you need the handle this case when calling functions such as - * xkb_keymap_led_get_name() or xkb_state_led_index_is_active(). - * - * @sa xkb_led_index_t - * @memberof xkb_keymap - */ -xkb_led_index_t -xkb_keymap_num_leds(struct xkb_keymap *keymap); - -/** - * Get the name of a LED by index. - * - * @returns The name. If the index is invalid, returns NULL. - * - * @memberof xkb_keymap - */ -const char * -xkb_keymap_led_get_name(struct xkb_keymap *keymap, xkb_led_index_t idx); - -/** - * Get the index of a LED by name. - * - * @returns The index. If no LED with this name exists, returns - * XKB_LED_INVALID. - * - * @memberof xkb_keymap - */ -xkb_led_index_t -xkb_keymap_led_get_index(struct xkb_keymap *keymap, const char *name); - -/** - * Get the number of layouts for a specific key. - * - * This number can be different from xkb_keymap_num_layouts(), but is always - * smaller. It is the appropriate value to use when iterating over the - * layouts of a key. - * - * @sa xkb_layout_index_t - * @memberof xkb_keymap - */ -xkb_layout_index_t -xkb_keymap_num_layouts_for_key(struct xkb_keymap *keymap, xkb_keycode_t key); - -/** - * Get the number of shift levels for a specific key and layout. - * - * If @c layout is out of range for this key (that is, larger or equal to - * the value returned by xkb_keymap_num_layouts_for_key()), it is brought - * back into range in a manner consistent with xkb_state_key_get_layout(). - * - * @sa xkb_level_index_t - * @memberof xkb_keymap - */ -xkb_level_index_t -xkb_keymap_num_levels_for_key(struct xkb_keymap *keymap, xkb_keycode_t key, - xkb_layout_index_t layout); - -/** - * Get the keysyms obtained from pressing a key in a given layout and - * shift level. - * - * This function is like xkb_state_key_get_syms(), only the layout and - * shift level are not derived from the keyboard state but are instead - * specified explicitly. - * - * @param[in] keymap The keymap. - * @param[in] key The keycode of the key. - * @param[in] layout The layout for which to get the keysyms. - * @param[in] level The shift level in the layout for which to get the - * keysyms. This must be smaller than: - * @code xkb_keymap_num_levels_for_key(keymap, key) @endcode - * @param[out] syms_out An immutable array of keysyms corresponding to the - * key in the given layout and shift level. - * - * If @c layout is out of range for this key (that is, larger or equal to - * the value returned by xkb_keymap_num_layouts_for_key()), it is brought - * back into range in a manner consistent with xkb_state_key_get_layout(). - * - * @returns The number of keysyms in the syms_out array. If no keysyms - * are produced by the key in the given layout and shift level, returns 0 - * and sets syms_out to NULL. - * - * @sa xkb_state_key_get_syms() - * @memberof xkb_keymap - */ -int -xkb_keymap_key_get_syms_by_level(struct xkb_keymap *keymap, - xkb_keycode_t key, - xkb_layout_index_t layout, - xkb_level_index_t level, - const xkb_keysym_t **syms_out); - -/** - * Determine whether a key should repeat or not. - * - * A keymap may specify different repeat behaviors for different keys. - * Most keys should generally exhibit repeat behavior; for example, holding - * the 'a' key down in a text editor should normally insert a single 'a' - * character every few milliseconds, until the key is released. However, - * there are keys which should not or do not need to be repeated. For - * example, repeating modifier keys such as Left/Right Shift or Caps Lock - * is not generally useful or desired. - * - * @returns 1 if the key should repeat, 0 otherwise. - * - * @memberof xkb_keymap - */ -int -xkb_keymap_key_repeats(struct xkb_keymap *keymap, xkb_keycode_t key); - -/** @} */ - -/** - * @defgroup state Keyboard State - * Creating, destroying and manipulating keyboard state objects. - * - * @{ - */ - -/** - * Create a new keyboard state object. - * - * @param keymap The keymap which the state will use. - * - * @returns A new keyboard state object, or NULL on failure. - * - * @memberof xkb_state - */ -struct xkb_state * -xkb_state_new(struct xkb_keymap *keymap); - -/** - * Take a new reference on a keyboard state object. - * - * @returns The passed in object. - * - * @memberof xkb_state - */ -struct xkb_state * -xkb_state_ref(struct xkb_state *state); - -/** - * Release a reference on a keybaord state object, and possibly free it. - * - * @param state The state. If it is NULL, this function does nothing. - * - * @memberof xkb_state - */ -void -xkb_state_unref(struct xkb_state *state); - -/** - * Get the keymap which a keyboard state object is using. - * - * @returns The keymap which was passed to xkb_state_new() when creating - * this state object. - * - * This function does not take a new reference on the keymap; you must - * explicitly reference it yourself if you plan to use it beyond the - * lifetime of the state. - * - * @memberof xkb_state - */ -struct xkb_keymap * -xkb_state_get_keymap(struct xkb_state *state); - -/** Specifies the direction of the key (press / release). */ -enum xkb_key_direction { - XKB_KEY_UP, /**< The key was released. */ - XKB_KEY_DOWN /**< The key was pressed. */ -}; - -/** - * Modifier and layout types for state objects. This enum is bitmaskable, - * e.g. (XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED) is valid to - * exclude locked modifiers. - * - * In XKB, the DEPRESSED components are also known as 'base'. - */ -enum xkb_state_component { - /** Depressed modifiers, i.e. a key is physically holding them. */ - XKB_STATE_MODS_DEPRESSED = (1 << 0), - /** Latched modifiers, i.e. will be unset after the next non-modifier - * key press. */ - XKB_STATE_MODS_LATCHED = (1 << 1), - /** Locked modifiers, i.e. will be unset after the key provoking the - * lock has been pressed again. */ - XKB_STATE_MODS_LOCKED = (1 << 2), - /** Effective modifiers, i.e. currently active and affect key - * processing (derived from the other state components). - * Use this unless you explictly care how the state came about. */ - XKB_STATE_MODS_EFFECTIVE = (1 << 3), - /** Depressed layout, i.e. a key is physically holding it. */ - XKB_STATE_LAYOUT_DEPRESSED = (1 << 4), - /** Latched layout, i.e. will be unset after the next non-modifier - * key press. */ - XKB_STATE_LAYOUT_LATCHED = (1 << 5), - /** Locked layout, i.e. will be unset after the key provoking the lock - * has been pressed again. */ - XKB_STATE_LAYOUT_LOCKED = (1 << 6), - /** Effective layout, i.e. currently active and affects key processing - * (derived from the other state components). - * Use this unless you explictly care how the state came about. */ - XKB_STATE_LAYOUT_EFFECTIVE = (1 << 7), - /** LEDs (derived from the other state components). */ - XKB_STATE_LEDS = (1 << 8) -}; - -/** - * Update the keyboard state to reflect a given key being pressed or - * released. - * - * This entry point is intended for programs which track the keyboard state - * explictly (like an evdev client). If the state is serialized to you by - * a master process (like a Wayland compositor) using functions like - * xkb_state_serialize_mods(), you should use xkb_state_update_mask() instead. - * The two functins should not generally be used together. - * - * A series of calls to this function should be consistent; that is, a call - * with XKB_KEY_DOWN for a key should be matched by an XKB_KEY_UP; if a key - * is pressed twice, it should be released twice; etc. Otherwise (e.g. due - * to missed input events), situations like "stuck modifiers" may occur. - * - * This function is often used in conjunction with the function - * xkb_state_key_get_syms() (or xkb_state_key_get_one_sym()), for example, - * when handling a key event. In this case, you should prefer to get the - * keysyms *before* updating the key, such that the keysyms reported for - * the key event are not affected by the event itself. This is the - * conventional behavior. - * - * @returns A mask of state components that have changed as a result of - * the update. If nothing in the state has changed, returns 0. - * - * @memberof xkb_state - * - * @sa xkb_state_update_mask() - */ -enum xkb_state_component -xkb_state_update_key(struct xkb_state *state, xkb_keycode_t key, - enum xkb_key_direction direction); - -/** - * Update a keyboard state from a set of explicit masks. - * - * This entry point is intended for window systems and the like, where a - * master process holds an xkb_state, then serializes it over a wire - * protocol, and clients then use the serialization to feed in to their own - * xkb_state. - * - * All parameters must always be passed, or the resulting state may be - * incoherent. - * - * The serialization is lossy and will not survive round trips; it must only - * be used to feed slave state objects, and must not be used to update the - * master state. - * - * If you do not fit the description above, you should use - * xkb_state_update_key() instead. The two functions should not generally be - * used together. - * - * @returns A mask of state components that have changed as a result of - * the update. If nothing in the state has changed, returns 0. - * - * @memberof xkb_state - * - * @sa xkb_state_component - * @sa xkb_state_update_key - */ -enum xkb_state_component -xkb_state_update_mask(struct xkb_state *state, - xkb_mod_mask_t depressed_mods, - xkb_mod_mask_t latched_mods, - xkb_mod_mask_t locked_mods, - xkb_layout_index_t depressed_layout, - xkb_layout_index_t latched_layout, - xkb_layout_index_t locked_layout); - -/** - * Get the keysyms obtained from pressing a particular key in a given - * keyboard state. - * - * Get the keysyms for a key according to the current active layout, - * modifiers and shift level for the key, as determined by a keyboard - * state. - * - * @param[in] state The keyboard state object. - * @param[in] key The keycode of the key. - * @param[out] syms_out An immutable array of keysyms corresponding the - * key in the given keyboard state. - * - * As an extension to XKB, this function can return more than one keysym. - * If you do not want to handle this case, you can use - * xkb_state_key_get_one_sym() for a simpler interface. - * - * This function does not perform any @ref keysym-transformations. - * (This might change). - * - * @returns The number of keysyms in the syms_out array. If no keysyms - * are produced by the key in the given keyboard state, returns 0 and sets - * syms_out to NULL. - * - * @memberof xkb_state - */ -int -xkb_state_key_get_syms(struct xkb_state *state, xkb_keycode_t key, - const xkb_keysym_t **syms_out); - -/** - * Get the Unicode/UTF-8 string obtained from pressing a particular key - * in a given keyboard state. - * - * @param[in] state The keyboard state object. - * @param[in] key The keycode of the key. - * @param[out] buffer A buffer to write the string into. - * @param[in] size Size of the buffer. - * - * @warning If the buffer passed is too small, the string is truncated - * (though still NUL-terminated). - * - * @returns The number of bytes required for the string, excluding the - * NUL byte. If there is nothing to write, returns 0. - * - * You may check if truncation has occurred by comparing the return value - * with the size of @p buffer, similarly to the snprintf(3) function. - * You may safely pass NULL and 0 to @p buffer and @p size to find the - * required size (without the NUL-byte). - * - * This function performs Capitalization and Control @ref - * keysym-transformations. - * - * @memberof xkb_state - * @since 0.4.1 - */ -int -xkb_state_key_get_utf8(struct xkb_state *state, xkb_keycode_t key, - char *buffer, size_t size); - -/** - * Get the Unicode/UTF-32 codepoint obtained from pressing a particular - * key in a a given keyboard state. - * - * @returns The UTF-32 representation for the key, if it consists of only - * a single codepoint. Otherwise, returns 0. - * - * This function performs Capitalization and Control @ref - * keysym-transformations. - * - * @memberof xkb_state - * @since 0.4.1 - */ -uint32_t -xkb_state_key_get_utf32(struct xkb_state *state, xkb_keycode_t key); - -/** - * Get the single keysym obtained from pressing a particular key in a - * given keyboard state. - * - * This function is similar to xkb_state_key_get_syms(), but intended - * for users which cannot or do not want to handle the case where - * multiple keysyms are returned (in which case this function is - * preferred). - * - * @returns The keysym. If the key does not have exactly one keysym, - * returns XKB_KEY_NoSymbol - * - * This function performs Capitalization @ref keysym-transformations. - * - * @sa xkb_state_key_get_syms() - * @memberof xkb_state - */ -xkb_keysym_t -xkb_state_key_get_one_sym(struct xkb_state *state, xkb_keycode_t key); - -/** - * Get the effective layout index for a key in a given keyboard state. - * - * @returns The layout index for the key in the given keyboard state. If - * the given keycode is invalid, or if the key is not included in any - * layout at all, returns XKB_LAYOUT_INVALID. - * - * @invariant If the returned layout is valid, the following always holds: - * @code - * xkb_state_key_get_layout(state, key) < xkb_keymap_num_layouts_for_key(keymap, key) - * @endcode - * - * @memberof xkb_state - */ -xkb_layout_index_t -xkb_state_key_get_layout(struct xkb_state *state, xkb_keycode_t key); - -/** - * Get the effective shift level for a key in a given keyboard state and - * layout. - * - * @param state The keyboard state. - * @param key The keycode of the key. - * @param layout The layout for which to get the shift level. This must be - * smaller than: - * @code xkb_keymap_num_layouts_for_key(keymap, key) @endcode - * usually it would be: - * @code xkb_state_key_get_layout(state, key) @endcode - * - * @return The shift level index. If the key or layout are invalid, - * returns XKB_LEVEL_INVALID. - * - * @invariant If the returned level is valid, the following always holds: - * @code - * xkb_state_key_get_level(state, key, layout) < xkb_keymap_num_levels_for_key(keymap, key, layout) - * @endcode - * - * @memberof xkb_state - */ -xkb_level_index_t -xkb_state_key_get_level(struct xkb_state *state, xkb_keycode_t key, - xkb_layout_index_t layout); - -/** - * Match flags for xkb_state_mod_indices_are_active() and - * xkb_state_mod_names_are_active(), specifying the conditions for a - * successful match. XKB_STATE_MATCH_NON_EXCLUSIVE is bitmaskable with - * the other modes. - */ -enum xkb_state_match { - /** Returns true if any of the modifiers are active. */ - XKB_STATE_MATCH_ANY = (1 << 0), - /** Returns true if all of the modifiers are active. */ - XKB_STATE_MATCH_ALL = (1 << 1), - /** Makes matching non-exclusive, i.e. will not return false if a - * modifier not specified in the arguments is active. */ - XKB_STATE_MATCH_NON_EXCLUSIVE = (1 << 16) -}; - -/** - * The counterpart to xkb_state_update_mask for modifiers, to be used on - * the server side of serialization. - * - * @param state The keyboard state. - * @param components A mask of the modifier state components to serialize. - * State components other than XKB_STATE_MODS_* are ignored. - * If XKB_STATE_MODS_EFFECTIVE is included, all other state components are - * ignored. - * - * @returns A xkb_mod_mask_t representing the given components of the - * modifier state. - * - * This function should not be used in regular clients; please use the - * xkb_state_mod_*_is_active API instead. - * - * @memberof xkb_state - */ -xkb_mod_mask_t -xkb_state_serialize_mods(struct xkb_state *state, - enum xkb_state_component components); - -/** - * The counterpart to xkb_state_update_mask for layouts, to be used on - * the server side of serialization. - * - * @param state The keyboard state. - * @param components A mask of the layout state components to serialize. - * State components other than XKB_STATE_LAYOUT_* are ignored. - * If XKB_STATE_LAYOUT_EFFECTIVE is included, all other state components are - * ignored. - * - * @returns A layout index representing the given components of the - * layout state. - * - * This function should not be used in regular clients; please use the - * xkb_state_layout_*_is_active API instead. - * - * @memberof xkb_state - */ -xkb_layout_index_t -xkb_state_serialize_layout(struct xkb_state *state, - enum xkb_state_component components); - -/** - * Test whether a modifier is active in a given keyboard state by name. - * - * @returns 1 if the modifier is active, 0 if it is not. If the modifier - * name does not exist in the keymap, returns -1. - * - * @memberof xkb_state - */ -int -xkb_state_mod_name_is_active(struct xkb_state *state, const char *name, - enum xkb_state_component type); - -/** - * Test whether a set of modifiers are active in a given keyboard state by - * name. - * - * @param state The keyboard state. - * @param type The component of the state against which to match the - * given modifiers. - * @param match The manner by which to match the state against the - * given modifiers. - * @param ... The set of of modifier names to test, terminated by a NULL - * argument (sentinel). - * - * @returns 1 if the modifiers are active, 0 if they are not. If any of - * the modifier names do not exist in the keymap, returns -1. - * - * @memberof xkb_state - */ -int -xkb_state_mod_names_are_active(struct xkb_state *state, - enum xkb_state_component type, - enum xkb_state_match match, - ...); - -/** - * Test whether a modifier is active in a given keyboard state by index. - * - * @returns 1 if the modifier is active, 0 if it is not. If the modifier - * index is invalid in the keymap, returns -1. - * - * @memberof xkb_state - */ -int -xkb_state_mod_index_is_active(struct xkb_state *state, xkb_mod_index_t idx, - enum xkb_state_component type); - -/** - * Test whether a set of modifiers are active in a given keyboard state by - * index. - * - * @param state The keyboard state. - * @param type The component of the state against which to match the - * given modifiers. - * @param match The manner by which to match the state against the - * given modifiers. - * @param ... The set of of modifier indices to test, terminated by a - * XKB_MOD_INVALID argument (sentinel). - * - * @returns 1 if the modifiers are active, 0 if they are not. If any of - * the modifier indices are invalid in the keymap, returns -1. - * - * @memberof xkb_state - */ -int -xkb_state_mod_indices_are_active(struct xkb_state *state, - enum xkb_state_component type, - enum xkb_state_match match, - ...); - -/** - * @page consumed-modifiers Consumed Modifiers - * @parblock - * - * Some functions, like xkb_state_key_get_syms(), look at the state of - * the modifiers in the keymap and derive from it the correct shift level - * to use for the key. For example, in a US layout, pressing the key - * labeled \ while the Shift modifier is active, generates the keysym - * 'A'. In this case, the Shift modifier is said to be "consumed". - * However, the Num Lock modifier does not affect this translation at all, - * even if it is active, so it is not consumed by this translation. - * - * It may be desirable for some application to not reuse consumed modifiers - * for further processing, e.g. for hotkeys or keyboard shortcuts. To - * understand why, consider some requirements from a standard shortcut - * mechanism, and how they are implemented: - * - * 1. The shortcut's modifiers must match exactly to the state. For - * example, it is possible to bind separate actions to \\ - * and to \\\. Further, if only \\ is - * bound to an action, pressing \\\ should not - * trigger the shortcut. - * Effectively, this means that the modifiers are compared using the - * equality operator (==). - * - * 2. Only relevant modifiers are considered for the matching. For example, - * Caps Lock and Num Lock should not generally affect the matching, e.g. - * when matching \\ against the state, it does not matter - * whether Num Lock is active or not. These relevant, or "significant", - * modifiers usually include Alt, Control, Shift, Super and similar. - * Effectively, this means that non-significant modifiers are masked out, - * before doing the comparison as described above. - * - * 3. The matching must be independent of the layout/keymap. For example, - * the \ (+) symbol is found on the first level on some layouts, - * but requires holding Shift on others. If you simply bind the action - * to the \ keysym, it would work for the unshifted kind, but - * not for the others, because the match against Shift would fail. If - * you bind the action to \\, only the shifted kind would - * work. So what is needed is to recognize that Shift is used up in the - * translation of the keysym itself, and therefore should not be included - * in the matching. - * Effectively, this means that consumed modifiers (Shift in this example) - * are masked out as well, before doing the comparison. - * - * In summary, this is how the matching would be performed: - * @code - * (keysym == shortcut_keysym) && - * ((state_mods & ~consumed_mods & significant_mods) == shortcut_mods) - * @endcode - * - * @c state_mods are the modifiers reported by - * xkb_state_mod_index_is_active() and similar functions. - * @c consumed_mods are the modifiers reported by - * xkb_state_mod_index_is_consumed() and similar functions. - * @c significant_mods are decided upon by the application/toolkit/user; - * it is up to them to decide whether these are configurable or hard-coded. - * - * @endparblock - */ - -/** - * Test whether a modifier is consumed by keyboard state translation for - * a key. - * - * @returns 1 if the modifier is consumed, 0 if it is not. If the modifier - * index is not valid in the keymap, returns -1. - * - * @sa xkb_state_mod_mask_remove_consumed() - * @sa xkb_state_key_get_consumed_mods() - * @memberof xkb_state - */ -int -xkb_state_mod_index_is_consumed(struct xkb_state *state, xkb_keycode_t key, - xkb_mod_index_t idx); - -/** - * Remove consumed modifiers from a modifier mask for a key. - * - * Takes the given modifier mask, and removes all modifiers which are - * consumed for that particular key (as in xkb_state_mod_index_is_consumed()). - * - * @sa xkb_state_mod_index_is_consumed() - * @memberof xkb_state - */ -xkb_mod_mask_t -xkb_state_mod_mask_remove_consumed(struct xkb_state *state, xkb_keycode_t key, - xkb_mod_mask_t mask); - -/** - * Get the mask of modifiers consumed by translating a given key. - * - * @returns a mask of the consumed modifiers. - * - * @sa xkb_state_mod_index_is_consumed() - * @memberof xkb_state - * @since 0.4.1 - */ -xkb_mod_mask_t -xkb_state_key_get_consumed_mods(struct xkb_state *state, xkb_keycode_t key); - -/** - * Test whether a layout is active in a given keyboard state by name. - * - * @returns 1 if the layout is active, 0 if it is not. If no layout with - * this name exists in the keymap, return -1. - * - * If multiple layouts in the keymap have this name, the one with the lowest - * index is tested. - * - * @sa xkb_layout_index_t - * @memberof xkb_state - */ -int -xkb_state_layout_name_is_active(struct xkb_state *state, const char *name, - enum xkb_state_component type); - -/** - * Test whether a layout is active in a given keyboard state by index. - * - * @returns 1 if the layout is active, 0 if it is not. If the layout index - * is not valid in the keymap, returns -1. - * - * @sa xkb_layout_index_t - * @memberof xkb_state - */ -int -xkb_state_layout_index_is_active(struct xkb_state *state, - xkb_layout_index_t idx, - enum xkb_state_component type); - -/** - * Test whether a LED is active in a given keyboard state by name. - * - * @returns 1 if the LED is active, 0 if it not. If no LED with this name - * exists in the keymap, returns -1. - * - * @sa xkb_led_index_t - * @memberof xkb_state - */ -int -xkb_state_led_name_is_active(struct xkb_state *state, const char *name); - -/** - * Test whether a LED is active in a given keyboard state by index. - * - * @returns 1 if the LED is active, 0 if it not. If the LED index is not - * valid in the keymap, returns -1. - * - * @sa xkb_led_index_t - * @memberof xkb_state - */ -int -xkb_state_led_index_is_active(struct xkb_state *state, xkb_led_index_t idx); - -/** @} */ - -/* Leave this include last, so it can pick up our types, etc. */ -#include - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* _XKBCOMMON_H_ */ diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/platforminputcontexts.pro b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/platforminputcontexts.pro deleted file mode 100644 index 0967cb3d8..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforminputcontexts/platforminputcontexts.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = subdirs - -qtHaveModule(dbus) { -!mac:!win32:SUBDIRS += fcitx -!mac:!win32:SUBDIRS += ibus -} - -contains(QT_CONFIG, xcb-plugin): SUBDIRS += compose - - diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm deleted file mode 100644 index 643ebdd53..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm +++ /dev/null @@ -1,449 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/**************************************************************************** - ** - ** Copyright (c) 2007-2008, Apple, Inc. - ** - ** All rights reserved. - ** - ** Redistribution and use in source and binary forms, with or without - ** modification, are permitted provided that the following conditions are met: - ** - ** * Redistributions of source code must retain the above copyright notice, - ** this list of conditions and the following disclaimer. - ** - ** * Redistributions in binary form must reproduce the above copyright notice, - ** this list of conditions and the following disclaimer in the documentation - ** and/or other materials provided with the distribution. - ** - ** * Neither the name of Apple, Inc. nor the names of its contributors - ** may be used to endorse or promote products derived from this software - ** without specific prior written permission. - ** - ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - ** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - ** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - ** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - ** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - ** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - ** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ** - ****************************************************************************/ - - -#import "qcocoaapplicationdelegate.h" -#import "qnswindowdelegate.h" -#import "qcocoamenuloader.h" -#include "qcocoaintegration.h" -#include -#include -#include -#include -#include -#include "qt_mac_p.h" -#include - -QT_USE_NAMESPACE - -QT_BEGIN_NAMESPACE -static QCocoaApplicationDelegate *sharedCocoaApplicationDelegate = nil; - -static void cleanupCocoaApplicationDelegate() -{ - [sharedCocoaApplicationDelegate release]; -} -QT_END_NAMESPACE - -@implementation QCocoaApplicationDelegate - -- (id)init -{ - self = [super init]; - if (self) { - inLaunch = true; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(updateScreens:) - name:NSApplicationDidChangeScreenParametersNotification - object:NSApp]; - } - return self; -} - -- (void)updateScreens:(NSNotification *)notification -{ - Q_UNUSED(notification); - if (QCocoaIntegration *ci = QCocoaIntegration::instance()) - ci->updateScreens(); -} - -- (void)dealloc -{ - sharedCocoaApplicationDelegate = nil; - [dockMenu release]; - [qtMenuLoader release]; - if (reflectionDelegate) { - [[NSApplication sharedApplication] setDelegate:reflectionDelegate]; - [reflectionDelegate release]; - } - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [super dealloc]; -} - -+ (id)allocWithZone:(NSZone *)zone -{ - @synchronized(self) { - if (sharedCocoaApplicationDelegate == nil) { - sharedCocoaApplicationDelegate = [super allocWithZone:zone]; - return sharedCocoaApplicationDelegate; - qAddPostRoutine(cleanupCocoaApplicationDelegate); - } - } - return nil; -} - -+ (QCocoaApplicationDelegate *)sharedDelegate -{ - @synchronized(self) { - if (sharedCocoaApplicationDelegate == nil) - [[self alloc] init]; - } - return [[sharedCocoaApplicationDelegate retain] autorelease]; -} - -- (void)setDockMenu:(NSMenu*)newMenu -{ - [newMenu retain]; - [dockMenu release]; - dockMenu = newMenu; -} - -- (NSMenu *)applicationDockMenu:(NSApplication *)sender -{ - Q_UNUSED(sender); - // Manually invoke the delegate's -menuWillOpen: method. - // See QTBUG-39604 (and its fix) for details. - [[dockMenu delegate] menuWillOpen:dockMenu]; - return [[dockMenu retain] autorelease]; -} - -- (void)setMenuLoader:(QCocoaMenuLoader *)menuLoader -{ - [menuLoader retain]; - [qtMenuLoader release]; - qtMenuLoader = menuLoader; -} - -- (QCocoaMenuLoader *)menuLoader -{ - return [[qtMenuLoader retain] autorelease]; -} - -- (BOOL) canQuit -{ - [[NSApp mainMenu] cancelTracking]; - - bool handle_quit = true; - NSMenuItem *quitMenuItem = [[[QCocoaApplicationDelegate sharedDelegate] menuLoader] quitMenuItem]; - if (!QGuiApplicationPrivate::instance()->modalWindowList.isEmpty() - && [quitMenuItem isEnabled]) { - int visible = 0; - const QWindowList tlws = QGuiApplication::topLevelWindows(); - for (int i = 0; i < tlws.size(); ++i) { - if (tlws.at(i)->isVisible()) - ++visible; - } - handle_quit = (visible <= 1); - } - - if (handle_quit) { - QCloseEvent ev; - QGuiApplication::sendEvent(qGuiApp, &ev); - if (ev.isAccepted()) { - return YES; - } - } - - return NO; -} - -// This function will only be called when NSApp is actually running. -- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender -{ - // The reflection delegate gets precedence - if (reflectionDelegate) { - if ([reflectionDelegate respondsToSelector:@selector(applicationShouldTerminate:)]) - return [reflectionDelegate applicationShouldTerminate:sender]; - //return NSTerminateNow; - } - - if ([self canQuit]) { - if (!startedQuit) { - startedQuit = true; - // Close open windows. This is done in order to deliver de-expose - // events while the event loop is still running. - const QWindowList topLevels = QGuiApplication::topLevelWindows(); - for (int i = 0; i < topLevels.size(); ++i) { - QWindow *topLevelWindow = topLevels.at(i); - // Widgets have alreay received a CloseEvent from the QApplication - // QCloseEvent handler. (see canQuit above). Prevent running the - // CloseEvent logic twice, call close() directly. - if (topLevelWindow->inherits("QWidgetWindow")) - topLevelWindow->close(); - else - QWindowSystemInterface::handleCloseEvent(topLevelWindow); - } - QWindowSystemInterface::flushWindowSystemEvents(); - - QGuiApplication::exit(0); - startedQuit = false; - } - } - - if (QGuiApplicationPrivate::instance()->threadData->eventLoops.isEmpty()) { - // INVARIANT: No event loop is executing. This probably - // means that Qt is used as a plugin, or as a part of a native - // Cocoa application. In any case it should be fine to - // terminate now: - return NSTerminateNow; - } - - return NSTerminateCancel; -} - -- (void) applicationWillFinishLaunching:(NSNotification *)notification -{ - Q_UNUSED(notification); - - /* - From the Cocoa documentation: "A good place to install event handlers - is in the applicationWillFinishLaunching: method of the application - delegate. At that point, the Application Kit has installed its default - event handlers, so if you install a handler for one of the same events, - it will replace the Application Kit version." - */ - - /* - If Qt is used as a plugin, we let the 3rd party application handle - events like quit and open file events. Otherwise, if we install our own - handlers, we easily end up breaking functionality the 3rd party - application depends on. - */ - NSAppleEventManager *eventManager = [NSAppleEventManager sharedAppleEventManager]; - [eventManager setEventHandler:self - andSelector:@selector(appleEventQuit:withReplyEvent:) - forEventClass:kCoreEventClass - andEventID:kAEQuitApplication]; - [eventManager setEventHandler:self - andSelector:@selector(getUrl:withReplyEvent:) - forEventClass:kInternetEventClass - andEventID:kAEGetURL]; -} - -// called by QCocoaIntegration's destructor before resetting the application delegate to nil -- (void) removeAppleEventHandlers -{ - NSAppleEventManager *eventManager = [NSAppleEventManager sharedAppleEventManager]; - [eventManager removeEventHandlerForEventClass:kCoreEventClass andEventID:kAEQuitApplication]; - [eventManager removeEventHandlerForEventClass:kInternetEventClass andEventID:kAEGetURL]; -} - -- (void)applicationDidFinishLaunching:(NSNotification *)aNotification -{ - Q_UNUSED(aNotification); - inLaunch = false; - // qt_release_apple_event_handler(); - - - // Insert code here to initialize your application -} - - - -- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames -{ - Q_UNUSED(filenames); - Q_UNUSED(sender); - - for (NSString *fileName in filenames) { - QString qtFileName = QCFString::toQString(fileName); - if (inLaunch) { - // We need to be careful because Cocoa will be nice enough to take - // command line arguments and send them to us as events. Given the history - // of Qt Applications, this will result in behavior people don't want, as - // they might be doing the opening themselves with the command line parsing. - if (qApp->arguments().contains(qtFileName)) - continue; - } - QWindowSystemInterface::handleFileOpenEvent(qtFileName); - } - - if (reflectionDelegate && - [reflectionDelegate respondsToSelector:@selector(application:openFiles:)]) - [reflectionDelegate application:sender openFiles:filenames]; - -} - -- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender -{ - // If we have a reflection delegate, that will get to call the shots. - if (reflectionDelegate - && [reflectionDelegate respondsToSelector: - @selector(applicationShouldTerminateAfterLastWindowClosed:)]) - return [reflectionDelegate applicationShouldTerminateAfterLastWindowClosed:sender]; - return NO; // Someday qApp->quitOnLastWindowClosed(); when QApp and NSApp work closer together. -} - - -- (void)applicationDidBecomeActive:(NSNotification *)notification -{ - if (reflectionDelegate - && [reflectionDelegate respondsToSelector:@selector(applicationDidBecomeActive:)]) - [reflectionDelegate applicationDidBecomeActive:notification]; - - QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive); -/* - onApplicationChangedActivation(true); - - if (!QWidget::mouseGrabber()){ - // Update enter/leave immidiatly, don't wait for a move event. But only - // if no grab exists (even if the grab points to this widget, it seems, ref X11) - QPoint qlocal, qglobal; - QWidget *widgetUnderMouse = 0; - qt_mac_getTargetForMouseEvent(0, QEvent::Enter, qlocal, qglobal, 0, &widgetUnderMouse); - QApplicationPrivate::dispatchEnterLeave(widgetUnderMouse, 0); - qt_last_mouse_receiver = widgetUnderMouse; - qt_last_native_mouse_receiver = widgetUnderMouse ? - (widgetUnderMouse->internalWinId() ? widgetUnderMouse : widgetUnderMouse->nativeParentWidget()) : 0; - } -*/ -} - -- (void)applicationDidResignActive:(NSNotification *)notification -{ - if (reflectionDelegate - && [reflectionDelegate respondsToSelector:@selector(applicationDidResignActive:)]) - [reflectionDelegate applicationDidResignActive:notification]; - - QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationInactive); -/* - onApplicationChangedActivation(false); - - if (!QWidget::mouseGrabber()) - QApplicationPrivate::dispatchEnterLeave(0, qt_last_mouse_receiver); - qt_last_mouse_receiver = 0; - qt_last_native_mouse_receiver = 0; - qt_button_down = 0; -*/ -} - -- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag -{ - Q_UNUSED(theApplication); - Q_UNUSED(flag); - if (reflectionDelegate - && [reflectionDelegate respondsToSelector:@selector(applicationShouldHandleReopen:hasVisibleWindows:)]) - return [reflectionDelegate applicationShouldHandleReopen:theApplication hasVisibleWindows:flag]; - - /* - true to force delivery of the event even if the application state is already active, - because rapp (handle reopen) events are sent each time the dock icon is clicked regardless - of the active state of the application or number of visible windows. For example, a browser - app that has no windows opened would need the event be to delivered even if it was already - active in order to create a new window as per OS X conventions. - */ - QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive, true /*forcePropagate*/); - - return YES; -} - -- (void)setReflectionDelegate:(NSObject *)oldDelegate -{ - [oldDelegate retain]; - [reflectionDelegate release]; - reflectionDelegate = oldDelegate; -} - -- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector -{ - NSMethodSignature *result = [super methodSignatureForSelector:aSelector]; - if (!result && reflectionDelegate) { - result = [reflectionDelegate methodSignatureForSelector:aSelector]; - } - return result; -} - -- (BOOL)respondsToSelector:(SEL)aSelector -{ - BOOL result = [super respondsToSelector:aSelector]; - if (!result && reflectionDelegate) - result = [reflectionDelegate respondsToSelector:aSelector]; - return result; -} - -- (void)forwardInvocation:(NSInvocation *)invocation -{ - SEL invocationSelector = [invocation selector]; - if (reflectionDelegate && [reflectionDelegate respondsToSelector:invocationSelector]) - [invocation invokeWithTarget:reflectionDelegate]; - else - [self doesNotRecognizeSelector:invocationSelector]; -} - -- (void)getUrl:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent -{ - Q_UNUSED(replyEvent); - NSString *urlString = [[event paramDescriptorForKeyword:keyDirectObject] stringValue]; - QWindowSystemInterface::handleFileOpenEvent(QUrl(QCFString::toQString(urlString))); -} - -- (void)appleEventQuit:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent -{ - Q_UNUSED(event); - Q_UNUSED(replyEvent); - [NSApp terminate:self]; -} - -- (void)qtDispatcherToQAction:(id)sender -{ - Q_UNUSED(sender); - [qtMenuLoader qtDispatcherToQPAMenuItem:sender]; -} - -@end diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoabackingstore.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoabackingstore.h deleted file mode 100644 index 1014a2104..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoabackingstore.h +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QBACKINGSTORE_COCOA_H -#define QBACKINGSTORE_COCOA_H - -#include - -#include "qcocoawindow.h" -#include "qnsview.h" - -#include - -QT_BEGIN_NAMESPACE - -class QCocoaBackingStore : public QPlatformBackingStore -{ -public: - QCocoaBackingStore(QWindow *window); - ~QCocoaBackingStore(); - - QPaintDevice *paintDevice(); - void flush(QWindow *widget, const QRegion ®ion, const QPoint &offset); - QImage toImage() const; - void resize (const QSize &size, const QRegion &); - bool scroll(const QRegion &area, int dx, int dy); - void beginPaint(const QRegion ®ion); - void beforeBeginPaint(QWindow *widget); - void afterEndPaint(QWindow *widget); - qreal getBackingStoreDevicePixelRatio(); - -private: - QImage m_qImage; - QSize m_requestedSize; - bool m_qImageNeedsClear, m_imageWasEqual; -}; - -QT_END_NAMESPACE - -#endif diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoabackingstore.mm deleted file mode 100644 index cab243e43..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoabackingstore.mm +++ /dev/null @@ -1,137 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qcocoabackingstore.h" -#include -#include "qcocoahelpers.h" - -QT_BEGIN_NAMESPACE - -QCocoaBackingStore::QCocoaBackingStore(QWindow *window) - : QPlatformBackingStore(window), m_qImageNeedsClear(false), m_imageWasEqual(false) -{ -} - -QCocoaBackingStore::~QCocoaBackingStore() -{ -} - -QPaintDevice *QCocoaBackingStore::paintDevice() -{ - QCocoaWindow *cocoaWindow = static_cast(window()->handle()); - int windowDevicePixelRatio = int(cocoaWindow->devicePixelRatio()); - - // Receate the backing store buffer if the effective buffer size has changed, - // either due to a window resize or devicePixelRatio change. - QSize effectiveBufferSize = m_requestedSize * windowDevicePixelRatio; - if (m_qImage.size() != effectiveBufferSize) { - QImage::Format format = (window()->format().hasAlpha() || cocoaWindow->m_drawContentBorderGradient) - ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32; - m_qImageNeedsClear = window()->requestedFormat().hasAlpha() || cocoaWindow->m_drawContentBorderGradient; - m_qImage = QImage(effectiveBufferSize, format); - m_qImage.setDevicePixelRatio(windowDevicePixelRatio); - if (m_qImageNeedsClear) - m_qImage.fill(Qt::transparent); - } - return &m_qImage; -} - -void QCocoaBackingStore::flush(QWindow *win, const QRegion ®ion, const QPoint &offset) -{ - if (!m_qImage.isNull()) { - if (QCocoaWindow *cocoaWindow = static_cast(win->handle())) - [cocoaWindow->m_qtView flushBackingStore:this region:region offset:offset]; - } -} - -QImage QCocoaBackingStore::toImage() const -{ - return m_qImage; -} - -void QCocoaBackingStore::resize(const QSize &size, const QRegion &) -{ - m_requestedSize = size; -} - -bool QCocoaBackingStore::scroll(const QRegion &area, int dx, int dy) -{ - extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset); - const qreal devicePixelRatio = m_qImage.devicePixelRatio(); - QPoint qpoint(dx * devicePixelRatio, dy * devicePixelRatio); - const QVector qrects = area.rects(); - for (int i = 0; i < qrects.count(); ++i) { - const QRect &qrect = QRect(qrects.at(i).topLeft() * devicePixelRatio, qrects.at(i).size() * devicePixelRatio); - qt_scrollRectInImage(m_qImage, qrect, qpoint); - } - return true; -} - -void QCocoaBackingStore::beginPaint(const QRegion ®ion) -{ - if (m_qImageNeedsClear && m_qImage.hasAlphaChannel()) { - QPainter p(&m_qImage); - p.setCompositionMode(QPainter::CompositionMode_Source); - const QVector rects = region.rects(); - const QColor blank = Qt::transparent; - for (QVector::const_iterator it = rects.begin(), end = rects.end(); it != end; ++it) - p.fillRect(*it, blank); - } -} - -void QCocoaBackingStore::beforeBeginPaint(QWindow *win) { - m_imageWasEqual = false; - if (!m_qImage.isNull()) { - if (QCocoaWindow *cocoaWindow = static_cast(win->handle())) { - if ([cocoaWindow->m_qtView beforeBeginPaint:this]) - m_imageWasEqual = true; - } - } -} - -void QCocoaBackingStore::afterEndPaint(QWindow *win) { - if (!m_qImage.isNull()) { - if (QCocoaWindow *cocoaWindow = static_cast(win->handle())) { - if (m_imageWasEqual) - [cocoaWindow->m_qtView afterEndPaint:this]; - } - } - m_imageWasEqual = false; -} - -qreal QCocoaBackingStore::getBackingStoreDevicePixelRatio() -{ - return m_qImage.devicePixelRatio(); -} - -QT_END_NAMESPACE diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoacursor.mm b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoacursor.mm deleted file mode 100644 index 922809f90..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoacursor.mm +++ /dev/null @@ -1,323 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qcocoacursor.h" -#include "qcocoawindow.h" -#include "qcocoahelpers.h" -#include "qcocoaautoreleasepool.h" - -#include - -QT_BEGIN_NAMESPACE - -QCocoaCursor::QCocoaCursor() -{ -} - -QCocoaCursor::~QCocoaCursor() -{ - // release cursors - QHash::const_iterator i = m_cursors.constBegin(); - while (i != m_cursors.constEnd()) { - [*i release]; - ++i; - } -} - -void QCocoaCursor::changeCursor(QCursor *cursor, QWindow *window) -{ - NSCursor * cocoaCursor = convertCursor(cursor); - - if (QPlatformWindow * platformWindow = window->handle()) - static_cast(platformWindow)->setWindowCursor(cocoaCursor); -} - -QPoint QCocoaCursor::pos() const -{ - return qt_mac_flipPoint([NSEvent mouseLocation]).toPoint(); -} - -void QCocoaCursor::setPos(const QPoint &position) -{ - CGPoint pos; - pos.x = position.x(); - pos.y = position.y(); - - CGEventRef e = CGEventCreateMouseEvent(0, kCGEventMouseMoved, pos, kCGMouseButtonLeft); - CGEventPost(kCGHIDEventTap, e); - CFRelease(e); -} - -NSCursor *QCocoaCursor::convertCursor(QCursor * cursor) -{ - const Qt::CursorShape newShape = cursor ? cursor->shape() : Qt::ArrowCursor; - NSCursor *cocoaCursor; - - // Check for a suitable built-in NSCursor first: - switch (newShape) { - case Qt::ArrowCursor: - cocoaCursor= [NSCursor arrowCursor]; - break; - case Qt::CrossCursor: - cocoaCursor = [NSCursor crosshairCursor]; - break; - case Qt::IBeamCursor: - cocoaCursor = [NSCursor IBeamCursor]; - break; - case Qt::WhatsThisCursor: //for now just use the pointing hand - case Qt::PointingHandCursor: - cocoaCursor = [NSCursor pointingHandCursor]; - break; - case Qt::SplitVCursor: - cocoaCursor = [NSCursor resizeUpDownCursor]; - break; - case Qt::SplitHCursor: - cocoaCursor = [NSCursor resizeLeftRightCursor]; - break; - case Qt::OpenHandCursor: - cocoaCursor = [NSCursor openHandCursor]; - break; - case Qt::ClosedHandCursor: - cocoaCursor = [NSCursor closedHandCursor]; - break; - case Qt::DragMoveCursor: - cocoaCursor = [NSCursor crosshairCursor]; - break; - case Qt::DragCopyCursor: - cocoaCursor = [NSCursor crosshairCursor]; - break; - case Qt::DragLinkCursor: - cocoaCursor = [NSCursor dragLinkCursor]; - break; - default : { - // No suitable OS cursor exist, use cursors provided - // by Qt for the rest. Check for a cached cursor: - cocoaCursor = m_cursors.value(newShape); - if (cocoaCursor && cursor->shape() == Qt::BitmapCursor) { - [cocoaCursor release]; - cocoaCursor = 0; - } - if (cocoaCursor == 0) { - cocoaCursor = createCursorData(cursor); - if (cocoaCursor == 0) - return [NSCursor arrowCursor]; - - m_cursors.insert(newShape, cocoaCursor); - } - - break; } - } - return cocoaCursor; -} - - -// Creates an NSCursor for the given QCursor. -NSCursor *QCocoaCursor::createCursorData(QCursor *cursor) -{ - /* Note to self... *** - * mask x data - * 0xFF x 0x00 == fully opaque white - * 0x00 x 0xFF == xor'd black - * 0xFF x 0xFF == fully opaque black - * 0x00 x 0x00 == fully transparent - */ -#define QT_USE_APPROXIMATE_CURSORS -#ifdef QT_USE_APPROXIMATE_CURSORS - static const uchar cur_ver_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0xc0, 0x07, 0xe0, 0x0f, 0xf0, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x0f, 0xf0, - 0x07, 0xe0, 0x03, 0xc0, 0x01, 0x80, 0x00, 0x00 }; - static const uchar mcur_ver_bits[] = { - 0x00, 0x00, 0x03, 0x80, 0x07, 0xc0, 0x0f, 0xe0, 0x1f, 0xf0, 0x3f, 0xf8, - 0x7f, 0xfc, 0x07, 0xc0, 0x07, 0xc0, 0x07, 0xc0, 0x7f, 0xfc, 0x3f, 0xf8, - 0x1f, 0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0x80 }; - - static const uchar cur_hor_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x18, 0x30, - 0x38, 0x38, 0x7f, 0xfc, 0x7f, 0xfc, 0x38, 0x38, 0x18, 0x30, 0x08, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - static const uchar mcur_hor_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x0c, 0x60, 0x1c, 0x70, 0x3c, 0x78, - 0x7f, 0xfc, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0x7f, 0xfc, 0x3c, 0x78, - 0x1c, 0x70, 0x0c, 0x60, 0x04, 0x40, 0x00, 0x00 }; - - static const uchar cur_fdiag_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0x78, - 0x00, 0xf8, 0x01, 0xd8, 0x23, 0x88, 0x37, 0x00, 0x3e, 0x00, 0x3c, 0x00, - 0x3e, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00 }; - static const uchar mcur_fdiag_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x03, 0xfc, 0x01, 0xfc, 0x00, 0xfc, - 0x41, 0xfc, 0x63, 0xfc, 0x77, 0xdc, 0x7f, 0x8c, 0x7f, 0x04, 0x7e, 0x00, - 0x7f, 0x00, 0x7f, 0x80, 0x7f, 0xc0, 0x00, 0x00 }; - - static const uchar cur_bdiag_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3c, 0x00, 0x3e, 0x00, - 0x37, 0x00, 0x23, 0x88, 0x01, 0xd8, 0x00, 0xf8, 0x00, 0x78, 0x00, 0xf8, - 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - static const uchar mcur_bdiag_bits[] = { - 0x00, 0x00, 0x7f, 0xc0, 0x7f, 0x80, 0x7f, 0x00, 0x7e, 0x00, 0x7f, 0x04, - 0x7f, 0x8c, 0x77, 0xdc, 0x63, 0xfc, 0x41, 0xfc, 0x00, 0xfc, 0x01, 0xfc, - 0x03, 0xfc, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00 }; - - static const unsigned char cur_up_arrow_bits[] = { - 0x00, 0x80, 0x01, 0x40, 0x01, 0x40, 0x02, 0x20, 0x02, 0x20, 0x04, 0x10, - 0x04, 0x10, 0x08, 0x08, 0x0f, 0x78, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, - 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0xc0 }; - static const unsigned char mcur_up_arrow_bits[] = { - 0x00, 0x80, 0x01, 0xc0, 0x01, 0xc0, 0x03, 0xe0, 0x03, 0xe0, 0x07, 0xf0, - 0x07, 0xf0, 0x0f, 0xf8, 0x0f, 0xf8, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, - 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0 }; -#endif - const uchar *cursorData = 0; - const uchar *cursorMaskData = 0; - QPoint hotspot = cursor->hotSpot(); - - switch (cursor->shape()) { - case Qt::BitmapCursor: { - if (cursor->pixmap().isNull()) - return createCursorFromBitmap(cursor->bitmap(), cursor->mask(), hotspot); - else - return createCursorFromPixmap(cursor->pixmap(), hotspot); - break; } - case Qt::BlankCursor: { - QPixmap pixmap = QPixmap(16, 16); - pixmap.fill(Qt::transparent); - return createCursorFromPixmap(pixmap); - break; } - case Qt::WaitCursor: { - QPixmap pixmap = QPixmap(QLatin1String(":/qt-project.org/mac/cursors/images/spincursor.png")); - return createCursorFromPixmap(pixmap, hotspot); - break; } - case Qt::SizeAllCursor: { - QPixmap pixmap = QPixmap(QLatin1String(":/qt-project.org/mac/cursors/images/sizeallcursor.png")); - return createCursorFromPixmap(pixmap, QPoint(8, 8)); - break; } - case Qt::BusyCursor: { - QPixmap pixmap = QPixmap(QLatin1String(":/qt-project.org/mac/cursors/images/waitcursor.png")); - return createCursorFromPixmap(pixmap, hotspot); - break; } - case Qt::ForbiddenCursor: { - QPixmap pixmap = QPixmap(QLatin1String(":/qt-project.org/mac/cursors/images/forbiddencursor.png")); - return createCursorFromPixmap(pixmap, hotspot); - break; } -#define QT_USE_APPROXIMATE_CURSORS -#ifdef QT_USE_APPROXIMATE_CURSORS - case Qt::SizeVerCursor: - cursorData = cur_ver_bits; - cursorMaskData = mcur_ver_bits; - hotspot = QPoint(8, 8); - break; - case Qt::SizeHorCursor: - cursorData = cur_hor_bits; - cursorMaskData = mcur_hor_bits; - hotspot = QPoint(8, 8); - break; - case Qt::SizeBDiagCursor: - cursorData = cur_fdiag_bits; - cursorMaskData = mcur_fdiag_bits; - hotspot = QPoint(8, 8); - break; - case Qt::SizeFDiagCursor: - cursorData = cur_bdiag_bits; - cursorMaskData = mcur_bdiag_bits; - hotspot = QPoint(8, 8); - break; - case Qt::UpArrowCursor: - cursorData = cur_up_arrow_bits; - cursorMaskData = mcur_up_arrow_bits; - hotspot = QPoint(8, 0); - break; -#endif - default: - qWarning("Qt: QCursor::update: Invalid cursor shape %d", cursor->shape()); - return 0; - } - - // Create an NSCursor from image data if this a self-provided cursor. - if (cursorData) { - QBitmap bitmap(QBitmap::fromData(QSize(16, 16), cursorData, QImage::Format_Mono)); - QBitmap mask(QBitmap::fromData(QSize(16, 16), cursorMaskData, QImage::Format_Mono)); - return (createCursorFromBitmap(&bitmap, &mask, hotspot)); - } - - return 0; // should not happen, all cases covered above -} - -NSCursor *QCocoaCursor::createCursorFromBitmap(const QBitmap *bitmap, const QBitmap *mask, const QPoint hotspot) -{ - QImage finalCursor(bitmap->size(), QImage::Format_ARGB32); - QImage bmi = bitmap->toImage().convertToFormat(QImage::Format_RGB32); - QImage bmmi = mask->toImage().convertToFormat(QImage::Format_RGB32); - for (int row = 0; row < finalCursor.height(); ++row) { - QRgb *bmData = reinterpret_cast(bmi.scanLine(row)); - QRgb *bmmData = reinterpret_cast(bmmi.scanLine(row)); - QRgb *finalData = reinterpret_cast(finalCursor.scanLine(row)); - for (int col = 0; col < finalCursor.width(); ++col) { - if (bmmData[col] == 0xff000000 && bmData[col] == 0xffffffff) { - finalData[col] = 0xffffffff; - } else if (bmmData[col] == 0xff000000 && bmData[col] == 0xffffffff) { - finalData[col] = 0x7f000000; - } else if (bmmData[col] == 0xffffffff && bmData[col] == 0xffffffff) { - finalData[col] = 0x00000000; - } else { - finalData[col] = 0xff000000; - } - } - } - - return createCursorFromPixmap(QPixmap::fromImage(finalCursor), hotspot); -} - -NSCursor *QCocoaCursor::createCursorFromPixmap(const QPixmap pixmap, const QPoint hotspot) -{ - NSPoint hotSpot = NSMakePoint(hotspot.x(), hotspot.y()); - NSImage *nsimage; - if (pixmap.devicePixelRatio() > 1.0) { - QSize layoutSize = pixmap.size() / pixmap.devicePixelRatio(); - QPixmap scaledPixmap = pixmap.scaled(layoutSize); - nsimage = static_cast(qt_mac_create_nsimage(scaledPixmap)); - CGImageRef cgImage = qt_mac_toCGImage(pixmap.toImage()); - NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithCGImage:cgImage]; - [nsimage addRepresentation:imageRep]; - [imageRep release]; - CGImageRelease(cgImage); - } else { - nsimage = static_cast(qt_mac_create_nsimage(pixmap)); - } - - NSCursor *nsCursor = [[NSCursor alloc] initWithImage:nsimage hotSpot: hotSpot]; - [nsimage release]; - return nsCursor; -} - -QT_END_NAMESPACE diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm deleted file mode 100644 index 9c695aaec..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm +++ /dev/null @@ -1,550 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Copyright (C) 2012 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Christoph Schleifenbaum -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/**************************************************************************** -** -** Copyright (c) 2007-2008, Apple, Inc. -** -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** -** * Neither the name of Apple, Inc. nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -****************************************************************************/ - -#define QT_MAC_SYSTEMTRAY_USE_GROWL - -#include "qcocoasystemtrayicon.h" -#include -#include -#include - -#include "qcocoamenu.h" - -#include "qt_mac_p.h" -#include "qcocoahelpers.h" - -#import - -QT_USE_NAMESPACE - -@class QT_MANGLE_NAMESPACE(QNSMenu); -@class QT_MANGLE_NAMESPACE(QNSImageView); - -@interface QT_MANGLE_NAMESPACE(QNSStatusItem) : NSObject -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 - -#endif - { -@public - QCocoaSystemTrayIcon *systray; - NSStatusItem *item; - QCocoaMenu *menu; - bool menuVisible, iconSelected; - QIcon icon; - QT_MANGLE_NAMESPACE(QNSImageView) *imageCell; -} --(id)initWithSysTray:(QCocoaSystemTrayIcon *)systray; --(void)dealloc; --(NSStatusItem*)item; --(QRectF)geometry; -- (void)triggerSelector:(id)sender button:(Qt::MouseButton)mouseButton; -- (void)doubleClickSelector:(id)sender; - -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 -- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center shouldPresentNotification:(NSUserNotification *)notification; -- (void)userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification; -#endif -@end - -@interface QT_MANGLE_NAMESPACE(QNSImageView) : NSImageView { - BOOL down; - QT_MANGLE_NAMESPACE(QNSStatusItem) *parent; -} --(id)initWithParent:(QT_MANGLE_NAMESPACE(QNSStatusItem)*)myParent; --(void)menuTrackingDone:(NSNotification*)notification; --(void)mousePressed:(NSEvent *)mouseEvent button:(Qt::MouseButton)mouseButton; -@end - -@interface QT_MANGLE_NAMESPACE(QNSMenu) : NSMenu { - QPlatformMenu *qmenu; -} --(QPlatformMenu*)menu; --(id)initWithQMenu:(QPlatformMenu*)qmenu; -@end - -QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSStatusItem); -QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSImageView); -QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSMenu); - -QT_BEGIN_NAMESPACE -class QSystemTrayIconSys -{ -public: - QSystemTrayIconSys(QCocoaSystemTrayIcon *sys) { - item = [[QNSStatusItem alloc] initWithSysTray:sys]; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 - if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_8) { - [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:item]; - } -#endif - } - ~QSystemTrayIconSys() { - [[[item item] view] setHidden: YES]; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 - if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_8) { - [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:nil]; - } -#endif - [item release]; - } - QNSStatusItem *item; -}; - -void QCocoaSystemTrayIcon::init() -{ - if (!m_sys) - m_sys = new QSystemTrayIconSys(this); -} - -QRect QCocoaSystemTrayIcon::geometry() const -{ - if (!m_sys) - return QRect(); - - const QRectF geom = [m_sys->item geometry]; - if (!geom.isNull()) - return geom.toRect(); - else - return QRect(); -} - -void QCocoaSystemTrayIcon::cleanup() -{ - delete m_sys; - m_sys = 0; -} - -static bool heightCompareFunction (QSize a, QSize b) { return (a.height() < b.height()); } -static QList sortByHeight(const QList &sizes) -{ - QList sorted = sizes; - std::sort(sorted.begin(), sorted.end(), heightCompareFunction); - return sorted; -} - -void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon) -{ - if (!m_sys) - return; - - m_sys->item->icon = icon; - - // The reccomended maximum title bar icon height is 18 points - // (device independent pixels). The menu height on past and - // current OS X versions is 22 points. Provide some future-proofing - // by deriving the icon height from the menu height. - const int padding = 0; - const int menuHeight = [[[NSApplication sharedApplication] mainMenu] menuBarHeight]; - const int maxImageHeight = menuHeight - padding; - - // Select pixmap based on the device pixel height. Ideally we would use - // the devicePixelRatio of the target screen, but that value is not - // known until draw time. Use qApp->devicePixelRatio, which returns the - // devicePixelRatio for the "best" screen on the system. - qreal devicePixelRatio = qApp->devicePixelRatio(); - const int maxPixmapHeight = maxImageHeight * devicePixelRatio; - const QIcon::Mode mode = m_sys->item->iconSelected ? QIcon::Selected : QIcon::Normal; - QSize selectedSize; - Q_FOREACH (const QSize& size, sortByHeight(icon.availableSizes(mode))) { - // Select a pixmap based on the height. We want the largest pixmap - // with a height smaller or equal to maxPixmapHeight. The pixmap - // may rectangular; assume it has a reasonable size. If there is - // not suitable pixmap use the smallest one the icon can provide. - if (size.height() <= maxPixmapHeight) { - selectedSize = size; - } else { - if (!selectedSize.isValid()) - selectedSize = size; - break; - } - } - - // Handle SVG icons, which do not return anything for availableSizes(). - if (!selectedSize.isValid()) - selectedSize = icon.actualSize(QSize(maxPixmapHeight, maxPixmapHeight), mode); - - QPixmap pixmap = icon.pixmap(selectedSize, mode); - - // Draw a low-resolution icon if there is not enough pixels for a retina - // icon. This prevents showing a small icon on retina displays. - if (devicePixelRatio > 1.0 && selectedSize.height() < maxPixmapHeight / 2) - devicePixelRatio = 1.0; - - // Scale large pixmaps to fit the available menu bar area. - if (pixmap.height() > maxPixmapHeight) - pixmap = pixmap.scaledToHeight(maxPixmapHeight, Qt::SmoothTransformation); - - // The icon will be stretched over the full height of the menu bar - // therefore we create a second pixmap which has the full height - QSize fullHeightSize(!pixmap.isNull() ? pixmap.width(): - menuHeight * devicePixelRatio, - menuHeight * devicePixelRatio); - QPixmap fullHeightPixmap(fullHeightSize); - fullHeightPixmap.fill(Qt::transparent); - if (!pixmap.isNull()) { - QPainter p(&fullHeightPixmap); - QRect r = pixmap.rect(); - r.moveCenter(fullHeightPixmap.rect().center()); - p.drawPixmap(r, pixmap); - } - - NSImage *nsimage = static_cast(qt_mac_create_nsimage(fullHeightPixmap)); - [(NSImageView*)[[m_sys->item item] view] setImage: nsimage]; - [nsimage release]; -} - -void QCocoaSystemTrayIcon::updateMenu(QPlatformMenu *menu) -{ - if (!m_sys) - return; - - m_sys->item->menu = static_cast(menu); - if (menu && [m_sys->item->menu->nsMenu() numberOfItems] > 0) { - [[m_sys->item item] setHighlightMode:YES]; - } else { - [[m_sys->item item] setHighlightMode:NO]; - } -} - -void QCocoaSystemTrayIcon::updateToolTip(const QString &toolTip) -{ - if (!m_sys) - return; - [[[m_sys->item item] view] setToolTip:QCFString::toNSString(toolTip)]; -} - -bool QCocoaSystemTrayIcon::isSystemTrayAvailable() const -{ - return true; -} - -bool QCocoaSystemTrayIcon::supportsMessages() const -{ - return true; -} - -void QCocoaSystemTrayIcon::showMessage(const QString &title, const QString &message, - const QIcon& icon, MessageIcon, int) -{ - if (!m_sys) - return; - -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 - if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_8) { - NSUserNotification *notification = [[NSUserNotification alloc] init]; - notification.title = [NSString stringWithUTF8String:title.toUtf8().data()]; - notification.informativeText = [NSString stringWithUTF8String:message.toUtf8().data()]; - - [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification]; - - return; - } -#endif - -#ifdef QT_MAC_SYSTEMTRAY_USE_GROWL - // Make sure that we have Growl installed on the machine we are running on. - QCFType cfurl; - OSStatus status = LSGetApplicationForInfo(kLSUnknownType, kLSUnknownCreator, - CFSTR("growlTicket"), kLSRolesAll, 0, &cfurl); - if (status == kLSApplicationNotFoundErr) - return; - QCFType bundle = CFBundleCreate(0, cfurl); - - if (CFStringCompare(CFBundleGetIdentifier(bundle), CFSTR("com.Growl.GrowlHelperApp"), - kCFCompareCaseInsensitive | kCFCompareBackwards) != kCFCompareEqualTo) - return; - QPixmap notificationIconPixmap = icon.pixmap(32, 32); - QTemporaryFile notificationIconFile; - QString notificationType(QLatin1String("Notification")), notificationIcon, notificationApp(qt_mac_applicationName()); - if (notificationApp.isEmpty()) - notificationApp = QLatin1String("Application"); - if (!notificationIconPixmap.isNull() && notificationIconFile.open()) { - QImageWriter writer(¬ificationIconFile, "PNG"); - if (writer.write(notificationIconPixmap.toImage())) - notificationIcon = QLatin1String("image from location \"file://") + notificationIconFile.fileName() + QLatin1String("\""); - } - const QString script(QLatin1String( - "tell application \"System Events\"\n" - "set isRunning to (count of (every process whose bundle identifier is \"com.Growl.GrowlHelperApp\")) > 0\n" - "end tell\n" - "if isRunning\n" - "tell application id \"com.Growl.GrowlHelperApp\"\n" - "-- Make a list of all the notification types (all)\n" - "set the allNotificationsList to {\"") + notificationType + QLatin1String("\"}\n" - - "-- Make a list of the notifications (enabled)\n" - "set the enabledNotificationsList to {\"") + notificationType + QLatin1String("\"}\n" - - "-- Register our script with growl.\n" - "register as application \"") + notificationApp + QLatin1String("\" all notifications allNotificationsList default notifications enabledNotificationsList\n" - - "-- Send a Notification...\n") + - QLatin1String("notify with name \"") + notificationType + - QLatin1String("\" title \"") + title + - QLatin1String("\" description \"") + message + - QLatin1String("\" application name \"") + notificationApp + - QLatin1String("\" ") + notificationIcon + - QLatin1String("\nend tell\nend if")); - qt_mac_execute_apple_script(script, 0); -#else - Q_UNUSED(icon); - Q_UNUSED(title); - Q_UNUSED(message); -#endif -} -QT_END_NAMESPACE - -@implementation NSStatusItem (Qt) -@end - -@implementation QNSImageView --(id)initWithParent:(QNSStatusItem*)myParent { - self = [super init]; - parent = myParent; - down = NO; - return self; -} - --(void)menuTrackingDone:(NSNotification*)notification -{ - Q_UNUSED(notification); - down = NO; - - parent->iconSelected = false; - parent->systray->updateIcon(parent->icon); - parent->menuVisible = false; - - [self setNeedsDisplay:YES]; -} - --(void)mousePressed:(NSEvent *)mouseEvent button:(Qt::MouseButton)mouseButton -{ - down = YES; - int clickCount = [mouseEvent clickCount]; - [self setNeedsDisplay:YES]; - - parent->iconSelected = (clickCount != 2) && parent->menu; - parent->systray->updateIcon(parent->icon); - - if (clickCount == 2) { - [self menuTrackingDone:nil]; - [parent doubleClickSelector:self]; - } else { - [parent triggerSelector:self button:mouseButton]; - } -} - --(void)mouseDown:(NSEvent *)mouseEvent -{ - [self mousePressed:mouseEvent button:Qt::LeftButton]; -} - --(void)mouseUp:(NSEvent *)mouseEvent -{ - Q_UNUSED(mouseEvent); - - parent->iconSelected = false; - parent->systray->updateIcon(parent->icon); - - [self menuTrackingDone:nil]; -} - -- (void)rightMouseDown:(NSEvent *)mouseEvent -{ - [self mousePressed:mouseEvent button:Qt::RightButton]; -} - --(void)rightMouseUp:(NSEvent *)mouseEvent -{ - Q_UNUSED(mouseEvent); - - parent->iconSelected = false; - parent->systray->updateIcon(parent->icon); - - [self menuTrackingDone:nil]; -} - -- (void)otherMouseDown:(NSEvent *)mouseEvent -{ - [self mousePressed:mouseEvent button:cocoaButton2QtButton([mouseEvent buttonNumber])]; -} - --(void)otherMouseUp:(NSEvent *)mouseEvent -{ - Q_UNUSED(mouseEvent); - [self menuTrackingDone:nil]; -} - --(void)drawRect:(NSRect)rect { - [[parent item] drawStatusBarBackgroundInRect:rect withHighlight:parent->menu ? down : NO]; - [super drawRect:rect]; -} -@end - -@implementation QNSStatusItem - --(id)initWithSysTray:(QCocoaSystemTrayIcon *)sys -{ - self = [super init]; - if (self) { - item = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain]; - menu = 0; - menuVisible = false; - systray = sys; - imageCell = [[QNSImageView alloc] initWithParent:self]; - [item setView: imageCell]; - } - return self; -} - --(void)dealloc { - [[NSStatusBar systemStatusBar] removeStatusItem:item]; - [[NSNotificationCenter defaultCenter] removeObserver:imageCell]; - [imageCell release]; - [item release]; - [super dealloc]; - -} - --(NSStatusItem*)item { - return item; -} --(QRectF)geometry { - if (NSWindow *window = [[item view] window]) { - NSRect screenRect = [[window screen] frame]; - NSRect windowRect = [window frame]; - return QRectF(windowRect.origin.x, screenRect.size.height-windowRect.origin.y-windowRect.size.height, windowRect.size.width, windowRect.size.height); - } - return QRectF(); -} - -- (void)triggerSelector:(id)sender button:(Qt::MouseButton)mouseButton { - Q_UNUSED(sender); - if (!systray) - return; - - if (mouseButton == Qt::MidButton) - emit systray->activated(QPlatformSystemTrayIcon::MiddleClick); - else - emit systray->activated(QPlatformSystemTrayIcon::Trigger); - - if (menu) { - NSMenu *m = menu->nsMenu(); - [[NSNotificationCenter defaultCenter] addObserver:imageCell - selector:@selector(menuTrackingDone:) - name:NSMenuDidEndTrackingNotification - object:m]; - menuVisible = true; - [item popUpStatusItemMenu: m]; - } -} - -- (void)doubleClickSelector:(id)sender { - Q_UNUSED(sender); - if (!systray) - return; - emit systray->activated(QPlatformSystemTrayIcon::DoubleClick); -} - -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 -- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center shouldPresentNotification:(NSUserNotification *)notification { - Q_UNUSED(center); - Q_UNUSED(notification); - return YES; -} - -- (void)userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification { - Q_UNUSED(center); - Q_UNUSED(notification); - emit systray->messageClicked(); -} -#endif - -@end - -class QSystemTrayIconQMenu : public QPlatformMenu -{ -public: - void doAboutToShow() { emit aboutToShow(); } -private: - QSystemTrayIconQMenu(); -}; - -@implementation QNSMenu --(id)initWithQMenu:(QPlatformMenu*)qm { - self = [super init]; - if (self) { - self->qmenu = qm; - [self setDelegate:self]; - } - return self; -} --(QPlatformMenu*)menu { - return qmenu; -} -@end diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoawindow.mm b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoawindow.mm deleted file mode 100644 index d18884ad5..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qcocoawindow.mm +++ /dev/null @@ -1,1851 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "qcocoawindow.h" -#include "qcocoaintegration.h" -#include "qnswindowdelegate.h" -#include "qcocoaautoreleasepool.h" -#include "qcocoaeventdispatcher.h" -#ifndef QT_NO_OPENGL -#include "qcocoaglcontext.h" -#endif -#include "qcocoahelpers.h" -#include "qcocoanativeinterface.h" -#include "qnsview.h" -#include -#include -#include -#include -#include -#include - -#include -#include - -#include - -enum { - defaultWindowWidth = 160, - defaultWindowHeight = 160 -}; - -static bool isMouseEvent(NSEvent *ev) -{ - switch ([ev type]) { - case NSLeftMouseDown: - case NSLeftMouseUp: - case NSRightMouseDown: - case NSRightMouseUp: - case NSMouseMoved: - case NSLeftMouseDragged: - case NSRightMouseDragged: - return true; - default: - return false; - } -} - -@implementation QNSWindowHelper - -@synthesize window = _window; -@synthesize platformWindow = _platformWindow; -@synthesize grabbingMouse = _grabbingMouse; -@synthesize releaseOnMouseUp = _releaseOnMouseUp; - -- (id)initWithNSWindow:(QCocoaNSWindow *)window platformWindow:(QCocoaWindow *)platformWindow -{ - self = [super init]; - if (self) { - _window = window; - _platformWindow = platformWindow; - - _window.delegate = [[QNSWindowDelegate alloc] initWithQCocoaWindow:_platformWindow]; - - // Prevent Cocoa from releasing the window on close. Qt - // handles the close event asynchronously and we want to - // make sure that m_nsWindow stays valid until the - // QCocoaWindow is deleted by Qt. - [_window setReleasedWhenClosed:NO]; - } - - return self; -} - -- (void)handleWindowEvent:(NSEvent *)theEvent -{ - QCocoaWindow *pw = self.platformWindow; - if (pw && pw->m_forwardWindow) { - if (theEvent.type == NSLeftMouseUp || theEvent.type == NSLeftMouseDragged) { - QNSView *forwardView = pw->m_qtView; - if (theEvent.type == NSLeftMouseUp) { - [forwardView mouseUp:theEvent]; - pw->m_forwardWindow = 0; - } else { - [forwardView mouseDragged:theEvent]; - } - } - - if (!pw->m_isNSWindowChild && theEvent.type == NSLeftMouseDown) { - pw->m_forwardWindow = 0; - } - } - - if (theEvent.type == NSLeftMouseDown) { - self.grabbingMouse = YES; - } else if (theEvent.type == NSLeftMouseUp) { - self.grabbingMouse = NO; - if (self.releaseOnMouseUp) { - [self detachFromPlatformWindow]; - [self.window release]; - return; - } - } - - // The call to -[NSWindow sendEvent] may result in the window being deleted - // (e.g., when closing the window by pressing the title bar close button). - [self retain]; - [self.window superSendEvent:theEvent]; - bool windowStillAlive = self.window != nil; // We need to read before releasing - [self release]; - if (!windowStillAlive) - return; - - if (!self.window.delegate) - return; // Already detached, pending NSAppKitDefined event - - if (pw && pw->frameStrutEventsEnabled() && pw->m_synchedWindowState != Qt::WindowMinimized && pw->m_isExposed && isMouseEvent(theEvent)) { - NSPoint loc = [theEvent locationInWindow]; - NSRect windowFrame = [self.window convertRectFromScreen:[self.window frame]]; - NSRect contentFrame = [[self.window contentView] frame]; - if (NSMouseInRect(loc, windowFrame, NO) && - !NSMouseInRect(loc, contentFrame, NO)) - { - QNSView *contentView = (QNSView *)pw->contentView(); - [contentView handleFrameStrutMouseEvent: theEvent]; - } - } -} - -- (void)detachFromPlatformWindow -{ - _platformWindow = 0; - [self.window.delegate release]; - self.window.delegate = nil; -} - -- (void)clearWindow -{ - if (_window) { - QCocoaEventDispatcher *cocoaEventDispatcher = qobject_cast(QGuiApplication::instance()->eventDispatcher()); - if (cocoaEventDispatcher) { - QCocoaEventDispatcherPrivate *cocoaEventDispatcherPrivate = static_cast(QObjectPrivate::get(cocoaEventDispatcher)); - cocoaEventDispatcherPrivate->removeQueuedUserInputEvents([_window windowNumber]); - } - - _window = nil; - } -} - -- (void)dealloc -{ - _window = nil; - _platformWindow = 0; - [super dealloc]; -} - -@end - -@implementation QNSWindow - -@synthesize helper = _helper; - -- (id)initWithContentRect:(NSRect)contentRect - styleMask:(NSUInteger)windowStyle - qPlatformWindow:(QCocoaWindow *)qpw -{ - self = [super initWithContentRect:contentRect - styleMask:windowStyle - backing:NSBackingStoreBuffered - defer:NO]; // Deferring window creation breaks OpenGL (the GL context is - // set up before the window is shown and needs a proper window) - - if (self) { - _helper = [[QNSWindowHelper alloc] initWithNSWindow:self platformWindow:qpw]; - } - return self; -} - -- (BOOL)canBecomeKeyWindow -{ - // Prevent child NSWindows from becoming the key window in - // order keep the active apperance of the top-level window. - QCocoaWindow *pw = self.helper.platformWindow; - if (!pw || pw->m_isNSWindowChild) - return NO; - - if (pw->shouldRefuseKeyWindowAndFirstResponder()) - return NO; - - // The default implementation returns NO for title-bar less windows, - // override and return yes here to make sure popup windows such as - // the combobox popup can become the key window. - return YES; -} - -- (BOOL)canBecomeMainWindow -{ - BOOL canBecomeMain = YES; // By default, windows can become the main window - - // Windows with a transient parent (such as combobox popup windows) - // cannot become the main window: - QCocoaWindow *pw = self.helper.platformWindow; - if (!pw || pw->m_isNSWindowChild || pw->window()->transientParent()) - canBecomeMain = NO; - - return canBecomeMain; -} - -- (void) sendEvent: (NSEvent*) theEvent -{ - [self.helper handleWindowEvent:theEvent]; -} - -- (void)superSendEvent:(NSEvent *)theEvent -{ - [super sendEvent:theEvent]; -} - -- (void)closeAndRelease -{ - [self close]; - - if (self.helper.grabbingMouse) { - self.helper.releaseOnMouseUp = YES; - } else { - [self.helper detachFromPlatformWindow]; - [self release]; - } -} - -- (void)dealloc -{ - [_helper clearWindow]; - [_helper release]; - _helper = nil; - [super dealloc]; -} - -@end - -@implementation QNSPanel - -@synthesize helper = _helper; - -- (id)initWithContentRect:(NSRect)contentRect - styleMask:(NSUInteger)windowStyle - qPlatformWindow:(QCocoaWindow *)qpw -{ - self = [super initWithContentRect:contentRect - styleMask:windowStyle - backing:NSBackingStoreBuffered - defer:NO]; // Deferring window creation breaks OpenGL (the GL context is - // set up before the window is shown and needs a proper window) - - if (self) { - _helper = [[QNSWindowHelper alloc] initWithNSWindow:self platformWindow:qpw]; - } - return self; -} - -- (BOOL)canBecomeKeyWindow -{ - QCocoaWindow *pw = self.helper.platformWindow; - if (!pw) - return NO; - - if (pw->shouldRefuseKeyWindowAndFirstResponder()) - return NO; - - // Only tool or dialog windows should become key: - Qt::WindowType type = pw->window()->type(); - if (type == Qt::Tool || type == Qt::Dialog) - return YES; - - return NO; -} - -- (void) sendEvent: (NSEvent*) theEvent -{ - [self.helper handleWindowEvent:theEvent]; -} - -- (void)superSendEvent:(NSEvent *)theEvent -{ - [super sendEvent:theEvent]; -} - -- (void)closeAndRelease -{ - [self.helper detachFromPlatformWindow]; - [self close]; - [self release]; -} - -- (void)dealloc -{ - [_helper clearWindow]; - [_helper release]; - _helper = nil; - [super dealloc]; -} - -@end - -const int QCocoaWindow::NoAlertRequest = -1; - -QCocoaWindow::QCocoaWindow(QWindow *tlw) - : QPlatformWindow(tlw) - , m_contentView(nil) - , m_qtView(nil) - , m_nsWindow(0) - , m_forwardWindow(0) - , m_contentViewIsEmbedded(false) - , m_contentViewIsToBeEmbedded(false) - , m_parentCocoaWindow(0) - , m_isNSWindowChild(false) - , m_effectivelyMaximized(false) - , m_synchedWindowState(Qt::WindowActive) - , m_windowModality(Qt::NonModal) - , m_windowUnderMouse(false) - , m_ignoreWindowShouldClose(false) - , m_inConstructor(true) - , m_inSetVisible(false) - , m_inSetGeometry(false) -#ifndef QT_NO_OPENGL - , m_glContext(0) -#endif - , m_menubar(0) - , m_windowCursor(0) - , m_hasModalSession(false) - , m_frameStrutEventsEnabled(false) - , m_geometryUpdateExposeAllowed(false) - , m_isExposed(false) - , m_registerTouchCount(0) - , m_resizableTransientParent(false) - , m_hiddenByClipping(false) - , m_hiddenByAncestor(false) - , m_alertRequest(NoAlertRequest) - , monitor(nil) - , m_drawContentBorderGradient(false) - , m_topContentBorderThickness(0) - , m_bottomContentBorderThickness(0) - , m_normalGeometry(QRect(0,0,-1,-1)) -{ -#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG - qDebug() << "QCocoaWindow::QCocoaWindow" << this; -#endif - QCocoaAutoReleasePool pool; - - if (tlw->type() == Qt::ForeignWindow) { - NSView *foreignView = (NSView *)WId(tlw->property("_q_foreignWinId").value()); - setContentView(foreignView); - } else { - m_qtView = [[QNSView alloc] initWithQWindow:tlw platformWindow:this]; - m_contentView = m_qtView; - // Enable high-dpi OpenGL for retina displays. Enabling has the side - // effect that Cocoa will start calling glViewport(0, 0, width, height), - // overriding any glViewport calls in application code. This is usually not a - // problem, except if the appilcation wants to have a "custom" viewport. - // (like the hellogl example) - if (tlw->supportsOpenGL()) { - BOOL enable = qt_mac_resolveOption(YES, tlw, "_q_mac_wantsBestResolutionOpenGLSurface", - "QT_MAC_WANTS_BEST_RESOLUTION_OPENGL_SURFACE"); - [m_contentView setWantsBestResolutionOpenGLSurface:enable]; - } - BOOL enable = qt_mac_resolveOption(NO, tlw, "_q_mac_wantsLayer", - "QT_MAC_WANTS_LAYER"); - [m_contentView setWantsLayer:enable]; - } - setGeometry(tlw->geometry()); - recreateWindow(parent()); - tlw->setGeometry(geometry()); - if (tlw->isTopLevel()) - setWindowIcon(tlw->icon()); - m_inConstructor = false; -} - -QCocoaWindow::~QCocoaWindow() -{ -#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG - qDebug() << "QCocoaWindow::~QCocoaWindow" << this; -#endif - - QCocoaAutoReleasePool pool; - [m_nsWindow setContentView:nil]; - [m_nsWindow.helper detachFromPlatformWindow]; - if (m_isNSWindowChild) { - if (m_parentCocoaWindow) - m_parentCocoaWindow->removeChildWindow(this); - } else if ([m_contentView superview]) { - [m_contentView removeFromSuperview]; - } - - // Make sure to disconnect observer in all case if view is valid - // to avoid notifications received when deleting when using Qt::AA_NativeWindows attribute - if (m_qtView) { - [[NSNotificationCenter defaultCenter] removeObserver:m_qtView]; - } - - // The QNSView object may outlive the corresponding QCocoaWindow object, - // for example during app shutdown when the QNSView is embedded in a - // foregin NSView hiearchy. Clear the pointers to the QWindow/QCocoaWindow - // here to make sure QNSView does not dereference stale pointers. - if (m_qtView) { - [m_qtView clearQWindowPointers]; - } - - // While it is unlikely that this window will be in the popup stack - // during deletetion we clear any pointers here to make sure. - if (QCocoaIntegration::instance()) { - QCocoaIntegration::instance()->popupWindowStack()->removeAll(this); - } - - foreach (QCocoaWindow *child, m_childWindows) { - [m_nsWindow removeChildWindow:child->m_nsWindow]; - child->m_parentCocoaWindow = 0; - } - - [m_contentView release]; - [m_nsWindow release]; - [m_windowCursor release]; -} - -QSurfaceFormat QCocoaWindow::format() const -{ - QSurfaceFormat format = window()->requestedFormat(); - - // Upgrade the default surface format to include an alpha channel. The default RGB format - // causes Cocoa to spend an unreasonable amount of time converting it to RGBA internally. - if (format == QSurfaceFormat()) - format.setAlphaBufferSize(8); - return format; -} - -void QCocoaWindow::setGeometry(const QRect &rectIn) -{ - QBoolBlocker inSetGeometry(m_inSetGeometry, true); - - QRect rect = rectIn; - // This means it is a call from QWindow::setFramePosition() and - // the coordinates include the frame (size is still the contents rectangle). - if (qt_window_private(const_cast(window()))->positionPolicy - == QWindowPrivate::WindowFrameInclusive) { - const QMargins margins = frameMargins(); - rect.moveTopLeft(rect.topLeft() + QPoint(margins.left(), margins.top())); - } - if (geometry() == rect) - return; -#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG - qDebug() << "QCocoaWindow::setGeometry" << this << rect; -#endif - setCocoaGeometry(rect); -} - -QRect QCocoaWindow::geometry() const -{ - // QWindows that are embedded in a NSView hiearchy may be considered - // top-level from Qt's point of view but are not from Cocoa's point - // of view. Embedded QWindows get global (screen) geometry. - if (m_contentViewIsEmbedded) { - NSPoint windowPoint = [m_contentView convertPoint:NSMakePoint(0, 0) toView:nil]; - NSRect screenRect = [[m_contentView window] convertRectToScreen:NSMakeRect(windowPoint.x, windowPoint.y, 1, 1)]; - NSPoint screenPoint = screenRect.origin; - QPoint position = qt_mac_flipPoint(screenPoint).toPoint(); - QSize size = qt_mac_toQRect([m_contentView bounds]).size(); - return QRect(position, size); - } - - return QPlatformWindow::geometry(); -} - -void QCocoaWindow::setCocoaGeometry(const QRect &rect) -{ - QCocoaAutoReleasePool pool; - - if (m_contentViewIsEmbedded) { - QPlatformWindow::setGeometry(rect); - return; - } - - if (m_isNSWindowChild) { - QPlatformWindow::setGeometry(rect); - NSWindow *parentNSWindow = m_parentCocoaWindow->m_nsWindow; - NSRect parentWindowFrame = [parentNSWindow contentRectForFrameRect:parentNSWindow.frame]; - clipWindow(parentWindowFrame); - - // call this here: updateGeometry in qnsview.mm is a no-op for this case - QWindowSystemInterface::handleGeometryChange(window(), rect); - QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), rect.size())); - } else if (m_nsWindow) { - NSRect bounds = qt_mac_flipRect(rect); - [m_nsWindow setFrame:[m_nsWindow frameRectForContentRect:bounds] display:YES animate:NO]; - } else { - [m_contentView setFrame : NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height())]; - } - - if (!m_qtView) - QPlatformWindow::setGeometry(rect); - - // will call QPlatformWindow::setGeometry(rect) during resize confirmation (see qnsview.mm) -} - -void QCocoaWindow::clipChildWindows() -{ - foreach (QCocoaWindow *childWindow, m_childWindows) { - childWindow->clipWindow(m_nsWindow.frame); - } -} - -void QCocoaWindow::clipWindow(const NSRect &clipRect) -{ - if (!m_isNSWindowChild) - return; - - NSRect clippedWindowRect = NSZeroRect; - if (!NSIsEmptyRect(clipRect)) { - NSRect windowFrame = qt_mac_flipRect(QRect(window()->mapToGlobal(QPoint(0, 0)), geometry().size())); - clippedWindowRect = NSIntersectionRect(windowFrame, clipRect); - // Clipping top/left offsets the content. Move it back. - NSPoint contentViewOffset = NSMakePoint(qMax(CGFloat(0), NSMinX(clippedWindowRect) - NSMinX(windowFrame)), - qMax(CGFloat(0), NSMaxY(windowFrame) - NSMaxY(clippedWindowRect))); - [m_contentView setBoundsOrigin:contentViewOffset]; - } - - if (NSIsEmptyRect(clippedWindowRect)) { - if (!m_hiddenByClipping) { - // We dont call hide() here as we will recurse further down - [m_nsWindow orderOut:nil]; - m_hiddenByClipping = true; - } - } else { - [m_nsWindow setFrame:clippedWindowRect display:YES animate:NO]; - if (m_hiddenByClipping) { - m_hiddenByClipping = false; - if (!m_hiddenByAncestor) { - [m_nsWindow orderFront:nil]; - m_parentCocoaWindow->reinsertChildWindow(this); - } - } - } - - // recurse - foreach (QCocoaWindow *childWindow, m_childWindows) { - childWindow->clipWindow(clippedWindowRect); - } -} - -void QCocoaWindow::hide(bool becauseOfAncestor) -{ - bool visible = [m_nsWindow isVisible]; - - if (!m_hiddenByAncestor && !visible) // Already explicitly hidden - return; - if (m_hiddenByAncestor && becauseOfAncestor) // Trying to hide some child again - return; - - m_hiddenByAncestor = becauseOfAncestor; - - if (!visible) // Could have been clipped before - return; - - foreach (QCocoaWindow *childWindow, m_childWindows) - childWindow->hide(true); - - [m_nsWindow orderOut:nil]; -} - -void QCocoaWindow::show(bool becauseOfAncestor) -{ - if ([m_nsWindow isVisible]) - return; - - if (m_parentCocoaWindow && ![m_parentCocoaWindow->m_nsWindow isVisible]) { - m_hiddenByAncestor = true; // Parent still hidden, don't show now - } else if ((becauseOfAncestor == m_hiddenByAncestor) // Was NEITHER explicitly hidden - && !m_hiddenByClipping) { // ... NOR clipped - if (m_isNSWindowChild) { - m_hiddenByAncestor = false; - setCocoaGeometry(window()->geometry()); - } - if (!m_hiddenByClipping) { // setCocoaGeometry() can change the clipping status - [m_nsWindow orderFront:nil]; - if (m_isNSWindowChild) - m_parentCocoaWindow->reinsertChildWindow(this); - foreach (QCocoaWindow *childWindow, m_childWindows) - childWindow->show(true); - } - } -} - -void QCocoaWindow::setVisible(bool visible) -{ - if (m_isNSWindowChild && m_hiddenByClipping) - return; - - m_inSetVisible = true; - - QCocoaAutoReleasePool pool; - QCocoaWindow *parentCocoaWindow = 0; - if (window()->transientParent()) - parentCocoaWindow = static_cast(window()->transientParent()->handle()); -#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG - qDebug() << "QCocoaWindow::setVisible" << window() << visible; -#endif - if (visible) { - // We need to recreate if the modality has changed as the style mask will need updating - if (m_windowModality != window()->modality()) - recreateWindow(parent()); - - // Register popup windows. The Cocoa platform plugin will forward mouse events - // to them and close them when needed. - if (window()->type() == Qt::Popup || window()->type() == Qt::ToolTip) - QCocoaIntegration::instance()->pushPopupWindow(this); - - if (parentCocoaWindow) { - // The parent window might have moved while this window was hidden, - // update the window geometry if there is a parent. - setGeometry(window()->geometry()); - - if (window()->type() == Qt::Popup) { - // QTBUG-30266: a window should not be resizable while a transient popup is open - // Since this isn't a native popup, the window manager doesn't close the popup when you click outside - NSUInteger parentStyleMask = [parentCocoaWindow->m_nsWindow styleMask]; - if ((m_resizableTransientParent = (parentStyleMask & NSResizableWindowMask)) - && !([parentCocoaWindow->m_nsWindow styleMask] & NSFullScreenWindowMask)) - [parentCocoaWindow->m_nsWindow setStyleMask:parentStyleMask & ~NSResizableWindowMask]; - } - - } - - // This call is here to handle initial window show correctly: - // - top-level windows need to have backing store content ready when the - // window is shown, sendin the expose event here makes that more likely. - // - QNSViews for child windows are initialy not hidden and won't get the - // viewDidUnhide message. - exposeWindow(); - - if (m_nsWindow) { - QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents); - - // setWindowState might have been called while the window was hidden and - // will not change the NSWindow state in that case. Sync up here: - syncWindowState(window()->windowState()); - - if (window()->windowState() != Qt::WindowMinimized) { - if ((window()->modality() == Qt::WindowModal - || window()->type() == Qt::Sheet) - && parentCocoaWindow) { - // show the window as a sheet - [NSApp beginSheet:m_nsWindow modalForWindow:parentCocoaWindow->m_nsWindow modalDelegate:nil didEndSelector:nil contextInfo:nil]; - } else if (window()->modality() != Qt::NonModal) { - // show the window as application modal - QCocoaEventDispatcher *cocoaEventDispatcher = qobject_cast(QGuiApplication::instance()->eventDispatcher()); - Q_ASSERT(cocoaEventDispatcher != 0); - QCocoaEventDispatcherPrivate *cocoaEventDispatcherPrivate = static_cast(QObjectPrivate::get(cocoaEventDispatcher)); - cocoaEventDispatcherPrivate->beginModalSession(window()); - m_hasModalSession = true; - } else if ([m_nsWindow canBecomeKeyWindow]) { - [m_nsWindow makeKeyAndOrderFront:nil]; - foreach (QCocoaWindow *childWindow, m_childWindows) - childWindow->show(true); - } else { - show(); - } - - // We want the events to properly reach the popup, dialog, and tool - if ((window()->type() == Qt::Popup || window()->type() == Qt::Dialog || window()->type() == Qt::Tool) - && [m_nsWindow isKindOfClass:[NSPanel class]]) { - [(NSPanel *)m_nsWindow setWorksWhenModal:YES]; - if (!(parentCocoaWindow && window()->transientParent()->isActive()) && window()->type() == Qt::Popup) { - monitor = [NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDownMask|NSRightMouseDownMask|NSOtherMouseDownMask|NSMouseMovedMask handler:^(NSEvent *e) { - QPointF localPoint = qt_mac_flipPoint([NSEvent mouseLocation]); - QWindowSystemInterface::handleMouseEvent(window(), window()->mapFromGlobal(localPoint.toPoint()), localPoint, - cocoaButton2QtButton([e buttonNumber])); - }]; - } - } - } - } - // In some cases, e.g. QDockWidget, the content view is hidden before moving to its own - // Cocoa window, and then shown again. Therefore, we test for the view being hidden even - // if it's attached to an NSWindow. - if ([m_contentView isHidden]) - [m_contentView setHidden:NO]; - } else { - // qDebug() << "close" << this; -#ifndef QT_NO_OPENGL - if (m_glContext) - m_glContext->windowWasHidden(); -#endif - QCocoaEventDispatcher *cocoaEventDispatcher = qobject_cast(QGuiApplication::instance()->eventDispatcher()); - QCocoaEventDispatcherPrivate *cocoaEventDispatcherPrivate = 0; - if (cocoaEventDispatcher) - cocoaEventDispatcherPrivate = static_cast(QObjectPrivate::get(cocoaEventDispatcher)); - if (m_nsWindow) { - if (m_hasModalSession) { - if (cocoaEventDispatcherPrivate) - cocoaEventDispatcherPrivate->endModalSession(window()); - m_hasModalSession = false; - } else { - if ([m_nsWindow isSheet]) - [NSApp endSheet:m_nsWindow]; - } - - hide(); - if (m_nsWindow == [NSApp keyWindow] - && !(cocoaEventDispatcherPrivate && cocoaEventDispatcherPrivate->currentModalSession())) { - // Probably because we call runModalSession: outside [NSApp run] in QCocoaEventDispatcher - // (e.g., when show()-ing a modal QDialog instead of exec()-ing it), it can happen that - // the current NSWindow is still key after being ordered out. Then, after checking we - // don't have any other modal session left, it's safe to make the main window key again. - NSWindow *mainWindow = [NSApp mainWindow]; - if (mainWindow && [mainWindow canBecomeKeyWindow]) - [mainWindow makeKeyWindow]; - } - } else { - [m_contentView setHidden:YES]; - } - if (monitor && window()->type() == Qt::Popup) { - [NSEvent removeMonitor:monitor]; - monitor = nil; - } - - if (window()->type() == Qt::Popup || window()->type() == Qt::ToolTip) - QCocoaIntegration::instance()->popupWindowStack()->removeAll(this); - - if (parentCocoaWindow && window()->type() == Qt::Popup) { - if (m_resizableTransientParent - && !([parentCocoaWindow->m_nsWindow styleMask] & NSFullScreenWindowMask)) - // QTBUG-30266: a window should not be resizable while a transient popup is open - [parentCocoaWindow->m_nsWindow setStyleMask:[parentCocoaWindow->m_nsWindow styleMask] | NSResizableWindowMask]; - } - } - - m_inSetVisible = false; -} - -NSInteger QCocoaWindow::windowLevel(Qt::WindowFlags flags) -{ - Qt::WindowType type = static_cast(int(flags & Qt::WindowType_Mask)); - - NSInteger windowLevel = NSNormalWindowLevel; - - if (type == Qt::Tool) - windowLevel = NSFloatingWindowLevel; - else if ((type & Qt::Popup) == Qt::Popup) - windowLevel = NSPopUpMenuWindowLevel; - - // StayOnTop window should appear above Tool windows. - if (flags & Qt::WindowStaysOnTopHint) - windowLevel = NSModalPanelWindowLevel; - // Tooltips should appear above StayOnTop windows. - if (type == Qt::ToolTip) - windowLevel = NSScreenSaverWindowLevel; - - // Any "special" window should be in at least the same level as its parent. - if (type != Qt::Window) { - const QWindow * const transientParent = window()->transientParent(); - const QCocoaWindow * const transientParentWindow = transientParent ? static_cast(transientParent->handle()) : 0; - if (transientParentWindow) - windowLevel = qMax([transientParentWindow->m_nsWindow level], windowLevel); - } - - return windowLevel; -} - -NSUInteger QCocoaWindow::windowStyleMask(Qt::WindowFlags flags) -{ - Qt::WindowType type = static_cast(int(flags & Qt::WindowType_Mask)); - NSInteger styleMask = NSBorderlessWindowMask; - if (flags & Qt::FramelessWindowHint) - return styleMask; - if ((type & Qt::Popup) == Qt::Popup) { - if (!windowIsPopupType(type)) { - styleMask = NSUtilityWindowMask; - if (!(flags & Qt::CustomizeWindowHint)) { - styleMask |= NSResizableWindowMask | NSClosableWindowMask | - NSMiniaturizableWindowMask | NSTitledWindowMask; - } else { - if (flags & Qt::WindowMaximizeButtonHint) - styleMask |= NSResizableWindowMask; - if (flags & Qt::WindowTitleHint) - styleMask |= NSTitledWindowMask; - if (flags & Qt::WindowCloseButtonHint) - styleMask |= NSClosableWindowMask; - if (flags & Qt::WindowMinimizeButtonHint) - styleMask |= NSMiniaturizableWindowMask; - } - } - } else { - if (type == Qt::Window && !(flags & Qt::CustomizeWindowHint)) { - styleMask = (NSResizableWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSTitledWindowMask); - } else if (type == Qt::Dialog) { - if (flags & Qt::CustomizeWindowHint) { - if (flags & Qt::WindowMaximizeButtonHint) - styleMask = NSResizableWindowMask; - if (flags & Qt::WindowTitleHint) - styleMask |= NSTitledWindowMask; - if (flags & Qt::WindowCloseButtonHint) - styleMask |= NSClosableWindowMask; - if (flags & Qt::WindowMinimizeButtonHint) - styleMask |= NSMiniaturizableWindowMask; - } else { - styleMask = NSResizableWindowMask | NSClosableWindowMask | NSTitledWindowMask; - } - } else { - if (flags & Qt::WindowMaximizeButtonHint) - styleMask |= NSResizableWindowMask; - if (flags & Qt::WindowTitleHint) - styleMask |= NSTitledWindowMask; - if (flags & Qt::WindowCloseButtonHint) - styleMask |= NSClosableWindowMask; - if (flags & Qt::WindowMinimizeButtonHint) - styleMask |= NSMiniaturizableWindowMask; - } - } - - if (m_drawContentBorderGradient) - styleMask |= NSTexturedBackgroundWindowMask; - -#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG - qDebug("windowStyleMask of '%s': flags %X -> styleMask %lX", qPrintable(window()->title()), (int)flags, styleMask); -#endif - return styleMask; -} - -void QCocoaWindow::setWindowShadow(Qt::WindowFlags flags) -{ - bool keepShadow = !(flags & Qt::NoDropShadowWindowHint); - [m_nsWindow setHasShadow:(keepShadow ? YES : NO)]; -} - -void QCocoaWindow::setWindowZoomButton(Qt::WindowFlags flags) -{ - // Disable the zoom (maximize) button for fixed-sized windows and customized - // no-WindowMaximizeButtonHint windows. From a Qt perspective it migth be expected - // that the button would be removed in the latter case, but disabling it is more - // in line with the platform style guidelines. - bool fixedSizeNoZoom = (window()->minimumSize().isValid() && window()->maximumSize().isValid() - && window()->minimumSize() == window()->maximumSize()); - bool customizeNoZoom = ((flags & Qt::CustomizeWindowHint) && !(flags & Qt::WindowMaximizeButtonHint)); - [[m_nsWindow standardWindowButton:NSWindowZoomButton] setEnabled:!(fixedSizeNoZoom || customizeNoZoom)]; -} - -void QCocoaWindow::setWindowFlags(Qt::WindowFlags flags) -{ - if (m_nsWindow && !m_isNSWindowChild) { - NSUInteger styleMask = windowStyleMask(flags); - NSInteger level = this->windowLevel(flags); - [m_nsWindow setStyleMask:styleMask]; - [m_nsWindow setLevel:level]; - setWindowShadow(flags); - if (!(styleMask & NSBorderlessWindowMask)) { - setWindowTitle(window()->title()); - } - - Qt::WindowType type = window()->type(); - if ((type & Qt::Popup) != Qt::Popup && (type & Qt::Dialog) != Qt::Dialog) { - NSWindowCollectionBehavior behavior = [m_nsWindow collectionBehavior]; - if (flags & Qt::WindowFullscreenButtonHint) - behavior |= NSWindowCollectionBehaviorFullScreenPrimary; - else - behavior &= ~NSWindowCollectionBehaviorFullScreenPrimary; - [m_nsWindow setCollectionBehavior:behavior]; - } - setWindowZoomButton(flags); - } - - m_windowFlags = flags; -} - -void QCocoaWindow::setWindowState(Qt::WindowState state) -{ - if (window()->isVisible()) - syncWindowState(state); // Window state set for hidden windows take effect when show() is called. -} - -void QCocoaWindow::setWindowTitle(const QString &title) -{ - QCocoaAutoReleasePool pool; - if (!m_nsWindow) - return; - - CFStringRef windowTitle = QCFString::toCFStringRef(title); - [m_nsWindow setTitle: const_cast(reinterpret_cast(windowTitle))]; - CFRelease(windowTitle); -} - -void QCocoaWindow::setWindowFilePath(const QString &filePath) -{ - QCocoaAutoReleasePool pool; - if (!m_nsWindow) - return; - - QFileInfo fi(filePath); - [m_nsWindow setRepresentedFilename: fi.exists() ? QCFString::toNSString(filePath) : @""]; -} - -qreal _win_devicePixelRatio() { - qreal result = 1.0; - foreach (QScreen *screen, QGuiApplication::screens()) { - result = qMax(result, screen->devicePixelRatio()); - } - return result; -} - -void QCocoaWindow::setWindowIcon(const QIcon &icon) -{ - QCocoaAutoReleasePool pool; - - NSButton *iconButton = [m_nsWindow standardWindowButton:NSWindowDocumentIconButton]; - if (iconButton == nil) { - if (icon.isNull()) - return; - NSString *title = QCFString::toNSString(window()->title()); - [m_nsWindow setRepresentedURL:[NSURL fileURLWithPath:title]]; - iconButton = [m_nsWindow standardWindowButton:NSWindowDocumentIconButton]; - } - if (icon.isNull()) { - [iconButton setImage:nil]; - } else { - CGFloat hgt = 16. * _win_devicePixelRatio(); - QPixmap pixmap = icon.pixmap(QSize(hgt, hgt)); - NSImage *image = static_cast(qt_mac_create_nsimage(pixmap)); - [iconButton setImage:image]; - [image release]; - } -} - -void QCocoaWindow::setAlertState(bool enabled) -{ - if (m_alertRequest == NoAlertRequest && enabled) { - m_alertRequest = [NSApp requestUserAttention:NSCriticalRequest]; - } else if (m_alertRequest != NoAlertRequest && !enabled) { - [NSApp cancelUserAttentionRequest:m_alertRequest]; - m_alertRequest = NoAlertRequest; - } -} - -bool QCocoaWindow::isAlertState() const -{ - return m_alertRequest != NoAlertRequest; -} - -void QCocoaWindow::raise() -{ - //qDebug() << "raise" << this; - // ### handle spaces (see Qt 4 raise_sys in qwidget_mac.mm) - if (!m_nsWindow) - return; - if (m_isNSWindowChild) { - QList &siblings = m_parentCocoaWindow->m_childWindows; - siblings.removeOne(this); - siblings.append(this); - if (m_hiddenByClipping) - return; - } - if ([m_nsWindow isVisible]) { - if (m_isNSWindowChild) { - // -[NSWindow orderFront:] doesn't work with attached windows. - // The only solution is to remove and add the child window. - // This will place it on top of all the other NSWindows. - NSWindow *parentNSWindow = m_parentCocoaWindow->m_nsWindow; - [parentNSWindow removeChildWindow:m_nsWindow]; - [parentNSWindow addChildWindow:m_nsWindow ordered:NSWindowAbove]; - } else { - [m_nsWindow orderFront: m_nsWindow]; - static bool raiseProcess = qt_mac_resolveOption(true, "QT_MAC_SET_RAISE_PROCESS"); - if (raiseProcess) { - ProcessSerialNumber psn; - GetCurrentProcess(&psn); - SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); - } - } - } -} - -void QCocoaWindow::lower() -{ - if (!m_nsWindow) - return; - if (m_isNSWindowChild) { - QList &siblings = m_parentCocoaWindow->m_childWindows; - siblings.removeOne(this); - siblings.prepend(this); - if (m_hiddenByClipping) - return; - } - if ([m_nsWindow isVisible]) { - if (m_isNSWindowChild) { - // -[NSWindow orderBack:] doesn't work with attached windows. - // The only solution is to remove and add all the child windows except this one. - // This will keep the current window at the bottom while adding the others on top of it, - // hopefully in the same order (this is not documented anywhere in the Cocoa documentation). - NSWindow *parentNSWindow = m_parentCocoaWindow->m_nsWindow; - NSArray *children = [parentNSWindow.childWindows copy]; - for (NSWindow *child in children) - if (m_nsWindow != child) { - [parentNSWindow removeChildWindow:child]; - [parentNSWindow addChildWindow:child ordered:NSWindowAbove]; - } - } else { - [m_nsWindow orderBack: m_nsWindow]; - } - } -} - -bool QCocoaWindow::isExposed() const -{ - return m_isExposed; -} - -bool QCocoaWindow::isOpaque() const -{ - // OpenGL surfaces can be ordered either above(default) or below the NSWindow. - // When ordering below the window must be tranclucent. - static GLint openglSourfaceOrder = qt_mac_resolveOption(1, "QT_MAC_OPENGL_SURFACE_ORDER"); - - bool translucent = (window()->format().alphaBufferSize() > 0 - || window()->opacity() < 1 - || (m_qtView && [m_qtView hasMask])) - || (surface()->supportsOpenGL() && openglSourfaceOrder == -1); - return !translucent; -} - -void QCocoaWindow::propagateSizeHints() -{ - QCocoaAutoReleasePool pool; - if (!m_nsWindow) - return; - -#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG - qDebug() << "QCocoaWindow::propagateSizeHints" << this; - qDebug() << " min/max " << window()->minimumSize() << window()->maximumSize(); - qDebug() << "size increment" << window()->sizeIncrement(); - qDebug() << " basesize" << window()->baseSize(); - qDebug() << " geometry" << geometry(); -#endif - - // Set the minimum content size. - const QSize minimumSize = window()->minimumSize(); - if (!minimumSize.isValid()) // minimumSize is (-1, -1) when not set. Make that (0, 0) for Cocoa. - [m_nsWindow setContentMinSize : NSMakeSize(0.0, 0.0)]; - [m_nsWindow setContentMinSize : NSMakeSize(minimumSize.width(), minimumSize.height())]; - - // Set the maximum content size. - const QSize maximumSize = window()->maximumSize(); - [m_nsWindow setContentMaxSize : NSMakeSize(maximumSize.width(), maximumSize.height())]; - - // The window may end up with a fixed size; in this case the zoom button should be disabled. - setWindowZoomButton(m_windowFlags); - - // sizeIncrement is observed to take values of (-1, -1) and (0, 0) for windows that should be - // resizable and that have no specific size increment set. Cocoa expects (1.0, 1.0) in this case. - if (!window()->sizeIncrement().isEmpty()) - [m_nsWindow setResizeIncrements : qt_mac_toNSSize(window()->sizeIncrement())]; - else - [m_nsWindow setResizeIncrements : NSMakeSize(1.0, 1.0)]; - - QRect rect = geometry(); - QSize baseSize = window()->baseSize(); - if (!baseSize.isNull() && baseSize.isValid()) { - [m_nsWindow setFrame:NSMakeRect(rect.x(), rect.y(), baseSize.width(), baseSize.height()) display:YES]; - } -} - -void QCocoaWindow::setOpacity(qreal level) -{ - if (m_nsWindow) { - [m_nsWindow setAlphaValue:level]; - [m_nsWindow setOpaque: isOpaque()]; - } -} - -void QCocoaWindow::setMask(const QRegion ®ion) -{ - if (m_nsWindow) - [m_nsWindow setBackgroundColor:[NSColor clearColor]]; - - [m_qtView setMaskRegion:®ion]; - [m_nsWindow setOpaque: isOpaque()]; -} - -bool QCocoaWindow::setKeyboardGrabEnabled(bool grab) -{ - if (!m_nsWindow) - return false; - - if (grab && ![m_nsWindow isKeyWindow]) - [m_nsWindow makeKeyWindow]; - else if (!grab && [m_nsWindow isKeyWindow]) - [m_nsWindow resignKeyWindow]; - return true; -} - -bool QCocoaWindow::setMouseGrabEnabled(bool grab) -{ - if (!m_nsWindow) - return false; - - if (grab && ![m_nsWindow isKeyWindow]) - [m_nsWindow makeKeyWindow]; - else if (!grab && [m_nsWindow isKeyWindow]) - [m_nsWindow resignKeyWindow]; - return true; -} - -WId QCocoaWindow::winId() const -{ - return WId(m_contentView); -} - -void QCocoaWindow::setParent(const QPlatformWindow *parentWindow) -{ - // recreate the window for compatibility - bool unhideAfterRecreate = parentWindow && !m_contentViewIsToBeEmbedded && ![m_contentView isHidden]; - recreateWindow(parentWindow); - if (unhideAfterRecreate) - [m_contentView setHidden:NO]; - setCocoaGeometry(geometry()); -} - -NSView *QCocoaWindow::contentView() const -{ - return m_contentView; -} - -void QCocoaWindow::setContentView(NSView *contentView) -{ - // Remove and release the previous content view - [m_contentView removeFromSuperview]; - [m_contentView release]; - - // Insert and retain the new content view - [contentView retain]; - m_contentView = contentView; - m_qtView = 0; // The new content view is not a QNSView. - recreateWindow(parent()); // Adds the content view to parent NSView -} - -QNSView *QCocoaWindow::qtView() const -{ - return m_qtView; -} - -NSWindow *QCocoaWindow::nativeWindow() const -{ - return m_nsWindow; -} - -void QCocoaWindow::setEmbeddedInForeignView(bool embedded) -{ - m_contentViewIsToBeEmbedded = embedded; - // Release any previosly created NSWindow. - [m_nsWindow closeAndRelease]; - m_nsWindow = 0; -} - -void QCocoaWindow::windowWillMove() -{ - // Close any open popups on window move - while (QCocoaWindow *popup = QCocoaIntegration::instance()->popPopupWindow()) { - QWindowSystemInterface::handleCloseEvent(popup->window()); - QWindowSystemInterface::flushWindowSystemEvents(); - } -} - -void QCocoaWindow::windowDidMove() -{ - if (m_isNSWindowChild) - return; - - [m_qtView updateGeometry]; -} - -void QCocoaWindow::windowDidResize() -{ - if (!m_nsWindow) - return; - - if (m_isNSWindowChild) - return; - - clipChildWindows(); - [m_qtView updateGeometry]; -} - -void QCocoaWindow::windowDidEndLiveResize() -{ - if (m_synchedWindowState == Qt::WindowMaximized && ![m_nsWindow isZoomed]) { - m_effectivelyMaximized = false; - [m_qtView notifyWindowStateChanged:Qt::WindowNoState]; - } -} - -bool QCocoaWindow::windowShouldClose() -{ - // might have been set from qnsview.mm - if (m_ignoreWindowShouldClose) - return false; - bool accepted = false; - QWindowSystemInterface::handleCloseEvent(window(), &accepted); - QWindowSystemInterface::flushWindowSystemEvents(); - return accepted; -} - -void QCocoaWindow::setSynchedWindowStateFromWindow() -{ - if (QWindow *w = window()) - m_synchedWindowState = w->windowState(); -} - -bool QCocoaWindow::windowIsPopupType(Qt::WindowType type) const -{ - if (type == Qt::Widget) - type = window()->type(); - if (type == Qt::Tool) - return false; // Qt::Tool has the Popup bit set but isn't, at least on Mac. - - return ((type & Qt::Popup) == Qt::Popup); -} - -#ifndef QT_NO_OPENGL -void QCocoaWindow::setCurrentContext(QCocoaGLContext *context) -{ - m_glContext = context; -} - -QCocoaGLContext *QCocoaWindow::currentContext() const -{ - return m_glContext; -} -#endif - -void QCocoaWindow::recreateWindow(const QPlatformWindow *parentWindow) -{ - bool wasNSWindowChild = m_isNSWindowChild; - m_isNSWindowChild = parentWindow && (window()->property("_q_platform_MacUseNSWindow").toBool()); - bool needsNSWindow = m_isNSWindowChild || !parentWindow; - - QCocoaWindow *oldParentCocoaWindow = m_parentCocoaWindow; - m_parentCocoaWindow = const_cast(static_cast(parentWindow)); - if (m_parentCocoaWindow && m_isNSWindowChild) { - QWindow *parentQWindow = m_parentCocoaWindow->window(); - if (!parentQWindow->property("_q_platform_MacUseNSWindow").toBool()) { - parentQWindow->setProperty("_q_platform_MacUseNSWindow", QVariant(true)); - m_parentCocoaWindow->recreateWindow(m_parentCocoaWindow->m_parentCocoaWindow); - } - } - - bool usesNSPanel = [m_nsWindow isKindOfClass:[QNSPanel class]]; - - // No child QNSWindow should notify its QNSView - if (m_nsWindow && m_qtView && m_parentCocoaWindow && !oldParentCocoaWindow) - [[NSNotificationCenter defaultCenter] removeObserver:m_qtView - name:nil object:m_nsWindow]; - - // Remove current window (if any) - if ((m_nsWindow && !needsNSWindow) || (usesNSPanel != shouldUseNSPanel())) { - [m_nsWindow closeAndRelease]; - if (wasNSWindowChild && oldParentCocoaWindow) - oldParentCocoaWindow->removeChildWindow(this); - m_nsWindow = 0; - } - - if (needsNSWindow) { - bool noPreviousWindow = m_nsWindow == 0; - if (noPreviousWindow) - m_nsWindow = createNSWindow(); - - // Only non-child QNSWindows should notify their QNSViews - // (but don't register more than once). - if (m_qtView && (noPreviousWindow || (wasNSWindowChild && !m_isNSWindowChild))) - [[NSNotificationCenter defaultCenter] addObserver:m_qtView - selector:@selector(windowNotification:) - name:nil // Get all notifications - object:m_nsWindow]; - - if (oldParentCocoaWindow) { - if (!m_isNSWindowChild || oldParentCocoaWindow != m_parentCocoaWindow) - oldParentCocoaWindow->removeChildWindow(this); - m_forwardWindow = oldParentCocoaWindow; - } - - setNSWindow(m_nsWindow); - } - - if (m_contentViewIsToBeEmbedded) { - // An embedded window doesn't have its own NSWindow. - } else if (!parentWindow) { - // QPlatformWindow subclasses must sync up with QWindow on creation: - propagateSizeHints(); - setWindowFlags(window()->flags()); - setWindowTitle(window()->title()); - setWindowState(window()->windowState()); - } else if (m_isNSWindowChild) { - m_nsWindow.styleMask = NSBorderlessWindowMask; - m_nsWindow.hasShadow = NO; - m_nsWindow.level = NSNormalWindowLevel; - NSWindowCollectionBehavior collectionBehavior = - NSWindowCollectionBehaviorManaged | NSWindowCollectionBehaviorIgnoresCycle - | NSWindowCollectionBehaviorFullScreenAuxiliary; - m_nsWindow.animationBehavior = NSWindowAnimationBehaviorNone; - m_nsWindow.collectionBehavior = collectionBehavior; - setCocoaGeometry(window()->geometry()); - - QList &siblings = m_parentCocoaWindow->m_childWindows; - if (siblings.contains(this)) { - if (!m_hiddenByClipping) - m_parentCocoaWindow->reinsertChildWindow(this); - } else { - if (!m_hiddenByClipping) - [m_parentCocoaWindow->m_nsWindow addChildWindow:m_nsWindow ordered:NSWindowAbove]; - siblings.append(this); - } - } else { - // Child windows have no NSWindow, link the NSViews instead. - [m_parentCocoaWindow->m_contentView addSubview : m_contentView]; - QRect rect = window()->geometry(); - // Prevent setting a (0,0) window size; causes opengl context - // "Invalid Drawable" warnings. - if (rect.isNull()) - rect.setSize(QSize(1, 1)); - NSRect frame = NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height()); - [m_contentView setFrame:frame]; - [m_contentView setHidden: YES]; - } - - const qreal opacity = qt_window_private(window())->opacity; - if (!qFuzzyCompare(opacity, qreal(1.0))) - setOpacity(opacity); - - // top-level QWindows may have an attached NSToolBar, call - // update function which will attach to the NSWindow. - if (!parentWindow) - updateNSToolbar(); -} - -void QCocoaWindow::reinsertChildWindow(QCocoaWindow *child) -{ - int childIndex = m_childWindows.indexOf(child); - Q_ASSERT(childIndex != -1); - - for (int i = childIndex; i < m_childWindows.size(); i++) { - NSWindow *nsChild = m_childWindows[i]->m_nsWindow; - if (i != childIndex) - [m_nsWindow removeChildWindow:nsChild]; - [m_nsWindow addChildWindow:nsChild ordered:NSWindowAbove]; - } -} - -void QCocoaWindow::requestActivateWindow() -{ - NSWindow *window = [m_contentView window]; - [ window makeFirstResponder : m_contentView ]; - [ window makeKeyWindow ]; -} - -bool QCocoaWindow::shouldUseNSPanel() -{ - Qt::WindowType type = window()->type(); - - return !m_isNSWindowChild && - ((type & Qt::Popup) == Qt::Popup || (type & Qt::Dialog) == Qt::Dialog); -} - -QCocoaNSWindow * QCocoaWindow::createNSWindow() -{ - QCocoaAutoReleasePool pool; - - QRect rect = initialGeometry(window(), window()->geometry(), defaultWindowWidth, defaultWindowHeight); - NSRect frame = qt_mac_flipRect(rect); - - Qt::WindowType type = window()->type(); - Qt::WindowFlags flags = window()->flags(); - - NSUInteger styleMask; - if (m_isNSWindowChild) { - styleMask = NSBorderlessWindowMask; - } else { - styleMask = windowStyleMask(flags); - } - QCocoaNSWindow *createdWindow = 0; - - // Use NSPanel for popup-type windows. (Popup, Tool, ToolTip, SplashScreen) - // and dialogs - if (shouldUseNSPanel()) { - QNSPanel *window; - window = [[QNSPanel alloc] initWithContentRect:frame - styleMask: styleMask - qPlatformWindow:this]; - if ((type & Qt::Popup) == Qt::Popup) - [window setHasShadow:YES]; - - // Qt::Tool windows hide on app deactivation, unless Qt::WA_MacAlwaysShowToolWindow is set. - QVariant showWithoutActivating = QPlatformWindow::window()->property("_q_macAlwaysShowToolWindow"); - bool shouldHideOnDeactivate = ((type & Qt::Tool) == Qt::Tool) && - !(showWithoutActivating.isValid() && showWithoutActivating.toBool()); - [window setHidesOnDeactivate: shouldHideOnDeactivate]; - - // Make popup windows show on the same desktop as the parent full-screen window. - [window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenAuxiliary]; - if ((type & Qt::Popup) == Qt::Popup) - [window setAnimationBehavior:NSWindowAnimationBehaviorUtilityWindow]; - - createdWindow = window; - } else { - QNSWindow *window; - window = [[QNSWindow alloc] initWithContentRect:frame - styleMask: styleMask - qPlatformWindow:this]; - createdWindow = window; - } - - if ([createdWindow respondsToSelector:@selector(setRestorable:)]) - [createdWindow setRestorable: NO]; - - NSInteger level = windowLevel(flags); - [createdWindow setLevel:level]; - - // OpenGL surfaces can be ordered either above(default) or below the NSWindow. - // When ordering below the window must be tranclucent and have a clear background color. - static GLint openglSourfaceOrder = qt_mac_resolveOption(1, "QT_MAC_OPENGL_SURFACE_ORDER"); - - bool isTranslucent = window()->format().alphaBufferSize() > 0 - || (surface()->supportsOpenGL() && openglSourfaceOrder == -1); - if (isTranslucent) { - [createdWindow setBackgroundColor:[NSColor clearColor]]; - [createdWindow setOpaque:NO]; - } - - m_windowModality = window()->modality(); - - applyContentBorderThickness(createdWindow); - - return createdWindow; -} - -void QCocoaWindow::setNSWindow(QCocoaNSWindow *window) -{ - if (window.contentView != m_contentView) { - [m_contentView setPostsFrameChangedNotifications: NO]; - [m_contentView retain]; - if (m_contentView.superview) // m_contentView comes from another NSWindow - [m_contentView removeFromSuperview]; - [window setContentView:m_contentView]; - [m_contentView release]; - [m_contentView setPostsFrameChangedNotifications: YES]; - } -} - -void QCocoaWindow::removeChildWindow(QCocoaWindow *child) -{ - m_childWindows.removeOne(child); - [m_nsWindow removeChildWindow:child->m_nsWindow]; -} - -// Returns the current global screen geometry for the nswindow associated with this window. -QRect QCocoaWindow::windowGeometry() const -{ - if (!m_nsWindow || m_isNSWindowChild) - return geometry(); - - NSRect rect = [m_nsWindow frame]; - QPlatformScreen *onScreen = QPlatformScreen::platformScreenForWindow(window()); - int flippedY = onScreen->geometry().height() - rect.origin.y - rect.size.height; // account for nswindow inverted y. - QRect qRect = QRect(rect.origin.x, flippedY, rect.size.width, rect.size.height); - return qRect; -} - -// Returns a pointer to the parent QCocoaWindow for this window, or 0 if there is none. -QCocoaWindow *QCocoaWindow::parentCocoaWindow() const -{ - if (window() && window()->transientParent()) { - return static_cast(window()->transientParent()->handle()); - } - return 0; -} - -// Syncs the NSWindow minimize/maximize/fullscreen state with the current QWindow state -void QCocoaWindow::syncWindowState(Qt::WindowState newState) -{ - if (!m_nsWindow) - return; - // if content view width or height is 0 then the window animations will crash so - // do nothing except set the new state - NSRect contentRect = [contentView() frame]; - if (contentRect.size.width <= 0 || contentRect.size.height <= 0) { - qWarning() << Q_FUNC_INFO << "invalid window content view size, check your window geometry"; - m_synchedWindowState = newState; - return; - } - - Qt::WindowState predictedState = newState; - if ((m_synchedWindowState & Qt::WindowMaximized) != (newState & Qt::WindowMaximized)) { - const int styleMask = [m_nsWindow styleMask]; - const bool usePerform = styleMask & NSResizableWindowMask; - [m_nsWindow setStyleMask:styleMask | NSResizableWindowMask]; - if (usePerform) - [m_nsWindow performZoom : m_nsWindow]; // toggles - else - [m_nsWindow zoom : m_nsWindow]; // toggles - [m_nsWindow setStyleMask:styleMask]; - } - - if ((m_synchedWindowState & Qt::WindowMinimized) != (newState & Qt::WindowMinimized)) { - if (newState & Qt::WindowMinimized) { - if ([m_nsWindow styleMask] & NSMiniaturizableWindowMask) - [m_nsWindow performMiniaturize : m_nsWindow]; - else - [m_nsWindow miniaturize : m_nsWindow]; - } else { - [m_nsWindow deminiaturize : m_nsWindow]; - } - } - - const bool effMax = m_effectivelyMaximized; - if ((m_synchedWindowState & Qt::WindowMaximized) != (newState & Qt::WindowMaximized) || (m_effectivelyMaximized && newState == Qt::WindowNoState)) { - if ((m_synchedWindowState & Qt::WindowFullScreen) == (newState & Qt::WindowFullScreen)) { - [m_nsWindow zoom : m_nsWindow]; // toggles - m_effectivelyMaximized = !effMax; - } else if (!(newState & Qt::WindowMaximized)) { - // it would be nice to change the target geometry that toggleFullScreen will animate toward - // but there is no known way, so the maximized state is not possible at this time - predictedState = static_cast(static_cast(newState) | Qt::WindowMaximized); - m_effectivelyMaximized = true; - } - } - - if ((m_synchedWindowState & Qt::WindowFullScreen) != (newState & Qt::WindowFullScreen)) { - if (window()->flags() & Qt::WindowFullscreenButtonHint) { - if (m_effectivelyMaximized && m_synchedWindowState == Qt::WindowFullScreen) - predictedState = Qt::WindowMaximized; - [m_nsWindow toggleFullScreen : m_nsWindow]; - } else { - if (newState & Qt::WindowFullScreen) { - QScreen *screen = window()->screen(); - if (screen) { - if (m_normalGeometry.width() < 0) { - m_oldWindowFlags = m_windowFlags; - window()->setFlags(window()->flags() | Qt::FramelessWindowHint); - m_normalGeometry = windowGeometry(); - setGeometry(screen->geometry()); - m_presentationOptions = [NSApp presentationOptions]; - [NSApp setPresentationOptions : m_presentationOptions | NSApplicationPresentationAutoHideMenuBar | NSApplicationPresentationAutoHideDock]; - } - } - } else { - window()->setFlags(m_oldWindowFlags); - setGeometry(m_normalGeometry); - m_normalGeometry.setRect(0, 0, -1, -1); - [NSApp setPresentationOptions : m_presentationOptions]; - } - } - } - -#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG - qDebug() << "QCocoaWindow::syncWindowState" << newState << "actual" << predictedState << "was" << m_synchedWindowState << "effectively maximized" << m_effectivelyMaximized; -#endif - - // New state is now the current synched state - m_synchedWindowState = predictedState; -} - -bool QCocoaWindow::setWindowModified(bool modified) -{ - if (!m_nsWindow) - return false; - [m_nsWindow setDocumentEdited:(modified?YES:NO)]; - return true; -} - -void QCocoaWindow::setMenubar(QCocoaMenuBar *mb) -{ - m_menubar = mb; -} - -QCocoaMenuBar *QCocoaWindow::menubar() const -{ - return m_menubar; -} - -void QCocoaWindow::setWindowCursor(NSCursor *cursor) -{ - // This function is called (via QCocoaCursor) by Qt to set - // the cursor for this window. It can be called for a window - // that is not currenly under the mouse pointer (for example - // for a popup window.) Qt expects the set cursor to "stick": - // it should be accociated with the window until a different - // cursor is set. - if (m_windowCursor != cursor) { - [m_windowCursor release]; - m_windowCursor = [cursor retain]; - } - - // Use the built in cursor rect API if the QCocoaWindow has a NSWindow. - // Othervise, set the cursor if this window is under the mouse. In - // this case QNSView::cursorUpdate will set the cursor as the pointer - // moves. - if (m_nsWindow && m_qtView) { - [m_nsWindow invalidateCursorRectsForView : m_qtView]; - } else { - if (m_windowUnderMouse) - [cursor set]; - } -} - -void QCocoaWindow::registerTouch(bool enable) -{ - m_registerTouchCount += enable ? 1 : -1; - if (enable && m_registerTouchCount == 1) - [m_contentView setAcceptsTouchEvents:YES]; - else if (m_registerTouchCount == 0) - [m_contentView setAcceptsTouchEvents:NO]; -} - -void QCocoaWindow::setContentBorderThickness(int topThickness, int bottomThickness) -{ - m_topContentBorderThickness = topThickness; - m_bottomContentBorderThickness = bottomThickness; - bool enable = (topThickness > 0 || bottomThickness > 0); - m_drawContentBorderGradient = enable; - - applyContentBorderThickness(m_nsWindow); -} - -void QCocoaWindow::registerContentBorderArea(quintptr identifier, int upper, int lower) -{ - m_contentBorderAreas.insert(identifier, BorderRange(identifier, upper, lower)); - applyContentBorderThickness(m_nsWindow); -} - -void QCocoaWindow::setContentBorderAreaEnabled(quintptr identifier, bool enable) -{ - m_enabledContentBorderAreas.insert(identifier, enable); - applyContentBorderThickness(m_nsWindow); -} - -void QCocoaWindow::setContentBorderEnabled(bool enable) -{ - m_drawContentBorderGradient = enable; - applyContentBorderThickness(m_nsWindow); -} - -void QCocoaWindow::applyContentBorderThickness(NSWindow *window) -{ - if (!window) - return; - - if (!m_drawContentBorderGradient) { - [window setStyleMask:[window styleMask] & ~NSTexturedBackgroundWindowMask]; - [[[window contentView] superview] setNeedsDisplay:YES]; - return; - } - - // Find consecutive registered border areas, starting from the top. - QList ranges = m_contentBorderAreas.values(); - std::sort(ranges.begin(), ranges.end()); - int effectiveTopContentBorderThickness = m_topContentBorderThickness; - foreach (BorderRange range, ranges) { - // Skip disiabled ranges (typically hidden tool bars) - if (!m_enabledContentBorderAreas.value(range.identifier, false)) - continue; - - // Is this sub-range adjacent to or overlaping the - // existing total border area range? If so merge - // it into the total range, - if (range.upper <= (effectiveTopContentBorderThickness + 1)) - effectiveTopContentBorderThickness = qMax(effectiveTopContentBorderThickness, range.lower); - else - break; - } - - int effectiveBottomContentBorderThickness = m_bottomContentBorderThickness; - - [window setStyleMask:[window styleMask] | NSTexturedBackgroundWindowMask]; - - [window setContentBorderThickness:effectiveTopContentBorderThickness forEdge:NSMaxYEdge]; - [window setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge]; - - [window setContentBorderThickness:effectiveBottomContentBorderThickness forEdge:NSMinYEdge]; - [window setAutorecalculatesContentBorderThickness:NO forEdge:NSMinYEdge]; - - [[[window contentView] superview] setNeedsDisplay:YES]; -} - -void QCocoaWindow::updateNSToolbar() -{ - if (!m_nsWindow) - return; - - NSToolbar *toolbar = QCocoaIntegration::instance()->toolbar(window()); - - if ([m_nsWindow toolbar] == toolbar) - return; - - [m_nsWindow setToolbar: toolbar]; - [m_nsWindow setShowsToolbarButton:YES]; -} - -bool QCocoaWindow::testContentBorderAreaPosition(int position) const -{ - return m_nsWindow && m_drawContentBorderGradient && - 0 <= position && position < [m_nsWindow contentBorderThicknessForEdge: NSMaxYEdge]; -} - -qreal QCocoaWindow::devicePixelRatio() const -{ - // The documented way to observe the relationship between device-independent - // and device pixels is to use one for the convertToBacking functions. Other - // methods such as [NSWindow backingScaleFacor] might not give the correct - // result, for example if setWantsBestResolutionOpenGLSurface is not set or - // or ignored by the OpenGL driver. - NSSize backingSize = [m_contentView convertSizeToBacking:NSMakeSize(1.0, 1.0)]; - return backingSize.height; -} - -// Returns whether the window can be expose, which it can -// if it is on screen and has a valid geometry. -bool QCocoaWindow::isWindowExposable() -{ - QSize size = geometry().size(); - bool validGeometry = (size.width() > 0 && size.height() > 0); - bool validScreen = ([[m_contentView window] screen] != 0); - bool nonHiddenSuperView = ![[m_contentView superview] isHidden]; - return (validGeometry && validScreen && nonHiddenSuperView); -} - -// Exposes the window by posting an expose event to QWindowSystemInterface -void QCocoaWindow::exposeWindow() -{ - m_geometryUpdateExposeAllowed = true; - - if (!isWindowExposable()) - return; - - if (!m_isExposed) { - m_isExposed = true; - m_exposedGeometry = geometry(); - m_exposedDevicePixelRatio = devicePixelRatio(); - QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), m_exposedGeometry.size())); - } -} - -// Obscures the window by posting an empty expose event to QWindowSystemInterface -void QCocoaWindow::obscureWindow() -{ - if (m_isExposed) { - m_geometryUpdateExposeAllowed = false; - m_isExposed = false; - QWindowSystemInterface::handleExposeEvent(window(), QRegion()); - } -} - -// Updates window geometry by posting an expose event to QWindowSystemInterface -void QCocoaWindow::updateExposedGeometry() -{ - // updateExposedGeometry is not allowed to send the initial expose. If you want - // that call exposeWindow(); - if (!m_geometryUpdateExposeAllowed) - return; - - // Do not send incorrect exposes in case the window is not even visible yet. - // We might get here as a result of a resize() from QWidget's show(), for instance. - if (!window()->isVisible()) - return; - - if (!isWindowExposable()) - return; - - if (m_exposedGeometry.size() == geometry().size() && m_exposedDevicePixelRatio == devicePixelRatio()) - return; - - m_isExposed = true; - m_exposedGeometry = geometry(); - m_exposedDevicePixelRatio = devicePixelRatio(); - QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(0, 0), m_exposedGeometry.size())); -} - -QWindow *QCocoaWindow::childWindowAt(QPoint windowPoint) -{ - QWindow *targetWindow = window(); - foreach (QObject *child, targetWindow->children()) - if (QWindow *childWindow = qobject_cast(child)) - if (QPlatformWindow *handle = childWindow->handle()) - if (handle->isExposed() && childWindow->geometry().contains(windowPoint)) - targetWindow = static_cast(handle)->childWindowAt(windowPoint - childWindow->position()); - - return targetWindow; -} - -bool QCocoaWindow::shouldRefuseKeyWindowAndFirstResponder() -{ - // This function speaks up if there's any reason - // to refuse key window or first responder state. - - if (window()->flags() & Qt::WindowDoesNotAcceptFocus) - return true; - - if (m_inSetVisible) { - QVariant showWithoutActivating = window()->property("_q_showWithoutActivating"); - if (showWithoutActivating.isValid() && showWithoutActivating.toBool()) - return true; - } - - return false; -} - -QMargins QCocoaWindow::frameMargins() const -{ - NSRect frameW = [m_nsWindow frame]; - NSRect frameC = [m_nsWindow contentRectForFrameRect:frameW]; - - return QMargins(frameW.origin.x - frameC.origin.x, - (frameW.origin.y + frameW.size.height) - (frameC.origin.y + frameC.size.height), - (frameW.origin.x + frameW.size.width) - (frameC.origin.x + frameC.size.width), - frameC.origin.y - frameW.origin.y); -} - -void QCocoaWindow::setFrameStrutEventsEnabled(bool enabled) -{ - m_frameStrutEventsEnabled = enabled; -} diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qnsview.h b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qnsview.h deleted file mode 100644 index 1940b25c9..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qnsview.h +++ /dev/null @@ -1,145 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QNSVIEW_H -#define QNSVIEW_H - -#include - -#include -#include -#include - -#include "private/qcore_mac_p.h" - -QT_BEGIN_NAMESPACE -class QCocoaWindow; -class QCocoaBackingStore; -class QCocoaGLContext; -QT_END_NAMESPACE - -Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(QNSViewMouseMoveHelper)); - -@interface QT_MANGLE_NAMESPACE(QNSView) : NSView { - QImage m_backingStore; - qreal m_pixelRatio; - QPoint m_backingStoreOffset; - CGImageRef m_maskImage; - uchar *m_maskData; - bool m_shouldInvalidateWindowShadow; - QWindow *m_window; - QCocoaWindow *m_platformWindow; - NSTrackingArea *m_trackingArea; - Qt::MouseButtons m_buttons; - Qt::MouseButtons m_frameStrutButtons; - QString m_composingText; - bool m_sendKeyEvent; - QStringList *currentCustomDragTypes; - bool m_sendUpAsRightButton; - Qt::KeyboardModifiers currentWheelModifiers; - bool m_subscribesForGlobalFrameNotifications; -#ifndef QT_NO_OPENGL - QCocoaGLContext *m_glContext; - bool m_shouldSetGLContextinDrawRect; -#endif - NSString *m_inputSource; - QT_MANGLE_NAMESPACE(QNSViewMouseMoveHelper) *m_mouseMoveHelper; - bool m_resendKeyEvent; - bool m_scrolling; - bool m_exposedOnMoveToWindow; -} - -- (id)init; -- (id)initWithQWindow:(QWindow *)window platformWindow:(QCocoaWindow *) platformWindow; -- (void) clearQWindowPointers; -#ifndef QT_NO_OPENGL -- (void)setQCocoaGLContext:(QCocoaGLContext *)context; -#endif -- (void)flushBackingStore:(QCocoaBackingStore *)backingStore region:(const QRegion &)region offset:(QPoint)offset; -- (BOOL)beforeBeginPaint:(QCocoaBackingStore *)backingStore; -- (void)afterEndPaint:(QCocoaBackingStore *)backingStore; -- (void)setMaskRegion:(const QRegion *)region; -- (void)invalidateWindowShadowIfNeeded; -- (void)drawRect:(NSRect)dirtyRect; -- (void)updateGeometry; -- (void)notifyWindowStateChanged:(Qt::WindowState)newState; -- (void)windowNotification : (NSNotification *) windowNotification; -- (void)notifyWindowWillZoom:(BOOL)willZoom; -- (void)viewDidHide; -- (void)viewDidUnhide; - -- (BOOL)isFlipped; -- (BOOL)acceptsFirstResponder; -- (BOOL)becomeFirstResponder; -- (BOOL)hasMask; -- (BOOL)isOpaque; - -- (void)convertFromScreen:(NSPoint)mouseLocation toWindowPoint:(QPointF *)qtWindowPoint andScreenPoint:(QPointF *)qtScreenPoint; - -- (void)resetMouseButtons; - -- (void)handleMouseEvent:(NSEvent *)theEvent; -- (void)mouseDown:(NSEvent *)theEvent; -- (void)mouseDragged:(NSEvent *)theEvent; -- (void)mouseUp:(NSEvent *)theEvent; -- (void)mouseMovedImpl:(NSEvent *)theEvent; -- (void)mouseEnteredImpl:(NSEvent *)theEvent; -- (void)mouseExitedImpl:(NSEvent *)theEvent; -- (void)cursorUpdateImpl:(NSEvent *)theEvent; -- (void)rightMouseDown:(NSEvent *)theEvent; -- (void)rightMouseDragged:(NSEvent *)theEvent; -- (void)rightMouseUp:(NSEvent *)theEvent; -- (void)otherMouseDown:(NSEvent *)theEvent; -- (void)otherMouseDragged:(NSEvent *)theEvent; -- (void)otherMouseUp:(NSEvent *)theEvent; -- (void)handleFrameStrutMouseEvent:(NSEvent *)theEvent; - -- (void)handleTabletEvent: (NSEvent *)theEvent; -- (void)tabletPoint: (NSEvent *)theEvent; -- (void)tabletProximity: (NSEvent *)theEvent; - -- (int) convertKeyCode : (QChar)keyCode; -+ (Qt::KeyboardModifiers) convertKeyModifiers : (ulong)modifierFlags; -- (void)handleKeyEvent:(NSEvent *)theEvent eventType:(int)eventType; -- (void)keyDown:(NSEvent *)theEvent; -- (void)keyUp:(NSEvent *)theEvent; -- (BOOL)performKeyEquivalent:(NSEvent *)theEvent; - -- (void)registerDragTypes; -- (NSDragOperation)handleDrag:(id )sender; - -@end - -QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSView); - -#endif //QNSVIEW_H diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qnsview.mm b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qnsview.mm deleted file mode 100644 index f31ad9e5a..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/cocoa/qnsview.mm +++ /dev/null @@ -1,2009 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include - -#include -#include - -#include "qnsview.h" -#include "qcocoawindow.h" -#include "qcocoahelpers.h" -#include "qcocoaautoreleasepool.h" -#include "qmultitouch_mac_p.h" -#include "qcocoadrag.h" -#include - -#include -#include -#include -#include -#include "qcocoabackingstore.h" -#ifndef QT_NO_OPENGL -#include "qcocoaglcontext.h" -#endif -#include "qcocoaintegration.h" - -#ifdef QT_COCOA_ENABLE_ACCESSIBILITY_INSPECTOR -#include -#endif - -Q_LOGGING_CATEGORY(lcQpaTouch, "qt.qpa.input.touch") -#ifndef QT_NO_GESTURES -Q_LOGGING_CATEGORY(lcQpaGestures, "qt.qpa.input.gestures") -#endif -Q_LOGGING_CATEGORY(lcQpaTablet, "qt.qpa.input.tablet") - -static QTouchDevice *touchDevice = 0; - -// ### HACK Remove once 10.8 is unsupported -static NSString *_q_NSWindowDidChangeOcclusionStateNotification = nil; - -@interface NSEvent (Qt_Compile_Leopard_DeviceDelta) - - (CGFloat)deviceDeltaX; - - (CGFloat)deviceDeltaY; - - (CGFloat)deviceDeltaZ; -@end - -@interface QT_MANGLE_NAMESPACE(QNSViewMouseMoveHelper) : NSObject -{ - QNSView *view; -} - -- (id)initWithView:(QNSView *)theView; - -- (void)mouseMoved:(NSEvent *)theEvent; -- (void)mouseEntered:(NSEvent *)theEvent; -- (void)mouseExited:(NSEvent *)theEvent; -- (void)cursorUpdate:(NSEvent *)theEvent; - -@end - -@implementation QT_MANGLE_NAMESPACE(QNSViewMouseMoveHelper) - -- (id)initWithView:(QNSView *)theView -{ - self = [super init]; - if (self) { - view = theView; - } - return self; -} - -- (void)mouseMoved:(NSEvent *)theEvent -{ - [view mouseMovedImpl:theEvent]; -} - -- (void)mouseEntered:(NSEvent *)theEvent -{ - [view mouseEnteredImpl:theEvent]; -} - -- (void)mouseExited:(NSEvent *)theEvent -{ - [view mouseExitedImpl:theEvent]; -} - -- (void)cursorUpdate:(NSEvent *)theEvent -{ - [view cursorUpdateImpl:theEvent]; -} - -@end - -@implementation QT_MANGLE_NAMESPACE(QNSView) - -+ (void)initialize -{ - NSString **notificationNameVar = (NSString **)dlsym(RTLD_NEXT, "NSWindowDidChangeOcclusionStateNotification"); - if (notificationNameVar) - _q_NSWindowDidChangeOcclusionStateNotification = *notificationNameVar; -} - -- (id) init -{ - self = [super initWithFrame : NSMakeRect(0,0, 300,300)]; - if (self) { - m_pixelRatio = 1.; - m_maskImage = 0; - m_shouldInvalidateWindowShadow = false; - m_window = 0; - m_buttons = Qt::NoButton; - m_frameStrutButtons = Qt::NoButton; - m_sendKeyEvent = false; - m_subscribesForGlobalFrameNotifications = false; -#ifndef QT_NO_OPENGL - m_glContext = 0; - m_shouldSetGLContextinDrawRect = false; -#endif - currentCustomDragTypes = 0; - m_sendUpAsRightButton = false; - m_inputSource = 0; - m_mouseMoveHelper = [[QT_MANGLE_NAMESPACE(QNSViewMouseMoveHelper) alloc] initWithView:self]; - m_resendKeyEvent = false; - m_scrolling = false; - - if (!touchDevice) { - touchDevice = new QTouchDevice; - touchDevice->setType(QTouchDevice::TouchPad); - touchDevice->setCapabilities(QTouchDevice::Position | QTouchDevice::NormalizedPosition | QTouchDevice::MouseEmulation); - QWindowSystemInterface::registerTouchDevice(touchDevice); - } - } - return self; -} - -- (void)dealloc -{ - CGImageRelease(m_maskImage); - [m_trackingArea release]; - m_maskImage = 0; - m_window = 0; - m_subscribesForGlobalFrameNotifications = false; - [m_inputSource release]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [m_mouseMoveHelper release]; - - delete currentCustomDragTypes; - - [super dealloc]; -} - -- (id)initWithQWindow:(QWindow *)window platformWindow:(QCocoaWindow *) platformWindow -{ - self = [self init]; - if (!self) - return 0; - - m_window = window; - m_platformWindow = platformWindow; - m_sendKeyEvent = false; - m_trackingArea = nil; - -#ifdef QT_COCOA_ENABLE_ACCESSIBILITY_INSPECTOR - // prevent rift in space-time continuum, disable - // accessibility for the accessibility inspector's windows. - static bool skipAccessibilityForInspectorWindows = false; - if (!skipAccessibilityForInspectorWindows) { - - // m_accessibleRoot = window->accessibleRoot(); - - AccessibilityInspector *inspector = new AccessibilityInspector(window); - skipAccessibilityForInspectorWindows = true; - inspector->inspectWindow(window); - skipAccessibilityForInspectorWindows = false; - } -#endif - - [self registerDragTypes]; - [self setPostsFrameChangedNotifications : YES]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(updateGeometry) - name:NSViewFrameDidChangeNotification - object:self]; - - return self; -} - -- (void) clearQWindowPointers -{ - m_window = 0; - m_platformWindow = 0; -} - -#ifndef QT_NO_OPENGL -- (void) setQCocoaGLContext:(QCocoaGLContext *)context -{ - m_glContext = context; - [m_glContext->nsOpenGLContext() setView:self]; - if (![m_glContext->nsOpenGLContext() view]) { - //was unable to set view - m_shouldSetGLContextinDrawRect = true; - } - - if (!m_subscribesForGlobalFrameNotifications) { - // NSOpenGLContext expects us to repaint (or update) the view when - // it changes position on screen. Since this happens unnoticed for - // the view when the parent view moves, we need to register a special - // notification that lets us handle this case: - m_subscribesForGlobalFrameNotifications = true; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(globalFrameChanged:) - name:NSViewGlobalFrameDidChangeNotification - object:self]; - } -} -#endif - -- (void) globalFrameChanged:(NSNotification*)notification -{ - Q_UNUSED(notification); - m_platformWindow->updateExposedGeometry(); -} - -- (void)viewDidMoveToSuperview -{ - if (!(m_platformWindow->m_contentViewIsToBeEmbedded)) - return; - - if ([self superview]) { - m_platformWindow->m_contentViewIsEmbedded = true; - QWindowSystemInterface::handleGeometryChange(m_window, m_platformWindow->geometry()); - m_platformWindow->updateExposedGeometry(); - QWindowSystemInterface::flushWindowSystemEvents(); - } else { - m_platformWindow->m_contentViewIsEmbedded = false; - } -} - -- (void)viewDidMoveToWindow -{ - if (self.window) { - // This is the case of QWidgetAction's generated QWidget inserted in an NSMenu. - // 10.9 and newer get the NSWindowDidChangeOcclusionStateNotification - if ((!_q_NSWindowDidChangeOcclusionStateNotification - && [self.window.className isEqualToString:@"NSCarbonMenuWindow"])) { - m_exposedOnMoveToWindow = true; - m_platformWindow->exposeWindow(); - } - } else if (m_exposedOnMoveToWindow) { - m_exposedOnMoveToWindow = false; - m_platformWindow->obscureWindow(); - } -} - -- (void)viewWillMoveToWindow:(NSWindow *)newWindow -{ - // ### Merge "normal" window code path with this one for 5.1. - if (!(m_window->type() & Qt::SubWindow)) - return; - - if (newWindow) { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(windowNotification:) - name:nil // Get all notifications - object:newWindow]; - } - if ([self window]) - [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:[self window]]; -} - -- (QWindow *)topLevelWindow -{ - QWindow *focusWindow = m_window; - - // For widgets we need to do a bit of trickery as the window - // to activate is the window of the top-level widget. - if (qstrcmp(m_window->metaObject()->className(), "QWidgetWindow") == 0) { - while (focusWindow->parent()) { - focusWindow = focusWindow->parent(); - } - } - - return focusWindow; -} - -- (void)updateGeometry -{ - QRect geometry; - - if (m_platformWindow->m_isNSWindowChild) { - return; -#if 0 - //geometry = qt_mac_toQRect([self frame]); - qDebug() << "nsview updateGeometry" << m_platformWindow->window(); - QRect screenRect = qt_mac_toQRect([m_platformWindow->m_nsWindow convertRectToScreen:[self frame]]); - qDebug() << "screenRect" << screenRect; - - screenRect.moveTop(qt_mac_flipYCoordinate(screenRect.y() + screenRect.height())); - geometry = QRect(m_platformWindow->window()->parent()->mapFromGlobal(screenRect.topLeft()), screenRect.size()); - qDebug() << "geometry" << geometry; -#endif - //geometry = QRect(screenRect.origin.x, qt_mac_flipYCoordinate(screenRect.origin.y + screenRect.size.height), screenRect.size.width, screenRect.size.height); - } else if (m_platformWindow->m_nsWindow) { - // top level window, get window rect and flip y. - NSRect rect = [self frame]; - NSRect windowRect = [[self window] frame]; - geometry = QRect(windowRect.origin.x, qt_mac_flipYCoordinate(windowRect.origin.y + rect.size.height), rect.size.width, rect.size.height); - } else if (m_platformWindow->m_contentViewIsToBeEmbedded) { - // embedded child window, use the frame rect ### merge with case below - geometry = qt_mac_toQRect([self bounds]); - } else { - // child window, use the frame rect - geometry = qt_mac_toQRect([self frame]); - } - - if (m_platformWindow->m_nsWindow && geometry == m_platformWindow->geometry()) - return; - -#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG - qDebug() << "QNSView::udpateGeometry" << m_platformWindow << geometry; -#endif - - // Call setGeometry on QPlatformWindow. (not on QCocoaWindow, - // doing that will initiate a geometry change it and possibly create - // an infinite loop when this notification is triggered again.) - m_platformWindow->QPlatformWindow::setGeometry(geometry); - - // Don't send the geometry change if the QWindow is designated to be - // embedded in a foreign view hiearchy but has not actually been - // embedded yet - it's too early. - if (m_platformWindow->m_contentViewIsToBeEmbedded && !m_platformWindow->m_contentViewIsEmbedded) - return; - - // Send a geometry change event to Qt, if it's ready to handle events - if (!m_platformWindow->m_inConstructor) { - QWindowSystemInterface::handleGeometryChange(m_window, geometry); - m_platformWindow->updateExposedGeometry(); - // Guard against processing window system events during QWindow::setGeometry - // calles, which Qt and Qt applications do not excpect. - if (!m_platformWindow->m_inSetGeometry) - QWindowSystemInterface::flushWindowSystemEvents(); - else - m_backingStore = QImage(); - } -} - -- (void)notifyWindowStateChanged:(Qt::WindowState)newState -{ - // If the window was maximized, then fullscreen, then tried to go directly to "normal" state, - // this notification will say that it is "normal", but it will still look maximized, and - // if you called performZoom it would actually take it back to "normal". - // So we should say that it is maximized because it actually is. - if (newState == Qt::WindowNoState && m_platformWindow->m_effectivelyMaximized) - newState = Qt::WindowMaximized; - QWindowSystemInterface::handleWindowStateChanged(m_window, newState); - // We want to read the window state back from the window, - // but the event we just sent may be asynchronous. - QWindowSystemInterface::flushWindowSystemEvents(); - m_platformWindow->setSynchedWindowStateFromWindow(); -} - -- (void)windowNotification : (NSNotification *) windowNotification -{ - //qDebug() << "windowNotification" << QCFString::toQString([windowNotification name]); - - NSString *notificationName = [windowNotification name]; - if (notificationName == NSWindowDidBecomeKeyNotification) { - if (!m_platformWindow->windowIsPopupType()) - QWindowSystemInterface::handleWindowActivated(m_window); - } else if (notificationName == NSWindowDidResignKeyNotification) { - // key window will be non-nil if another window became key... do not - // set the active window to zero here, the new key window's - // NSWindowDidBecomeKeyNotification hander will change the active window - NSWindow *keyWindow = [NSApp keyWindow]; - if (!keyWindow) { - // no new key window, go ahead and set the active window to zero - if (!m_platformWindow->windowIsPopupType()) - QWindowSystemInterface::handleWindowActivated(0); - } - } else if (notificationName == NSWindowDidMiniaturizeNotification - || notificationName == NSWindowDidDeminiaturizeNotification) { - Qt::WindowState newState = notificationName == NSWindowDidMiniaturizeNotification ? - Qt::WindowMinimized : Qt::WindowNoState; - [self notifyWindowStateChanged:newState]; - } else if ([notificationName isEqualToString: @"NSWindowDidOrderOffScreenNotification"]) { - m_platformWindow->obscureWindow(); - } else if ([notificationName isEqualToString: @"NSWindowDidOrderOnScreenAndFinishAnimatingNotification"]) { - m_platformWindow->exposeWindow(); - } else if (_q_NSWindowDidChangeOcclusionStateNotification - && [notificationName isEqualToString:_q_NSWindowDidChangeOcclusionStateNotification]) { -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_9 -// ### HACK Remove the enum declaration, the warning disabling and the cast further down once 10.8 is unsupported -QT_WARNING_PUSH -QT_WARNING_DISABLE_CLANG("-Wobjc-method-access") - enum { NSWindowOcclusionStateVisible = 1UL << 1 }; -#endif - if ((NSUInteger)[self.window occlusionState] & NSWindowOcclusionStateVisible) { - m_platformWindow->exposeWindow(); - } else { - // Send Obscure events on window occlusion to stop animations. Several - // unit tests expect paint and/or expose events for windows that are - // sometimes (unpredictably) occlouded: Don't send Obscure events when - // running under QTestLib. - static bool onTestLib = qt_mac_resolveOption(false, "QT_QTESTLIB_RUNNING"); - if (!onTestLib) - m_platformWindow->obscureWindow(); - } -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_9 -QT_WARNING_POP -#endif - } else if (notificationName == NSWindowDidChangeScreenNotification) { - if (m_window) { - NSUInteger screenIndex = [[NSScreen screens] indexOfObject:self.window.screen]; - if (screenIndex != NSNotFound) { - QCocoaScreen *cocoaScreen = QCocoaIntegration::instance()->screenAtIndex(screenIndex); - QWindowSystemInterface::handleWindowScreenChanged(m_window, cocoaScreen->screen()); - m_platformWindow->updateExposedGeometry(); - } - } - } else if (notificationName == NSWindowDidEnterFullScreenNotification - || notificationName == NSWindowDidExitFullScreenNotification) { - Qt::WindowState newState = notificationName == NSWindowDidEnterFullScreenNotification ? - Qt::WindowFullScreen : Qt::WindowNoState; - [self notifyWindowStateChanged:newState]; - } -} - -- (void)notifyWindowWillZoom:(BOOL)willZoom -{ - Qt::WindowState newState = willZoom ? Qt::WindowMaximized : Qt::WindowNoState; - if (!willZoom) - m_platformWindow->m_effectivelyMaximized = false; - [self notifyWindowStateChanged:newState]; -} - -- (void)viewDidHide -{ - m_platformWindow->obscureWindow(); -} - -- (void)viewDidUnhide -{ - m_platformWindow->exposeWindow(); -} - -- (void) flushBackingStore:(QCocoaBackingStore *)backingStore region:(const QRegion &)region offset:(QPoint)offset -{ - m_backingStore = backingStore->toImage(); - m_pixelRatio = backingStore->getBackingStoreDevicePixelRatio(); - m_backingStoreOffset = offset * m_pixelRatio; - foreach (QRect rect, region.rects()) { - [self setNeedsDisplayInRect:NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height())]; - } -} - -- (BOOL) beforeBeginPaint:(QCocoaBackingStore *)backingStore -{ - if (!m_backingStore.isNull() && m_backingStore.constBits() == backingStore->toImage().constBits()) { - m_backingStore = QImage(); - return true; - } - return false; -} - -- (void) afterEndPaint:(QCocoaBackingStore *)backingStore -{ - m_backingStore = backingStore->toImage(); -} - -- (BOOL) hasMask -{ - return m_maskImage != 0; -} - -- (BOOL) isOpaque -{ - if (!m_platformWindow) - return true; - return m_platformWindow->isOpaque(); -} - -- (void) setMaskRegion:(const QRegion *)region -{ - m_shouldInvalidateWindowShadow = true; - if (m_maskImage) - CGImageRelease(m_maskImage); - if (region->isEmpty()) { - m_maskImage = 0; - return; - } - - const QRect &rect = region->boundingRect(); - QImage tmp(rect.size(), QImage::Format_RGB32); - tmp.fill(Qt::white); - QPainter p(&tmp); - p.setClipRegion(*region); - p.fillRect(rect, Qt::black); - p.end(); - QImage maskImage = QImage(rect.size(), QImage::Format_Indexed8); - for (int y=0; ym_nsWindow) { - [m_platformWindow->m_nsWindow invalidateShadow]; - m_shouldInvalidateWindowShadow = false; - } -} - -- (void) drawRect:(NSRect)dirtyRect -{ -#ifndef QT_NO_OPENGL - if (m_glContext && m_shouldSetGLContextinDrawRect) { - [m_glContext->nsOpenGLContext() setView:self]; - m_shouldSetGLContextinDrawRect = false; - } -#endif - - if (m_platformWindow->m_drawContentBorderGradient) - NSDrawWindowBackground(dirtyRect); - - if (m_backingStore.isNull()) - return; - - // Calculate source and target rects. The target rect is the dirtyRect: - CGRect dirtyWindowRect = NSRectToCGRect(dirtyRect); - - // The backing store source rect will be larger on retina displays. - // Scale dirtyRect by the device pixel ratio: - CGRect dirtyBackingRect = CGRectMake(dirtyRect.origin.x * m_pixelRatio, - dirtyRect.origin.y * m_pixelRatio, - dirtyRect.size.width * m_pixelRatio, - dirtyRect.size.height * m_pixelRatio); - - NSGraphicsContext *nsGraphicsContext = [NSGraphicsContext currentContext]; - CGContextRef cgContext = (CGContextRef) [nsGraphicsContext graphicsPort]; - - // Translate coordiate system from CoreGraphics (bottom-left) to NSView (top-left): - CGContextSaveGState(cgContext); - int dy = dirtyWindowRect.origin.y + CGRectGetMaxY(dirtyWindowRect); - - CGContextTranslateCTM(cgContext, 0, dy); - CGContextScaleCTM(cgContext, 1, -1); - - // If a mask is set, modify the sub image accordingly: - CGImageRef subMask = 0; - if (m_maskImage) { - subMask = CGImageCreateWithImageInRect(m_maskImage, dirtyWindowRect); - CGContextClipToMask(cgContext, dirtyWindowRect, subMask); - } - - // Clip out and draw the correct sub image from the (shared) backingstore: - CGRect backingStoreRect = CGRectMake( - dirtyBackingRect.origin.x + m_backingStoreOffset.x(), - dirtyBackingRect.origin.y + m_backingStoreOffset.y(), - dirtyBackingRect.size.width, - dirtyBackingRect.size.height - ); - CGImageRef bsCGImage = qt_mac_toCGImage(m_backingStore); - CGImageRef cleanImg = CGImageCreateWithImageInRect(bsCGImage, backingStoreRect); - - // Optimization: Copy frame buffer content instead of blending for - // top-level windows where Qt fills the entire window content area. - // (But don't overpaint the title-bar gradient) - if (m_platformWindow->m_nsWindow && !m_platformWindow->m_drawContentBorderGradient) - CGContextSetBlendMode(cgContext, kCGBlendModeCopy); - - CGContextDrawImage(cgContext, dirtyWindowRect, cleanImg); - - // Clean-up: - CGContextRestoreGState(cgContext); - CGImageRelease(cleanImg); - CGImageRelease(subMask); - CGImageRelease(bsCGImage); - - [self invalidateWindowShadowIfNeeded]; -} - -- (BOOL) isFlipped -{ - return YES; -} - -- (BOOL)becomeFirstResponder -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return NO; - if (!m_platformWindow->windowIsPopupType()) - QWindowSystemInterface::handleWindowActivated([self topLevelWindow]); - return YES; -} - -- (BOOL)acceptsFirstResponder -{ - if (m_platformWindow->shouldRefuseKeyWindowAndFirstResponder()) - return NO; - if (m_window->flags() & Qt::WindowTransparentForInput) - return NO; - if ((m_window->flags() & Qt::ToolTip) == Qt::ToolTip) - return NO; - return YES; -} - -- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent -{ - Q_UNUSED(theEvent) - if (m_window->flags() & Qt::WindowTransparentForInput) - return NO; - return YES; -} - -- (void)convertFromScreen:(NSPoint)mouseLocation toWindowPoint:(QPointF *)qtWindowPoint andScreenPoint:(QPointF *)qtScreenPoint -{ - // Calculate the mouse position in the QWindow and Qt screen coordinate system, - // starting from coordinates in the NSWindow coordinate system. - // - // This involves translating according to the window location on screen, - // as well as inverting the y coordinate due to the origin change. - // - // Coordinate system overview, outer to innermost: - // - // Name Origin - // - // OS X screen bottom-left - // Qt screen top-left - // NSWindow bottom-left - // NSView/QWindow top-left - // - // NSView and QWindow are equal coordinate systems: the QWindow covers the - // entire NSView, and we've set the NSView's isFlipped property to true. - - NSWindow *window = [self window]; - NSPoint nsWindowPoint; - NSRect windowRect = [window convertRectFromScreen:NSMakeRect(mouseLocation.x, mouseLocation.y, 1, 1)]; - nsWindowPoint = windowRect.origin; // NSWindow coordinates - NSPoint nsViewPoint = [self convertPoint: nsWindowPoint fromView: nil]; // NSView/QWindow coordinates - *qtWindowPoint = QPointF(nsViewPoint.x, nsViewPoint.y); // NSView/QWindow coordinates - - *qtScreenPoint = QPointF(mouseLocation.x, qt_mac_flipYCoordinate(mouseLocation.y)); // Qt screen coordinates -} - -- (void)resetMouseButtons -{ - m_buttons = Qt::NoButton; - m_frameStrutButtons = Qt::NoButton; -} - -- (NSPoint) screenMousePoint:(NSEvent *)theEvent -{ - NSPoint screenPoint; - if (theEvent) { - NSPoint windowPoint = [theEvent locationInWindow]; - NSRect screenRect = [[theEvent window] convertRectToScreen:NSMakeRect(windowPoint.x, windowPoint.y, 1, 1)]; - screenPoint = screenRect.origin; - } else { - screenPoint = [NSEvent mouseLocation]; - } - return screenPoint; -} - -- (void)handleMouseEvent:(NSEvent *)theEvent -{ - [self handleTabletEvent: theEvent]; - - QPointF qtWindowPoint; - QPointF qtScreenPoint; - QNSView *targetView = self; - if (m_platformWindow && m_platformWindow->m_forwardWindow) { - if (theEvent.type == NSLeftMouseDragged || theEvent.type == NSLeftMouseUp) - targetView = m_platformWindow->m_forwardWindow->m_qtView; - else - m_platformWindow->m_forwardWindow = 0; - } - - // Popups implicitly grap mouse events; forward to the active popup if there is one - if (QCocoaWindow *popup = QCocoaIntegration::instance()->activePopupWindow()) { - if (QNSView *popupView = popup->qtView()) - targetView = popupView; - } - - [targetView convertFromScreen:[self screenMousePoint:theEvent] toWindowPoint:&qtWindowPoint andScreenPoint:&qtScreenPoint]; - ulong timestamp = [theEvent timestamp] * 1000; - - QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); - nativeDrag->setLastMouseEvent(theEvent, self); - - Qt::KeyboardModifiers keyboardModifiers = [QNSView convertKeyModifiers:[theEvent modifierFlags]]; - QWindowSystemInterface::handleMouseEvent(targetView->m_window, timestamp, qtWindowPoint, qtScreenPoint, m_buttons, keyboardModifiers); -} - -- (void)handleFrameStrutMouseEvent:(NSEvent *)theEvent -{ - // get m_buttons in sync - // Don't send frme strut events if we are in the middle of a mouse drag. - if (m_buttons != Qt::NoButton) - return; - - NSEventType ty = [theEvent type]; - switch (ty) { - case NSLeftMouseDown: - m_frameStrutButtons |= Qt::LeftButton; - break; - case NSLeftMouseUp: - m_frameStrutButtons &= ~Qt::LeftButton; - break; - case NSRightMouseDown: - m_frameStrutButtons |= Qt::RightButton; - break; - case NSLeftMouseDragged: - m_frameStrutButtons |= Qt::LeftButton; - break; - case NSRightMouseDragged: - m_frameStrutButtons |= Qt::RightButton; - break; - case NSRightMouseUp: - m_frameStrutButtons &= ~Qt::RightButton; - break; - case NSOtherMouseDown: - m_frameStrutButtons |= cocoaButton2QtButton([theEvent buttonNumber]); - break; - case NSOtherMouseUp: - m_frameStrutButtons &= ~cocoaButton2QtButton([theEvent buttonNumber]); - default: - break; - } - - NSWindow *window = [self window]; - NSPoint windowPoint = [theEvent locationInWindow]; - - int windowScreenY = [window frame].origin.y + [window frame].size.height; - NSPoint windowCoord = [self convertPoint:[self frame].origin toView:nil]; - int viewScreenY = [window convertRectToScreen:NSMakeRect(windowCoord.x, windowCoord.y, 0, 0)].origin.y; - int titleBarHeight = windowScreenY - viewScreenY; - - NSPoint nsViewPoint = [self convertPoint: windowPoint fromView: nil]; - QPoint qtWindowPoint = QPoint(nsViewPoint.x, titleBarHeight + nsViewPoint.y); - NSPoint screenPoint = [window convertRectToScreen:NSMakeRect(windowPoint.x, windowPoint.y, 0, 0)].origin; - QPoint qtScreenPoint = QPoint(screenPoint.x, qt_mac_flipYCoordinate(screenPoint.y)); - - ulong timestamp = [theEvent timestamp] * 1000; - QWindowSystemInterface::handleFrameStrutMouseEvent(m_window, timestamp, qtWindowPoint, qtScreenPoint, m_frameStrutButtons); -} - -- (void)mouseDown:(NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super mouseDown:theEvent]; - m_sendUpAsRightButton = false; - - // Handle any active poup windows; clicking outisde them should close them - // all. Don't do anything or clicks inside one of the menus, let Cocoa - // handle that case. Note that in practice many windows of the Qt::Popup type - // will actually close themselves in this case using logic implemented in - // that particular poup type (for example context menus). However, Qt expects - // that plain popup QWindows will also be closed, so we implement the logic - // here as well. - QList *popups = QCocoaIntegration::instance()->popupWindowStack(); - if (!popups->isEmpty()) { - // Check if the click is outside all popups. - bool inside = false; - QPointF qtScreenPoint = qt_mac_flipPoint([self screenMousePoint:theEvent]); - for (QList::const_iterator it = popups->begin(); it != popups->end(); ++it) { - if ((*it)->geometry().contains(qtScreenPoint.toPoint())) { - inside = true; - break; - } - } - // Close the popups if the click was outside. - if (!inside) { - Qt::WindowType type = QCocoaIntegration::instance()->activePopupWindow()->window()->type(); - while (QCocoaWindow *popup = QCocoaIntegration::instance()->popPopupWindow()) { - QWindowSystemInterface::handleCloseEvent(popup->window()); - QWindowSystemInterface::flushWindowSystemEvents(); - } - // Consume the mouse event when closing the popup, except for tool tips - // were it's expected that the event is processed normally. - if (type != Qt::ToolTip) - return; - } - } - - if ([self hasMarkedText]) { - [[NSTextInputContext currentInputContext] handleEvent:theEvent]; - } else { - if ([QNSView convertKeyModifiers:[theEvent modifierFlags]] & Qt::MetaModifier) { - m_buttons |= Qt::RightButton; - m_sendUpAsRightButton = true; - } else { - m_buttons |= Qt::LeftButton; - } - [self handleMouseEvent:theEvent]; - } -} - -- (void)mouseDragged:(NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super mouseDragged:theEvent]; - if (!(m_buttons & (m_sendUpAsRightButton ? Qt::RightButton : Qt::LeftButton))) - qWarning("QNSView mouseDragged: Internal mouse button tracking invalid (missing Qt::LeftButton)"); - [self handleMouseEvent:theEvent]; -} - -- (void)mouseUp:(NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super mouseUp:theEvent]; - if (m_sendUpAsRightButton) { - m_buttons &= ~Qt::RightButton; - m_sendUpAsRightButton = false; - } else { - m_buttons &= ~Qt::LeftButton; - } - [self handleMouseEvent:theEvent]; -} - -- (void)updateTrackingAreas -{ - [super updateTrackingAreas]; - - QCocoaAutoReleasePool pool; - - // NSTrackingInVisibleRect keeps care of updating once the tracking is set up, so bail out early - if (m_trackingArea && [[self trackingAreas] containsObject:m_trackingArea]) - return; - - // Ideally, we shouldn't have NSTrackingMouseMoved events included below, it should - // only be turned on if mouseTracking, hover is on or a tool tip is set. - // Unfortunately, Qt will send "tooltip" events on mouse moves, so we need to - // turn it on in ALL case. That means EVERY QWindow gets to pay the cost of - // mouse moves delivered to it (Apple recommends keeping it OFF because there - // is a performance hit). So it goes. - NSUInteger trackingOptions = NSTrackingMouseEnteredAndExited | NSTrackingActiveInActiveApp - | NSTrackingInVisibleRect | NSTrackingMouseMoved | NSTrackingCursorUpdate; - [m_trackingArea release]; - m_trackingArea = [[NSTrackingArea alloc] initWithRect:[self frame] - options:trackingOptions - owner:m_mouseMoveHelper - userInfo:nil]; - [self addTrackingArea:m_trackingArea]; -} - --(void)cursorUpdateImpl:(NSEvent *)theEvent -{ - Q_UNUSED(theEvent) - // Set the cursor manually if there is no NSWindow. - if (!m_platformWindow->m_nsWindow && m_platformWindow->m_windowCursor) - [m_platformWindow->m_windowCursor set]; - else - [super cursorUpdate:theEvent]; -} - --(void)resetCursorRects -{ - // Use the cursor rect API if there is a NSWindow - if (m_platformWindow->m_nsWindow && m_platformWindow->m_windowCursor) - [self addCursorRect:[self visibleRect] cursor:m_platformWindow->m_windowCursor]; -} - -- (void)mouseMovedImpl:(NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return; - - QPointF windowPoint; - QPointF screenPoint; - [self convertFromScreen:[self screenMousePoint:theEvent] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; - QWindow *childWindow = m_platformWindow->childWindowAt(windowPoint.toPoint()); - - // Top-level windows generate enter-leave events for sub-windows. - // Qt wants to know which window (if any) will be entered at the - // the time of the leave. This is dificult to accomplish by - // handling mouseEnter and mouseLeave envents, since they are sent - // individually to different views. - if (m_platformWindow->m_nsWindow && childWindow) { - if (childWindow != m_platformWindow->m_enterLeaveTargetWindow) { - QWindowSystemInterface::handleEnterLeaveEvent(childWindow, m_platformWindow->m_enterLeaveTargetWindow, windowPoint, screenPoint); - m_platformWindow->m_enterLeaveTargetWindow = childWindow; - } - } - - // Cocoa keeps firing mouse move events for obscured parent views. Qt should not - // send those events so filter them out here. - if (childWindow != m_window) - return; - - [self handleMouseEvent: theEvent]; -} - -- (void)mouseEnteredImpl:(NSEvent *)theEvent -{ - Q_UNUSED(theEvent) - m_platformWindow->m_windowUnderMouse = true; - - if (m_window->flags() & Qt::WindowTransparentForInput) - return; - - // Top-level windows generate enter events for sub-windows. - if (!m_platformWindow->m_nsWindow) - return; - - QPointF windowPoint; - QPointF screenPoint; - [self convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; - m_platformWindow->m_enterLeaveTargetWindow = m_platformWindow->childWindowAt(windowPoint.toPoint()); - QWindowSystemInterface::handleEnterEvent(m_platformWindow->m_enterLeaveTargetWindow, windowPoint, screenPoint); -} - -- (void)mouseExitedImpl:(NSEvent *)theEvent -{ - Q_UNUSED(theEvent); - m_platformWindow->m_windowUnderMouse = false; - - if (m_window->flags() & Qt::WindowTransparentForInput) - return; - - // Top-level windows generate leave events for sub-windows. - if (!m_platformWindow->m_nsWindow) - return; - - QWindowSystemInterface::handleLeaveEvent(m_platformWindow->m_enterLeaveTargetWindow); - m_platformWindow->m_enterLeaveTargetWindow = 0; -} - -- (void)rightMouseDown:(NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super rightMouseDown:theEvent]; - m_buttons |= Qt::RightButton; - m_sendUpAsRightButton = true; - [self handleMouseEvent:theEvent]; -} - -- (void)rightMouseDragged:(NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super rightMouseDragged:theEvent]; - if (!(m_buttons & Qt::RightButton)) - qWarning("QNSView rightMouseDragged: Internal mouse button tracking invalid (missing Qt::RightButton)"); - [self handleMouseEvent:theEvent]; -} - -- (void)rightMouseUp:(NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super rightMouseUp:theEvent]; - m_buttons &= ~Qt::RightButton; - m_sendUpAsRightButton = false; - [self handleMouseEvent:theEvent]; -} - -- (void)otherMouseDown:(NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super otherMouseDown:theEvent]; - m_buttons |= cocoaButton2QtButton([theEvent buttonNumber]); - [self handleMouseEvent:theEvent]; -} - -- (void)otherMouseDragged:(NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super otherMouseDragged:theEvent]; - if (!(m_buttons & ~(Qt::LeftButton | Qt::RightButton))) - qWarning("QNSView otherMouseDragged: Internal mouse button tracking invalid (missing Qt::MiddleButton or Qt::ExtraButton*)"); - [self handleMouseEvent:theEvent]; -} - -- (void)otherMouseUp:(NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super otherMouseUp:theEvent]; - m_buttons &= ~cocoaButton2QtButton([theEvent buttonNumber]); - [self handleMouseEvent:theEvent]; -} - -struct QCocoaTabletDeviceData -{ - QTabletEvent::TabletDevice device; - QTabletEvent::PointerType pointerType; - uint capabilityMask; - qint64 uid; -}; - -typedef QHash QCocoaTabletDeviceDataHash; -Q_GLOBAL_STATIC(QCocoaTabletDeviceDataHash, tabletDeviceDataHash) - -- (void)handleTabletEvent: (NSEvent *)theEvent -{ - NSEventType eventType = [theEvent type]; - if (eventType != NSTabletPoint && [theEvent subtype] != NSTabletPointEventSubtype) - return; // Not a tablet event. - - ulong timestamp = [theEvent timestamp] * 1000; - - QPointF windowPoint; - QPointF screenPoint; - [self convertFromScreen:[NSEvent mouseLocation] toWindowPoint: &windowPoint andScreenPoint: &screenPoint]; - - uint deviceId = [theEvent deviceID]; - if (!tabletDeviceDataHash->contains(deviceId)) { - // Error: Unknown tablet device. Qt also gets into this state - // when running on a VM. This appears to be harmless; don't - // print a warning. - return; - } - const QCocoaTabletDeviceData &deviceData = tabletDeviceDataHash->value(deviceId); - - bool down = (eventType != NSMouseMoved); - - qreal pressure; - if (down) { - pressure = [theEvent pressure]; - } else { - pressure = 0.0; - } - - NSPoint tilt = [theEvent tilt]; - int xTilt = qRound(tilt.x * 60.0); - int yTilt = qRound(tilt.y * -60.0); - Qt::MouseButtons buttons = static_cast(static_cast([theEvent buttonMask])); - qreal tangentialPressure = 0; - qreal rotation = 0; - int z = 0; - if (deviceData.capabilityMask & 0x0200) - z = [theEvent absoluteZ]; - - if (deviceData.capabilityMask & 0x0800) - tangentialPressure = ([theEvent tangentialPressure] * 2.0) - 1.0; - - rotation = 360.0 - [theEvent rotation]; - if (rotation > 180.0) - rotation -= 360.0; - - Qt::KeyboardModifiers keyboardModifiers = [QNSView convertKeyModifiers:[theEvent modifierFlags]]; - - qCDebug(lcQpaTablet, "event on tablet %d with tool %d type %d unique ID %lld pos %6.1f, %6.1f root pos %6.1f, %6.1f buttons 0x%x pressure %4.2lf tilt %d, %d rotation %6.2lf", - deviceId, deviceData.device, deviceData.pointerType, deviceData.uid, - windowPoint.x(), windowPoint.y(), screenPoint.x(), screenPoint.y(), - static_cast(buttons), pressure, xTilt, yTilt, rotation); - - QWindowSystemInterface::handleTabletEvent(m_window, timestamp, windowPoint, screenPoint, - deviceData.device, deviceData.pointerType, buttons, pressure, xTilt, yTilt, - tangentialPressure, rotation, z, deviceData.uid, - keyboardModifiers); -} - -- (void)tabletPoint: (NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super tabletPoint:theEvent]; - - [self handleTabletEvent: theEvent]; -} - -static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) -{ - qint64 uid = [theEvent uniqueID]; - uint bits = [theEvent vendorPointingDeviceType]; - if (bits == 0 && uid != 0) { - // Fallback. It seems that the driver doesn't always include all the information. - // High-End Wacom devices store their "type" in the uper bits of the Unique ID. - // I'm not sure how to handle it for consumer devices, but I'll test that in a bit. - bits = uid >> 32; - } - - QTabletEvent::TabletDevice device; - // Defined in the "EN0056-NxtGenImpGuideX" - // on Wacom's Developer Website (www.wacomeng.com) - if (((bits & 0x0006) == 0x0002) && ((bits & 0x0F06) != 0x0902)) { - device = QTabletEvent::Stylus; - } else { - switch (bits & 0x0F06) { - case 0x0802: - device = QTabletEvent::Stylus; - break; - case 0x0902: - device = QTabletEvent::Airbrush; - break; - case 0x0004: - device = QTabletEvent::FourDMouse; - break; - case 0x0006: - device = QTabletEvent::Puck; - break; - case 0x0804: - device = QTabletEvent::RotationStylus; - break; - default: - device = QTabletEvent::NoDevice; - } - } - return device; -} - -- (void)tabletProximity: (NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super tabletProximity:theEvent]; - - ulong timestamp = [theEvent timestamp] * 1000; - - QCocoaTabletDeviceData deviceData; - deviceData.uid = [theEvent uniqueID]; - deviceData.capabilityMask = [theEvent capabilityMask]; - - switch ([theEvent pointingDeviceType]) { - case NSUnknownPointingDevice: - default: - deviceData.pointerType = QTabletEvent::UnknownPointer; - break; - case NSPenPointingDevice: - deviceData.pointerType = QTabletEvent::Pen; - break; - case NSCursorPointingDevice: - deviceData.pointerType = QTabletEvent::Cursor; - break; - case NSEraserPointingDevice: - deviceData.pointerType = QTabletEvent::Eraser; - break; - } - - deviceData.device = wacomTabletDevice(theEvent); - - // The deviceID is "unique" while in the proximity, it's a key that we can use for - // linking up QCocoaTabletDeviceData to an event (especially if there are two devices in action). - bool entering = [theEvent isEnteringProximity]; - uint deviceId = [theEvent deviceID]; - if (entering) { - tabletDeviceDataHash->insert(deviceId, deviceData); - } else { - tabletDeviceDataHash->remove(deviceId); - } - - qCDebug(lcQpaTablet, "proximity change on tablet %d: current tool %d type %d unique ID %lld", - deviceId, deviceData.device, deviceData.pointerType, deviceData.uid); - - if (entering) { - QWindowSystemInterface::handleTabletEnterProximityEvent(timestamp, deviceData.device, deviceData.pointerType, deviceData.uid); - } else { - QWindowSystemInterface::handleTabletLeaveProximityEvent(timestamp, deviceData.device, deviceData.pointerType, deviceData.uid); - } -} - -- (bool) shouldSendSingleTouch -{ - // QtWidgets expects single-point touch events, QtDeclarative does not. - // Until there is an API we solve this by looking at the window class type. - return m_window->inherits("QWidgetWindow"); -} - -- (void)touchesBeganWithEvent:(NSEvent *)event -{ - const NSTimeInterval timestamp = [event timestamp]; - const QList points = QCocoaTouch::getCurrentTouchPointList(event, [self shouldSendSingleTouch]); - qCDebug(lcQpaTouch) << "touchesBeganWithEvent" << points; - QWindowSystemInterface::handleTouchEvent(m_window, timestamp * 1000, touchDevice, points); -} - -- (void)touchesMovedWithEvent:(NSEvent *)event -{ - const NSTimeInterval timestamp = [event timestamp]; - const QList points = QCocoaTouch::getCurrentTouchPointList(event, [self shouldSendSingleTouch]); - qCDebug(lcQpaTouch) << "touchesMovedWithEvent" << points; - QWindowSystemInterface::handleTouchEvent(m_window, timestamp * 1000, touchDevice, points); -} - -- (void)touchesEndedWithEvent:(NSEvent *)event -{ - const NSTimeInterval timestamp = [event timestamp]; - const QList points = QCocoaTouch::getCurrentTouchPointList(event, [self shouldSendSingleTouch]); - qCDebug(lcQpaTouch) << "touchesEndedWithEvent" << points; - QWindowSystemInterface::handleTouchEvent(m_window, timestamp * 1000, touchDevice, points); -} - -- (void)touchesCancelledWithEvent:(NSEvent *)event -{ - const NSTimeInterval timestamp = [event timestamp]; - const QList points = QCocoaTouch::getCurrentTouchPointList(event, [self shouldSendSingleTouch]); - qCDebug(lcQpaTouch) << "touchesCancelledWithEvent" << points; - QWindowSystemInterface::handleTouchEvent(m_window, timestamp * 1000, touchDevice, points); -} - -#ifndef QT_NO_GESTURES -- (void)magnifyWithEvent:(NSEvent *)event -{ - qCDebug(lcQpaGestures) << "magnifyWithEvent" << [event magnification]; - const NSTimeInterval timestamp = [event timestamp]; - QPointF windowPoint; - QPointF screenPoint; - [self convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; - QWindowSystemInterface::handleGestureEventWithRealValue(m_window, timestamp, Qt::ZoomNativeGesture, - [event magnification], windowPoint, screenPoint); -} - -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 -- (void)smartMagnifyWithEvent:(NSEvent *)event -{ - static bool zoomIn = true; - qCDebug(lcQpaGestures) << "smartMagnifyWithEvent" << zoomIn; - const NSTimeInterval timestamp = [event timestamp]; - QPointF windowPoint; - QPointF screenPoint; - [self convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; - QWindowSystemInterface::handleGestureEventWithRealValue(m_window, timestamp, Qt::SmartZoomNativeGesture, - zoomIn ? 1.0f : 0.0f, windowPoint, screenPoint); - zoomIn = !zoomIn; -} -#endif - -- (void)rotateWithEvent:(NSEvent *)event -{ - qCDebug(lcQpaGestures) << "rotateWithEvent" << [event rotation]; - const NSTimeInterval timestamp = [event timestamp]; - QPointF windowPoint; - QPointF screenPoint; - [self convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; - QWindowSystemInterface::handleGestureEventWithRealValue(m_window, timestamp, Qt::RotateNativeGesture, - -[event rotation], windowPoint, screenPoint); -} - -- (void)swipeWithEvent:(NSEvent *)event -{ - qCDebug(lcQpaGestures) << "swipeWithEvent" << [event deltaX] << [event deltaY]; - const NSTimeInterval timestamp = [event timestamp]; - QPointF windowPoint; - QPointF screenPoint; - [self convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; - - qreal angle = 0.0f; - if ([event deltaX] == 1) - angle = 180.0f; - else if ([event deltaX] == -1) - angle = 0.0f; - else if ([event deltaY] == 1) - angle = 90.0f; - else if ([event deltaY] == -1) - angle = 270.0f; - - QWindowSystemInterface::handleGestureEventWithRealValue(m_window, timestamp, Qt::SwipeNativeGesture, - angle, windowPoint, screenPoint); -} - -- (void)beginGestureWithEvent:(NSEvent *)event -{ - const NSTimeInterval timestamp = [event timestamp]; - QPointF windowPoint; - QPointF screenPoint; - [self convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; - qCDebug(lcQpaGestures) << "beginGestureWithEvent @" << windowPoint; - QWindowSystemInterface::handleGestureEvent(m_window, timestamp, Qt::BeginNativeGesture, - windowPoint, screenPoint); -} - -- (void)endGestureWithEvent:(NSEvent *)event -{ - qCDebug(lcQpaGestures) << "endGestureWithEvent"; - const NSTimeInterval timestamp = [event timestamp]; - QPointF windowPoint; - QPointF screenPoint; - [self convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; - QWindowSystemInterface::handleGestureEvent(m_window, timestamp, Qt::EndNativeGesture, - windowPoint, screenPoint); -} -#endif // QT_NO_GESTURES - -#ifndef QT_NO_WHEELEVENT -- (void)scrollWheel:(NSEvent *)theEvent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super scrollWheel:theEvent]; - - QPoint angleDelta; - Qt::MouseEventSource source = Qt::MouseEventNotSynthesized; - if ([theEvent hasPreciseScrollingDeltas]) { - // The mouse device contains pixel scroll wheel support (Mighty Mouse, Trackpad). - // Since deviceDelta is delivered as pixels rather than degrees, we need to - // convert from pixels to degrees in a sensible manner. - // It looks like 1/4 degrees per pixel behaves most native. - // (NB: Qt expects the unit for delta to be 8 per degree): - const int pixelsToDegrees = 2; // 8 * 1/4 - angleDelta.setX([theEvent scrollingDeltaX] * pixelsToDegrees); - angleDelta.setY([theEvent scrollingDeltaY] * pixelsToDegrees); - source = Qt::MouseEventSynthesizedBySystem; - } else { - // Remove acceleration, and use either -120 or 120 as delta: - angleDelta.setX(qBound(-120, int([theEvent deltaX] * 10000), 120)); - angleDelta.setY(qBound(-120, int([theEvent deltaY] * 10000), 120)); - } - - QPoint pixelDelta; - if ([theEvent hasPreciseScrollingDeltas]) { - pixelDelta.setX([theEvent scrollingDeltaX]); - pixelDelta.setY([theEvent scrollingDeltaY]); - } else { - // docs: "In the case of !hasPreciseScrollingDeltas, multiply the delta with the line width." - // scrollingDeltaX seems to return a minimum value of 0.1 in this case, map that to two pixels. - const CGFloat lineWithEstimate = 20.0; - pixelDelta.setX([theEvent scrollingDeltaX] * lineWithEstimate); - pixelDelta.setY([theEvent scrollingDeltaY] * lineWithEstimate); - } - - QPointF qt_windowPoint; - QPointF qt_screenPoint; - [self convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&qt_windowPoint andScreenPoint:&qt_screenPoint]; - NSTimeInterval timestamp = [theEvent timestamp]; - ulong qt_timestamp = timestamp * 1000; - - // Prevent keyboard modifier state from changing during scroll event streams. - // A two-finger trackpad flick generates a stream of scroll events. We want - // the keyboard modifier state to be the state at the beginning of the - // flick in order to avoid changing the interpretation of the events - // mid-stream. One example of this happening would be when pressing cmd - // after scrolling in Qt Creator: not taking the phase into account causes - // the end of the event stream to be interpreted as font size changes. - NSEventPhase momentumPhase = [theEvent momentumPhase]; - if (momentumPhase == NSEventPhaseNone) { - currentWheelModifiers = [QNSView convertKeyModifiers:[theEvent modifierFlags]]; - } - - NSEventPhase phase = [theEvent phase]; - Qt::ScrollPhase ph = Qt::ScrollUpdate; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 - if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_8) { - // On 10.8 and above, MayBegin is likely to happen. We treat it the same as an actual begin. - if (phase == NSEventPhaseMayBegin || phase == NSEventPhaseBegan) { - m_scrolling = true; - ph = Qt::ScrollBegin; - } - } -#endif - if (phase == NSEventPhaseBegan) { - // If MayBegin did not happen, Began is the actual beginning. - if (!m_scrolling) - ph = Qt::ScrollBegin; - m_scrolling = true; - } else if (phase == NSEventPhaseEnded || phase == NSEventPhaseCancelled || - momentumPhase == NSEventPhaseEnded || momentumPhase == NSEventPhaseCancelled) { - ph = Qt::ScrollEnd; - m_scrolling = false; - } - - QWindowSystemInterface::handleWheelEvent(m_window, qt_timestamp, qt_windowPoint, qt_screenPoint, pixelDelta, angleDelta, currentWheelModifiers, ph, source); -} -#endif //QT_NO_WHEELEVENT - -- (int) convertKeyCode : (QChar)keyChar -{ - return qt_mac_cocoaKey2QtKey(keyChar); -} - -+ (Qt::KeyboardModifiers) convertKeyModifiers : (ulong)modifierFlags -{ - Qt::KeyboardModifiers qtMods =Qt::NoModifier; - if (modifierFlags & NSShiftKeyMask) - qtMods |= Qt::ShiftModifier; - if (modifierFlags & NSControlKeyMask) - qtMods |= Qt::MetaModifier; - if (modifierFlags & NSAlternateKeyMask) - qtMods |= Qt::AltModifier; - if (modifierFlags & NSCommandKeyMask) - qtMods |= Qt::ControlModifier; - if (modifierFlags & NSNumericPadKeyMask) - qtMods |= Qt::KeypadModifier; - return qtMods; -} - -- (void)handleKeyEvent:(NSEvent *)nsevent eventType:(int)eventType -{ - ulong timestamp = [nsevent timestamp] * 1000; - ulong nativeModifiers = [nsevent modifierFlags]; - Qt::KeyboardModifiers modifiers = [QNSView convertKeyModifiers: nativeModifiers]; - NSString *charactersIgnoringModifiers = [nsevent charactersIgnoringModifiers]; - NSString *characters = [nsevent characters]; - if (m_inputSource != characters) { - [m_inputSource release]; - m_inputSource = [characters retain]; - } - - // There is no way to get the scan code from carbon/cocoa. But we cannot - // use the value 0, since it indicates that the event originates from somewhere - // else than the keyboard. - quint32 nativeScanCode = 1; - quint32 nativeVirtualKey = [nsevent keyCode]; - - QChar ch = QChar::ReplacementCharacter; - int keyCode = Qt::Key_unknown; - if ([characters length] != 0) { - if (((modifiers & Qt::MetaModifier) || (modifiers & Qt::AltModifier)) && ([charactersIgnoringModifiers length] != 0)) - ch = QChar([charactersIgnoringModifiers characterAtIndex:0]); - else - ch = QChar([characters characterAtIndex:0]); - keyCode = [self convertKeyCode:ch]; - } - - // we will send a key event unless the input method sets m_sendKeyEvent to false - m_sendKeyEvent = true; - QString text; - // ignore text for the U+F700-U+F8FF range. This is used by Cocoa when - // delivering function keys (e.g. arrow keys, backspace, F1-F35, etc.) - if (!(modifiers & (Qt::ControlModifier | Qt::MetaModifier)) && (ch.unicode() < 0xf700 || ch.unicode() > 0xf8ff)) - text = QCFString::toQString(characters); - - QWindow *focusWindow = [self topLevelWindow]; - - if (eventType == QEvent::KeyPress) { - - if (m_composingText.isEmpty()) - m_sendKeyEvent = !QWindowSystemInterface::tryHandleShortcutEvent(focusWindow, timestamp, keyCode, modifiers, text); - - QObject *fo = QGuiApplication::focusObject(); - if (m_sendKeyEvent && fo) { - // if escape is pressed we don't want interpretKeyEvents to close a dialog. This will be done via QWindowSystemInterface - if (keyCode == Qt::Key_Escape) - m_platformWindow->m_ignoreWindowShouldClose = true; - - QInputMethodQueryEvent queryEvent(Qt::ImEnabled | Qt::ImHints); - if (QCoreApplication::sendEvent(fo, &queryEvent)) { - bool imEnabled = queryEvent.value(Qt::ImEnabled).toBool(); - Qt::InputMethodHints hints = static_cast(queryEvent.value(Qt::ImHints).toUInt()); - if (imEnabled && !(hints & Qt::ImhDigitsOnly || hints & Qt::ImhFormattedNumbersOnly || hints & Qt::ImhHiddenText)) { - // pass the key event to the input method. note that m_sendKeyEvent may be set to false during this call - [self interpretKeyEvents:[NSArray arrayWithObject:nsevent]]; - } - } - - m_platformWindow->m_ignoreWindowShouldClose = false;; - } - if (m_resendKeyEvent) - m_sendKeyEvent = true; - } - - if (m_sendKeyEvent && m_composingText.isEmpty()) - QWindowSystemInterface::handleExtendedKeyEvent(focusWindow, timestamp, QEvent::Type(eventType), keyCode, modifiers, - nativeScanCode, nativeVirtualKey, nativeModifiers, text, [nsevent isARepeat], 1, false); - - m_sendKeyEvent = false; - m_resendKeyEvent = false; -} - -- (void)keyDown:(NSEvent *)nsevent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super keyDown:nsevent]; - [self handleKeyEvent:nsevent eventType:int(QEvent::KeyPress)]; -} - -- (void)keyUp:(NSEvent *)nsevent -{ - if (m_window->flags() & Qt::WindowTransparentForInput) - return [super keyUp:nsevent]; - [self handleKeyEvent:nsevent eventType:int(QEvent::KeyRelease)]; -} - -- (BOOL)performKeyEquivalent:(NSEvent *)nsevent -{ - NSString *chars = [nsevent charactersIgnoringModifiers]; - - if ([nsevent type] == NSKeyDown && [chars length] > 0) { - QChar ch = [chars characterAtIndex:0]; - Qt::Key qtKey = qt_mac_cocoaKey2QtKey(ch); - // check for Command + Key_Period - if ([nsevent modifierFlags] & NSCommandKeyMask - && qtKey == Qt::Key_Period) { - [self handleKeyEvent:nsevent eventType:int(QEvent::KeyPress)]; - return YES; - } else if ([nsevent modifierFlags] & NSControlKeyMask - && (qtKey == Qt::Key_Tab || qtKey == Qt::Key_Backtab)) { - [self handleKeyEvent:nsevent eventType:int(QEvent::KeyPress)]; - return YES; - } - } - return [super performKeyEquivalent:nsevent]; -} - -- (void)flagsChanged:(NSEvent *)nsevent -{ - ulong timestamp = [nsevent timestamp] * 1000; - ulong modifiers = [nsevent modifierFlags]; - Qt::KeyboardModifiers qmodifiers = [QNSView convertKeyModifiers:modifiers]; - - // calculate the delta and remember the current modifiers for next time - static ulong m_lastKnownModifiers; - ulong lastKnownModifiers = m_lastKnownModifiers; - ulong delta = lastKnownModifiers ^ modifiers; - m_lastKnownModifiers = modifiers; - - struct qt_mac_enum_mapper - { - ulong mac_mask; - Qt::Key qt_code; - }; - static qt_mac_enum_mapper modifier_key_symbols[] = { - { NSShiftKeyMask, Qt::Key_Shift }, - { NSControlKeyMask, Qt::Key_Meta }, - { NSCommandKeyMask, Qt::Key_Control }, - { NSAlternateKeyMask, Qt::Key_Alt }, - { NSAlphaShiftKeyMask, Qt::Key_CapsLock }, - { 0ul, Qt::Key_unknown } }; - for (int i = 0; modifier_key_symbols[i].mac_mask != 0u; ++i) { - uint mac_mask = modifier_key_symbols[i].mac_mask; - if ((delta & mac_mask) == 0u) - continue; - - QWindowSystemInterface::handleKeyEvent(m_window, - timestamp, - (lastKnownModifiers & mac_mask) ? QEvent::KeyRelease : QEvent::KeyPress, - modifier_key_symbols[i].qt_code, - qmodifiers ^ [QNSView convertKeyModifiers:mac_mask]); - } -} - -- (void) insertNewline:(id)sender -{ - Q_UNUSED(sender); - m_resendKeyEvent = true; -} - -- (void) doCommandBySelector:(SEL)aSelector -{ - [self tryToPerform:aSelector with:self]; -} - -- (void) insertText:(id)aString replacementRange:(NSRange)replacementRange -{ - Q_UNUSED(replacementRange) - - if (m_sendKeyEvent && m_composingText.isEmpty() && [aString isEqualToString:m_inputSource]) { - // don't send input method events for simple text input (let handleKeyEvent send key events instead) - return; - } - - QString commitString; - if ([aString length]) { - if ([aString isKindOfClass:[NSAttributedString class]]) { - commitString = QCFString::toQString(reinterpret_cast([aString string])); - } else { - commitString = QCFString::toQString(reinterpret_cast(aString)); - }; - } - QObject *fo = QGuiApplication::focusObject(); - if (fo) { - QInputMethodQueryEvent queryEvent(Qt::ImEnabled); - if (QCoreApplication::sendEvent(fo, &queryEvent)) { - if (queryEvent.value(Qt::ImEnabled).toBool()) { - QInputMethodEvent e; - e.setCommitString(commitString); - QCoreApplication::sendEvent(fo, &e); - // prevent handleKeyEvent from sending a key event - m_sendKeyEvent = false; - } - } - } - - m_composingText.clear(); -} - -- (void) setMarkedText:(id)aString selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange -{ - Q_UNUSED(replacementRange) - QString preeditString; - - QList attrs; - attrs<([aString string])); - int composingLength = preeditString.length(); - int index = 0; - // Create attributes for individual sections of preedit text - while (index < composingLength) { - NSRange effectiveRange; - NSRange range = NSMakeRange(index, composingLength-index); - NSDictionary *attributes = [aString attributesAtIndex:index - longestEffectiveRange:&effectiveRange - inRange:range]; - NSNumber *underlineStyle = [attributes objectForKey:NSUnderlineStyleAttributeName]; - if (underlineStyle) { - QColor clr (Qt::black); - NSColor *color = [attributes objectForKey:NSUnderlineColorAttributeName]; - if (color) { - clr = qt_mac_toQColor(color); - } - QTextCharFormat format; - format.setFontUnderline(true); - format.setUnderlineColor(clr); - attrs<(aString)); - } - - if (attrs.isEmpty()) { - QTextCharFormat format; - format.setFontUnderline(true); - attrs<((CFStringRef)string); - return [[[NSAttributedString alloc] initWithString:const_cast(tmpString)] autorelease]; -} - -- (NSRange) markedRange -{ - NSRange range; - if (!m_composingText.isEmpty()) { - range.location = 0; - range.length = m_composingText.length(); - } else { - range.location = NSNotFound; - range.length = 0; - } - return range; -} - -- (NSRange) selectedRange -{ - NSRange selectedRange = {NSNotFound, 0}; - selectedRange.location = NSNotFound; - selectedRange.length = 0; - - QObject *fo = QGuiApplication::focusObject(); - if (!fo) - return selectedRange; - QInputMethodQueryEvent queryEvent(Qt::ImEnabled | Qt::ImCurrentSelection); - if (!QCoreApplication::sendEvent(fo, &queryEvent)) - return selectedRange; - if (!queryEvent.value(Qt::ImEnabled).toBool()) - return selectedRange; - - QString selectedText = queryEvent.value(Qt::ImCurrentSelection).toString(); - - if (!selectedText.isEmpty()) { - selectedRange.location = 0; - selectedRange.length = selectedText.length(); - } - return selectedRange; -} - -- (NSRect) firstRectForCharacterRange:(NSRange)aRange actualRange:(NSRangePointer)actualRange -{ - Q_UNUSED(aRange) - Q_UNUSED(actualRange) - QObject *fo = QGuiApplication::focusObject(); - if (!fo) - return NSZeroRect; - - QInputMethodQueryEvent queryEvent(Qt::ImEnabled); - if (!QCoreApplication::sendEvent(fo, &queryEvent)) - return NSZeroRect; - if (!queryEvent.value(Qt::ImEnabled).toBool()) - return NSZeroRect; - - if (!m_window) - return NSZeroRect; - - // The returned rect is always based on the internal cursor. - QRect mr = qApp->inputMethod()->cursorRectangle().toRect(); - QPoint mp = m_window->mapToGlobal(mr.bottomLeft()); - - NSRect rect; - rect.origin.x = mp.x(); - rect.origin.y = qt_mac_flipYCoordinate(mp.y()); - rect.size.width = mr.width(); - rect.size.height = mr.height(); - return rect; -} - -- (NSUInteger)characterIndexForPoint:(NSPoint)aPoint -{ - // We don't support cursor movements using mouse while composing. - Q_UNUSED(aPoint); - return NSNotFound; -} - -- (NSArray*) validAttributesForMarkedText -{ - if (m_window != QGuiApplication::focusWindow()) - return nil; - - QObject *fo = QGuiApplication::focusObject(); - if (!fo) - return nil; - - QInputMethodQueryEvent queryEvent(Qt::ImEnabled); - if (!QCoreApplication::sendEvent(fo, &queryEvent)) - return nil; - if (!queryEvent.value(Qt::ImEnabled).toBool()) - return nil; - - // Support only underline color/style. - return [NSArray arrayWithObjects:NSUnderlineColorAttributeName, - NSUnderlineStyleAttributeName, nil]; -} - --(void)registerDragTypes -{ - QCocoaAutoReleasePool pool; - QStringList customTypes = qt_mac_enabledDraggedTypes(); - if (currentCustomDragTypes == 0 || *currentCustomDragTypes != customTypes) { - if (currentCustomDragTypes == 0) - currentCustomDragTypes = new QStringList(); - *currentCustomDragTypes = customTypes; - const NSString* mimeTypeGeneric = @"com.trolltech.qt.MimeTypeName"; - NSMutableArray *supportedTypes = [NSMutableArray arrayWithObjects:NSColorPboardType, - NSFilenamesPboardType, NSStringPboardType, - NSFilenamesPboardType, NSPostScriptPboardType, NSTIFFPboardType, - NSRTFPboardType, NSTabularTextPboardType, NSFontPboardType, - NSRulerPboardType, NSFileContentsPboardType, NSColorPboardType, - NSRTFDPboardType, NSHTMLPboardType, - NSURLPboardType, NSPDFPboardType, NSVCardPboardType, - NSFilesPromisePboardType, NSInkTextPboardType, - NSMultipleTextSelectionPboardType, mimeTypeGeneric, nil]; - // Add custom types supported by the application. - for (int i = 0; i < customTypes.size(); i++) { - [supportedTypes addObject:QCFString::toNSString(customTypes[i])]; - } - [self registerForDraggedTypes:supportedTypes]; - } -} - -static QWindow *findEventTargetWindow(QWindow *candidate) -{ - while (candidate) { - if (!(candidate->flags() & Qt::WindowTransparentForInput)) - return candidate; - candidate = candidate->parent(); - } - return candidate; -} - -static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint point) -{ - return target->mapFromGlobal(source->mapToGlobal(point)); -} - -- (NSDragOperation) draggingSourceOperationMaskForLocal:(BOOL)isLocal -{ - Q_UNUSED(isLocal); - QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); - return qt_mac_mapDropActions(nativeDrag->currentDrag()->supportedActions()); -} - -- (BOOL) ignoreModifierKeysWhileDragging -{ - return NO; -} - -- (BOOL)wantsPeriodicDraggingUpdates -{ - // From the documentation: - // - // "If the destination returns NO, these messages are sent only when the mouse moves - // or a modifier flag changes. Otherwise the destination gets the default behavior, - // where it receives periodic dragging-updated messages even if nothing changes." - // - // We do not want these constant drag update events while mouse is stationary, - // since we do all animations (autoscroll) with timers. - return NO; -} - -- (void)updateCursorFromDragResponse:(QPlatformDragQtResponse)response drag:(QCocoaDrag *)drag -{ - const QPixmap pixmapCursor = drag->currentDrag()->dragCursor(response.acceptedAction()); - NSCursor *nativeCursor = nil; - - if (pixmapCursor.isNull()) { - switch (response.acceptedAction()) { - case Qt::CopyAction: - nativeCursor = [NSCursor dragCopyCursor]; - break; - case Qt::LinkAction: - nativeCursor = [NSCursor dragLinkCursor]; - break; - case Qt::IgnoreAction: - // Uncomment the next lines if forbiden cursor wanted on non droppable targets. - /*nativeCursor = [NSCursor operationNotAllowedCursor]; - break;*/ - case Qt::MoveAction: - default: - nativeCursor = [NSCursor arrowCursor]; - break; - } - } - else { - NSImage *nsimage = qt_mac_create_nsimage(pixmapCursor); - nativeCursor = [[NSCursor alloc] initWithImage:nsimage hotSpot:NSZeroPoint]; - [nsimage release]; - } - - // change the cursor - [nativeCursor set]; - - // Make sure the cursor is updated correctly if the mouse does not move and window is under cursor - // by creating a fake move event - const QPoint mousePos(QCursor::pos()); - CGEventRef moveEvent(CGEventCreateMouseEvent( - NULL, kCGEventMouseMoved, - CGPointMake(mousePos.x(), mousePos.y()), - kCGMouseButtonLeft // ignored - )); - CGEventPost(kCGHIDEventTap, moveEvent); - CFRelease(moveEvent); -} - -- (NSDragOperation)draggingEntered:(id )sender -{ - return [self handleDrag : sender]; -} - -- (NSDragOperation)draggingUpdated:(id )sender -{ - return [self handleDrag : sender]; -} - -// Sends drag update to Qt, return the action -- (NSDragOperation)handleDrag:(id )sender -{ - NSPoint windowPoint = [self convertPoint: [sender draggingLocation] fromView: nil]; - QPoint qt_windowPoint(windowPoint.x, windowPoint.y); - Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations([sender draggingSourceOperationMask]); - - QWindow *target = findEventTargetWindow(m_window); - if (!target) - return NSDragOperationNone; - - // update these so selecting move/copy/link works - QGuiApplicationPrivate::modifier_buttons = [QNSView convertKeyModifiers: [[NSApp currentEvent] modifierFlags]]; - - QPlatformDragQtResponse response(false, Qt::IgnoreAction, QRect()); - QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); - if (nativeDrag->currentDrag()) { - // The drag was started from within the application - response = QWindowSystemInterface::handleDrag(target, nativeDrag->platformDropData(), mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed); - [self updateCursorFromDragResponse:response drag:nativeDrag]; - } else { - QCocoaDropData mimeData([sender draggingPasteboard]); - response = QWindowSystemInterface::handleDrag(target, &mimeData, mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed); - } - - return qt_mac_mapDropAction(response.acceptedAction()); -} - -- (void)draggingExited:(id )sender -{ - QWindow *target = findEventTargetWindow(m_window); - if (!target) - return; - - NSPoint windowPoint = [self convertPoint: [sender draggingLocation] fromView: nil]; - QPoint qt_windowPoint(windowPoint.x, windowPoint.y); - - // Send 0 mime data to indicate drag exit - QWindowSystemInterface::handleDrag(target, 0, mapWindowCoordinates(m_window, target, qt_windowPoint), Qt::IgnoreAction); -} - -// called on drop, send the drop to Qt and return if it was accepted. -- (BOOL)performDragOperation:(id )sender -{ - QWindow *target = findEventTargetWindow(m_window); - if (!target) - return false; - - NSPoint windowPoint = [self convertPoint: [sender draggingLocation] fromView: nil]; - QPoint qt_windowPoint(windowPoint.x, windowPoint.y); - Qt::DropActions qtAllowed = qt_mac_mapNSDragOperations([sender draggingSourceOperationMask]); - - QPlatformDropQtResponse response(false, Qt::IgnoreAction); - QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); - if (nativeDrag->currentDrag()) { - // The drag was started from within the application - response = QWindowSystemInterface::handleDrop(target, nativeDrag->platformDropData(), mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed); - } else { - QCocoaDropData mimeData([sender draggingPasteboard]); - response = QWindowSystemInterface::handleDrop(target, &mimeData, mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed); - } - if (response.isAccepted()) { - QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); - nativeDrag->setAcceptedAction(response.acceptedAction()); - } - return response.isAccepted(); -} - -- (void)draggedImage:(NSImage*) img endedAt:(NSPoint) point operation:(NSDragOperation) operation -{ - Q_UNUSED(img); - Q_UNUSED(operation); - QWindow *target = findEventTargetWindow(m_window); - if (!target) - return; - -// keep our state, and QGuiApplication state (buttons member) in-sync, -// or future mouse events will be processed incorrectly - m_buttons &= ~(m_sendUpAsRightButton ? Qt::RightButton : Qt::LeftButton); - - NSPoint windowPoint = [self convertPoint: point fromView: nil]; - QPoint qtWindowPoint(windowPoint.x, windowPoint.y); - - NSWindow *window = [self window]; - NSPoint screenPoint = [window convertRectToScreen:NSMakeRect(point.x, point.y, 0, 0)].origin; - QPoint qtScreenPoint = QPoint(screenPoint.x, qt_mac_flipYCoordinate(screenPoint.y)); - - QWindowSystemInterface::handleMouseEvent(target, mapWindowCoordinates(m_window, target, qtWindowPoint), qtScreenPoint, m_buttons); -} - -@end diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp deleted file mode 100644 index 1d42b7970..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp +++ /dev/null @@ -1,2319 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#define QT_NO_URL_CAST_FROM_STRING 1 - -#define _WIN32_WINNT 0x0600 - -#include "qwindowsdialoghelpers.h" - -#include "qwindowscontext.h" -#include "qwindowswindow.h" -#include "qwindowsintegration.h" -#include "qwindowstheme.h" // Color conversion helpers - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "qtwindows_additional.h" - -// #define USE_NATIVE_COLOR_DIALOG /* Testing purposes only */ - -#ifdef Q_CC_MINGW /* Add missing declarations for MinGW */ - -#ifndef __IShellLibrary_FWD_DEFINED__ - -/* Constants obtained by running the below stream operator for - * CLSID, IID on the constants in the Windows SDK libraries. */ - -static const IID IID_IFileOpenDialog = {0xd57c7288, 0xd4ad, 0x4768, {0xbe, 0x02, 0x9d, 0x96, 0x95, 0x32, 0xd9, 0x60}}; -static const IID IID_IFileSaveDialog = {0x84bccd23, 0x5fde, 0x4cdb,{0xae, 0xa4, 0xaf, 0x64, 0xb8, 0x3d, 0x78, 0xab}}; -#ifdef __MINGW64_VERSION_MAJOR -static const IID q_IID_IShellItem = {0x43826d1e, 0xe718, 0x42ee, {0xbc, 0x55, 0xa1, 0xe2, 0x61, 0xc3, 0x7b, 0xfe}}; -#define IID_IShellItem q_IID_IShellItem -#else -static const IID IID_IShellItem = {0x43826d1e, 0xe718, 0x42ee, {0xbc, 0x55, 0xa1, 0xe2, 0x61, 0xc3, 0x7b, 0xfe}}; -static const IID IID_IShellItemArray = {0xb63ea76d, 0x1f85, 0x456f, {0xa1, 0x9c, 0x48, 0x15, 0x9e, 0xfa, 0x85, 0x8b}}; -# define LFF_FORCEFILESYSTEM 1 -#endif -static const IID IID_IFileDialogEvents = {0x973510db, 0x7d7f, 0x452b,{0x89, 0x75, 0x74, 0xa8, 0x58, 0x28, 0xd3, 0x54}}; -static const CLSID CLSID_FileOpenDialog = {0xdc1c5a9c, 0xe88a, 0x4dde, {0xa5, 0xa1, 0x60, 0xf8, 0x2a, 0x20, 0xae, 0xf7}}; -static const CLSID CLSID_FileSaveDialog = {0xc0b4e2f3, 0xba21, 0x4773,{0x8d, 0xba, 0x33, 0x5e, 0xc9, 0x46, 0xeb, 0x8b}}; - -typedef struct _COMDLG_FILTERSPEC -{ - LPCWSTR pszName; - LPCWSTR pszSpec; -} COMDLG_FILTERSPEC; - - -#define FOS_OVERWRITEPROMPT 0x2 -#define FOS_STRICTFILETYPES 0x4 -#define FOS_NOCHANGEDIR 0x8 -#define FOS_PICKFOLDERS 0x20 -#define FOS_FORCEFILESYSTEM 0x40 -#define FOS_ALLNONSTORAGEITEMS 0x80 -#define FOS_NOVALIDATE 0x100 -#define FOS_ALLOWMULTISELECT 0x200 -#define FOS_PATHMUSTEXIST 0x800 -#define FOS_FILEMUSTEXIST 0x1000 -#define FOS_CREATEPROMPT 0x2000 -#define FOS_SHAREAWARE 0x4000 -#define FOS_NOREADONLYRETURN 0x8000 -#define FOS_NOTESTFILECREATE 0x10000 -#define FOS_HIDEMRUPLACES 0x20000 -#define FOS_HIDEPINNEDPLACES 0x40000 -#define FOS_NODEREFERENCELINKS 0x100000 -#define FOS_DONTADDTORECENT 0x2000000 -#define FOS_FORCESHOWHIDDEN 0x10000000 -#define FOS_DEFAULTNOMINIMODE 0x20000000 -#define FOS_FORCEPREVIEWPANEON 0x40000000 - -#if __MINGW64_VERSION_MAJOR < 2 -typedef int GETPROPERTYSTOREFLAGS; -#define GPS_DEFAULT 0x00000000 -#define GPS_HANDLERPROPERTIESONLY 0x00000001 -#define GPS_READWRITE 0x00000002 -#define GPS_TEMPORARY 0x00000004 -#define GPS_FASTPROPERTIESONLY 0x00000008 -#define GPS_OPENSLOWITEM 0x00000010 -#define GPS_DELAYCREATION 0x00000020 -#define GPS_BESTEFFORT 0x00000040 -#define GPS_MASK_VALID 0x0000007F -#endif - -typedef int (QT_WIN_CALLBACK* BFFCALLBACK)(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData); -// message from browser -#define BFFM_INITIALIZED 1 -#define BFFM_SELCHANGED 2 -#define BFFM_ENABLEOK (WM_USER + 101) -// Browsing for directory. -#define BIF_NONEWFOLDERBUTTON 0x0200 -#define BIF_NOTRANSLATETARGETS 0x0400 -#define BIF_BROWSEFORCOMPUTER 0x1000 -#define BIF_BROWSEFORPRINTER 0x2000 -#define BIF_BROWSEINCLUDEFILES 0x4000 -#define BIF_SHAREABLE 0x8000 - -//the enums -typedef enum { - SIATTRIBFLAGS_AND = 0x1, - SIATTRIBFLAGS_OR = 0x2, - SIATTRIBFLAGS_APPCOMPAT = 0x3, - SIATTRIBFLAGS_MASK = 0x3 -} SIATTRIBFLAGS; -#ifndef __MINGW64_VERSION_MAJOR -typedef enum { - SIGDN_NORMALDISPLAY = 0x00000000, - SIGDN_PARENTRELATIVEPARSING = 0x80018001, - SIGDN_PARENTRELATIVEFORADDRESSBAR = 0x8001c001, - SIGDN_DESKTOPABSOLUTEPARSING = 0x80028000, - SIGDN_PARENTRELATIVEEDITING = 0x80031001, - SIGDN_DESKTOPABSOLUTEEDITING = 0x8004c000, - SIGDN_FILESYSPATH = 0x80058000, - SIGDN_URL = 0x80068000 -} SIGDN; -#endif -typedef enum { - FDAP_BOTTOM = 0x00000000, - FDAP_TOP = 0x00000001 -} FDAP; -typedef enum { - FDESVR_DEFAULT = 0x00000000, - FDESVR_ACCEPT = 0x00000001, - FDESVR_REFUSE = 0x00000002 -} FDE_SHAREVIOLATION_RESPONSE; -typedef FDE_SHAREVIOLATION_RESPONSE FDE_OVERWRITE_RESPONSE; - -//the structs -typedef struct { - LPCWSTR pszName; - LPCWSTR pszSpec; -} qt_COMDLG_FILTERSPEC; -typedef struct { - GUID fmtid; - DWORD pid; -} qt_PROPERTYKEY; - -typedef struct { - USHORT cb; - BYTE abID[1]; -} qt_SHITEMID, *qt_LPSHITEMID; -typedef struct { - qt_SHITEMID mkid; -} qt_ITEMIDLIST, *qt_LPITEMIDLIST; -typedef const qt_ITEMIDLIST *qt_LPCITEMIDLIST; -typedef struct { - HWND hwndOwner; - qt_LPCITEMIDLIST pidlRoot; - LPWSTR pszDisplayName; - LPCWSTR lpszTitle; - UINT ulFlags; - BFFCALLBACK lpfn; - LPARAM lParam; - int iImage; -} qt_BROWSEINFO; - -#endif // __IShellLibrary_FWD_DEFINED__ - -#ifndef __IFileDialogEvents_FWD_DEFINED__ -DECLARE_INTERFACE(IFileDialogEvents); -#endif - -#ifndef __IShellItem_INTERFACE_DEFINED__ -DECLARE_INTERFACE_(IShellItem, IUnknown) -{ - STDMETHOD(BindToHandler)(THIS_ IBindCtx *pbc, REFGUID bhid, REFIID riid, void **ppv) PURE; - STDMETHOD(GetParent)(THIS_ IShellItem **ppsi) PURE; - STDMETHOD(GetDisplayName)(THIS_ SIGDN sigdnName, LPWSTR *ppszName) PURE; - STDMETHOD(GetAttributes)(THIS_ ULONG sfgaoMask, ULONG *psfgaoAttribs) PURE; - STDMETHOD(Compare)(THIS_ IShellItem *psi, DWORD hint, int *piOrder) PURE; -}; -#endif - -#ifndef __IShellItemFilter_INTERFACE_DEFINED__ -DECLARE_INTERFACE_(IShellItemFilter, IUnknown) -{ - STDMETHOD(IncludeItem)(THIS_ IShellItem *psi) PURE; - STDMETHOD(GetEnumFlagsForItem)(THIS_ IShellItem *psi, DWORD *pgrfFlags) PURE; -}; -#endif - -#ifndef __IEnumShellItems_INTERFACE_DEFINED__ -DECLARE_INTERFACE_(IEnumShellItems, IUnknown) -{ - STDMETHOD(Next)(THIS_ ULONG celt, IShellItem **rgelt, ULONG *pceltFetched) PURE; - STDMETHOD(Skip)(THIS_ ULONG celt) PURE; - STDMETHOD(Reset)(THIS_) PURE; - STDMETHOD(Clone)(THIS_ IEnumShellItems **ppenum) PURE; -}; -#endif - -#ifndef __IShellItemArray_INTERFACE_DEFINED__ -DECLARE_INTERFACE_(IShellItemArray, IUnknown) -{ - STDMETHOD(BindToHandler)(THIS_ IBindCtx *pbc, REFGUID rbhid, REFIID riid, void **ppvOut) PURE; - STDMETHOD(GetPropertyStore)(THIS_ GETPROPERTYSTOREFLAGS flags, REFIID riid, void **ppv) PURE; - STDMETHOD(GetPropertyDescriptionList)(THIS_ const qt_PROPERTYKEY *keyType, REFIID riid, void **ppv) PURE; - STDMETHOD(GetAttributes)(THIS_ SIATTRIBFLAGS dwAttribFlags, ULONG sfgaoMask, ULONG *psfgaoAttribs) PURE; - STDMETHOD(GetCount)(THIS_ DWORD *pdwNumItems) PURE; - STDMETHOD(GetItemAt)(THIS_ DWORD dwIndex, IShellItem **ppsi) PURE; - STDMETHOD(EnumItems)(THIS_ IEnumShellItems **ppenumShellItems) PURE; -}; -#endif - -#ifndef __IShellLibrary_INTERFACE_DEFINED__ - -enum LIBRARYOPTIONFLAGS {}; -enum DEFAULTSAVEFOLDERTYPE { DSFT_DETECT = 1 }; -enum LIBRARYSAVEFLAGS {}; - -DECLARE_INTERFACE_(IShellLibrary, IUnknown) -{ - STDMETHOD(LoadLibraryFromItem)(THIS_ IShellItem *psiLibrary, DWORD grfMode) PURE; - STDMETHOD(LoadLibraryFromKnownFolder)(THIS_ const GUID &kfidLibrary, DWORD grfMode) PURE; - STDMETHOD(AddFolder)(THIS_ IShellItem *psiLocation) PURE; - STDMETHOD(RemoveFolder)(THIS_ IShellItem *psiLocation) PURE; - STDMETHOD(GetFolders)(THIS_ int lff, REFIID riid, void **ppv) PURE; - STDMETHOD(ResolveFolder)(THIS_ IShellItem *psiFolderToResolve, DWORD dwTimeout, REFIID riid, void **ppv) PURE; - STDMETHOD(GetDefaultSaveFolder)(THIS_ DEFAULTSAVEFOLDERTYPE dsft, REFIID riid, void **ppv) PURE; - STDMETHOD(SetDefaultSaveFolder)(THIS_ DEFAULTSAVEFOLDERTYPE dsft, IShellItem *psi) PURE; - STDMETHOD(GetOptions)(THIS_ LIBRARYOPTIONFLAGS *plofOptions) PURE; - STDMETHOD(SetOptions)(THIS_ LIBRARYOPTIONFLAGS lofMask, LIBRARYOPTIONFLAGS lofOptions) PURE; - STDMETHOD(GetFolderType)(THIS_ GUID *pftid) PURE; - STDMETHOD(SetFolderType)(THIS_ const GUID &ftid) PURE; - STDMETHOD(GetIcon)(THIS_ LPWSTR *ppszIcon) PURE; - STDMETHOD(SetIcon)(THIS_ LPCWSTR pszIcon) PURE; - STDMETHOD(Commit)(THIS_) PURE; - STDMETHOD(Save)(THIS_ IShellItem *psiFolderToSaveIn, LPCWSTR pszLibraryName, LIBRARYSAVEFLAGS lsf, IShellItem **ppsiSavedTo) PURE; - STDMETHOD(SaveInKnownFolder)(THIS_ const GUID &kfidToSaveIn, LPCWSTR pszLibraryName, LIBRARYSAVEFLAGS lsf,IShellItem **ppsiSavedTo) PURE; -}; -#endif - -#ifndef __IModalWindow_INTERFACE_DEFINED__ -DECLARE_INTERFACE_(IModalWindow, IUnknown) -{ - STDMETHOD(Show)(THIS_ HWND hwndParent) PURE; -}; -#endif - -#ifndef __IFileDialog_INTERFACE_DEFINED__ -DECLARE_INTERFACE_(IFileDialog, IModalWindow) -{ - STDMETHOD(SetFileTypes)(THIS_ UINT cFileTypes, const COMDLG_FILTERSPEC *rgFilterSpec) PURE; - STDMETHOD(SetFileTypeIndex)(THIS_ UINT iFileType) PURE; - STDMETHOD(GetFileTypeIndex)(THIS_ UINT *piFileType) PURE; - STDMETHOD(Advise)(THIS_ IFileDialogEvents *pfde, DWORD *pdwCookie) PURE; - STDMETHOD(Unadvise)(THIS_ DWORD dwCookie) PURE; - STDMETHOD(SetOptions)(THIS_ DWORD fos) PURE; - STDMETHOD(GetOptions)(THIS_ DWORD *pfos) PURE; - STDMETHOD(SetDefaultFolder)(THIS_ IShellItem *psi) PURE; - STDMETHOD(SetFolder)(THIS_ IShellItem *psi) PURE; - STDMETHOD(GetFolder)(THIS_ IShellItem **ppsi) PURE; - STDMETHOD(GetCurrentSelection)(THIS_ IShellItem **ppsi) PURE; - STDMETHOD(SetFileName)(THIS_ LPCWSTR pszName) PURE; - STDMETHOD(GetFileName)(THIS_ LPWSTR *pszName) PURE; - STDMETHOD(SetTitle)(THIS_ LPCWSTR pszTitle) PURE; - STDMETHOD(SetOkButtonLabel)(THIS_ LPCWSTR pszText) PURE; - STDMETHOD(SetFileNameLabel)(THIS_ LPCWSTR pszLabel) PURE; - STDMETHOD(GetResult)(THIS_ IShellItem **ppsi) PURE; - STDMETHOD(AddPlace)(THIS_ IShellItem *psi, FDAP fdap) PURE; - STDMETHOD(SetDefaultExtension)(THIS_ LPCWSTR pszDefaultExtension) PURE; - STDMETHOD(Close)(THIS_ HRESULT hr) PURE; - STDMETHOD(SetClientGuid)(THIS_ REFGUID guid) PURE; - STDMETHOD(ClearClientData)(THIS_) PURE; - STDMETHOD(SetFilter)(THIS_ IShellItemFilter *pFilter) PURE; -}; -#endif - -#ifndef __IFileDialogEvents_INTERFACE_DEFINED__ -DECLARE_INTERFACE_(IFileDialogEvents, IUnknown) -{ - STDMETHOD(OnFileOk)(THIS_ IFileDialog *pfd) PURE; - STDMETHOD(OnFolderChanging)(THIS_ IFileDialog *pfd, IShellItem *psiFolder) PURE; - STDMETHOD(OnFolderChange)(THIS_ IFileDialog *pfd) PURE; - STDMETHOD(OnSelectionChange)(THIS_ IFileDialog *pfd) PURE; - STDMETHOD(OnShareViolation)(THIS_ IFileDialog *pfd, IShellItem *psi, FDE_SHAREVIOLATION_RESPONSE *pResponse) PURE; - STDMETHOD(OnTypeChange)(THIS_ IFileDialog *pfd) PURE; - STDMETHOD(OnOverwrite)(THIS_ IFileDialog *pfd, IShellItem *psi, FDE_OVERWRITE_RESPONSE *pResponse) PURE; -}; -#endif - -#ifndef __IFileOpenDialog_INTERFACE_DEFINED__ -DECLARE_INTERFACE_(IFileOpenDialog, IFileDialog) -{ - STDMETHOD(GetResults)(THIS_ IShellItemArray **ppenum) PURE; - STDMETHOD(GetSelectedItems)(THIS_ IShellItemArray **ppsai) PURE; -}; -#endif - -#ifndef __IPropertyStore_FWD_DEFINED__ -typedef IUnknown IPropertyStore; -#endif - -#ifndef __IFileOperationProgressSink_FWD_DEFINED__ -typedef IUnknown IFileOperationProgressSink; -#endif - -#ifndef __IFileSaveDialog_INTERFACE_DEFINED__ -DECLARE_INTERFACE_(IFileSaveDialog, IFileDialog) -{ -public: - STDMETHOD(SetSaveAsItem)(THIS_ IShellItem *psi) PURE; - STDMETHOD(SetProperties)(THIS_ IPropertyStore *pStore) PURE; - STDMETHOD(SetCollectedProperties)(THIS_ IPropertyStore *pStore) PURE; - STDMETHOD(GetProperties)(THIS_ IPropertyStore **ppStore) PURE; - STDMETHOD(ApplyProperties)(THIS_ IShellItem *psi, IPropertyStore *pStore, HWND hwnd, IFileOperationProgressSink *pSink) PURE; -}; -#endif - -#endif // Q_CC_MINGW - -QT_BEGIN_NAMESPACE - -/* Output UID (IID, CLSID) as C++ constants. - * The constants are contained in the Windows SDK libs, but not for MinGW. */ -static inline QString guidToString(const GUID &g) -{ - QString rc; - QTextStream str(&rc); - str.setIntegerBase(16); - str.setNumberFlags(str.numberFlags() | QTextStream::ShowBase); - str << '{' << g.Data1 << ", " << g.Data2 << ", " << g.Data3; - str.setFieldWidth(2); - str.setFieldAlignment(QTextStream::AlignRight); - str.setPadChar(QLatin1Char('0')); - str << ",{" << g.Data4[0] << ", " << g.Data4[1] << ", " << g.Data4[2] << ", " << g.Data4[3] - << ", " << g.Data4[4] << ", " << g.Data4[5] << ", " << g.Data4[6] << ", " << g.Data4[7] - << "}};"; - return rc; -} - -inline QDebug operator<<(QDebug d, const GUID &g) -{ - QDebugStateSaver saver(d); - d.nospace(); - d << guidToString(g); - return d; -} - -// Return an allocated wchar_t array from a QString, reserve more memory if desired. -static wchar_t *qStringToWCharArray(const QString &s, size_t reserveSize = 0) -{ - const size_t stringSize = s.size(); - wchar_t *result = new wchar_t[qMax(stringSize + 1, reserveSize)]; - s.toWCharArray(result); - result[stringSize] = 0; - return result; -} - -namespace QWindowsDialogs -{ -/*! - \fn eatMouseMove() - - After closing a windows dialog with a double click (i.e. open a file) - the message queue still contains a dubious WM_MOUSEMOVE message where - the left button is reported to be down (wParam != 0). - remove all those messages (usually 1) and post the last one with a - reset button state. - - \ingroup qt-lighthouse-win -*/ - -void eatMouseMove() -{ - MSG msg = {0, 0, 0, 0, 0, {0, 0} }; - while (PeekMessage(&msg, 0, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE)) - ; - if (msg.message == WM_MOUSEMOVE) - PostMessage(msg.hwnd, msg.message, 0, msg.lParam); - qCDebug(lcQpaDialogs) << __FUNCTION__ << "triggered=" << (msg.message == WM_MOUSEMOVE); -} - -} // namespace QWindowsDialogs - -/*! - \class QWindowsNativeDialogBase - \brief Base class for Windows native dialogs. - - Base classes for native dialogs (using the CLSID-based - dialog interfaces "IFileDialog", etc. available from Windows - Vista on) that mimick the behaviour of their QDialog - counterparts as close as possible. - - Instances of derived classes are controlled by - QWindowsDialogHelperBase-derived classes. - - A major difference is that there is only an exec(), which - is a modal, blocking call; there is no non-blocking show(). - There 2 types of native dialogs: - - \list - \li Dialogs provided by the Comdlg32 library (ChooseColor, - ChooseFont). They only provide a modal, blocking - function call (with idle processing). - \li File dialogs are classes derived from IFileDialog. They - inherit IModalWindow and their exec() method (calling - IModalWindow::Show()) is similarly blocking, but methods - like close() can be called on them from event handlers. - \endlist - - \sa QWindowsDialogHelperBase - \internal - \ingroup qt-lighthouse-win -*/ - -class QWindowsNativeDialogBase : public QObject -{ - Q_OBJECT -public: - virtual void setWindowTitle(const QString &title) = 0; - bool executed() const { return m_executed; } - void exec(HWND owner = 0) { doExec(owner); m_executed = true; } - -signals: - void accepted(); - void rejected(); - -public slots: - virtual void close() = 0; - -protected: - QWindowsNativeDialogBase() : m_executed(false) {} - -private: - virtual void doExec(HWND owner = 0) = 0; - - bool m_executed; -}; - -/*! - \class QWindowsDialogHelperBase - \brief Helper for native Windows dialogs. - - Provides basic functionality and introduces new virtuals. - The native dialog is created in setVisible_sys() since - then modality and the state of DontUseNativeDialog is known. - - Modal dialogs are then run by exec(). Non-modal dialogs are shown using a - separate thread started in show() should they support it. - - \sa QWindowsDialogThread, QWindowsNativeDialogBase - \internal - \ingroup qt-lighthouse-win -*/ - -template -QWindowsDialogHelperBase::QWindowsDialogHelperBase() : - m_nativeDialog(0), - m_ownerWindow(0), - m_timerId(0), - m_thread(0) -{ -} - -template -void QWindowsDialogHelperBase::cleanupThread() -{ - if (m_thread) { // Thread may be running if the dialog failed to close. - if (m_thread->isRunning()) - m_thread->wait(500); - if (m_thread->isRunning()) { - m_thread->terminate(); - m_thread->wait(300); - if (m_thread->isRunning()) - qCCritical(lcQpaDialogs) <<__FUNCTION__ << "Failed to terminate thread."; - else - qCWarning(lcQpaDialogs) << __FUNCTION__ << "Thread terminated."; - } - delete m_thread; - m_thread = 0; - } -} - -template -QWindowsNativeDialogBase *QWindowsDialogHelperBase::nativeDialog() const -{ - if (m_nativeDialog.isNull()) { - qWarning("%s invoked with no native dialog present.", __FUNCTION__); - return 0; - } - return m_nativeDialog.data(); -} - -template -void QWindowsDialogHelperBase::timerEvent(QTimerEvent *) -{ - startDialogThread(); -} - -template -QWindowsNativeDialogBase *QWindowsDialogHelperBase::ensureNativeDialog() -{ - // Create dialog and apply common settings. Check "executed" flag as well - // since for example IFileDialog::Show() works only once. - if (m_nativeDialog.isNull() || m_nativeDialog->executed()) - m_nativeDialog = QWindowsNativeDialogBasePtr(createNativeDialog()); - return m_nativeDialog.data(); -} - -/*! - \class QWindowsDialogThread - \brief Run a non-modal native dialog in a separate thread. - - \sa QWindowsDialogHelperBase - \internal - \ingroup qt-lighthouse-win -*/ - -class QWindowsDialogThread : public QThread -{ -public: - typedef QSharedPointer QWindowsNativeDialogBasePtr; - - explicit QWindowsDialogThread(const QWindowsNativeDialogBasePtr &d, HWND owner) - : m_dialog(d), m_owner(owner) {} - void run(); - -private: - const QWindowsNativeDialogBasePtr m_dialog; - const HWND m_owner; -}; - -void QWindowsDialogThread::run() -{ - qCDebug(lcQpaDialogs) << '>' << __FUNCTION__; - m_dialog->exec(m_owner); - qCDebug(lcQpaDialogs) << '<' << __FUNCTION__; -} - -template -bool QWindowsDialogHelperBase::show(Qt::WindowFlags, - Qt::WindowModality windowModality, - QWindow *parent) -{ - const bool modal = (windowModality != Qt::NonModal); - if (!parent) - parent = QGuiApplication::focusWindow(); // Need a parent window, else the application loses activation when closed. - if (parent) { - m_ownerWindow = QWindowsWindow::handleOf(parent); - } else { - m_ownerWindow = 0; - } - qCDebug(lcQpaDialogs) << __FUNCTION__ << "modal=" << modal - << " modal supported? " << supportsNonModalDialog(parent) - << "native=" << m_nativeDialog.data() << "owner" << m_ownerWindow; - if (!modal && !supportsNonModalDialog(parent)) - return false; // Was it changed in-between? - if (!ensureNativeDialog()) - return false; - // Start a background thread to show the dialog. For modal dialogs, - // a subsequent call to exec() may follow. So, start an idle timer - // which will start the dialog thread. If exec() is then called, the - // timer is stopped and dialog->exec() is called directly. - cleanupThread(); - if (modal) { - m_timerId = this->startTimer(0); - } else { - startDialogThread(); - } - return true; -} - -template -void QWindowsDialogHelperBase::startDialogThread() -{ - Q_ASSERT(!m_nativeDialog.isNull()); - Q_ASSERT(!m_thread); - m_thread = new QWindowsDialogThread(m_nativeDialog, m_ownerWindow); - m_thread->start(); - stopTimer(); -} - -template -void QWindowsDialogHelperBase::stopTimer() -{ - if (m_timerId) { - this->killTimer(m_timerId); - m_timerId = 0; - } -} - -#ifndef Q_OS_WINCE -// Find a file dialog window created by IFileDialog by process id, window -// title and class, which starts with a hash '#'. - -struct FindDialogContext -{ - explicit FindDialogContext(const QString &titleIn) - : title(qStringToWCharArray(titleIn)), processId(GetCurrentProcessId()), hwnd(0) {} - - const QScopedArrayPointer title; - const DWORD processId; - HWND hwnd; // contains the HWND of the window found. -}; - -static BOOL QT_WIN_CALLBACK findDialogEnumWindowsProc(HWND hwnd, LPARAM lParam) -{ - FindDialogContext *context = reinterpret_cast(lParam); - DWORD winPid = 0; - GetWindowThreadProcessId(hwnd, &winPid); - if (winPid != context->processId) - return TRUE; - wchar_t buf[256]; - if (!RealGetWindowClass(hwnd, buf, sizeof(buf)/sizeof(wchar_t)) || buf[0] != L'#') - return TRUE; - if (!GetWindowTextW(hwnd, buf, sizeof(buf)/sizeof(wchar_t)) || wcscmp(buf, context->title.data())) - return TRUE; - context->hwnd = hwnd; - return FALSE; -} - -static inline HWND findDialogWindow(const QString &title) -{ - FindDialogContext context(title); - EnumWindows(findDialogEnumWindowsProc, reinterpret_cast(&context)); - return context.hwnd; -} -#endif // !Q_OS_WINCE - -template -void QWindowsDialogHelperBase::hide() -{ - if (m_nativeDialog) - m_nativeDialog->close(); - m_ownerWindow = 0; -} - -template -void QWindowsDialogHelperBase::exec() -{ - qCDebug(lcQpaDialogs) << __FUNCTION__; - stopTimer(); - if (QWindowsNativeDialogBase *nd = nativeDialog()) { - nd->exec(m_ownerWindow); - m_nativeDialog.clear(); - } -} - -/*! - \class QWindowsFileDialogSharedData - \brief Explicitly shared file dialog parameters that are not in QFileDialogOptions. - - Contain Parameters that need to be cached while the native dialog does not - exist yet. In addition, the data are updated by the change notifications of the - IFileDialogEvent, as querying them after the dialog has closed - does not reliably work. Provides thread-safe setters (for the non-modal case). - - \internal - \ingroup qt-lighthouse-win - \sa QFileDialogOptions -*/ - -class QWindowsFileDialogSharedData -{ -public: - QWindowsFileDialogSharedData() : m_data(new Data) {} - void fromOptions(const QSharedPointer &o); - - QUrl directory() const; - void setDirectory(const QUrl &); - QString selectedNameFilter() const; - void setSelectedNameFilter(const QString &); - QList selectedFiles() const; - void setSelectedFiles(const QList &); - QString selectedFile() const; - void setSelectedRemoteContent(const QByteArray &); - QByteArray selectedRemoteContent() const; - -private: - class Data : public QSharedData { - public: - QUrl directory; - QString selectedNameFilter; - QList selectedFiles; - QByteArray selectedRemoteContent; - QMutex mutex; - }; - QExplicitlySharedDataPointer m_data; -}; - -inline QUrl QWindowsFileDialogSharedData::directory() const -{ - m_data->mutex.lock(); - const QUrl result = m_data->directory; - m_data->mutex.unlock(); - return result; -} - -inline void QWindowsFileDialogSharedData::setDirectory(const QUrl &d) -{ - QMutexLocker (&m_data->mutex); - m_data->directory = d; -} - -inline QString QWindowsFileDialogSharedData::selectedNameFilter() const -{ - m_data->mutex.lock(); - const QString result = m_data->selectedNameFilter; - m_data->mutex.unlock(); - return result; -} - -inline void QWindowsFileDialogSharedData::setSelectedNameFilter(const QString &f) -{ - QMutexLocker (&m_data->mutex); - m_data->selectedNameFilter = f; -} - -inline QList QWindowsFileDialogSharedData::selectedFiles() const -{ - m_data->mutex.lock(); - const QList result = m_data->selectedFiles; - m_data->mutex.unlock(); - return result; -} - -inline QString QWindowsFileDialogSharedData::selectedFile() const -{ - const QList files = selectedFiles(); - return files.isEmpty() ? QString() : files.front().toLocalFile(); -} - -inline void QWindowsFileDialogSharedData::setSelectedFiles(const QList &urls) -{ - QMutexLocker (&m_data->mutex); - m_data->selectedFiles = urls; -} - -inline QByteArray QWindowsFileDialogSharedData::selectedRemoteContent() const -{ - m_data->mutex.lock(); - const QByteArray result = m_data->selectedRemoteContent; - m_data->mutex.unlock(); - return result; -} - -inline void QWindowsFileDialogSharedData::setSelectedRemoteContent(const QByteArray &c) -{ - QMutexLocker(&m_data->mutex); - m_data->selectedRemoteContent = c; -} - -inline void QWindowsFileDialogSharedData::fromOptions(const QSharedPointer &o) -{ - QMutexLocker (&m_data->mutex); - m_data->directory = o->initialDirectory(); - m_data->selectedFiles = o->initiallySelectedFiles(); - m_data->selectedNameFilter = o->initiallySelectedNameFilter(); -} - -/*! - \class QWindowsNativeFileDialogEventHandler - \brief Listens to IFileDialog events and forwards them to QWindowsNativeFileDialogBase - - Events like 'folder change' that have an equivalent signal - in QFileDialog are forwarded. - - \sa QWindowsNativeFileDialogBase, QWindowsFileDialogHelper - \internal - \ingroup qt-lighthouse-win -*/ - -class QWindowsNativeFileDialogBase; - -class QWindowsNativeFileDialogEventHandler : public IFileDialogEvents -{ -public: - static IFileDialogEvents *create(QWindowsNativeFileDialogBase *nativeFileDialog); - - // IUnknown methods - IFACEMETHODIMP QueryInterface(REFIID riid, void** ppv) - { - if (riid != IID_IUnknown && riid != IID_IFileDialogEvents) { - *ppv = NULL; - return ResultFromScode(E_NOINTERFACE); - } - *ppv = this; - AddRef(); - return NOERROR; - } - - IFACEMETHODIMP_(ULONG) AddRef() { return InterlockedIncrement(&m_ref); } - - IFACEMETHODIMP_(ULONG) Release() - { - const long ref = InterlockedDecrement(&m_ref); - if (!ref) - delete this; - return ref; - } - - // IFileDialogEvents methods - IFACEMETHODIMP OnFileOk(IFileDialog *); - IFACEMETHODIMP OnFolderChange(IFileDialog *) { return S_OK; } - IFACEMETHODIMP OnFolderChanging(IFileDialog *, IShellItem *); - IFACEMETHODIMP OnHelp(IFileDialog *) { return S_OK; } - IFACEMETHODIMP OnSelectionChange(IFileDialog *); - IFACEMETHODIMP OnShareViolation(IFileDialog *, IShellItem *, FDE_SHAREVIOLATION_RESPONSE *) { return S_OK; } - IFACEMETHODIMP OnTypeChange(IFileDialog *); - IFACEMETHODIMP OnOverwrite(IFileDialog *, IShellItem *, FDE_OVERWRITE_RESPONSE *) { return S_OK; } - - QWindowsNativeFileDialogEventHandler(QWindowsNativeFileDialogBase *nativeFileDialog) : - m_ref(1), m_nativeFileDialog(nativeFileDialog) {} - virtual ~QWindowsNativeFileDialogEventHandler() {} - -private: - long m_ref; - QWindowsNativeFileDialogBase *m_nativeFileDialog; -}; - -IFileDialogEvents *QWindowsNativeFileDialogEventHandler::create(QWindowsNativeFileDialogBase *nativeFileDialog) -{ - IFileDialogEvents *result; - QWindowsNativeFileDialogEventHandler *eventHandler = new QWindowsNativeFileDialogEventHandler(nativeFileDialog); - if (FAILED(eventHandler->QueryInterface(IID_IFileDialogEvents, reinterpret_cast(&result)))) { - qErrnoWarning("Unable to obtain IFileDialogEvents"); - return 0; - } - eventHandler->Release(); - return result; -} - -/*! - \class QWindowsNativeFileDialogBase - \brief Windows native file dialog wrapper around IFileOpenDialog, IFileSaveDialog. - - Provides convenience methods. - Note that only IFileOpenDialog has multi-file functionality. - - \sa QWindowsNativeFileDialogEventHandler, QWindowsFileDialogHelper - \internal - \ingroup qt-lighthouse-win -*/ - -class QWindowsNativeFileDialogBase : public QWindowsNativeDialogBase -{ - Q_OBJECT - Q_PROPERTY(bool hideFiltersDetails READ hideFiltersDetails WRITE setHideFiltersDetails) -public: - ~QWindowsNativeFileDialogBase(); - - inline static QWindowsNativeFileDialogBase *create(QFileDialogOptions::AcceptMode am, const QWindowsFileDialogSharedData &data); - - virtual void setWindowTitle(const QString &title); - inline void setMode(QFileDialogOptions::FileMode mode, QFileDialogOptions::AcceptMode acceptMode, QFileDialogOptions::FileDialogOptions options); - inline void setDirectory(const QUrl &directory); - inline void updateDirectory() { setDirectory(m_data.directory()); } - inline QString directory() const; - virtual void doExec(HWND owner = 0); - virtual void setNameFilters(const QStringList &f); - inline void selectNameFilter(const QString &filter); - inline void updateSelectedNameFilter() { selectNameFilter(m_data.selectedNameFilter()); } - inline QString selectedNameFilter() const; - void selectFile(const QString &fileName) const; - bool hideFiltersDetails() const { return m_hideFiltersDetails; } - void setHideFiltersDetails(bool h) { m_hideFiltersDetails = h; } - void setDefaultSuffix(const QString &s); - inline bool hasDefaultSuffix() const { return m_hasDefaultSuffix; } - inline void setLabelText(QFileDialogOptions::DialogLabel l, const QString &text); - - // Return the selected files for tracking in OnSelectionChanged(). - virtual QList selectedFiles() const = 0; - // Return the result for tracking in OnFileOk(). Differs from selection for - // example by appended default suffixes, etc. - virtual QList dialogResult() const = 0; - virtual QByteArray dialogRemoteContent() const { return QByteArray(); } - - inline void onFolderChange(IShellItem *); - inline void onSelectionChange(); - inline void onTypeChange(); - inline bool onFileOk(); - -signals: - void directoryEntered(const QUrl &directory); - void currentChanged(const QUrl &file); - void filterSelected(const QString & filter); - -public slots: - virtual void close(); - -protected: - explicit QWindowsNativeFileDialogBase(const QWindowsFileDialogSharedData &data); - bool init(const CLSID &clsId, const IID &iid); - void setDefaultSuffixSys(const QString &s); - inline IFileDialog * fileDialog() const { return m_fileDialog; } - static QString itemPath(IShellItem *item); - static QList libraryItemFolders(IShellItem *item); - static QString libraryItemDefaultSaveFolder(IShellItem *item); - static int itemPaths(IShellItemArray *items, QList *fileResult = 0); - static IShellItem *shellItem(const QUrl &url); - - const QWindowsFileDialogSharedData &data() const { return m_data; } - QWindowsFileDialogSharedData &data() { return m_data; } - -private: - IFileDialog *m_fileDialog; - IFileDialogEvents *m_dialogEvents; - DWORD m_cookie; - QStringList m_nameFilters; - bool m_hideFiltersDetails; - bool m_hasDefaultSuffix; - QWindowsFileDialogSharedData m_data; - QString m_title; -}; - -QWindowsNativeFileDialogBase::QWindowsNativeFileDialogBase(const QWindowsFileDialogSharedData &data) : - m_fileDialog(0), m_dialogEvents(0), m_cookie(0), m_hideFiltersDetails(false), - m_hasDefaultSuffix(false), m_data(data) -{ -} - -QWindowsNativeFileDialogBase::~QWindowsNativeFileDialogBase() -{ - if (m_dialogEvents && m_fileDialog) - m_fileDialog->Unadvise(m_cookie); - if (m_dialogEvents) - m_dialogEvents->Release(); - if (m_fileDialog) - m_fileDialog->Release(); -} - -bool QWindowsNativeFileDialogBase::init(const CLSID &clsId, const IID &iid) -{ - HRESULT hr = CoCreateInstance(clsId, NULL, CLSCTX_INPROC_SERVER, - iid, reinterpret_cast(&m_fileDialog)); - if (FAILED(hr)) { - qErrnoWarning("CoCreateInstance failed"); - return false; - } - m_dialogEvents = QWindowsNativeFileDialogEventHandler::create(this); - if (!m_dialogEvents) - return false; - // Register event handler - hr = m_fileDialog->Advise(m_dialogEvents, &m_cookie); - if (FAILED(hr)) { - qErrnoWarning("IFileDialog::Advise failed"); - return false; - } - qCDebug(lcQpaDialogs) << __FUNCTION__ << m_fileDialog << m_dialogEvents << m_cookie; - - return true; -} - -void QWindowsNativeFileDialogBase::setWindowTitle(const QString &title) -{ - m_title = title; - m_fileDialog->SetTitle(reinterpret_cast(title.utf16())); -} - -IShellItem *QWindowsNativeFileDialogBase::shellItem(const QUrl &url) -{ -#ifndef Q_OS_WINCE - if (url.isLocalFile()) { - if (!QWindowsContext::shell32dll.sHCreateItemFromParsingName) - return Q_NULLPTR; - IShellItem *result = Q_NULLPTR; - const QString native = QDir::toNativeSeparators(url.toLocalFile()); - const HRESULT hr = - QWindowsContext::shell32dll.sHCreateItemFromParsingName(reinterpret_cast(native.utf16()), - NULL, IID_IShellItem, - reinterpret_cast(&result)); - if (FAILED(hr)) { - qErrnoWarning("%s: SHCreateItemFromParsingName(%s)) failed", __FUNCTION__, qPrintable(url.toString())); - return Q_NULLPTR; - } - return result; - } else if (url.scheme() == QLatin1String("clsid")) { - if (!QWindowsContext::shell32dll.sHGetKnownFolderIDList || !QWindowsContext::shell32dll.sHCreateItemFromIDList) - return Q_NULLPTR; - // Support for virtual folders via GUID - // (see https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx) - // specified as "clsid:" (without '{', '}'). - IShellItem *result = Q_NULLPTR; - const QUuid uuid(url.path()); - if (uuid.isNull()) { - qWarning() << __FUNCTION__ << ": Invalid CLSID: " << url.path(); - return Q_NULLPTR; - } - PIDLIST_ABSOLUTE idList; - HRESULT hr = QWindowsContext::shell32dll.sHGetKnownFolderIDList(uuid, 0, 0, &idList); - if (FAILED(hr)) { - qErrnoWarning("%s: SHGetKnownFolderIDList(%s)) failed", __FUNCTION__, qPrintable(url.toString())); - return Q_NULLPTR; - } - hr = QWindowsContext::shell32dll.sHCreateItemFromIDList(idList, IID_IShellItem, reinterpret_cast(&result)); - CoTaskMemFree(idList); - if (FAILED(hr)) { - qErrnoWarning("%s: SHCreateItemFromIDList(%s)) failed", __FUNCTION__, qPrintable(url.toString())); - return Q_NULLPTR; - } - return result; - } else { - qWarning() << __FUNCTION__ << ": Unhandled scheme: " << url.scheme(); - } -#else // !Q_OS_WINCE - Q_UNUSED(url) -#endif - return 0; -} - -void QWindowsNativeFileDialogBase::setDirectory(const QUrl &directory) -{ - if (!directory.isEmpty()) { - if (IShellItem *psi = QWindowsNativeFileDialogBase::shellItem(directory)) { - m_fileDialog->SetFolder(psi); - psi->Release(); - } - } -} - -QString QWindowsNativeFileDialogBase::directory() const -{ -#ifndef Q_OS_WINCE - IShellItem *item = 0; - if (m_fileDialog && SUCCEEDED(m_fileDialog->GetFolder(&item)) && item) - return QWindowsNativeFileDialogBase::itemPath(item); -#endif - return QString(); -} - -void QWindowsNativeFileDialogBase::doExec(HWND owner) -{ - qCDebug(lcQpaDialogs) << '>' << __FUNCTION__; - // Show() blocks until the user closes the dialog, the dialog window - // gets a WM_CLOSE or the parent window is destroyed. - const HRESULT hr = m_fileDialog->Show(owner); - QWindowsDialogs::eatMouseMove(); - qCDebug(lcQpaDialogs) << '<' << __FUNCTION__ << " returns " << hex << hr; - if (hr == S_OK) { - emit accepted(); - } else { - emit rejected(); - } -} - -void QWindowsNativeFileDialogBase::setMode(QFileDialogOptions::FileMode mode, - QFileDialogOptions::AcceptMode acceptMode, - QFileDialogOptions::FileDialogOptions options) -{ - DWORD flags = FOS_PATHMUSTEXIST | FOS_FORCESHOWHIDDEN; - if (options & QFileDialogOptions::DontResolveSymlinks) - flags |= FOS_NODEREFERENCELINKS; - switch (mode) { - case QFileDialogOptions::AnyFile: - if (acceptMode == QFileDialogOptions::AcceptSave) - flags |= FOS_NOREADONLYRETURN; - if (!(options & QFileDialogOptions::DontConfirmOverwrite)) - flags |= FOS_OVERWRITEPROMPT; - break; - case QFileDialogOptions::ExistingFile: - flags |= FOS_FILEMUSTEXIST; - break; - case QFileDialogOptions::Directory: - case QFileDialogOptions::DirectoryOnly: - flags |= FOS_PICKFOLDERS | FOS_FILEMUSTEXIST; - break; - case QFileDialogOptions::ExistingFiles: - flags |= FOS_FILEMUSTEXIST | FOS_ALLOWMULTISELECT; - break; - } - qCDebug(lcQpaDialogs) << __FUNCTION__ << "mode=" << mode - << "acceptMode=" << acceptMode << "options=" << options - << "results in" << showbase << hex << flags; - - if (FAILED(m_fileDialog->SetOptions(flags))) - qErrnoWarning("%s: SetOptions() failed", __FUNCTION__); -} - -#if !defined(Q_OS_WINCE) && defined(__IShellLibrary_INTERFACE_DEFINED__) // Windows SDK 7 - -// Helper for "Libraries": collections of folders appearing from Windows 7 -// on, visible in the file dialogs. - -// Load a library from a IShellItem (sanitized copy of the inline function -// SHLoadLibraryFromItem from ShObjIdl.h, which does not exist for MinGW). -static IShellLibrary *sHLoadLibraryFromItem(IShellItem *libraryItem, DWORD mode) -{ - // ID symbols present from Windows 7 on: - static const CLSID classId_ShellLibrary = {0xd9b3211d, 0xe57f, 0x4426, {0xaa, 0xef, 0x30, 0xa8, 0x6, 0xad, 0xd3, 0x97}}; - static const IID iId_IShellLibrary = {0x11a66efa, 0x382e, 0x451a, {0x92, 0x34, 0x1e, 0xe, 0x12, 0xef, 0x30, 0x85}}; - - IShellLibrary *helper = 0; - IShellLibrary *result = 0; - if (SUCCEEDED(CoCreateInstance(classId_ShellLibrary, NULL, CLSCTX_INPROC_SERVER, iId_IShellLibrary, reinterpret_cast(&helper)))) - if (SUCCEEDED(helper->LoadLibraryFromItem(libraryItem, mode))) - helper->QueryInterface(iId_IShellLibrary, reinterpret_cast(&result)); - if (helper) - helper->Release(); - return result; -} - -// Return all folders of a library-type item. -QList QWindowsNativeFileDialogBase::libraryItemFolders(IShellItem *item) -{ - QList result; - if (IShellLibrary *library = sHLoadLibraryFromItem(item, STGM_READ | STGM_SHARE_DENY_WRITE)) { - IShellItemArray *itemArray = 0; - if (SUCCEEDED(library->GetFolders(LFF_FORCEFILESYSTEM, IID_IShellItemArray, reinterpret_cast(&itemArray)))) { - QWindowsNativeFileDialogBase::itemPaths(itemArray, &result); - itemArray->Release(); - } - library->Release(); - } - return result; -} - -// Return default save folders of a library-type item. -QString QWindowsNativeFileDialogBase::libraryItemDefaultSaveFolder(IShellItem *item) -{ - QString result; - if (IShellLibrary *library = sHLoadLibraryFromItem(item, STGM_READ | STGM_SHARE_DENY_WRITE)) { - IShellItem *item = 0; - if (SUCCEEDED(library->GetDefaultSaveFolder(DSFT_DETECT, IID_IShellItem, reinterpret_cast(&item)))) { - result = QWindowsNativeFileDialogBase::itemPath(item); - item->Release(); - } - library->Release(); - } - return result; -} - -#else // !Q_OS_WINCE && __IShellLibrary_INTERFACE_DEFINED__ - -QList QWindowsNativeFileDialogBase::libraryItemFolders(IShellItem *) -{ - return QList(); -} - -QString QWindowsNativeFileDialogBase::libraryItemDefaultSaveFolder(IShellItem *) -{ - return QString(); -} - -#endif // Q_OS_WINCE || !__IShellLibrary_INTERFACE_DEFINED__ - -QString QWindowsNativeFileDialogBase::itemPath(IShellItem *item) -{ - SFGAOF attributes = 0; - // Check whether it has a file system representation? - if (FAILED(item->GetAttributes(SFGAO_FILESYSTEM, &attributes))) - return QString(); - if (attributes & SFGAO_FILESYSTEM) { - LPWSTR name = 0; - QString result; - if (SUCCEEDED(item->GetDisplayName(SIGDN_FILESYSPATH, &name))) { - result = QDir::cleanPath(QString::fromWCharArray(name)); - CoTaskMemFree(name); - } - return result; - } - // Check for a "Library" item - if ((QSysInfo::windowsVersion() & QSysInfo::WV_NT_based) && QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS7) - return QWindowsNativeFileDialogBase::libraryItemDefaultSaveFolder(item); - return QString(); -} - -int QWindowsNativeFileDialogBase::itemPaths(IShellItemArray *items, - QList *result /* = 0 */) -{ - DWORD itemCount = 0; - if (result) - result->clear(); - if (FAILED(items->GetCount(&itemCount))) - return 0; - if (result && itemCount) { - result->reserve(itemCount); - for (DWORD i = 0; i < itemCount; ++i) { - IShellItem *item = 0; - if (SUCCEEDED(items->GetItemAt(i, &item))) - result->push_back(QUrl::fromLocalFile(QWindowsNativeFileDialogBase::itemPath(item))); - } - } - return itemCount; -} - -// Split a list of name filters into description and actual filters -struct FilterSpec -{ - QString description; - QString filter; -}; - -static QList filterSpecs(const QStringList &filters, - bool hideFilterDetails, - int *totalStringLength) -{ - QList result; - result.reserve(filters.size()); - *totalStringLength = 0; - - const QRegExp filterSeparatorRE(QStringLiteral("[;\\s]+")); - const QString separator = QStringLiteral(";"); - Q_ASSERT(filterSeparatorRE.isValid()); - // Split filter specification as 'Texts (*.txt[;] *.doc)', '*.txt[;] *.doc' - // into description and filters specification as '*.txt;*.doc' - foreach (const QString &filterString, filters) { - const int openingParenPos = filterString.lastIndexOf(QLatin1Char('(')); - const int closingParenPos = openingParenPos != -1 ? - filterString.indexOf(QLatin1Char(')'), openingParenPos + 1) : -1; - FilterSpec filterSpec; - filterSpec.filter = closingParenPos == -1 ? - filterString : - filterString.mid(openingParenPos + 1, closingParenPos - openingParenPos - 1).trimmed(); - if (filterSpec.filter.isEmpty()) - filterSpec.filter += QLatin1Char('*'); - filterSpec.filter.replace(filterSeparatorRE, separator); - filterSpec.description = filterString; - if (hideFilterDetails && openingParenPos != -1) { // Do not show pattern in description - filterSpec.description.truncate(openingParenPos); - while (filterSpec.description.endsWith(QLatin1Char(' '))) - filterSpec.description.truncate(filterSpec.description.size() - 1); - } - *totalStringLength += filterSpec.filter.size() + filterSpec.description.size(); - result.push_back(filterSpec); - } - return result; -} - -void QWindowsNativeFileDialogBase::setNameFilters(const QStringList &filters) -{ - /* Populates an array of COMDLG_FILTERSPEC from list of filters, - * store the strings in a flat, contiguous buffer. */ - m_nameFilters = filters; - int totalStringLength = 0; - const QList specs = filterSpecs(filters, m_hideFiltersDetails, &totalStringLength); - const int size = specs.size(); - - QScopedArrayPointer buffer(new WCHAR[totalStringLength + 2 * size]); - QScopedArrayPointer comFilterSpec(new COMDLG_FILTERSPEC[size]); - - WCHAR *ptr = buffer.data(); - // Split filter specification as 'Texts (*.txt[;] *.doc)' - // into description and filters specification as '*.txt;*.doc' - - for (int i = 0; i < size; ++i) { - // Display glitch (CLSID only): Any filter not filtering on suffix (such as - // '*', 'a.*') will be duplicated in combo: 'All files (*) (*)', - // 'AAA files (a.*) (a.*)' - QString description = specs[i].description; - const QString &filter = specs[i].filter; - if (!m_hideFiltersDetails && !filter.startsWith(QLatin1String("*."))) { - const int pos = description.lastIndexOf(QLatin1Char('(')); - if (pos > 0) - description.truncate(pos); - } - // Add to buffer. - comFilterSpec[i].pszName = ptr; - ptr += description.toWCharArray(ptr); - *ptr++ = 0; - comFilterSpec[i].pszSpec = ptr; - ptr += specs[i].filter.toWCharArray(ptr); - *ptr++ = 0; - } - - m_fileDialog->SetFileTypes(size, comFilterSpec.data()); -} - -void QWindowsNativeFileDialogBase::setDefaultSuffix(const QString &s) -{ - setDefaultSuffixSys(s); - m_hasDefaultSuffix = !s.isEmpty(); -} - -void QWindowsNativeFileDialogBase::setDefaultSuffixSys(const QString &s) -{ - // If this parameter is non-empty, it will be appended by the dialog for the 'Any files' - // filter ('*'). If this parameter is non-empty and the current filter has a suffix, - // the dialog will append the filter's suffix. - wchar_t *wSuffix = const_cast(reinterpret_cast(s.utf16())); - m_fileDialog->SetDefaultExtension(wSuffix); -} - -void QWindowsNativeFileDialogBase::setLabelText(QFileDialogOptions::DialogLabel l, const QString &text) -{ - wchar_t *wText = const_cast(reinterpret_cast(text.utf16())); - switch (l) { - case QFileDialogOptions::FileName: - m_fileDialog->SetFileNameLabel(wText); - break; - case QFileDialogOptions::Accept: - m_fileDialog->SetOkButtonLabel(wText); - break; - case QFileDialogOptions::LookIn: - case QFileDialogOptions::Reject: - case QFileDialogOptions::FileType: - case QFileDialogOptions::DialogLabelCount: - break; - } -} - -static inline bool isClsid(const QString &s) -{ - // detect "374DE290-123F-4565-9164-39C4925E467B". - static const QRegularExpression pattern(QLatin1String("[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{8}")); - Q_ASSERT(pattern.isValid()); - return pattern.match(s).hasMatch(); -} - -void QWindowsNativeFileDialogBase::selectFile(const QString &fileName) const -{ - // Hack to prevent CLSIDs from being set as file name due to - // QFileDialogPrivate::initialSelection() being QString-based. - if (!isClsid(fileName)) - { - QString file = QDir::toNativeSeparators(fileName); - int lastBackSlash = file.lastIndexOf(QChar::fromLatin1('\\')); - if (lastBackSlash >= 0) { - file = file.mid(lastBackSlash + 1); - } - m_fileDialog->SetFileName((wchar_t*)file.utf16());; - } -} - -// Return the index of the selected filter, accounting for QFileDialog -// sometimes stripping the filter specification depending on the -// hideFilterDetails setting. -static int indexOfNameFilter(const QStringList &filters, const QString &needle) -{ - const int index = filters.indexOf(needle); - if (index >= 0) - return index; - for (int i = 0; i < filters.size(); ++i) - if (filters.at(i).startsWith(needle)) - return i; - return -1; -} - -void QWindowsNativeFileDialogBase::selectNameFilter(const QString &filter) -{ - if (filter.isEmpty()) - return; - const int index = indexOfNameFilter(m_nameFilters, filter); - if (index < 0) { - qWarning("%s: Invalid parameter '%s' not found in '%s'.", - __FUNCTION__, qPrintable(filter), - qPrintable(m_nameFilters.join(QStringLiteral(", ")))); - return; - } - m_fileDialog->SetFileTypeIndex(index + 1); // one-based. -} - -QString QWindowsNativeFileDialogBase::selectedNameFilter() const -{ - UINT uIndex = 0; - if (SUCCEEDED(m_fileDialog->GetFileTypeIndex(&uIndex))) { - const int index = uIndex - 1; // one-based - if (index < m_nameFilters.size()) - return m_nameFilters.at(index); - } - return QString(); -} - -void QWindowsNativeFileDialogBase::onFolderChange(IShellItem *item) -{ - if (item) { - const QUrl directory = QUrl::fromLocalFile(QWindowsNativeFileDialogBase::itemPath(item)); - m_data.setDirectory(directory); - emit directoryEntered(directory); - } -} - -void QWindowsNativeFileDialogBase::onSelectionChange() -{ - const QList current = selectedFiles(); - m_data.setSelectedFiles(current); - if (current.size() == 1) - emit currentChanged(current.front()); -} - -void QWindowsNativeFileDialogBase::onTypeChange() -{ - const QString filter = selectedNameFilter(); - m_data.setSelectedNameFilter(filter); - emit filterSelected(filter); -} - -bool QWindowsNativeFileDialogBase::onFileOk() -{ - // Store selected files as GetResults() returns invalid data after the dialog closes. - m_data.setSelectedFiles(dialogResult()); - m_data.setSelectedRemoteContent(dialogRemoteContent()); - return true; -} - -void QWindowsNativeFileDialogBase::close() -{ - m_fileDialog->Close(S_OK); -#ifndef Q_OS_WINCE - // IFileDialog::Close() does not work unless invoked from a callback. - // Try to find the window and send it a WM_CLOSE in addition. - const HWND hwnd = findDialogWindow(m_title); - qCDebug(lcQpaDialogs) << __FUNCTION__ << "closing" << hwnd; - if (hwnd && IsWindowVisible(hwnd)) - PostMessageW(hwnd, WM_CLOSE, 0, 0); -#endif // !Q_OS_WINCE -} - -HRESULT QWindowsNativeFileDialogEventHandler::OnFolderChanging(IFileDialog *, IShellItem *item) -{ - m_nativeFileDialog->onFolderChange(item); - return S_OK; -} - -HRESULT QWindowsNativeFileDialogEventHandler::OnSelectionChange(IFileDialog *) -{ - m_nativeFileDialog->onSelectionChange(); - return S_OK; -} - -HRESULT QWindowsNativeFileDialogEventHandler::OnTypeChange(IFileDialog *) -{ - m_nativeFileDialog->onTypeChange(); - return S_OK; -} - -HRESULT QWindowsNativeFileDialogEventHandler::OnFileOk(IFileDialog *) -{ - return m_nativeFileDialog->onFileOk() ? S_OK : S_FALSE; -} - -/*! - \class QWindowsNativeSaveFileDialog - \brief Windows native file save dialog wrapper around IFileSaveDialog. - - Implements single-selection methods. - - \internal - \ingroup qt-lighthouse-win -*/ - -class QWindowsNativeSaveFileDialog : public QWindowsNativeFileDialogBase -{ - Q_OBJECT -public: - explicit QWindowsNativeSaveFileDialog(const QWindowsFileDialogSharedData &data) - : QWindowsNativeFileDialogBase(data) {} - virtual void setNameFilters(const QStringList &f); - virtual QList selectedFiles() const; - virtual QList dialogResult() const; -}; - -// Return the first suffix from the name filter "Foo files (*.foo;*.bar)" -> "foo". -static inline QString suffixFromFilter(const QString &filter) -{ - int suffixPos = filter.indexOf(QLatin1String("(*.")); - if (suffixPos < 0) - return QString(); - suffixPos += 3; - int endPos = filter.indexOf(QLatin1Char(' '), suffixPos + 1); - if (endPos < 0) - endPos = filter.indexOf(QLatin1Char(';'), suffixPos + 1); - if (endPos < 0) - endPos = filter.indexOf(QLatin1Char(')'), suffixPos + 1); - return endPos >= 0 ? filter.mid(suffixPos, endPos - suffixPos) : QString(); -} - -void QWindowsNativeSaveFileDialog::setNameFilters(const QStringList &f) -{ - QWindowsNativeFileDialogBase::setNameFilters(f); - // QTBUG-31381, QTBUG-30748: IFileDialog will update the suffix of the selected name - // filter only if a default suffix is set (see docs). Set the first available - // suffix unless we have a defaultSuffix. - if (!hasDefaultSuffix()) { - foreach (const QString &filter, f) { - const QString suffix = suffixFromFilter(filter); - if (!suffix.isEmpty()) { - setDefaultSuffixSys(suffix); - break; - } - } - } // m_hasDefaultSuffix -} - -QList QWindowsNativeSaveFileDialog::dialogResult() const -{ - QList result; - IShellItem *item = 0; - if (SUCCEEDED(fileDialog()->GetResult(&item)) && item) - result.push_back(QUrl::fromLocalFile(QWindowsNativeFileDialogBase::itemPath(item))); - return result; -} - -QList QWindowsNativeSaveFileDialog::selectedFiles() const -{ - QList result; - IShellItem *item = 0; - const HRESULT hr = fileDialog()->GetCurrentSelection(&item); - if (SUCCEEDED(hr) && item) - result.push_back(QUrl::fromLocalFile(QWindowsNativeSaveFileDialog::itemPath(item))); - return result; -} - -/*! - \class QWindowsNativeOpenFileDialog - \brief Windows native file save dialog wrapper around IFileOpenDialog. - - Implements multi-selection methods. - - \internal - \ingroup qt-lighthouse-win -*/ - -class QWindowsNativeOpenFileDialog : public QWindowsNativeFileDialogBase -{ -public: - explicit QWindowsNativeOpenFileDialog(const QWindowsFileDialogSharedData &data) : - QWindowsNativeFileDialogBase(data) {} - virtual QList selectedFiles() const; - virtual QList dialogResult() const; - virtual QByteArray dialogRemoteContent() const; - -private: - inline IFileOpenDialog *openFileDialog() const - { return static_cast(fileDialog()); } -}; - -QList QWindowsNativeOpenFileDialog::dialogResult() const -{ - QList result; - IShellItemArray *items = 0; - if (SUCCEEDED(openFileDialog()->GetResults(&items)) && items) - QWindowsNativeFileDialogBase::itemPaths(items, &result); - return result; -} - -QByteArray QWindowsNativeOpenFileDialog::dialogRemoteContent() const { - QByteArray result; - IShellItemArray *items = 0; - if (FAILED(openFileDialog()->GetResults(&items)) || !items) - return result; - DWORD itemCount = 0; - if (FAILED(items->GetCount(&itemCount)) || !itemCount) - return result; - for (DWORD i = 0; i < itemCount; ++i) { - IShellItem *item = 0; - if (SUCCEEDED(items->GetItemAt(i, &item))) { - SFGAOF attributes = 0; - // Check whether it has a file system representation? - if (FAILED(item->GetAttributes(SFGAO_FILESYSTEM, &attributes)) || (attributes & SFGAO_FILESYSTEM)) { - LPWSTR name = 0; - if (SUCCEEDED(item->GetDisplayName(SIGDN_FILESYSPATH, &name))) { - CoTaskMemFree(name); - continue; - } - } - if (FAILED(item->GetAttributes(SFGAO_STREAM, &attributes)) || !(attributes & SFGAO_STREAM)) - continue; - - IBindCtx *bind = 0; - if (FAILED(CreateBindCtx(0, &bind))) - continue; - - IStream *stream = 0; - if (FAILED(item->BindToHandler(bind, BHID_Stream, IID_IStream, reinterpret_cast(&stream)))) - continue; - - STATSTG stat = { 0 }; - if (FAILED(stream->Stat(&stat, STATFLAG_NONAME)) || !stat.cbSize.QuadPart) - continue; - - quint64 fullSize = stat.cbSize.QuadPart; - result.resize(fullSize); - ULONG read = 0; - HRESULT r = stream->Read(result.data(), fullSize, &read); - if (r == S_FALSE || r == S_OK) - return result; - - result.clear(); - } - } - return result; -} - -QList QWindowsNativeOpenFileDialog::selectedFiles() const -{ - QList result; - IShellItemArray *items = 0; - const HRESULT hr = openFileDialog()->GetSelectedItems(&items); - if (SUCCEEDED(hr) && items) - QWindowsNativeFileDialogBase::itemPaths(items, &result); - return result; -} - -/*! - \brief Factory method for QWindowsNativeFileDialogBase returning - QWindowsNativeOpenFileDialog or QWindowsNativeSaveFileDialog depending on - QFileDialog::AcceptMode. -*/ - -QWindowsNativeFileDialogBase *QWindowsNativeFileDialogBase::create(QFileDialogOptions::AcceptMode am, - const QWindowsFileDialogSharedData &data) -{ - QWindowsNativeFileDialogBase *result = 0; - if (am == QFileDialogOptions::AcceptOpen) { - result = new QWindowsNativeOpenFileDialog(data); - if (!result->init(CLSID_FileOpenDialog, IID_IFileOpenDialog)) { - delete result; - return 0; - } - } else { - result = new QWindowsNativeSaveFileDialog(data); - if (!result->init(CLSID_FileSaveDialog, IID_IFileSaveDialog)) { - delete result; - return 0; - } - } - return result; -} - -static inline bool isQQuickWindow(const QWindow *w = 0) -{ - return w && w->inherits("QQuickWindow"); -} - -/*! - \class QWindowsFileDialogHelper - \brief Helper for native Windows file dialogs - - For Qt 4 compatibility, do not create native non-modal dialogs on widgets, - but only on QQuickWindows, which do not have a fallback. - - \internal - \ingroup qt-lighthouse-win -*/ - -class QWindowsFileDialogHelper : public QWindowsDialogHelperBase -{ -public: - QWindowsFileDialogHelper() {} - virtual bool supportsNonModalDialog(const QWindow * /* parent */ = 0) const { return false; } - virtual bool defaultNameFilterDisables() const - { return false; } - virtual void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE; - virtual QUrl directory() const Q_DECL_OVERRIDE; - virtual void selectFile(const QUrl &filename) Q_DECL_OVERRIDE; - virtual QList selectedFiles() const Q_DECL_OVERRIDE; - virtual QByteArray selectedRemoteContent() const Q_DECL_OVERRIDE; - virtual void setFilter() Q_DECL_OVERRIDE; - virtual void selectNameFilter(const QString &filter) Q_DECL_OVERRIDE; - virtual QString selectedNameFilter() const Q_DECL_OVERRIDE; - -private: - virtual QWindowsNativeDialogBase *createNativeDialog(); - inline QWindowsNativeFileDialogBase *nativeFileDialog() const - { return static_cast(nativeDialog()); } - - // Cache for the case no native dialog is created. - QWindowsFileDialogSharedData m_data; -}; - -QWindowsNativeDialogBase *QWindowsFileDialogHelper::createNativeDialog() -{ - QWindowsNativeFileDialogBase *result = QWindowsNativeFileDialogBase::create(options()->acceptMode(), m_data); - if (!result) - return 0; - QObject::connect(result, &QWindowsNativeDialogBase::accepted, this, &QPlatformDialogHelper::accept); - QObject::connect(result, &QWindowsNativeDialogBase::rejected, this, &QPlatformDialogHelper::reject); - QObject::connect(result, &QWindowsNativeFileDialogBase::directoryEntered, - this, &QPlatformFileDialogHelper::directoryEntered); - QObject::connect(result, &QWindowsNativeFileDialogBase::currentChanged, - this, &QPlatformFileDialogHelper::currentChanged); - QObject::connect(result, &QWindowsNativeFileDialogBase::filterSelected, - this, &QPlatformFileDialogHelper::filterSelected); - - // Apply settings. - const QSharedPointer &opts = options(); - m_data.fromOptions(opts); - const QFileDialogOptions::FileMode mode = opts->fileMode(); - result->setWindowTitle(opts->windowTitle()); - result->setMode(mode, opts->acceptMode(), opts->options()); - result->setHideFiltersDetails(opts->testOption(QFileDialogOptions::HideNameFilterDetails)); - const QStringList nameFilters = opts->nameFilters(); - if (!nameFilters.isEmpty()) - result->setNameFilters(nameFilters); - if (opts->isLabelExplicitlySet(QFileDialogOptions::FileName)) - result->setLabelText(QFileDialogOptions::FileName, opts->labelText(QFileDialogOptions::FileName)); - if (opts->isLabelExplicitlySet(QFileDialogOptions::Accept)) - result->setLabelText(QFileDialogOptions::Accept, opts->labelText(QFileDialogOptions::Accept)); - result->updateDirectory(); - result->updateSelectedNameFilter(); - const QList initialSelection = opts->initiallySelectedFiles(); - if (initialSelection.size() > 0) { - const QUrl url = initialSelection.front(); - if (url.isLocalFile()) { - QFileInfo info(url.toLocalFile()); - if (!info.isDir()) - result->selectFile(info.fileName()); - } else { - result->selectFile(url.path()); // TODO url.fileName() once it exists - } - } - // No need to select initialNameFilter if mode is Dir - if (mode != QFileDialogOptions::Directory && mode != QFileDialogOptions::DirectoryOnly) { - const QString initialNameFilter = opts->initiallySelectedNameFilter(); - if (!initialNameFilter.isEmpty()) - result->selectNameFilter(initialNameFilter); - } - const QString defaultSuffix = opts->defaultSuffix(); - if (!defaultSuffix.isEmpty()) - result->setDefaultSuffix(defaultSuffix); - return result; -} - -void QWindowsFileDialogHelper::setDirectory(const QUrl &directory) -{ - qCDebug(lcQpaDialogs) << __FUNCTION__ << directory.toString(); - - m_data.setDirectory(directory); - if (hasNativeDialog()) - nativeFileDialog()->updateDirectory(); -} - -QUrl QWindowsFileDialogHelper::directory() const -{ - return m_data.directory(); -} - -void QWindowsFileDialogHelper::selectFile(const QUrl &fileName) -{ - qCDebug(lcQpaDialogs) << __FUNCTION__ << fileName.toString(); - - if (hasNativeDialog()) // Might be invoked from the QFileDialog constructor. - nativeFileDialog()->selectFile(fileName.toLocalFile()); // ## should use QUrl::fileName() once it exists -} - -QList QWindowsFileDialogHelper::selectedFiles() const -{ - return m_data.selectedFiles(); -} - -QByteArray QWindowsFileDialogHelper::selectedRemoteContent() const -{ - return m_data.selectedRemoteContent(); -} - -void QWindowsFileDialogHelper::setFilter() -{ - qCDebug(lcQpaDialogs) << __FUNCTION__; -} - -void QWindowsFileDialogHelper::selectNameFilter(const QString &filter) -{ - m_data.setSelectedNameFilter(filter); - if (hasNativeDialog()) - nativeFileDialog()->updateSelectedNameFilter(); -} - -QString QWindowsFileDialogHelper::selectedNameFilter() const -{ - return m_data.selectedNameFilter(); -} - -#ifndef Q_OS_WINCE - -/*! - \class QWindowsXpNativeFileDialog - \brief Native Windows directory dialog for Windows XP using SHlib-functions. - - Uses the synchronous GetOpenFileNameW(), GetSaveFileNameW() from ComDlg32 - or SHBrowseForFolder() for directories. - - \internal - \sa QWindowsXpFileDialogHelper - - \ingroup qt-lighthouse-win -*/ - -class QWindowsXpNativeFileDialog : public QWindowsNativeDialogBase -{ - Q_OBJECT -public: - typedef QSharedPointer OptionsPtr; - - static QWindowsXpNativeFileDialog *create(const OptionsPtr &options, const QWindowsFileDialogSharedData &data); - - virtual void setWindowTitle(const QString &t) { m_title = t; } - virtual void doExec(HWND owner = 0); - virtual QPlatformDialogHelper::DialogCode result() const { return m_result; } - - int existingDirCallback(HWND hwnd, UINT uMsg, LPARAM lParam); - -public slots: - virtual void close() {} - -private: - typedef BOOL (APIENTRY *PtrGetOpenFileNameW)(LPOPENFILENAMEW); - typedef BOOL (APIENTRY *PtrGetSaveFileNameW)(LPOPENFILENAMEW); - - explicit QWindowsXpNativeFileDialog(const OptionsPtr &options, const QWindowsFileDialogSharedData &data); - void populateOpenFileName(OPENFILENAME *ofn, HWND owner) const; - QList execExistingDir(HWND owner); - QList execFileNames(HWND owner, int *selectedFilterIndex) const; - - const OptionsPtr m_options; - QString m_title; - QPlatformDialogHelper::DialogCode m_result; - QWindowsFileDialogSharedData m_data; - - static PtrGetOpenFileNameW m_getOpenFileNameW; - static PtrGetSaveFileNameW m_getSaveFileNameW; -}; - -QWindowsXpNativeFileDialog::PtrGetOpenFileNameW QWindowsXpNativeFileDialog::m_getOpenFileNameW = 0; -QWindowsXpNativeFileDialog::PtrGetSaveFileNameW QWindowsXpNativeFileDialog::m_getSaveFileNameW = 0; - -QWindowsXpNativeFileDialog *QWindowsXpNativeFileDialog::create(const OptionsPtr &options, const QWindowsFileDialogSharedData &data) -{ - // GetOpenFileNameW() GetSaveFileName() are resolved - // dynamically as not to create a dependency on Comdlg32, which - // is used on XP only. - if (!m_getOpenFileNameW) { - QSystemLibrary library(QStringLiteral("Comdlg32")); - m_getOpenFileNameW = (PtrGetOpenFileNameW)(library.resolve("GetOpenFileNameW")); - m_getSaveFileNameW = (PtrGetSaveFileNameW)(library.resolve("GetSaveFileNameW")); - } - if (m_getOpenFileNameW && m_getSaveFileNameW) - return new QWindowsXpNativeFileDialog(options, data); - return 0; -} - -QWindowsXpNativeFileDialog::QWindowsXpNativeFileDialog(const OptionsPtr &options, - const QWindowsFileDialogSharedData &data) : - m_options(options), m_result(QPlatformDialogHelper::Rejected), m_data(data) -{ - setWindowTitle(m_options->windowTitle()); -} - -void QWindowsXpNativeFileDialog::doExec(HWND owner) -{ - int selectedFilterIndex = -1; - const QList selectedFiles = - m_options->fileMode() == QFileDialogOptions::DirectoryOnly ? - execExistingDir(owner) : execFileNames(owner, &selectedFilterIndex); - m_data.setSelectedFiles(selectedFiles); - QWindowsDialogs::eatMouseMove(); - if (selectedFiles.isEmpty()) { - m_result = QPlatformDialogHelper::Rejected; - emit rejected(); - } else { - const QStringList nameFilters = m_options->nameFilters(); - if (selectedFilterIndex >= 0 && selectedFilterIndex < nameFilters.size()) - m_data.setSelectedNameFilter(nameFilters.at(selectedFilterIndex)); - QUrl firstFile = selectedFiles.front(); - m_data.setDirectory(firstFile.adjusted(QUrl::RemoveFilename)); - m_result = QPlatformDialogHelper::Accepted; - emit accepted(); - } -} - -// Callback for QWindowsNativeXpFileDialog directory dialog. -// MFC Directory Dialog. Contrib: Steve Williams (minor parts from Scott Powers) - -static int QT_WIN_CALLBACK xpFileDialogGetExistingDirCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) -{ - QWindowsXpNativeFileDialog *dialog = reinterpret_cast(lpData); - return dialog->existingDirCallback(hwnd, uMsg, lParam); -} - -/* The correct declaration of the SHGetPathFromIDList symbol is - * being used in mingw-w64 as of r6215, which is a v3 snapshot. */ -#if defined(Q_CC_MINGW) && (!defined(__MINGW64_VERSION_MAJOR) || __MINGW64_VERSION_MAJOR < 3) -typedef ITEMIDLIST *qt_LpItemIdList; -#else -typedef PIDLIST_ABSOLUTE qt_LpItemIdList; -#endif - -int QWindowsXpNativeFileDialog::existingDirCallback(HWND hwnd, UINT uMsg, LPARAM lParam) -{ - switch (uMsg) { - case BFFM_INITIALIZED: { - if (!m_title.isEmpty()) - SetWindowText(hwnd, (wchar_t *)m_title.utf16()); - const QString initialFile = QDir::toNativeSeparators(m_data.directory().toLocalFile()); - if (!initialFile.isEmpty()) - SendMessage(hwnd, BFFM_SETSELECTION, TRUE, LPARAM(initialFile.utf16())); - } - break; - case BFFM_SELCHANGED: { - wchar_t path[MAX_PATH]; - const bool ok = SHGetPathFromIDList(reinterpret_cast(lParam), path) - && path[0]; - SendMessage(hwnd, BFFM_ENABLEOK, ok ? 1 : 0, 1); - } - break; - } - return 0; -} - -QList QWindowsXpNativeFileDialog::execExistingDir(HWND owner) -{ - BROWSEINFO bi; - wchar_t initPath[MAX_PATH]; - initPath[0] = 0; - bi.hwndOwner = owner; - bi.pidlRoot = NULL; - bi.lpszTitle = 0; - bi.pszDisplayName = initPath; - bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_NEWDIALOGSTYLE; - bi.lpfn = xpFileDialogGetExistingDirCallbackProc; - bi.lParam = LPARAM(this); - QList selectedFiles; - if (qt_LpItemIdList pItemIDList = SHBrowseForFolder(&bi)) { - wchar_t path[MAX_PATH]; - path[0] = 0; - if (SHGetPathFromIDList(pItemIDList, path) && path[0]) - selectedFiles.push_back(QUrl::fromLocalFile(QDir::cleanPath(QString::fromWCharArray(path)))); - IMalloc *pMalloc; - if (SHGetMalloc(&pMalloc) == NOERROR) { - pMalloc->Free(pItemIDList); - pMalloc->Release(); - } - } - return selectedFiles; -} - -// Open/Save files -void QWindowsXpNativeFileDialog::populateOpenFileName(OPENFILENAME *ofn, HWND owner) const -{ - ZeroMemory(ofn, sizeof(OPENFILENAME)); - ofn->lStructSize = sizeof(OPENFILENAME); - ofn->hwndOwner = owner; - - // Create a buffer with the filter strings. - int totalStringLength = 0; - QList specs = - filterSpecs(m_options->nameFilters(), m_options->options() & QFileDialogOptions::HideNameFilterDetails, &totalStringLength); - const int size = specs.size(); - wchar_t *ptr = new wchar_t[totalStringLength + 2 * size + 1]; - ofn->lpstrFilter = ptr; - foreach (const FilterSpec &spec, specs) { - ptr += spec.description.toWCharArray(ptr); - *ptr++ = 0; - ptr += spec.filter.toWCharArray(ptr); - *ptr++ = 0; - } - *ptr = 0; - const int nameFilterIndex = indexOfNameFilter(m_options->nameFilters(), m_data.selectedNameFilter()); - if (nameFilterIndex >= 0) - ofn->nFilterIndex = nameFilterIndex + 1; // 1..n based. - // lpstrFile receives the initial selection and is the buffer - // for the target. If it contains any invalid character, the dialog - // will not show. - ofn->nMaxFile = 65535; - const QString initiallySelectedFile = - QDir::toNativeSeparators(m_data.selectedFile()).remove(QLatin1Char('<')). - remove(QLatin1Char('>')).remove(QLatin1Char('"')).remove(QLatin1Char('|')); - ofn->lpstrFile = qStringToWCharArray(initiallySelectedFile, ofn->nMaxFile); - ofn->lpstrInitialDir = qStringToWCharArray(QDir::toNativeSeparators(m_data.directory().toLocalFile())); - ofn->lpstrTitle = (wchar_t*)m_title.utf16(); - // Determine lpstrDefExt. Note that the current MSDN docs document this - // member wrong. It should rather be documented as "the default extension - // if no extension was given and if the current filter does not have an - // extension (e.g (*)). If the current filter has an extension, use - // the extension of the current filter". - if (m_options->acceptMode() == QFileDialogOptions::AcceptSave) { - QString defaultSuffix = m_options->defaultSuffix(); - if (defaultSuffix.startsWith(QLatin1Char('.'))) - defaultSuffix.remove(0, 1); - // QTBUG-33156, also create empty strings to trigger the appending mechanism. - ofn->lpstrDefExt = qStringToWCharArray(defaultSuffix); - } - // Flags. - ofn->Flags = (OFN_NOCHANGEDIR | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_PATHMUSTEXIST); - if (m_options->fileMode() == QFileDialogOptions::ExistingFile - || m_options->fileMode() == QFileDialogOptions::ExistingFiles) - ofn->Flags |= (OFN_FILEMUSTEXIST); - if (m_options->fileMode() == QFileDialogOptions::ExistingFiles) - ofn->Flags |= (OFN_ALLOWMULTISELECT); - if (!(m_options->options() & QFileDialogOptions::DontConfirmOverwrite)) - ofn->Flags |= OFN_OVERWRITEPROMPT; -} - -QList QWindowsXpNativeFileDialog::execFileNames(HWND owner, int *selectedFilterIndex) const -{ - *selectedFilterIndex = -1; - OPENFILENAME ofn; - populateOpenFileName(&ofn, owner); - QList result; - const bool isSave = m_options->acceptMode() == QFileDialogOptions::AcceptSave; - if (isSave ? m_getSaveFileNameW(&ofn) : m_getOpenFileNameW(&ofn)) { - *selectedFilterIndex = ofn.nFilterIndex - 1; - const QString dir = QDir::cleanPath(QString::fromWCharArray(ofn.lpstrFile)); - result.push_back(QUrl::fromLocalFile(dir)); - // For multiselection, the first item is the path followed - // by "\0\0\0\0". - if (ofn.Flags & (OFN_ALLOWMULTISELECT)) { - wchar_t *ptr = ofn.lpstrFile + dir.size() + 1; - if (*ptr) { - result.pop_front(); - const QString path = dir + QLatin1Char('/'); - while (*ptr) { - const QString fileName = QString::fromWCharArray(ptr); - result.push_back(QUrl::fromLocalFile(path + fileName)); - ptr += fileName.size() + 1; - } // extract multiple files - } // has multiple files - } // multiple flag set - } - delete [] ofn.lpstrFile; - delete [] ofn.lpstrInitialDir; - delete [] ofn.lpstrFilter; - delete [] ofn.lpstrDefExt; - return result; -} - -/*! - \class QWindowsXpFileDialogHelper - \brief Dialog helper using QWindowsXpNativeFileDialog - - \sa QWindowsXpNativeFileDialog - \internal - \ingroup qt-lighthouse-win -*/ - -class QWindowsXpFileDialogHelper : public QWindowsDialogHelperBase -{ -public: - QWindowsXpFileDialogHelper() {} - virtual bool supportsNonModalDialog(const QWindow * /* parent */ = 0) const { return false; } - virtual bool defaultNameFilterDisables() const - { return true; } - virtual void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE; - virtual QUrl directory() const Q_DECL_OVERRIDE; - virtual void selectFile(const QUrl &url) Q_DECL_OVERRIDE; - virtual QList selectedFiles() const Q_DECL_OVERRIDE; - virtual QByteArray selectedRemoteContent() const Q_DECL_OVERRIDE; - virtual void setFilter() Q_DECL_OVERRIDE {} - virtual void selectNameFilter(const QString &) Q_DECL_OVERRIDE; - virtual QString selectedNameFilter() const Q_DECL_OVERRIDE; - -private: - virtual QWindowsNativeDialogBase *createNativeDialog(); - inline QWindowsXpNativeFileDialog *nativeFileDialog() const - { return static_cast(nativeDialog()); } - - QWindowsFileDialogSharedData m_data; -}; - -QWindowsNativeDialogBase *QWindowsXpFileDialogHelper::createNativeDialog() -{ - m_data.fromOptions(options()); - if (QWindowsXpNativeFileDialog *result = QWindowsXpNativeFileDialog::create(options(), m_data)) { - QObject::connect(result, &QWindowsNativeDialogBase::accepted, this, &QPlatformDialogHelper::accept); - QObject::connect(result, &QWindowsNativeDialogBase::rejected, this, &QPlatformDialogHelper::reject); - return result; - } - return 0; -} - -void QWindowsXpFileDialogHelper::setDirectory(const QUrl &directory) -{ - m_data.setDirectory(directory); // Dialog cannot be updated at run-time. -} - -QUrl QWindowsXpFileDialogHelper::directory() const -{ - return m_data.directory(); -} - -void QWindowsXpFileDialogHelper::selectFile(const QUrl &url) -{ - m_data.setSelectedFiles(QList() << url); // Dialog cannot be updated at run-time. -} - -QList QWindowsXpFileDialogHelper::selectedFiles() const -{ - return m_data.selectedFiles(); -} - -QByteArray QWindowsXpFileDialogHelper::selectedRemoteContent() const -{ - return m_data.selectedRemoteContent(); -} - -void QWindowsXpFileDialogHelper::selectNameFilter(const QString &f) -{ - m_data.setSelectedNameFilter(f); // Dialog cannot be updated at run-time. -} - -QString QWindowsXpFileDialogHelper::selectedNameFilter() const -{ - return m_data.selectedNameFilter(); -} - -#endif // Q_OS_WINCE - -/*! - \class QWindowsNativeColorDialog - \brief Native Windows color dialog. - - Wrapper around Comdlg32's ChooseColor() function. - Not currently in use as QColorDialog is equivalent. - - \sa QWindowsColorDialogHelper - \sa #define USE_NATIVE_COLOR_DIALOG - \internal - \ingroup qt-lighthouse-win -*/ - -typedef QSharedPointer SharedPointerColor; - -#ifdef USE_NATIVE_COLOR_DIALOG -class QWindowsNativeColorDialog : public QWindowsNativeDialogBase -{ - Q_OBJECT -public: - enum { CustomColorCount = 16 }; - - explicit QWindowsNativeColorDialog(const SharedPointerColor &color); - - virtual void setWindowTitle(const QString &) {} - virtual QPlatformDialogHelper::DialogCode result() const { return m_code; } - -public slots: - virtual void close() {} - -private: - virtual void doExec(HWND owner = 0); - - COLORREF m_customColors[CustomColorCount]; - QPlatformDialogHelper::DialogCode m_code; - SharedPointerColor m_color; -}; - -QWindowsNativeColorDialog::QWindowsNativeColorDialog(const SharedPointerColor &color) : - m_code(QPlatformDialogHelper::Rejected), m_color(color) -{ - std::fill(m_customColors, m_customColors + 16, COLORREF(0)); -} - -void QWindowsNativeColorDialog::doExec(HWND owner) -{ - typedef BOOL (WINAPI *ChooseColorWType)(LPCHOOSECOLORW); - - CHOOSECOLOR chooseColor; - ZeroMemory(&chooseColor, sizeof(chooseColor)); - chooseColor.lStructSize = sizeof(chooseColor); - chooseColor.hwndOwner = owner; - chooseColor.lpCustColors = m_customColors; - QRgb *qCustomColors = QColorDialogOptions::customColors(); - const int customColorCount = qMin(QColorDialogOptions::customColorCount(), - int(CustomColorCount)); - for (int c= 0; c < customColorCount; ++c) - m_customColors[c] = qColorToCOLORREF(QColor(qCustomColors[c])); - chooseColor.rgbResult = qColorToCOLORREF(*m_color); - chooseColor.Flags = CC_FULLOPEN | CC_RGBINIT; - static ChooseColorWType chooseColorW = 0; - if (!chooseColorW) { - QSystemLibrary library(QStringLiteral("Comdlg32")); - chooseColorW = (ChooseColorWType)library.resolve("ChooseColorW"); - } - if (chooseColorW) { - m_code = chooseColorW(&chooseColor) ? - QPlatformDialogHelper::Accepted : QPlatformDialogHelper::Rejected; - QWindowsDialogs::eatMouseMove(); - } else { - m_code = QPlatformDialogHelper::Rejected; - } - if (m_code == QPlatformDialogHelper::Accepted) { - *m_color = COLORREFToQColor(chooseColor.rgbResult); - for (int c= 0; c < customColorCount; ++c) - qCustomColors[c] = COLORREFToQColor(m_customColors[c]).rgb(); - emit accepted(); - } else { - emit rejected(); - } -} - -/*! - \class QWindowsColorDialogHelper - \brief Helper for native Windows color dialogs - - Not currently in use as QColorDialog is equivalent. - - \sa #define USE_NATIVE_COLOR_DIALOG - \sa QWindowsNativeColorDialog - \internal - \ingroup qt-lighthouse-win -*/ - -class QWindowsColorDialogHelper : public QWindowsDialogHelperBase -{ -public: - QWindowsColorDialogHelper() : m_currentColor(new QColor) {} - - virtual bool supportsNonModalDialog() - { return false; } - - virtual QColor currentColor() const { return *m_currentColor; } - virtual void setCurrentColor(const QColor &c) { *m_currentColor = c; } - -private: - inline QWindowsNativeColorDialog *nativeFileDialog() const - { return static_cast(nativeDialog()); } - virtual QWindowsNativeDialogBase *createNativeDialog(); - - SharedPointerColor m_currentColor; -}; - -QWindowsNativeDialogBase *QWindowsColorDialogHelper::createNativeDialog() -{ - QWindowsNativeColorDialog *nativeDialog = new QWindowsNativeColorDialog(m_currentColor); - nativeDialog->setWindowTitle(options()->windowTitle()); - connect(nativeDialog, &QWindowsNativeDialogBase::accepted, this, &QPlatformDialogHelper::accept); - connect(nativeDialog, &QWindowsNativeDialogBase::rejected, this, &QPlatformDialogHelper::reject); - return nativeDialog; -} -#endif // USE_NATIVE_COLOR_DIALOG - -namespace QWindowsDialogs { - -// QWindowsDialogHelperBase creation functions -bool useHelper(QPlatformTheme::DialogType type) -{ - if (QWindowsIntegration::instance()->options() & QWindowsIntegration::NoNativeDialogs) - return false; - switch (type) { - case QPlatformTheme::FileDialog: - return QSysInfo::windowsVersion() >= QSysInfo::WV_XP; - case QPlatformTheme::ColorDialog: -#ifdef USE_NATIVE_COLOR_DIALOG - return true; -#else - break; -#endif - case QPlatformTheme::FontDialog: - case QPlatformTheme::MessageDialog: - break; - default: - break; - } - return false; -} - -QPlatformDialogHelper *createHelper(QPlatformTheme::DialogType type) -{ - if (QWindowsIntegration::instance()->options() & QWindowsIntegration::NoNativeDialogs) - return 0; - switch (type) { - case QPlatformTheme::FileDialog: -#ifndef Q_OS_WINCE // Note: "Windows XP Professional x64 Edition has version number WV_5_2 (WV_2003). - if (QWindowsIntegration::instance()->options() & QWindowsIntegration::XpNativeDialogs - || QSysInfo::windowsVersion() <= QSysInfo::WV_2003) { - return new QWindowsXpFileDialogHelper(); - } - if (QSysInfo::windowsVersion() > QSysInfo::WV_2003) - return new QWindowsFileDialogHelper(); -#else - return new QWindowsFileDialogHelper(); -#endif // Q_OS_WINCE - case QPlatformTheme::ColorDialog: -#ifdef USE_NATIVE_COLOR_DIALOG - return new QWindowsColorDialogHelper(); -#else - break; -#endif - case QPlatformTheme::FontDialog: - case QPlatformTheme::MessageDialog: - break; - default: - break; - } - return 0; -} - -} // namespace QWindowsDialogs -QT_END_NAMESPACE - -#include "qwindowsdialoghelpers.moc" diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/windows/qwindowsservices.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/windows/qwindowsservices.cpp deleted file mode 100644 index 8e15e86d5..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/windows/qwindowsservices.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#define QT_NO_URL_CAST_FROM_STRING -#include "qwindowsservices.h" -#include "qtwindows_additional.h" - -#include -#include -#include - -#include -#ifndef Q_OS_WINCE -# include -#endif - -QT_BEGIN_NAMESPACE - -enum { debug = 0 }; - -static inline bool shellExecute(const QUrl &url) -{ -#ifndef Q_OS_WINCE - const QString nativeFilePath = - url.isLocalFile() ? QDir::toNativeSeparators(url.toLocalFile()) : url.toString(QUrl::FullyEncoded); - const quintptr result = (quintptr)ShellExecute(0, 0, (wchar_t*)nativeFilePath.utf16(), 0, 0, SW_SHOWNORMAL); - // ShellExecute returns a value greater than 32 if successful - if (result <= 32) { - qWarning("ShellExecute '%s' failed (error %s).", qPrintable(url.toString()), qPrintable(QString::number(result))); - return false; - } - return true; -#else - Q_UNUSED(url); - return false; -#endif -} - -// Retrieve the commandline for the default mail client. It contains a -// placeholder %1 for the URL. The default key used below is the -// command line for the mailto: shell command. -static inline QString mailCommand() -{ - enum { BufferSize = sizeof(wchar_t) * MAX_PATH }; - - const wchar_t mailUserKey[] = L"Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\mailto\\UserChoice"; - - wchar_t command[MAX_PATH] = {0}; - // Check if user has set preference, otherwise use default. - HKEY handle; - QString keyName; - if (!RegOpenKeyEx(HKEY_CURRENT_USER, mailUserKey, 0, KEY_READ, &handle)) { - DWORD bufferSize = BufferSize; - if (!RegQueryValueEx(handle, L"Progid", 0, 0, reinterpret_cast(command), &bufferSize)) - keyName = QString::fromWCharArray(command); - RegCloseKey(handle); - } - if (keyName.isEmpty()) - keyName = QStringLiteral("mailto"); - keyName += QStringLiteral("\\Shell\\Open\\Command"); - if (debug) - qDebug() << __FUNCTION__ << "keyName=" << keyName; - command[0] = 0; - if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, (const wchar_t*)keyName.utf16(), 0, KEY_READ, &handle)) { - DWORD bufferSize = BufferSize; - RegQueryValueEx(handle, L"", 0, 0, reinterpret_cast(command), &bufferSize); - RegCloseKey(handle); - } - if (!command[0]) - return QString(); -#ifndef Q_OS_WINCE - wchar_t expandedCommand[MAX_PATH] = {0}; - return ExpandEnvironmentStrings(command, expandedCommand, MAX_PATH) ? - QString::fromWCharArray(expandedCommand) : QString::fromWCharArray(command); -#else - return QString(); -#endif -} - -static inline bool launchMail(const QUrl &url) -{ - QString command = mailCommand(); - if (command.isEmpty()) { - qWarning("Cannot launch '%s': There is no mail program installed.", qPrintable(url.toString())); - return false; - } - //Make sure the path for the process is in quotes - const QChar doubleQuote = QLatin1Char('"'); - if (!command.startsWith(doubleQuote)) { - const int exeIndex = command.indexOf(QStringLiteral(".exe "), 0, Qt::CaseInsensitive); - if (exeIndex != -1) { - command.insert(exeIndex + 4, doubleQuote); - command.prepend(doubleQuote); - } - } - // Pass the url as the parameter. Should use QProcess::startDetached(), - // but that cannot handle a Windows command line [yet]. - if (command.indexOf(QStringLiteral("%1")) < 0) return false; - command.replace(QStringLiteral("%1"), url.toString(QUrl::FullyEncoded)); - if (debug) - qDebug() << __FUNCTION__ << "Launching" << command; - //start the process - PROCESS_INFORMATION pi; - ZeroMemory(&pi, sizeof(pi)); - STARTUPINFO si; - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - if (!CreateProcess(NULL, (wchar_t*)command.utf16(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { - qErrnoWarning("Unable to launch '%s'", qPrintable(command)); - return false; - } - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - return true; -} - -bool QWindowsServices::openUrl(const QUrl &url) -{ - const QString scheme = url.scheme(); - if (scheme == QLatin1String("mailto") && launchMail(url)) - return true; - return shellExecute(url); -} - -bool QWindowsServices::openDocument(const QUrl &url) -{ - return shellExecute(url); -} - -QT_END_NAMESPACE diff --git a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/windows/qwindowswindow.cpp b/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/windows/qwindowswindow.cpp deleted file mode 100644 index d80429b6d..000000000 --- a/Telegram/_qt_5_5_0_patch/qtbase/src/plugins/platforms/windows/qwindowswindow.cpp +++ /dev/null @@ -1,2354 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qwindowswindow.h" -#include "qwindowsnativeimage.h" -#include "qwindowscontext.h" -#include "qwindowsdrag.h" -#include "qwindowsscreen.h" -#include "qwindowsscaling.h" -#include "qwindowsintegration.h" -#include "qwindowsopenglcontext.h" -#ifdef QT_NO_CURSOR -# include "qwindowscursor.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -QT_BEGIN_NAMESPACE - -enum { - defaultWindowWidth = 160, - defaultWindowHeight = 160 -}; - -Q_GUI_EXPORT HICON qt_pixmapToWinHICON(const QPixmap &); - -static QByteArray debugWinStyle(DWORD style) -{ - QByteArray rc = "0x"; - rc += QByteArray::number(qulonglong(style), 16); - if (style & WS_POPUP) - rc += " WS_POPUP"; - if (style & WS_CHILD) - rc += " WS_CHILD"; - if (style & WS_OVERLAPPED) - rc += " WS_OVERLAPPED"; - if (style & WS_CLIPSIBLINGS) - rc += " WS_CLIPSIBLINGS"; - if (style & WS_CLIPCHILDREN) - rc += " WS_CLIPCHILDREN"; - if (style & WS_THICKFRAME) - rc += " WS_THICKFRAME"; - if (style & WS_DLGFRAME) - rc += " WS_DLGFRAME"; - if (style & WS_SYSMENU) - rc += " WS_SYSMENU"; - if (style & WS_MINIMIZEBOX) - rc += " WS_MINIMIZEBOX"; - if (style & WS_MAXIMIZEBOX) - rc += " WS_MAXIMIZEBOX"; - return rc; -} - -static QByteArray debugWinExStyle(DWORD exStyle) -{ - QByteArray rc = "0x"; - rc += QByteArray::number(qulonglong(exStyle), 16); - if (exStyle & WS_EX_TOOLWINDOW) - rc += " WS_EX_TOOLWINDOW"; - if (exStyle & WS_EX_CONTEXTHELP) - rc += " WS_EX_CONTEXTHELP"; - if (exStyle & WS_EX_LAYERED) - rc += " WS_EX_LAYERED"; - if (exStyle & WS_EX_DLGMODALFRAME) - rc += " WS_EX_DLGMODALFRAME"; - return rc; -} - -#ifndef Q_OS_WINCE // maybe available on some SDKs revisit WM_GETMINMAXINFO -QDebug operator<<(QDebug d, const MINMAXINFO &i) -{ - QDebugStateSaver saver(d); - d.nospace(); - d << "MINMAXINFO maxSize=" << i.ptMaxSize.x << ',' - << i.ptMaxSize.y << " maxpos=" << i.ptMaxPosition.x - << ',' << i.ptMaxPosition.y << " mintrack=" - << i.ptMinTrackSize.x << ',' << i.ptMinTrackSize.y - << " maxtrack=" << i.ptMaxTrackSize.x << ',' << i.ptMaxTrackSize.y; - return d; -} -#endif // !Q_OS_WINCE - -static inline QSize qSizeOfRect(const RECT &rect) -{ - return QSize(rect.right -rect.left, rect.bottom - rect.top); -} - -static inline QRect qrectFromRECT(const RECT &rect) -{ - return QRect(QPoint(rect.left, rect.top), qSizeOfRect(rect)); -} - -static inline RECT RECTfromQRect(const QRect &rect) -{ - const int x = rect.left(); - const int y = rect.top(); - RECT result = { x, y, x + rect.width(), y + rect.height() }; - return result; -} - -QDebug operator<<(QDebug d, const RECT &r) -{ - QDebugStateSaver saver(d); - d.nospace(); - d << "RECT: left/top=" << r.left << ',' << r.top - << " right/bottom=" << r.right << ',' << r.bottom; - return d; -} - -#ifndef Q_OS_WINCE // maybe available on some SDKs revisit WM_NCCALCSIZE -QDebug operator<<(QDebug d, const NCCALCSIZE_PARAMS &p) -{ - QDebugStateSaver saver(d); - d.nospace(); - d << "NCCALCSIZE_PARAMS " << qrectFromRECT(p.rgrc[0]) - << ' ' << qrectFromRECT(p.rgrc[1]) << ' ' << qrectFromRECT(p.rgrc[2]); - return d; -} -#endif // !Q_OS_WINCE - -// QTBUG-43872, for windows that do not have WS_EX_TOOLWINDOW set, WINDOWPLACEMENT -// is in workspace/available area coordinates. -static QPoint windowPlacementOffset(HWND hwnd, const QPoint &point) -{ -#ifndef Q_OS_WINCE - if (GetWindowLongPtr(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) - return QPoint(0, 0); - const QWindowsScreenManager &screenManager = QWindowsContext::instance()->screenManager(); - const QWindowsScreen *screen = screenManager.screens().size() == 1 - ? screenManager.screens().first() : screenManager.screenAtDp(point); - if (screen) - return screen->availableGeometryDp().topLeft() - screen->geometryDp().topLeft(); -#else - Q_UNUSED(hwnd) - Q_UNUSED(point) -#endif - return QPoint(0, 0); -} - -// Return the frame geometry relative to the parent -// if there is one. -static inline QRect frameGeometry(HWND hwnd, bool topLevel) -{ - RECT rect = { 0, 0, 0, 0 }; -#ifndef Q_OS_WINCE - if (topLevel) { - WINDOWPLACEMENT windowPlacement; - windowPlacement.length = sizeof(WINDOWPLACEMENT); - GetWindowPlacement(hwnd, &windowPlacement); - if (windowPlacement.showCmd == SW_SHOWMINIMIZED) { - const QRect result = qrectFromRECT(windowPlacement.rcNormalPosition); - return result.translated(windowPlacementOffset(hwnd, result.topLeft())); - } - } -#endif // !Q_OS_WINCE - GetWindowRect(hwnd, &rect); // Screen coordinates. - const HWND parent = GetParent(hwnd); - if (parent && !topLevel) { - const int width = rect.right - rect.left; - const int height = rect.bottom - rect.top; - POINT leftTop = { rect.left, rect.top }; - ScreenToClient(parent, &leftTop); - rect.left = leftTop.x; - rect.top = leftTop.y; - rect.right = leftTop.x + width; - rect.bottom = leftTop.y + height; - } - return qrectFromRECT(rect); -} - -static inline QSize clientSize(HWND hwnd) -{ - RECT rect = { 0, 0, 0, 0 }; - GetClientRect(hwnd, &rect); // Always returns point 0,0, thus unusable for geometry. - return qSizeOfRect(rect); -} - -static inline bool windowIsOpenGL(const QWindow *w) -{ - switch (w->surfaceType()) { - case QSurface::OpenGLSurface: - return true; - case QSurface::RasterGLSurface: - return qt_window_private(const_cast(w))->compositing; - default: - return false; - } -} - -static bool applyBlurBehindWindow(HWND hwnd) -{ -#ifdef Q_OS_WINCE - Q_UNUSED(hwnd); - return false; -#else - enum { dwmBbEnable = 0x1, dwmBbBlurRegion = 0x2 }; - - struct DwmBlurBehind { - DWORD dwFlags; - BOOL fEnable; - HRGN hRgnBlur; - BOOL fTransitionOnMaximized; - }; - - typedef HRESULT (WINAPI *PtrDwmEnableBlurBehindWindow)(HWND, const DwmBlurBehind*); - typedef HRESULT (WINAPI *PtrDwmIsCompositionEnabled)(BOOL *); - - // DWM API is available only from Windows Vista - if (QSysInfo::windowsVersion() < QSysInfo::WV_VISTA) - return false; - - static bool functionPointersResolved = false; - static PtrDwmEnableBlurBehindWindow dwmBlurBehind = 0; - static PtrDwmIsCompositionEnabled dwmIsCompositionEnabled = 0; - - if (Q_UNLIKELY(!functionPointersResolved)) { - QSystemLibrary library(QStringLiteral("dwmapi")); - if (library.load()) { - dwmBlurBehind = (PtrDwmEnableBlurBehindWindow)(library.resolve("DwmEnableBlurBehindWindow")); - dwmIsCompositionEnabled = (PtrDwmIsCompositionEnabled)(library.resolve("DwmIsCompositionEnabled")); - } - - functionPointersResolved = true; - } - - if (Q_UNLIKELY(!dwmBlurBehind || !dwmIsCompositionEnabled)) - return false; - - BOOL compositionEnabled; - if (dwmIsCompositionEnabled(&compositionEnabled) != S_OK) - return false; - - DwmBlurBehind blurBehind = {0, 0, 0, 0}; - - if (compositionEnabled) { - blurBehind.dwFlags = dwmBbEnable | dwmBbBlurRegion; - blurBehind.fEnable = TRUE; - blurBehind.hRgnBlur = CreateRectRgn(0, 0, -1, -1); - } else { - blurBehind.dwFlags = dwmBbEnable; - blurBehind.fEnable = FALSE; - } - - const bool result = dwmBlurBehind(hwnd, &blurBehind) == S_OK; - - if (blurBehind.hRgnBlur) - DeleteObject(blurBehind.hRgnBlur); - - return result; -#endif // Q_OS_WINCE -} - -// from qwidget_win.cpp, pass flags separately in case they have been "autofixed". -static bool shouldShowMaximizeButton(const QWindow *w, Qt::WindowFlags flags) -{ - if ((flags & Qt::MSWindowsFixedSizeDialogHint) || !(flags & Qt::WindowMaximizeButtonHint)) - return false; - // if the user explicitly asked for the maximize button, we try to add - // it even if the window has fixed size. - return (flags & Qt::CustomizeWindowHint) || - w->maximumSize() == QSize(QWINDOWSIZE_MAX, QWINDOWSIZE_MAX); -} - -// Set the WS_EX_LAYERED flag on a HWND if required. This is required for -// translucent backgrounds, not fully opaque windows and for -// Qt::WindowTransparentForInput (in combination with WS_EX_TRANSPARENT). -bool QWindowsWindow::setWindowLayered(HWND hwnd, Qt::WindowFlags flags, bool hasAlpha, qreal opacity) -{ -#ifndef Q_OS_WINCE // maybe needs revisiting WS_EX_LAYERED - const LONG exStyle = GetWindowLong(hwnd, GWL_EXSTYLE); - const bool needsLayered = (flags & Qt::WindowTransparentForInput) - || (hasAlpha && (flags & Qt::FramelessWindowHint)) || opacity < 1.0; - const bool isLayered = (exStyle & WS_EX_LAYERED); - if (needsLayered != isLayered) { - if (needsLayered) { - SetWindowLong(hwnd, GWL_EXSTYLE, exStyle | WS_EX_LAYERED); - } else { - SetWindowLong(hwnd, GWL_EXSTYLE, exStyle & ~WS_EX_LAYERED); - } - } - return needsLayered; -#else // !Q_OS_WINCE - Q_UNUSED(hwnd); - Q_UNUSED(flags); - Q_UNUSED(hasAlpha); - Q_UNUSED(opacity); - return false; -#endif // Q_OS_WINCE -} - -static void setWindowOpacity(HWND hwnd, Qt::WindowFlags flags, bool hasAlpha, bool openGL, qreal level) -{ -#ifdef Q_OS_WINCE // WINCE does not support that feature and microsoft explicitly warns to use those calls - Q_UNUSED(hwnd); - Q_UNUSED(flags); - Q_UNUSED(hasAlpha); - Q_UNUSED(level); -#else - if (QWindowsWindow::setWindowLayered(hwnd, flags, hasAlpha, level)) { - if (hasAlpha && !openGL && (flags & Qt::FramelessWindowHint)) { - // Non-GL windows with alpha: Use blend function to update. - BLENDFUNCTION blend = {AC_SRC_OVER, 0, (BYTE)(255.0 * level), AC_SRC_ALPHA}; - QWindowsContext::user32dll.updateLayeredWindow(hwnd, NULL, NULL, NULL, NULL, NULL, 0, &blend, ULW_ALPHA); - } else { - QWindowsContext::user32dll.setLayeredWindowAttributes(hwnd, 0, (int)(level * 255), LWA_ALPHA); - } - } else if (IsWindowVisible(hwnd)) { // Repaint when switching from layered. - InvalidateRect(hwnd, NULL, TRUE); - } -#endif // !Q_OS_WINCE -} - -static inline void updateGLWindowSettings(const QWindow *w, HWND hwnd, Qt::WindowFlags flags, qreal opacity) -{ - const bool isGL = windowIsOpenGL(w); - const bool hasAlpha = w->format().hasAlpha(); - - if (isGL && hasAlpha) - applyBlurBehindWindow(hwnd); - - setWindowOpacity(hwnd, flags, hasAlpha, isGL, opacity); -} - -/*! - \class WindowCreationData - \brief Window creation code. - - This struct gathers all information required to create a window. - Window creation is split in 3 steps: - - \list - \li fromWindow() Gather all required information - \li create() Create the system handle. - \li initialize() Post creation initialization steps. - \endlist - - The reason for this split is to also enable changing the QWindowFlags - by calling: - - \list - \li fromWindow() Gather information and determine new system styles - \li applyWindowFlags() to apply the new window system styles. - \li initialize() Post creation initialization steps. - \endlist - - Contains the window creation code formerly in qwidget_win.cpp. - - \sa QWindowCreationContext - \internal - \ingroup qt-lighthouse-win -*/ - -struct WindowCreationData -{ - typedef QWindowsWindowData WindowData; - enum Flags { ForceChild = 0x1, ForceTopLevel = 0x2 }; - - WindowCreationData() : parentHandle(0), type(Qt::Widget), style(0), exStyle(0), - topLevel(false), popup(false), dialog(false), desktop(false), - tool(false), embedded(false), hasAlpha(false) {} - - void fromWindow(const QWindow *w, const Qt::WindowFlags flags, unsigned creationFlags = 0); - inline WindowData create(const QWindow *w, const WindowData &data, QString title) const; - inline void applyWindowFlags(HWND hwnd) const; - void initialize(const QWindow *w, HWND h, bool frameChange, qreal opacityLevel) const; - - Qt::WindowFlags flags; - HWND parentHandle; - Qt::WindowType type; - unsigned style; - unsigned exStyle; - bool topLevel; - bool popup; - bool dialog; - bool desktop; - bool tool; - bool embedded; - bool hasAlpha; -}; - -QDebug operator<<(QDebug debug, const WindowCreationData &d) -{ - QDebugStateSaver saver(debug); - debug.nospace(); - debug.noquote(); - debug << "WindowCreationData: " << d.flags - << "\n topLevel=" << d.topLevel; - if (d.parentHandle) - debug << " parent=" << d.parentHandle; - debug << " popup=" << d.popup << " dialog=" << d.dialog << " desktop=" << d.desktop - << " embedded=" << d.embedded << " tool=" << d.tool - << "\n style=" << debugWinStyle(d.style); - if (d.exStyle) - debug << "\n exStyle=" << debugWinExStyle(d.exStyle); - return debug; -} - -// Fix top level window flags in case only the type flags are passed. -static inline void fixTopLevelWindowFlags(Qt::WindowFlags &flags) -{ - // Not supported on Windows, also do correction when it is set. - flags &= ~Qt::WindowFullscreenButtonHint; - switch (flags) { - case Qt::Window: - flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint - |Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint; - break; - case Qt::Dialog: - flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowContextHelpButtonHint | Qt::WindowCloseButtonHint; - break; - case Qt::Tool: - flags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint; - break; - default: - break; - } -} - -void WindowCreationData::fromWindow(const QWindow *w, const Qt::WindowFlags flagsIn, - unsigned creationFlags) -{ - flags = flagsIn; - - // Sometimes QWindow doesn't have a QWindow parent but does have a native parent window, - // e.g. in case of embedded ActiveQt servers. They should not be considered a top-level - // windows in such cases. - QVariant prop = w->property("_q_embedded_native_parent_handle"); - if (prop.isValid()) { - embedded = true; - parentHandle = (HWND)prop.value(); - } - - if (creationFlags & ForceChild) { - topLevel = false; - } else if (embedded) { - // Embedded native windows (for example Active X server windows) are by - // definition never toplevel, even though they do not have QWindow parents. - topLevel = false; - } else { - topLevel = (creationFlags & ForceTopLevel) ? true : w->isTopLevel(); - } - - if (topLevel) - fixTopLevelWindowFlags(flags); - - type = static_cast(int(flags) & Qt::WindowType_Mask); - switch (type) { - case Qt::Dialog: - case Qt::Sheet: - dialog = true; - break; - case Qt::Drawer: - case Qt::Tool: - tool = true; - break; - case Qt::Popup: - popup = true; - break; - case Qt::Desktop: - desktop = true; - break; - default: - break; - } - if ((flags & Qt::MSWindowsFixedSizeDialogHint)) - dialog = true; - - // Parent: Use transient parent for top levels. - if (popup) { - flags |= Qt::WindowStaysOnTopHint; // a popup stays on top, no parent. - } else if (!embedded) { - if (const QWindow *parentWindow = topLevel ? w->transientParent() : w->parent()) - parentHandle = QWindowsWindow::handleOf(parentWindow); - } - - if (popup || (type == Qt::ToolTip) || (type == Qt::SplashScreen)) { - style = WS_POPUP; - } else if (topLevel && !desktop) { - if (flags & Qt::FramelessWindowHint) - style = WS_POPUP; // no border - else if (flags & Qt::WindowTitleHint) - style = WS_OVERLAPPED; - else - style = 0; - } else { - style = WS_CHILD; - } - - if (!desktop) { - // if (!testAttribute(Qt::WA_PaintUnclipped)) - // ### Commented out for now as it causes some problems, but - // this should be correct anyway, so dig some more into this -#ifdef Q_FLATTEN_EXPOSE - if (windowIsOpenGL(w)) // a bit incorrect since the is-opengl status may change from false to true at any time later on - style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN; // see SetPixelFormat -#else - style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN ; -#endif - if (topLevel) { - if ((type == Qt::Window || dialog || tool)) { - if (!(flags & Qt::FramelessWindowHint)) { - style |= WS_POPUP; - if (flags & Qt::MSWindowsFixedSizeDialogHint) { - style |= WS_DLGFRAME; - } else { - style |= WS_THICKFRAME; - } - if (flags & Qt::WindowTitleHint) - style |= WS_CAPTION; // Contains WS_DLGFRAME - } - if (flags & Qt::WindowSystemMenuHint) - style |= WS_SYSMENU; - else if (dialog && (flags & Qt::WindowCloseButtonHint) && !(flags & Qt::FramelessWindowHint)) { - style |= WS_SYSMENU | WS_BORDER; // QTBUG-2027, dialogs without system menu. - exStyle |= WS_EX_DLGMODALFRAME; - } - if (flags & Qt::WindowMinimizeButtonHint) - style |= WS_MINIMIZEBOX; - if (shouldShowMaximizeButton(w, flags)) - style |= WS_MAXIMIZEBOX; - if (tool) - exStyle |= WS_EX_TOOLWINDOW; - if (flags & Qt::WindowContextHelpButtonHint) - exStyle |= WS_EX_CONTEXTHELP; - } else { - exStyle |= WS_EX_TOOLWINDOW; - } - -#ifndef Q_OS_WINCE - // make mouse events fall through this window - // NOTE: WS_EX_TRANSPARENT flag can make mouse inputs fall through a layered window - if (flagsIn & Qt::WindowTransparentForInput) - exStyle |= WS_EX_LAYERED | WS_EX_TRANSPARENT; -#endif - } - } -} - -QWindowsWindowData - WindowCreationData::create(const QWindow *w, const WindowData &data, QString title) const -{ - typedef QSharedPointer QWindowCreationContextPtr; - - WindowData result; - result.flags = flags; - - if (desktop) { // desktop widget. No frame, hopefully? - result.hwnd = GetDesktopWindow(); - result.geometry = frameGeometry(result.hwnd, true); - result.embedded = false; - qCDebug(lcQpaWindows) << "Created desktop window " << w << result.hwnd; - return result; - } - if ((flags & Qt::WindowType_Mask) == Qt::ForeignWindow) { - result.hwnd = reinterpret_cast(w->winId()); - Q_ASSERT(result.hwnd); - const LONG_PTR style = GetWindowLongPtr(result.hwnd, GWL_STYLE); - const LONG_PTR exStyle = GetWindowLongPtr(result.hwnd, GWL_EXSTYLE); - result.embedded = false; - result.frame = QWindowsGeometryHint::frame(style, exStyle); - result.geometry = frameGeometry(result.hwnd, !GetParent(result.hwnd)) - .marginsRemoved(result.frame); - qCDebug(lcQpaWindows) << "Foreign window: " << w << result.hwnd << result.geometry; - return result; - } - - const HINSTANCE appinst = (HINSTANCE)GetModuleHandle(0); - - const QString windowClassName = QWindowsContext::instance()->registerWindowClass(w); - - const QRect geometryDip = QWindowsScaling::mapFromNative(data.geometry); - QRect fixedGeometryDip = QPlatformWindow::initialGeometry(w, geometryDip, defaultWindowWidth, defaultWindowHeight); - const QRect rect = fixedGeometryDip != geometryDip ? QWindowsScaling::mapToNative(fixedGeometryDip) : data.geometry; - - if (title.isEmpty() && (result.flags & Qt::WindowTitleHint)) - title = topLevel ? qAppName() : w->objectName(); - - const wchar_t *titleUtf16 = reinterpret_cast(title.utf16()); - const wchar_t *classNameUtf16 = reinterpret_cast(windowClassName.utf16()); - - // Capture events before CreateWindowEx() returns. The context is cleared in - // the QWindowsWindow constructor. - const QWindowCreationContextPtr context(new QWindowCreationContext(w, rect, data.customMargins, style, exStyle)); - QWindowsContext::instance()->setWindowCreationContext(context); - - qCDebug(lcQpaWindows).nospace() - << "CreateWindowEx: " << w << " class=" << windowClassName << " title=" << title - << '\n' << *this << "\nrequested: " << rect << ": " - << context->frameWidth << 'x' << context->frameHeight - << '+' << context->frameX << '+' << context->frameY - << " custom margins: " << context->customMargins; - - result.hwnd = CreateWindowEx(exStyle, classNameUtf16, titleUtf16, - style, - context->frameX, context->frameY, - context->frameWidth, context->frameHeight, - parentHandle, NULL, appinst, NULL); -#ifdef Q_OS_WINCE - if (DisableGestures(result.hwnd, TGF_GID_ALL, TGF_SCOPE_WINDOW)) - EnableGestures(result.hwnd, TGF_GID_DIRECTMANIPULATION, TGF_SCOPE_WINDOW); -#endif - qCDebug(lcQpaWindows).nospace() - << "CreateWindowEx: returns " << w << ' ' << result.hwnd << " obtained geometry: " - << context->obtainedGeometry << ' ' << context->margins; - - if (!result.hwnd) { - qErrnoWarning("%s: CreateWindowEx failed", __FUNCTION__); - return result; - } - - result.geometry = context->obtainedGeometry; - result.frame = context->margins; - result.embedded = embedded; - result.customMargins = context->customMargins; - - return result; -} - -void WindowCreationData::applyWindowFlags(HWND hwnd) const -{ - // Keep enabled and visible from the current style. - const LONG_PTR oldStyle = GetWindowLongPtr(hwnd, GWL_STYLE); - const LONG_PTR oldExStyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE); - - const LONG_PTR newStyle = style | (oldStyle & (WS_DISABLED|WS_VISIBLE)); - if (oldStyle != newStyle) - SetWindowLongPtr(hwnd, GWL_STYLE, newStyle); - const LONG_PTR newExStyle = exStyle; - if (newExStyle != oldExStyle) - SetWindowLongPtr(hwnd, GWL_EXSTYLE, newExStyle); - qCDebug(lcQpaWindows).nospace() << __FUNCTION__ << hwnd << *this - << "\n Style from " << debugWinStyle(oldStyle) << "\n to " - << debugWinStyle(newStyle) << "\n ExStyle from " - << debugWinExStyle(oldExStyle) << " to " - << debugWinExStyle(newExStyle); -} - -void WindowCreationData::initialize(const QWindow *w, HWND hwnd, bool frameChange, qreal opacityLevel) const -{ - if (desktop || !hwnd) - return; - UINT swpFlags = SWP_NOMOVE | SWP_NOSIZE; - if (frameChange) - swpFlags |= SWP_FRAMECHANGED; - if (topLevel) { - swpFlags |= SWP_NOACTIVATE; - if ((flags & Qt::WindowStaysOnTopHint) || (type == Qt::ToolTip)) { - SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, swpFlags); - if (flags & Qt::WindowStaysOnBottomHint) - qWarning() << "QWidget: Incompatible window flags: the window can't be on top and on bottom at the same time"; - } else if (flags & Qt::WindowStaysOnBottomHint) { - SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 0, 0, swpFlags); - } else if (frameChange) { // Force WM_NCCALCSIZE with wParam=1 in case of custom margins. - SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, swpFlags); - } - if (flags & (Qt::CustomizeWindowHint|Qt::WindowTitleHint)) { - HMENU systemMenu = GetSystemMenu(hwnd, FALSE); - if (flags & Qt::WindowCloseButtonHint) - EnableMenuItem(systemMenu, SC_CLOSE, MF_BYCOMMAND|MF_ENABLED); - else - EnableMenuItem(systemMenu, SC_CLOSE, MF_BYCOMMAND|MF_GRAYED); - } - updateGLWindowSettings(w, hwnd, flags, opacityLevel); - } else { // child. - SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, swpFlags); - } -} - -/*! - \class QWindowsGeometryHint - \brief Stores geometry constraints and provides utility functions. - - Geometry constraints ready to apply to a MINMAXINFO taking frame - into account. - - \internal - \ingroup qt-lighthouse-win -*/ - -QWindowsGeometryHint::QWindowsGeometryHint(const QWindow *w, const QMargins &cm) : - minimumSize(QWindowsScaling::mapToNativeConstrained(w->minimumSize())), - maximumSize(QWindowsScaling::mapToNativeConstrained(w->maximumSize())), - customMargins(cm) -{ -} - -bool QWindowsGeometryHint::validSize(const QSize &s) const -{ - const int width = s.width(); - const int height = s.height(); - return width >= minimumSize.width() && width <= maximumSize.width() - && height >= minimumSize.height() && height <= maximumSize.height(); -} - -QMargins QWindowsGeometryHint::frame(DWORD style, DWORD exStyle) -{ - RECT rect = {0,0,0,0}; -#ifndef Q_OS_WINCE - style &= ~(WS_OVERLAPPED); // Not permitted, see docs. -#endif - if (!AdjustWindowRectEx(&rect, style, FALSE, exStyle)) - qErrnoWarning("%s: AdjustWindowRectEx failed", __FUNCTION__); - const QMargins result(qAbs(rect.left), qAbs(rect.top), - qAbs(rect.right), qAbs(rect.bottom)); - qCDebug(lcQpaWindows).nospace() << __FUNCTION__ << " style=" - << showbase << hex << style << " exStyle=" << exStyle << dec << noshowbase - << ' ' << rect << ' ' << result; - return result; -} - -bool QWindowsGeometryHint::handleCalculateSize(const QMargins &customMargins, const MSG &msg, LRESULT *result) -{ -#ifndef Q_OS_WINCE - // NCCALCSIZE_PARAMS structure if wParam==TRUE - if (!msg.wParam || customMargins.isNull()) - return false; - *result = DefWindowProc(msg.hwnd, msg.message, msg.wParam, msg.lParam); - NCCALCSIZE_PARAMS *ncp = reinterpret_cast(msg.lParam); - const RECT oldClientArea = ncp->rgrc[0]; - ncp->rgrc[0].left += customMargins.left(); - ncp->rgrc[0].top += customMargins.top(); - ncp->rgrc[0].right -= customMargins.right(); - ncp->rgrc[0].bottom -= customMargins.bottom(); - result = 0; - qCDebug(lcQpaWindows).nospace() << __FUNCTION__ << oldClientArea << '+' << customMargins << "-->" - << ncp->rgrc[0] << ' ' << ncp->rgrc[1] << ' ' << ncp->rgrc[2] - << ' ' << ncp->lppos->cx << ',' << ncp->lppos->cy; - return true; -#else - Q_UNUSED(customMargins) - Q_UNUSED(msg) - Q_UNUSED(result) - return false; -#endif -} - -#ifndef Q_OS_WINCE -void QWindowsGeometryHint::applyToMinMaxInfo(HWND hwnd, MINMAXINFO *mmi) const -{ - return applyToMinMaxInfo(GetWindowLong(hwnd, GWL_STYLE), - GetWindowLong(hwnd, GWL_EXSTYLE), mmi); -} - -void QWindowsGeometryHint::applyToMinMaxInfo(DWORD style, DWORD exStyle, MINMAXINFO *mmi) const -{ - qCDebug(lcQpaWindows).nospace() << '>' << __FUNCTION__ << '<' << " min=" - << minimumSize.width() << ',' << minimumSize.height() - << " max=" << maximumSize.width() << ',' << maximumSize.height() - << " in " << *mmi; - - const QMargins margins = QWindowsGeometryHint::frame(style, exStyle); - const int frameWidth = margins.left() + margins.right() + customMargins.left() + customMargins.right(); - const int frameHeight = margins.top() + margins.bottom() + customMargins.top() + customMargins.bottom(); - if (minimumSize.width() > 0) - mmi->ptMinTrackSize.x = minimumSize.width() + frameWidth; - if (minimumSize.height() > 0) - mmi->ptMinTrackSize.y = minimumSize.height() + frameHeight; - - const int maximumWidth = qMax(maximumSize.width(), minimumSize.width()); - const int maximumHeight = qMax(maximumSize.height(), minimumSize.height()); - if (maximumWidth < QWINDOWSIZE_MAX) - mmi->ptMaxTrackSize.x = maximumWidth + frameWidth; - if (maximumHeight < QWINDOWSIZE_MAX) - mmi->ptMaxTrackSize.y = maximumHeight + frameHeight; - qCDebug(lcQpaWindows).nospace() << '<' << __FUNCTION__ - << " frame=" << margins << ' ' << frameWidth << ',' << frameHeight - << " out " << *mmi; -} -#endif // !Q_OS_WINCE - -bool QWindowsGeometryHint::positionIncludesFrame(const QWindow *w) -{ - return qt_window_private(const_cast(w))->positionPolicy - == QWindowPrivate::WindowFrameInclusive; -} - -/*! - \class QWindowCreationContext - \brief Active Context for creating windows. - - There is a phase in window creation (WindowCreationData::create()) - in which events are sent before the system API CreateWindowEx() returns - the handle. These cannot be handled by the platform window as the association - of the unknown handle value to the window does not exist yet and as not - to trigger recursive handle creation, etc. - - In that phase, an instance of QWindowCreationContext is set on - QWindowsContext. - - QWindowCreationContext stores the information to answer the initial - WM_GETMINMAXINFO and obtains the corrected size/position. - - \sa WindowCreationData, QWindowsContext - \internal - \ingroup qt-lighthouse-win -*/ - -QWindowCreationContext::QWindowCreationContext(const QWindow *w, - const QRect &geometry, - const QMargins &cm, - DWORD style_, DWORD exStyle_) : - geometryHint(w, cm), window(w), style(style_), exStyle(exStyle_), - requestedGeometry(geometry), obtainedGeometry(geometry), - margins(QWindowsGeometryHint::frame(style, exStyle)), customMargins(cm), - frameX(CW_USEDEFAULT), frameY(CW_USEDEFAULT), - frameWidth(CW_USEDEFAULT), frameHeight(CW_USEDEFAULT) -{ - // Geometry of toplevels does not consider window frames. - // TODO: No concept of WA_wasMoved yet that would indicate a - // CW_USEDEFAULT unless set. For now, assume that 0,0 means 'default' - // for toplevels. - if (geometry.isValid()) { - frameX = geometry.x(); - frameY = geometry.y(); - const QMargins effectiveMargins = margins + customMargins; - frameWidth = effectiveMargins.left() + geometry.width() + effectiveMargins.right(); - frameHeight = effectiveMargins.top() + geometry.height() + effectiveMargins.bottom(); - const bool isDefaultPosition = !frameX && !frameY && w->isTopLevel(); - if (!QWindowsGeometryHint::positionIncludesFrame(w) && !isDefaultPosition) { - frameX -= effectiveMargins.left(); - frameY -= effectiveMargins.top(); - } - } - - qCDebug(lcQpaWindows).nospace() - << __FUNCTION__ << ' ' << w << ' ' << geometry - << " pos incl. frame=" << QWindowsGeometryHint::positionIncludesFrame(w) - << " frame=" << frameWidth << 'x' << frameHeight << '+' - << frameX << '+' << frameY - << " min=" << geometryHint.minimumSize << " max=" << geometryHint.maximumSize - << " custom margins=" << customMargins; -} - -/*! - \class QWindowsWindow - \brief Raster or OpenGL Window. - - \list - \li Raster type: handleWmPaint() is implemented to - to bitblt the image. The DC can be accessed - via getDC/Relase DC, which has a special handling - when within a paint event (in that case, the DC obtained - from BeginPaint() is returned). - - \li Open GL: The first time QWindowsGLContext accesses - the handle, it sets up the pixelformat on the DC - which in turn sets it on the window (see flag - PixelFormatInitialized). - handleWmPaint() is empty (although required). - \endlist - - \internal - \ingroup qt-lighthouse-win -*/ - -QWindowsWindow::QWindowsWindow(QWindow *aWindow, const QWindowsWindowData &data) : - QPlatformWindow(aWindow), - m_data(data), - m_flags(WithinCreate), - m_hdc(0), - m_windowState(Qt::WindowNoState), - m_opacity(1.0), - m_dropTarget(0), - m_savedStyle(0), - m_format(aWindow->requestedFormat()), -#ifdef Q_OS_WINCE - m_previouslyHidden(false), -#endif - m_iconSmall(0), - m_iconBig(0), - m_surface(0) -{ - // Clear the creation context as the window can be found in QWindowsContext's map. - QWindowsContext::instance()->setWindowCreationContext(QSharedPointer()); - QWindowsContext::instance()->addWindow(m_data.hwnd, this); - const Qt::WindowType type = aWindow->type(); - if (type == Qt::Desktop) - return; // No further handling for Qt::Desktop -#ifndef QT_NO_OPENGL - if (aWindow->surfaceType() == QWindow::OpenGLSurface) { - if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) - setFlag(OpenGLSurface); - else - setFlag(OpenGL_ES2); - } -#endif // QT_NO_OPENGL - updateDropSite(window()->isTopLevel()); - - registerTouchWindow(); - setWindowState(aWindow->windowState()); - const qreal opacity = qt_window_private(aWindow)->opacity; - if (!qFuzzyCompare(opacity, qreal(1.0))) - setOpacity(opacity); - if (aWindow->isTopLevel()) - setWindowIcon(aWindow->icon()); - clearFlag(WithinCreate); -} - -QWindowsWindow::~QWindowsWindow() -{ - setFlag(WithinDestroy); -#ifndef Q_OS_WINCE - if (testFlag(TouchRegistered)) - QWindowsContext::user32dll.unregisterTouchWindow(m_data.hwnd); -#endif // !Q_OS_WINCE - destroyWindow(); - destroyIcon(); -} - -void QWindowsWindow::fireExpose(const QRegion ®ion, bool force) -{ - if (region.isEmpty() && !force) - clearFlag(Exposed); - else - setFlag(Exposed); - QWindowSystemInterface::handleExposeEvent(window(), - QWindowsScaling::mapFromNative(region)); -} - -static inline QWindow *findTransientChild(const QWindow *parent) -{ - foreach (QWindow *w, QGuiApplication::topLevelWindows()) - if (w->transientParent() == parent) - return w; - return 0; -} - -void QWindowsWindow::destroyWindow() -{ - qCDebug(lcQpaWindows) << __FUNCTION__ << this << window() << m_data.hwnd; - if (m_data.hwnd) { // Stop event dispatching before Window is destroyed. - setFlag(WithinDestroy); - // Clear any transient child relationships as Windows will otherwise destroy them (QTBUG-35499, QTBUG-36666) - if (QWindow *transientChild = findTransientChild(window())) - if (QWindowsWindow *tw = QWindowsWindow::baseWindowOf(transientChild)) - tw->clearTransientParent(); - QWindowsContext *context = QWindowsContext::instance(); - if (context->windowUnderMouse() == window()) - context->clearWindowUnderMouse(); - if (hasMouseCapture()) - setMouseGrabEnabled(false); - setDropSiteEnabled(false); -#ifndef QT_NO_OPENGL - if (m_surface) { - if (QWindowsStaticOpenGLContext *staticOpenGLContext = QWindowsIntegration::staticOpenGLContext()) - staticOpenGLContext->destroyWindowSurface(m_surface); - m_surface = 0; - } -#endif -#ifdef Q_OS_WINCE - if ((m_windowState & Qt::WindowFullScreen) && !m_previouslyHidden) { - HWND handle = FindWindow(L"HHTaskBar", L""); - if (handle) { - ShowWindow(handle, SW_SHOW); - } - } -#endif // !Q_OS_WINCE - if (m_data.hwnd != GetDesktopWindow() && window()->type() != Qt::ForeignWindow) - DestroyWindow(m_data.hwnd); - context->removeWindow(m_data.hwnd); - m_data.hwnd = 0; - } -} - -void QWindowsWindow::updateDropSite(bool topLevel) -{ - bool enabled = false; - if (topLevel) { - switch (window()->type()) { - case Qt::Window: - case Qt::Dialog: - case Qt::Sheet: - case Qt::Drawer: - case Qt::Popup: - case Qt::Tool: - enabled = true; - break; - default: - break; - } - } - setDropSiteEnabled(enabled); -} - -void QWindowsWindow::setDropSiteEnabled(bool dropEnabled) -{ - if (isDropSiteEnabled() == dropEnabled) - return; - qCDebug(lcQpaMime) << __FUNCTION__ << window() << dropEnabled; -#if !defined(QT_NO_CLIPBOARD) && !defined(QT_NO_DRAGANDDROP) - if (dropEnabled) { - Q_ASSERT(m_data.hwnd); - m_dropTarget = new QWindowsOleDropTarget(window()); - RegisterDragDrop(m_data.hwnd, m_dropTarget); - CoLockObjectExternal(m_dropTarget, true, true); - } else { - m_dropTarget->Release(); - CoLockObjectExternal(m_dropTarget, false, true); - RevokeDragDrop(m_data.hwnd); - m_dropTarget = 0; - } -#endif // !QT_NO_CLIPBOARD && !QT_NO_DRAGANDDROP -} - -// Returns topmost QWindowsWindow ancestor even if there are embedded windows in the chain. -// Returns this window if it is the topmost ancestor. -QWindow *QWindowsWindow::topLevelOf(QWindow *w) -{ - while (QWindow *parent = w->parent()) - w = parent; - - if (const QPlatformWindow *handle = w->handle()) { - const QWindowsWindow *ww = static_cast(handle); - if (ww->isEmbedded(0)) { - HWND parentHWND = GetAncestor(ww->handle(), GA_PARENT); - const HWND desktopHwnd = GetDesktopWindow(); - const QWindowsContext *ctx = QWindowsContext::instance(); - while (parentHWND && parentHWND != desktopHwnd) { - if (QWindowsWindow *ancestor = ctx->findPlatformWindow(parentHWND)) - return topLevelOf(ancestor->window()); - parentHWND = GetAncestor(parentHWND, GA_PARENT); - } - } - } - return w; -} - -QWindowsWindowData - QWindowsWindowData::create(const QWindow *w, - const QWindowsWindowData ¶meters, - const QString &title) -{ - WindowCreationData creationData; - creationData.fromWindow(w, parameters.flags); - QWindowsWindowData result = creationData.create(w, parameters, title); - // Force WM_NCCALCSIZE (with wParam=1) via SWP_FRAMECHANGED for custom margin. - creationData.initialize(w, result.hwnd, !parameters.customMargins.isNull(), 1); - return result; -} - -void QWindowsWindow::setVisible(bool visible) -{ - const QWindow *win = window(); - qCDebug(lcQpaWindows) << __FUNCTION__ << this << win << m_data.hwnd << visible; - if (m_data.hwnd) { - if (visible) { - show_sys(); - - // When the window is layered, we won't get WM_PAINT, and "we" are in control - // over the rendering of the window - // There is nobody waiting for this, so we don't need to flush afterwards. - if (isLayered()) - fireExpose(QRect(0, 0, win->width(), win->height())); - // QTBUG-44928, QTBUG-7386: This is to resolve the problem where popups are - // opened from the system tray and not being implicitly activated - - if (win->type() == Qt::Popup && !win->parent() && !QGuiApplication::focusWindow()) - SetForegroundWindow(m_data.hwnd); - } else { - if (hasMouseCapture()) - setMouseGrabEnabled(false); - hide_sys(); - fireExpose(QRegion()); - } - } -} - -bool QWindowsWindow::isVisible() const -{ - return m_data.hwnd && IsWindowVisible(m_data.hwnd); -} - -bool QWindowsWindow::isActive() const -{ - // Check for native windows or children of the active native window. - if (const HWND activeHwnd = GetForegroundWindow()) - if (m_data.hwnd == activeHwnd || IsChild(activeHwnd, m_data.hwnd)) - return true; - return false; -} - -bool QWindowsWindow::isEmbedded(const QPlatformWindow *parentWindow) const -{ - if (parentWindow) { - const QWindowsWindow *ww = static_cast(parentWindow); - const HWND hwnd = ww->handle(); - if (!IsChild(hwnd, m_data.hwnd)) - return false; - } - - if (!m_data.embedded && parent()) - return parent()->isEmbedded(0); - - return m_data.embedded; -} - -QPoint QWindowsWindow::mapToGlobalDp(const QPoint &pos) const -{ - if (m_data.hwnd) - return QWindowsGeometryHint::mapToGlobal(m_data.hwnd, pos); - else - return pos; -} - -QPoint QWindowsWindow::mapFromGlobalDp(const QPoint &pos) const -{ - if (m_data.hwnd) - return QWindowsGeometryHint::mapFromGlobal(m_data.hwnd, pos); - else - return pos; -} - -#ifndef Q_OS_WINCE -static inline HWND transientParentHwnd(HWND hwnd) -{ - if (GetAncestor(hwnd, GA_PARENT) == GetDesktopWindow()) { - const HWND rootOwnerHwnd = GetAncestor(hwnd, GA_ROOTOWNER); - if (rootOwnerHwnd != hwnd) // May return itself for toplevels. - return rootOwnerHwnd; - } - return 0; -} -#endif // !Q_OS_WINCE - -// Update the transient parent for a toplevel window. The concept does not -// really exist on Windows, the relationship is set by passing a parent along with !WS_CHILD -// to window creation or by setting the parent using GWL_HWNDPARENT (as opposed to -// SetParent, which would make it a real child). -void QWindowsWindow::updateTransientParent() const -{ -#ifndef Q_OS_WINCE - if (window()->type() == Qt::Popup) - return; // QTBUG-34503, // a popup stays on top, no parent, see also WindowCreationData::fromWindow(). - // Update transient parent. - const HWND oldTransientParent = transientParentHwnd(m_data.hwnd); - HWND newTransientParent = 0; - if (const QWindow *tp = window()->transientParent()) - if (const QWindowsWindow *tw = QWindowsWindow::baseWindowOf(tp)) - if (!tw->testFlag(WithinDestroy)) // Prevent destruction by parent window (QTBUG-35499, QTBUG-36666) - newTransientParent = tw->handle(); - if (newTransientParent && newTransientParent != oldTransientParent) - SetWindowLongPtr(m_data.hwnd, GWL_HWNDPARENT, (LONG_PTR)newTransientParent); -#endif // !Q_OS_WINCE -} - -void QWindowsWindow::clearTransientParent() const -{ -#ifndef Q_OS_WINCE - if (window()->type() == Qt::Popup) - return; // QTBUG-34503, // a popup stays on top, no parent, see also WindowCreationData::fromWindow(). - // Update transient parent. - const HWND oldTransientParent = transientParentHwnd(m_data.hwnd); - HWND newTransientParent = 0; - if (newTransientParent != oldTransientParent) - SetWindowLongPtr(m_data.hwnd, GWL_HWNDPARENT, (LONG_PTR)newTransientParent); -#endif // !Q_OS_WINCE -} - -static inline bool testShowWithoutActivating(const QWindow *window) -{ - // QWidget-attribute Qt::WA_ShowWithoutActivating . - const QVariant showWithoutActivating = window->property("_q_showWithoutActivating"); - return showWithoutActivating.isValid() && showWithoutActivating.toBool(); -} - -// partially from QWidgetPrivate::show_sys() -void QWindowsWindow::show_sys() const -{ - int sm = SW_SHOWNORMAL; - bool fakedMaximize = false; - const QWindow *w = window(); - const Qt::WindowFlags flags = w->flags(); - const Qt::WindowType type = w->type(); - if (w->isTopLevel()) { - const Qt::WindowState state = w->windowState(); - if (state & Qt::WindowMinimized) { - sm = SW_SHOWMINIMIZED; - if (!isVisible()) - sm = SW_SHOWMINNOACTIVE; - } else { - updateTransientParent(); - if (state & Qt::WindowMaximized) { - sm = SW_SHOWMAXIMIZED; - // Windows will not behave correctly when we try to maximize a window which does not - // have minimize nor maximize buttons in the window frame. Windows would then ignore - // non-available geometry, and rather maximize the widget to the full screen, minus the - // window frame (caption). So, we do a trick here, by adding a maximize button before - // maximizing the widget, and then remove the maximize button afterwards. - if (flags & Qt::WindowTitleHint && - !(flags & (Qt::WindowMinMaxButtonsHint | Qt::FramelessWindowHint))) { - fakedMaximize = TRUE; - setStyle(style() | WS_MAXIMIZEBOX); - } - } // Qt::WindowMaximized - } // !Qt::WindowMinimized - } - if (type == Qt::Popup || type == Qt::ToolTip || type == Qt::Tool || testShowWithoutActivating(w)) - sm = SW_SHOWNOACTIVATE; - - if (w->windowState() & Qt::WindowMaximized) - setFlag(WithinMaximize); // QTBUG-8361 - - ShowWindow(m_data.hwnd, sm); - - clearFlag(WithinMaximize); - - if (fakedMaximize) { - setStyle(style() & ~WS_MAXIMIZEBOX); - SetWindowPos(m_data.hwnd, 0, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER - | SWP_FRAMECHANGED); - } -} - -// partially from QWidgetPrivate::hide_sys() -void QWindowsWindow::hide_sys() const -{ - const Qt::WindowFlags flags = window()->flags(); - if (flags != Qt::Desktop) { - if (flags & Qt::Popup) - ShowWindow(m_data.hwnd, SW_HIDE); - else - SetWindowPos(m_data.hwnd,0, 0,0,0,0, SWP_HIDEWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE); - } -} - -void QWindowsWindow::setParent(const QPlatformWindow *newParent) -{ - qCDebug(lcQpaWindows) << __FUNCTION__ << window() << newParent; - - if (m_data.hwnd) - setParent_sys(newParent); -} - -void QWindowsWindow::setParent_sys(const QPlatformWindow *parent) -{ - // Use GetAncestor instead of GetParent, as GetParent can return owner window for toplevels - HWND oldParentHWND = GetAncestor(m_data.hwnd, GA_PARENT); - HWND newParentHWND = 0; - if (parent) { - const QWindowsWindow *parentW = static_cast(parent); - newParentHWND = parentW->handle(); - - } - - // NULL handle means desktop window, which also has its proper handle -> disambiguate - HWND desktopHwnd = GetDesktopWindow(); - if (oldParentHWND == desktopHwnd) - oldParentHWND = 0; - if (newParentHWND == desktopHwnd) - newParentHWND = 0; - - if (newParentHWND != oldParentHWND) { - const bool wasTopLevel = oldParentHWND == 0; - const bool isTopLevel = newParentHWND == 0; - - setFlag(WithinSetParent); - SetParent(m_data.hwnd, newParentHWND); - clearFlag(WithinSetParent); - - // WS_CHILD/WS_POPUP must be manually set/cleared in addition - // to dialog frames, etc (see SetParent() ) if the top level state changes. - // Force toplevel state as QWindow::isTopLevel cannot be relied upon here. - if (wasTopLevel != isTopLevel) { - setDropSiteEnabled(false); - setWindowFlags_sys(window()->flags(), unsigned(isTopLevel ? WindowCreationData::ForceTopLevel : WindowCreationData::ForceChild)); - updateDropSite(isTopLevel); - } - } -} - -void QWindowsWindow::handleHidden() -{ - fireExpose(QRegion()); -} - -void QWindowsWindow::handleCompositionSettingsChanged() -{ - const QWindow *w = window(); - if (w->surfaceType() == QWindow::OpenGLSurface && w->format().hasAlpha()) - applyBlurBehindWindow(handle()); -} - -static QRect normalFrameGeometry(HWND hwnd) -{ -#ifndef Q_OS_WINCE - WINDOWPLACEMENT wp; - wp.length = sizeof(WINDOWPLACEMENT); - if (GetWindowPlacement(hwnd, &wp)) { - const QRect result = qrectFromRECT(wp.rcNormalPosition); - return result.translated(windowPlacementOffset(hwnd, result.topLeft())); - } -#else - Q_UNUSED(hwnd) -#endif - return QRect(); -} - -QRect QWindowsWindow::normalGeometryDp() const -{ - // Check for fake 'fullscreen' mode. - const bool fakeFullScreen = m_savedFrameGeometry.isValid() && window()->windowState() == Qt::WindowFullScreen; - const QRect frame = fakeFullScreen ? m_savedFrameGeometry : normalFrameGeometry(m_data.hwnd); - const QMargins margins = fakeFullScreen ? QWindowsGeometryHint::frame(m_savedStyle, 0) : frameMarginsDp(); - return frame.isValid() ? frame.marginsRemoved(margins) : frame; -} - -void QWindowsWindow::setGeometryDp(const QRect &rectIn) -{ - QRect rect = rectIn; - // This means it is a call from QWindow::setFramePosition() and - // the coordinates include the frame (size is still the contents rectangle). - if (QWindowsGeometryHint::positionIncludesFrame(window())) { - const QMargins margins = frameMarginsDp(); - rect.moveTopLeft(rect.topLeft() + QPoint(margins.left(), margins.top())); - } - if (m_windowState == Qt::WindowMinimized) - m_data.geometry = rect; // Otherwise set by handleGeometryChange() triggered by event. - if (m_data.hwnd) { - // A ResizeEvent with resulting geometry will be sent. If we cannot - // achieve that size (for example, window title minimal constraint), - // notify and warn. - setGeometry_sys(rect); - if (m_data.geometry != rect) { - qWarning("%s: Unable to set geometry %dx%d+%d+%d on %s/'%s'." - " Resulting geometry: %dx%d+%d+%d " - "(frame: %d, %d, %d, %d, custom margin: %d, %d, %d, %d" - ", minimum size: %dx%d, maximum size: %dx%d).", - __FUNCTION__, - rect.width(), rect.height(), rect.x(), rect.y(), - window()->metaObject()->className(), qPrintable(window()->objectName()), - m_data.geometry.width(), m_data.geometry.height(), - m_data.geometry.x(), m_data.geometry.y(), - m_data.frame.left(), m_data.frame.top(), - m_data.frame.right(), m_data.frame.bottom(), - m_data.customMargins.left(), m_data.customMargins.top(), - m_data.customMargins.right(), m_data.customMargins.bottom(), - window()->minimumWidth(), window()->minimumHeight(), - window()->maximumWidth(), window()->maximumHeight()); - } - } else { - QPlatformWindow::setGeometry(rect); - } -} - -void QWindowsWindow::handleMoved() -{ - // Minimize/Set parent can send nonsensical move events. - if (!IsIconic(m_data.hwnd) && !testFlag(WithinSetParent)) - handleGeometryChange(); -} - -void QWindowsWindow::handleResized(int wParam) -{ - switch (wParam) { - case SIZE_MAXHIDE: // Some other window affected. - case SIZE_MAXSHOW: - return; - case SIZE_MINIMIZED: - handleWindowStateChange(Qt::WindowMinimized); - return; - case SIZE_MAXIMIZED: - handleWindowStateChange(Qt::WindowMaximized); - handleGeometryChange(); - break; - case SIZE_RESTORED: - if (isFullScreen_sys()) - handleWindowStateChange(Qt::WindowFullScreen); - else if (m_windowState != Qt::WindowNoState && !testFlag(MaximizeToFullScreen)) - handleWindowStateChange(Qt::WindowNoState); - handleGeometryChange(); - break; - } -} - -void QWindowsWindow::handleGeometryChange() -{ - //Prevent recursive resizes for Windows CE - if (testFlag(WithinSetStyle)) - return; - const QRect previousGeometry = m_data.geometry; - m_data.geometry = geometry_sys(); - const QRect geometryDip = QWindowsScaling::mapFromNative(m_data.geometry); - QPlatformWindow::setGeometry(geometryDip); - QWindowSystemInterface::handleGeometryChange(window(), geometryDip); - // QTBUG-32121: OpenGL/normal windows (with exception of ANGLE) do not receive - // expose events when shrinking, synthesize. - if (!testFlag(OpenGL_ES2) && isExposed() - && !(m_data.geometry.width() >= previousGeometry.width() || m_data.geometry.height() >= previousGeometry.height())) { - fireExpose(QRect(QPoint(0, 0), m_data.geometry.size()), true); - } - if (previousGeometry.topLeft() != m_data.geometry.topLeft()) { - QPlatformScreen *newScreen = screenForGeometry(geometryDip); - if (newScreen != screen()) - QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->screen()); - } - if (testFlag(SynchronousGeometryChangeEvent)) - QWindowSystemInterface::flushWindowSystemEvents(); - - qCDebug(lcQpaEvents) << __FUNCTION__ << this << window() << m_data.geometry; -} - -void QWindowsWindow::setGeometry_sys(const QRect &rect) const -{ - const QMargins margins = frameMarginsDp(); - const QRect frameGeometry = rect + margins; - - qCDebug(lcQpaWindows) << '>' << __FUNCTION__ << window() - << "\n from " << geometry_sys() << " frame: " - << margins << " to " <