diff --git a/.clang-format b/.clang-format
new file mode 100644
index 00000000..41b5a26c
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,9 @@
+BasedOnStyle: WebKit
+BreakConstructorInitializers: AfterColon
+PointerAlignment: Right
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: true
+AlignConsecutiveDeclarations: true
+AlignTrailingComments: true
+ColumnLimit: 120
+CompactNamespaces: true
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..886ff314
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,64 @@
+name: CI
+on:
+ - push
+ - pull_request
+ - workflow_dispatch
+
+jobs:
+ test-linux:
+ runs-on: ubuntu-latest
+ env:
+ CCACHE_DIR: ${{github.workspace}}/ccache
+ CCACHE_MAXSIZE: 100M
+ strategy:
+ matrix:
+ tag:
+ - minimal
+ - system-libs
+ - bundled-libs
+ include:
+ - tag: minimal
+ deps: |
+ libb2-dev
+ libqca-qt5-2-dev
+ options: -DIRIS_ENABLE_JINGLE_SCTP=OFF
+ - tag: system-libs
+ deps: |
+ libb2-dev
+ libqca-qt5-2-dev
+ libusrsctp-dev
+ options: -DIRIS_BUNDLED_QCA=OFF -DIRIS_BUNDLED_USRSCTP=OFF
+ - tag: bundled-libs
+ deps: null
+ options: -DIRIS_BUNDLED_QCA=ON -DIRIS_BUNDLED_USRSCTP=ON
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ - name: Install dependencies
+ uses: awalsh128/cache-apt-pkgs-action@latest
+ with:
+ packages: |
+ ${{matrix.deps}}
+ ccache
+ ninja-build
+ qtbase5-dev
+ version: ${{matrix.tag}}
+ - name: Configure
+ run: |
+ cmake -B ${{github.workspace}}/build -G Ninja \
+ -DCMAKE_C_COMPILER_LAUNCHER=ccache \
+ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
+ ${{matrix.options}}
+ - name: Restore cache
+ uses: actions/cache/restore@v3
+ with:
+ key: ccache-linux-${{matrix.tag}}
+ path: ${{github.workspace}}/ccache
+ - name: Build
+ run: |
+ cmake --build ${{github.workspace}}/build -v -j $(nproc)
+ - name: Save cache
+ uses: actions/cache@v3
+ with:
+ key: ccache-linux-${{matrix.tag}}
+ path: ${{github.workspace}}/ccache
diff --git a/.gitignore b/.gitignore
index d764ff90..ceb5082b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,5 @@ object_script.*
/lib
/plugins
*.user*
+build-*
+3rdparty/qca
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 00000000..57837bde
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,29 @@
+# See https://pre-commit.com for more information
+# See https://pre-commit.com/hooks.html for more hooks
+
+exclude: '^3rdparty|COPYING.*|src/jdns'
+repos:
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v2.5.0
+ hooks:
+ - id: trailing-whitespace
+ - id: end-of-file-fixer
+ - id: check-added-large-files
+ - id: check-merge-conflict
+- repo: https://github.com/doublify/pre-commit-clang-format
+ # for clang-tidy we can take github.com/pocc/pre-commit-hooks
+ rev: f4c4ac5948aff384af2b439bfabb2bdd65d2b3ac
+ hooks:
+ - id: clang-format
+- repo: https://github.com/Lucas-C/pre-commit-hooks
+ rev: v1.1.7
+ hooks:
+ - id: forbid-crlf
+ - id: remove-crlf
+ - id: forbid-tabs
+ - id: remove-tabs
+- repo: https://github.com/openstack-dev/bashate
+ rev: 2.0.0
+ hooks:
+ - id: bashate
+ args: ['--ignore', 'E006']
diff --git a/3rdparty/stringprep/CMakeLists.txt b/3rdparty/stringprep/CMakeLists.txt
new file mode 100644
index 00000000..ff4bc9a6
--- /dev/null
+++ b/3rdparty/stringprep/CMakeLists.txt
@@ -0,0 +1,35 @@
+cmake_minimum_required(VERSION 3.10.0)
+
+project(stringprep
+ LANGUAGES CXX
+)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+if(QT_DEFAULT_MAJOR_VERSION LESS 6)
+ find_package(Qt5 5.10 REQUIRED COMPONENTS Core)
+else()
+ find_package(Qt6 REQUIRED COMPONENTS Core)
+endif()
+
+add_library(stringprep STATIC
+ stringprep.cpp
+ profiles.cpp
+ rfc3454.cpp
+ qstringprep.h
+)
+
+target_compile_definitions(stringprep PRIVATE QSTRINGPREP_BUILDING)
+
+if(MSVC)
+ target_compile_definitions(stringprep PRIVATE _CRT_SECURE_NO_WARNINGS _GENERATED_STDINT_H)
+endif()
+
+if(QT_DEFAULT_MAJOR_VERSION LESS 6)
+ target_link_libraries(stringprep PUBLIC Qt5::Core)
+else()
+ target_link_libraries(stringprep PUBLIC Qt6::Core)
+endif()
+target_include_directories(stringprep PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
diff --git a/3rdparty/stringprep/COPYING b/3rdparty/stringprep/COPYING
new file mode 100644
index 00000000..e6ea90ab
--- /dev/null
+++ b/3rdparty/stringprep/COPYING
@@ -0,0 +1,30 @@
+Libidn COPYING -- Explanation of licensing conditions.
+Copyright (C) 2002-2015 Simon Josefsson
+See the end for copying conditions.
+
+The source code for the C library (libidn.a or libidn.so), the C#
+library (Libidn.dll) and the Java library (libidn-*.jar) are licensed
+under the terms of either the GNU General Public License version 2.0
+or later (see the file COPYINGv2) or the GNU Lesser General Public
+License version 3.0 or later (see the file COPYING.LESSERv3), or both
+in parallel as here.
+
+The author of the Java library has agreed to also distribute it under
+the Apache License Version 2.0 (see the file java/LICENSE-2.0).
+
+The manual is licensed under the GNU Free Documentation License,
+Version 1.3 or any later.
+
+The command line tool, self tests, examples, and other auxilliary
+files, are licensed under the GNU General Public License version 3.0
+or later.
+
+Other files are licensed as indicated in each file.
+
+There may be exceptions to these general rules, see each file for
+precise information.
+
+----------------------------------------------------------------------
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
diff --git a/3rdparty/stringprep/README.md b/3rdparty/stringprep/README.md
new file mode 100644
index 00000000..2ec00709
--- /dev/null
+++ b/3rdparty/stringprep/README.md
@@ -0,0 +1,7 @@
+This is a stringprep library extracted from LibIDN and slightly rewritten to use Qt's unicode support instead glib's one.
+
+The current version corresponds to 86e84739c5186faf3722a0f42e1e2db27870b3a5 commit of git://git.savannah.gnu.org/libidn.git
+
+The necessity of usage of separate stringprep library is described here: https://gitlab.com/libidn/libidn2/-/issues/28
+
+Note this directory contains generated rfc3454 files from rfc3454.txt. It's very unlikely these files will ever be regenerated but just in case the directory also contains both rfc3454.txt and a perl script to generate the files.
diff --git a/3rdparty/stringprep/gen-stringprep-tables.pl b/3rdparty/stringprep/gen-stringprep-tables.pl
new file mode 100755
index 00000000..13eaef64
--- /dev/null
+++ b/3rdparty/stringprep/gen-stringprep-tables.pl
@@ -0,0 +1,130 @@
+#! /usr/bin/perl -w
+
+# Copyright (C) 2002-2016 Simon Josefsson
+
+# 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 3 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, see .
+
+# I consider the output of this program to be unrestricted. Use it as
+# you will.
+
+use strict;
+
+my ($tab) = 59;
+my ($intable) = 0;
+my ($entries) = 0;
+my ($tablename);
+my ($varname);
+my ($starheader, $header);
+my ($profile) = "rfc3454";
+my ($filename) = "$profile.c";
+my ($headername) = "$profile.h";
+my ($line, $start, $end, @map);
+
+open(FH, ">$filename") or die "cannot open $filename for writing";
+
+print FH "/* This file is automatically generated. DO NOT EDIT!\n";
+print FH " Instead, edit gen-stringprep-tables.pl and re-run. */\n\n";
+
+print FH "#include \n";
+print FH "#include \"stringprep.h\"\n";
+
+open(FHH, ">$headername") or die "cannot open $headername for writing";
+print FHH "/* This file is automatically generated. DO NOT EDIT!\n";
+print FHH " Instead, edit gen-stringprep-tables.pl and re-run. */\n\n";
+
+while(<>) {
+ s/^ (.*)/$1/g; # for rfc
+ $line = $_;
+
+ die "already in table" if $intable && m,^----- Start Table (.*) -----,;
+ die "not in table" if !$intable && m,^----- End Table (.*) -----,;
+
+ if ($intable && m,^----- End Table (.*) -----,) {
+ die "table error" unless $1 eq $tablename ||
+ ($1 eq "C.1.2" && $tablename eq "C.1.1"); # Typo in draft
+ print FH " { 0 },\n";
+ print FH "};\n\n";
+ print FHH "#define N_STRINGPREP_${profile}_${varname} ${entries}\n";
+ $intable = 0;
+ $entries = 0;
+ }
+
+ if (m,^[A-Z],) {
+ $header = $line;
+ } elsif (!m,^[ -],) {
+ $header .= $line;
+ }
+
+ next unless ($intable || m,^----- Start Table (.*) -----,);
+
+ if ($intable) {
+ $_ = $line;
+ chop $line;
+
+ next if m,^$,;
+ next if m,^Hoffman & Blanchet Standards Track \[Page [0-9]+\]$,;
+ next if m,^$,;
+ next if m,RFC 3454 Preparation of Internationalized Strings December 2002,;
+
+ die "regexp failed on line: $line" unless
+ m,^([0-9A-F]+)(-([0-9A-F]+))?(; ([0-9A-F]+)( ([0-9A-F]+))?( ([0-9A-F]+))?( ([0-9A-F]+))?;)?,;
+
+ die "too many mapping targets on line: $line" if $12;
+
+ $start = $1;
+ $end = $3;
+ $map[0] = $5;
+ $map[1] = $7;
+ $map[2] = $9;
+ $map[3] = $11;
+
+ die "tables tried to map a range" if $end && $map[0];
+
+ if ($map[3]) {
+ printf FH " { 0x%06s, 0x%06s, { 0x%06s,%*s/* %s */\n 0x%06s, 0x%06s, 0x%06s }},\n",
+ $start, $start, $map[0], $tab-length($line)-13, " ", $line,
+ $map[1], $map[2], $map[3];
+ } elsif ($map[2]) {
+ printf FH " { 0x%06s, 0x%06s, { 0x%06s,%*s/* %s */\n 0x%06s, 0x%06s }},\n",
+ $start, $start, $map[0], $tab-length($line)-14, " ", $line,
+ $map[1], $map[2];
+ } elsif ($map[1]) {
+ printf FH " { 0x%06s, 0x%06s, { 0x%06s,%*s/* %s */\n 0x%06s }},\n",
+ $start, $start, $map[0], $tab-length($line)-14, " ", $line,
+ $map[1];
+ } elsif ($map[0]) {
+ printf FH " { 0x%06s, 0x%06s, { 0x%06s }},%*s/* %s */\n",
+ $start, $start, $map[0], $tab-length($line)-17, " ", $line;
+ } elsif ($end) {
+ printf FH " { 0x%06s, 0x%06s },%*s/* %s */\n",
+ $start, $end, $tab-length($line)-11, " ", $line;
+ } else {
+ printf FH " { 0x%06s, 0x%06s },%*s/* %s */\n",
+ $start, $start, $tab-length($line)-11, " ", $line;
+ }
+ $entries++;
+ } else {
+ $intable = 1 if !$intable;
+ $tablename = $1;
+
+ ($varname = $tablename) =~ tr/./_/;
+ $header =~ s/\n/\n * /s;
+
+ print FH "\n/*\n * $header */\n\n";
+ print FH "const Stringprep_table_element stringprep_${profile}_${varname}\[\] = {\n";
+ }
+}
+
+close FHH or die "cannot close $headername";
+close FH or die "cannot close $filename";
diff --git a/3rdparty/stringprep/profiles.cpp b/3rdparty/stringprep/profiles.cpp
new file mode 100644
index 00000000..f63a532a
--- /dev/null
+++ b/3rdparty/stringprep/profiles.cpp
@@ -0,0 +1,246 @@
+/* profiles.c --- Definitions of stringprep profiles.
+ Copyright (C) 2002-2016 Simon Josefsson
+
+ This file is part of GNU Libidn.
+
+ GNU Libidn is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version.
+
+ or
+
+ * 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.
+
+ or both in parallel, as here.
+
+ GNU Libidn 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 copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see . */
+
+#include "qstringprep.h"
+#include "rfc3454.h"
+
+const Stringprep_profiles stringprep_profiles[] = { { "Nameprep", stringprep_nameprep },
+ { "KRBprep", stringprep_kerberos5 }, /* Deprecate? */
+ { "Nodeprep", stringprep_xmpp_nodeprep },
+ { "Resourceprep", stringprep_xmpp_resourceprep },
+ { "plain", stringprep_plain }, /* sasl-anon-00. */
+ { "trace", stringprep_trace }, /* sasl-anon-01,02,03. */
+ { "SASLprep", stringprep_saslprep },
+ { "ISCSIprep", stringprep_iscsi }, /* Obsolete. */
+ { "iSCSI", stringprep_iscsi }, /* IANA. */
+ { NULL, NULL } };
+
+/* number of elements within an array */
+#define countof(a) (sizeof(a) / sizeof(*(a)))
+
+/* helper for profile definitions */
+#define TABLE(x) stringprep_rfc3454_##x, N_STRINGPREP_rfc3454_##x
+
+const Stringprep_profile stringprep_nameprep[]
+ = { { STRINGPREP_MAP_TABLE, 0, TABLE(B_1) },
+ { STRINGPREP_MAP_TABLE, 0, TABLE(B_2) },
+ { STRINGPREP_NFKC, 0, 0, 0 },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_1_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_3) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_4) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_5) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_6) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_7) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_9) },
+ { STRINGPREP_BIDI, 0, 0, 0 },
+ { STRINGPREP_BIDI_PROHIBIT_TABLE, ~STRINGPREP_NO_BIDI, TABLE(C_8) },
+ { STRINGPREP_BIDI_RAL_TABLE, 0, TABLE(D_1) },
+ { STRINGPREP_BIDI_L_TABLE, 0, TABLE(D_2) },
+ { STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, TABLE(A_1) },
+ { 0 } };
+
+const Stringprep_profile stringprep_kerberos5[] = {
+ /* XXX this is likely to be wrong as the specification is
+ a rough draft. */
+ { STRINGPREP_MAP_TABLE, 0, TABLE(B_1) },
+ { STRINGPREP_MAP_TABLE, 0, TABLE(B_3) },
+ { STRINGPREP_NFKC, 0, 0, 0 },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_1_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_3) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_4) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_5) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_6) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_7) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_9) },
+ { STRINGPREP_BIDI, 0, 0, 0 },
+ { STRINGPREP_BIDI_PROHIBIT_TABLE, ~STRINGPREP_NO_BIDI, TABLE(C_8) },
+ { STRINGPREP_BIDI_RAL_TABLE, 0, TABLE(D_1) },
+ { STRINGPREP_BIDI_L_TABLE, 0, TABLE(D_2) },
+ { STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, TABLE(A_1) },
+ { 0 }
+};
+
+const Stringprep_table_element stringprep_xmpp_nodeprep_prohibit[] = { { 0x000022, 0x000022 }, /* #x22 (") */
+ { 0x000026, 0x000026 }, /* #x26 (&) */
+ { 0x000027, 0x000027 }, /* #x27 (') */
+ { 0x00002F, 0x00002F }, /* #x2F (/) */
+ { 0x00003A, 0x00003A }, /* #x3A (:) */
+ { 0x00003C, 0x00003C }, /* #x3C (<) */
+ { 0x00003E, 0x00003E }, /* #x3E (>) */
+ { 0x000040, 0x000040 }, /* #x40 (@) */
+ { 0 } };
+
+const Stringprep_profile stringprep_xmpp_nodeprep[]
+ = { { STRINGPREP_MAP_TABLE, 0, TABLE(B_1) },
+ { STRINGPREP_MAP_TABLE, 0, TABLE(B_2) },
+ { STRINGPREP_NFKC, 0, 0, 0 },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_1_1) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_1_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_1) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_3) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_4) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_5) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_6) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_7) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_9) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, stringprep_xmpp_nodeprep_prohibit,
+ countof(stringprep_xmpp_nodeprep_prohibit) - 1 },
+ { STRINGPREP_BIDI, 0, 0, 0 },
+ { STRINGPREP_BIDI_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_BIDI_RAL_TABLE, 0, TABLE(D_1) },
+ { STRINGPREP_BIDI_L_TABLE, 0, TABLE(D_2) },
+ { STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, TABLE(A_1) },
+ { 0 } };
+
+const Stringprep_profile stringprep_xmpp_resourceprep[]
+ = { { STRINGPREP_MAP_TABLE, 0, TABLE(B_1) },
+ { STRINGPREP_NFKC, 0, 0, 0 },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_1_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_1) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_3) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_4) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_5) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_6) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_7) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_9) },
+ { STRINGPREP_BIDI, 0, 0, 0 },
+ { STRINGPREP_BIDI_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, TABLE(D_1) },
+ { STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, TABLE(D_2) },
+ { STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, TABLE(A_1) },
+ { 0 } };
+
+const Stringprep_profile stringprep_plain[] = { { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_1) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_3) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_4) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_5) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_6) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_9) },
+ { STRINGPREP_BIDI, 0, 0, 0 },
+ { STRINGPREP_BIDI_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, TABLE(D_1) },
+ { STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, TABLE(D_2) },
+ { 0 } };
+
+const Stringprep_profile stringprep_trace[] = { { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_1) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_3) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_4) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_5) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_6) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_9) },
+ { STRINGPREP_BIDI, 0, 0, 0 },
+ { STRINGPREP_BIDI_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, TABLE(D_1) },
+ { STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, TABLE(D_2) },
+ { 0 } };
+
+const Stringprep_table_element stringprep_iscsi_prohibit[]
+ = { { 0x0000, 0x002C }, /* [ASCII CONTROL CHARACTERS and SPACE through ,] */
+ { 0x002F, 0x002F }, /* [ASCII /] */
+ { 0x003B, 0x0040 }, /* [ASCII ; through @] */
+ { 0x005B, 0x0060 }, /* [ASCII [ through `] */
+ { 0x007B, 0x007F }, /* [ASCII { through DEL] */
+ { 0x3002, 0x3002 }, /* ideographic full stop */
+ { 0 } };
+
+const Stringprep_profile stringprep_iscsi[]
+ = { { STRINGPREP_MAP_TABLE, 0, TABLE(B_1) },
+ { STRINGPREP_MAP_TABLE, 0, TABLE(B_2) },
+ { STRINGPREP_NFKC, 0, 0, 0 },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_1_1) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_1_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_1) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_3) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_4) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_5) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_6) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_7) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_9) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, stringprep_iscsi_prohibit, countof(stringprep_iscsi_prohibit) - 1 },
+ { STRINGPREP_BIDI, 0, 0, 0 },
+ { STRINGPREP_BIDI_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, TABLE(D_1) },
+ { STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, TABLE(D_2) },
+ { STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, TABLE(A_1) },
+ { 0 } };
+
+const Stringprep_table_element stringprep_saslprep_space_map[]
+ = { { 0x00A0, 0x00A0, { 0x0020 } }, /* 00A0; NO-BREAK SPACE */
+ { 0x1680, 0x1680, { 0x0020 } }, /* 1680; OGHAM SPACE MARK */
+ { 0x2000, 0x200B, { 0x0020 } }, /* 2000; EN QUAD */
+ /* 2001; EM QUAD */
+ /* 2002; EN SPACE */
+ /* 2003; EM SPACE */
+ /* 2004; THREE-PER-EM SPACE */
+ /* 2005; FOUR-PER-EM SPACE */
+ /* 2006; SIX-PER-EM SPACE */
+ /* 2007; FIGURE SPACE */
+ /* 2008; PUNCTUATION SPACE */
+ /* 2009; THIN SPACE */
+ /* 200A; HAIR SPACE */
+ /* 200B; ZERO WIDTH SPACE */
+ { 0x202F, 0x202F, { 0x0020 } }, /* 202F; NARROW NO-BREAK SPACE */
+ { 0x205F, 0x205F, { 0x0020 } }, /* 205F; MEDIUM MATHEMATICAL SPACE */
+ { 0x3000, 0x3000, { 0x0020 } }, /* 3000; IDEOGRAPHIC SPACE */
+ { 0 } };
+
+const Stringprep_profile stringprep_saslprep[]
+ = { { STRINGPREP_MAP_TABLE, 0, stringprep_saslprep_space_map, countof(stringprep_saslprep_space_map) - 1 },
+ { STRINGPREP_MAP_TABLE, 0, TABLE(B_1) },
+ { STRINGPREP_NFKC, 0, 0, 0 },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_1_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_1) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_2_2) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_3) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_4) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_5) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_6) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_7) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_PROHIBIT_TABLE, 0, TABLE(C_9) },
+ { STRINGPREP_BIDI, 0, 0, 0 },
+ { STRINGPREP_BIDI_PROHIBIT_TABLE, 0, TABLE(C_8) },
+ { STRINGPREP_BIDI_RAL_TABLE, ~STRINGPREP_NO_BIDI, TABLE(D_1) },
+ { STRINGPREP_BIDI_L_TABLE, ~STRINGPREP_NO_BIDI, TABLE(D_2) },
+ { STRINGPREP_UNASSIGNED_TABLE, ~STRINGPREP_NO_UNASSIGNED, TABLE(A_1) },
+ { 0 } };
diff --git a/3rdparty/stringprep/qstringprep.h b/3rdparty/stringprep/qstringprep.h
new file mode 100644
index 00000000..7bb84f0c
--- /dev/null
+++ b/3rdparty/stringprep/qstringprep.h
@@ -0,0 +1,180 @@
+/* stringprep.h --- Header file for stringprep functions.
+ Copyright (C) 2002-2016 Simon Josefsson
+
+ This file is part of GNU Libidn.
+
+ GNU Libidn is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version.
+
+ or
+
+ * 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.
+
+ or both in parallel, as here.
+
+ GNU Libidn 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 copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see . */
+
+#ifndef STRINGPREP_H
+#define STRINGPREP_H
+
+#include
+
+#if defined(QSTRINGPREP_BUILDING)
+#define IDNAPI Q_DECL_EXPORT
+#else
+#define IDNAPI Q_DECL_IMPORT
+#endif
+
+#include /* size_t */
+#include /* uint32_t */
+
+class QString;
+
+#define STRINGPREP_VERSION "1.35"
+
+/* Error codes. */
+typedef enum {
+ STRINGPREP_OK = 0,
+ /* Stringprep errors. */
+ STRINGPREP_CONTAINS_UNASSIGNED = 1,
+ STRINGPREP_CONTAINS_PROHIBITED = 2,
+ STRINGPREP_BIDI_BOTH_L_AND_RAL = 3,
+ STRINGPREP_BIDI_LEADTRAIL_NOT_RAL = 4,
+ STRINGPREP_BIDI_CONTAINS_PROHIBITED = 5,
+ /* Error in calling application. */
+ STRINGPREP_TOO_SMALL_BUFFER = 100,
+ STRINGPREP_PROFILE_ERROR = 101,
+ STRINGPREP_FLAG_ERROR = 102,
+ STRINGPREP_UNKNOWN_PROFILE = 103,
+ STRINGPREP_ICONV_ERROR = 104,
+ /* Internal errors. */
+ STRINGPREP_NFKC_FAILED = 200,
+ STRINGPREP_MALLOC_ERROR = 201
+} Stringprep_rc;
+
+enum Stringprep_profile_flags { STRINGPREP_NO_NFKC = 1, STRINGPREP_NO_BIDI = 2, STRINGPREP_NO_UNASSIGNED = 4 };
+
+/* Steps in a stringprep profile. */
+typedef enum {
+ STRINGPREP_NFKC = 1,
+ STRINGPREP_BIDI = 2,
+ STRINGPREP_MAP_TABLE = 3,
+ STRINGPREP_UNASSIGNED_TABLE = 4,
+ STRINGPREP_PROHIBIT_TABLE = 5,
+ STRINGPREP_BIDI_PROHIBIT_TABLE = 6,
+ STRINGPREP_BIDI_RAL_TABLE = 7,
+ STRINGPREP_BIDI_L_TABLE = 8
+} Stringprep_profile_steps;
+
+#define STRINGPREP_MAX_MAP_CHARS 4
+
+struct Stringprep_table_element {
+ uint32_t start;
+ uint32_t end = 0; /* 0 if only one character */
+ uint32_t map[STRINGPREP_MAX_MAP_CHARS] = {}; /* NULL if end is not 0 */
+};
+typedef struct Stringprep_table_element Stringprep_table_element;
+
+struct Stringprep_table {
+ Stringprep_table(int operation, long flags = 0, const Stringprep_table_element *table = nullptr,
+ size_t table_size = 0) :
+ operation(Stringprep_profile_steps(operation)),
+ flags(Stringprep_profile_flags(flags)), table(table), table_size(table_size)
+ {
+ }
+
+ Stringprep_profile_steps operation = Stringprep_profile_steps(0);
+ Stringprep_profile_flags flags = Stringprep_profile_flags(0);
+ const Stringprep_table_element *table = nullptr;
+ size_t table_size = 0;
+};
+typedef struct Stringprep_table Stringprep_profile;
+
+struct Stringprep_profiles {
+ const char * name;
+ const Stringprep_profile *tables;
+};
+typedef struct Stringprep_profiles Stringprep_profiles;
+
+extern IDNAPI const Stringprep_profiles stringprep_profiles[];
+
+/* Profiles */
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_A_1[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_B_1[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_B_2[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_B_3[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_C_1_1[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_C_1_2[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_C_2_1[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_C_2_2[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_C_3[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_C_4[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_C_5[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_C_6[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_C_7[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_C_8[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_C_9[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_D_1[];
+extern IDNAPI const Stringprep_table_element stringprep_rfc3454_D_2[];
+
+/* Nameprep */
+
+extern IDNAPI const Stringprep_profile stringprep_nameprep[];
+
+#define stringprep_nameprep(in, maxlen) stringprep(in, maxlen, 0, stringprep_nameprep)
+
+#define stringprep_nameprep_no_unassigned(in, maxlen) \
+ stringprep(in, maxlen, STRINGPREP_NO_UNASSIGNED, stringprep_nameprep)
+
+/* SASL */
+
+extern IDNAPI const Stringprep_profile stringprep_saslprep[];
+extern IDNAPI const Stringprep_table_element stringprep_saslprep_space_map[];
+extern IDNAPI const Stringprep_profile stringprep_plain[];
+extern IDNAPI const Stringprep_profile stringprep_trace[];
+
+#define stringprep_plain(in, maxlen) stringprep(in, maxlen, 0, stringprep_plain)
+
+/* Kerberos */
+
+extern IDNAPI const Stringprep_profile stringprep_kerberos5[];
+
+#define stringprep_kerberos5(in, maxlen) stringprep(in, maxlen, 0, stringprep_kerberos5)
+
+/* XMPP */
+
+extern IDNAPI const Stringprep_profile stringprep_xmpp_nodeprep[];
+extern IDNAPI const Stringprep_profile stringprep_xmpp_resourceprep[];
+extern IDNAPI const Stringprep_table_element stringprep_xmpp_nodeprep_prohibit[];
+
+#define stringprep_xmpp_nodeprep(in, maxlen) stringprep(in, maxlen, 0, stringprep_xmpp_nodeprep)
+#define stringprep_xmpp_resourceprep(in, maxlen) stringprep(in, maxlen, 0, stringprep_xmpp_resourceprep)
+
+/* iSCSI */
+
+extern IDNAPI const Stringprep_profile stringprep_iscsi[];
+extern IDNAPI const Stringprep_table_element stringprep_iscsi_prohibit[];
+
+#define stringprep_iscsi(in, maxlen) stringprep(in, maxlen, 0, stringprep_iscsi)
+
+/* API */
+
+extern IDNAPI int stringprep_4i(QString &input, Stringprep_profile_flags flags, const Stringprep_profile *profile);
+extern IDNAPI int stringprep(QString &input, Stringprep_profile_flags flags, const Stringprep_profile *profile);
+
+extern IDNAPI int stringprep_profile(const char *in, char **out, const char *profile, Stringprep_profile_flags flags);
+
+#endif /* STRINGPREP_H */
diff --git a/3rdparty/stringprep/rfc3454.cpp b/3rdparty/stringprep/rfc3454.cpp
new file mode 100644
index 00000000..ac74b41e
--- /dev/null
+++ b/3rdparty/stringprep/rfc3454.cpp
@@ -0,0 +1,4763 @@
+/* This file is automatically generated. DO NOT EDIT!
+ Instead, edit gen-stringprep-tables.pl and re-run. */
+
+#include "qstringprep.h"
+
+/*
+ * So we can use this material. There may be other legal analysis that
+ * also reach the same conclusion.
+
+ */
+
+const Stringprep_table_element stringprep_rfc3454_A_1[] = {
+ { 0x000221, 0x000221 }, /* 0221 */
+ { 0x000234, 0x00024F }, /* 0234-024F */
+ { 0x0002AE, 0x0002AF }, /* 02AE-02AF */
+ { 0x0002EF, 0x0002FF }, /* 02EF-02FF */
+ { 0x000350, 0x00035F }, /* 0350-035F */
+ { 0x000370, 0x000373 }, /* 0370-0373 */
+ { 0x000376, 0x000379 }, /* 0376-0379 */
+ { 0x00037B, 0x00037D }, /* 037B-037D */
+ { 0x00037F, 0x000383 }, /* 037F-0383 */
+ { 0x00038B, 0x00038B }, /* 038B */
+ { 0x00038D, 0x00038D }, /* 038D */
+ { 0x0003A2, 0x0003A2 }, /* 03A2 */
+ { 0x0003CF, 0x0003CF }, /* 03CF */
+ { 0x0003F7, 0x0003FF }, /* 03F7-03FF */
+ { 0x000487, 0x000487 }, /* 0487 */
+ { 0x0004CF, 0x0004CF }, /* 04CF */
+ { 0x0004F6, 0x0004F7 }, /* 04F6-04F7 */
+ { 0x0004FA, 0x0004FF }, /* 04FA-04FF */
+ { 0x000510, 0x000530 }, /* 0510-0530 */
+ { 0x000557, 0x000558 }, /* 0557-0558 */
+ { 0x000560, 0x000560 }, /* 0560 */
+ { 0x000588, 0x000588 }, /* 0588 */
+ { 0x00058B, 0x000590 }, /* 058B-0590 */
+ { 0x0005A2, 0x0005A2 }, /* 05A2 */
+ { 0x0005BA, 0x0005BA }, /* 05BA */
+ { 0x0005C5, 0x0005CF }, /* 05C5-05CF */
+ { 0x0005EB, 0x0005EF }, /* 05EB-05EF */
+ { 0x0005F5, 0x00060B }, /* 05F5-060B */
+ { 0x00060D, 0x00061A }, /* 060D-061A */
+ { 0x00061C, 0x00061E }, /* 061C-061E */
+ { 0x000620, 0x000620 }, /* 0620 */
+ { 0x00063B, 0x00063F }, /* 063B-063F */
+ { 0x000656, 0x00065F }, /* 0656-065F */
+ { 0x0006EE, 0x0006EF }, /* 06EE-06EF */
+ { 0x0006FF, 0x0006FF }, /* 06FF */
+ { 0x00070E, 0x00070E }, /* 070E */
+ { 0x00072D, 0x00072F }, /* 072D-072F */
+ { 0x00074B, 0x00077F }, /* 074B-077F */
+ { 0x0007B2, 0x000900 }, /* 07B2-0900 */
+ { 0x000904, 0x000904 }, /* 0904 */
+ { 0x00093A, 0x00093B }, /* 093A-093B */
+ { 0x00094E, 0x00094F }, /* 094E-094F */
+ { 0x000955, 0x000957 }, /* 0955-0957 */
+ { 0x000971, 0x000980 }, /* 0971-0980 */
+ { 0x000984, 0x000984 }, /* 0984 */
+ { 0x00098D, 0x00098E }, /* 098D-098E */
+ { 0x000991, 0x000992 }, /* 0991-0992 */
+ { 0x0009A9, 0x0009A9 }, /* 09A9 */
+ { 0x0009B1, 0x0009B1 }, /* 09B1 */
+ { 0x0009B3, 0x0009B5 }, /* 09B3-09B5 */
+ { 0x0009BA, 0x0009BB }, /* 09BA-09BB */
+ { 0x0009BD, 0x0009BD }, /* 09BD */
+ { 0x0009C5, 0x0009C6 }, /* 09C5-09C6 */
+ { 0x0009C9, 0x0009CA }, /* 09C9-09CA */
+ { 0x0009CE, 0x0009D6 }, /* 09CE-09D6 */
+ { 0x0009D8, 0x0009DB }, /* 09D8-09DB */
+ { 0x0009DE, 0x0009DE }, /* 09DE */
+ { 0x0009E4, 0x0009E5 }, /* 09E4-09E5 */
+ { 0x0009FB, 0x000A01 }, /* 09FB-0A01 */
+ { 0x000A03, 0x000A04 }, /* 0A03-0A04 */
+ { 0x000A0B, 0x000A0E }, /* 0A0B-0A0E */
+ { 0x000A11, 0x000A12 }, /* 0A11-0A12 */
+ { 0x000A29, 0x000A29 }, /* 0A29 */
+ { 0x000A31, 0x000A31 }, /* 0A31 */
+ { 0x000A34, 0x000A34 }, /* 0A34 */
+ { 0x000A37, 0x000A37 }, /* 0A37 */
+ { 0x000A3A, 0x000A3B }, /* 0A3A-0A3B */
+ { 0x000A3D, 0x000A3D }, /* 0A3D */
+ { 0x000A43, 0x000A46 }, /* 0A43-0A46 */
+ { 0x000A49, 0x000A4A }, /* 0A49-0A4A */
+ { 0x000A4E, 0x000A58 }, /* 0A4E-0A58 */
+ { 0x000A5D, 0x000A5D }, /* 0A5D */
+ { 0x000A5F, 0x000A65 }, /* 0A5F-0A65 */
+ { 0x000A75, 0x000A80 }, /* 0A75-0A80 */
+ { 0x000A84, 0x000A84 }, /* 0A84 */
+ { 0x000A8C, 0x000A8C }, /* 0A8C */
+ { 0x000A8E, 0x000A8E }, /* 0A8E */
+ { 0x000A92, 0x000A92 }, /* 0A92 */
+ { 0x000AA9, 0x000AA9 }, /* 0AA9 */
+ { 0x000AB1, 0x000AB1 }, /* 0AB1 */
+ { 0x000AB4, 0x000AB4 }, /* 0AB4 */
+ { 0x000ABA, 0x000ABB }, /* 0ABA-0ABB */
+ { 0x000AC6, 0x000AC6 }, /* 0AC6 */
+ { 0x000ACA, 0x000ACA }, /* 0ACA */
+ { 0x000ACE, 0x000ACF }, /* 0ACE-0ACF */
+ { 0x000AD1, 0x000ADF }, /* 0AD1-0ADF */
+ { 0x000AE1, 0x000AE5 }, /* 0AE1-0AE5 */
+ { 0x000AF0, 0x000B00 }, /* 0AF0-0B00 */
+ { 0x000B04, 0x000B04 }, /* 0B04 */
+ { 0x000B0D, 0x000B0E }, /* 0B0D-0B0E */
+ { 0x000B11, 0x000B12 }, /* 0B11-0B12 */
+ { 0x000B29, 0x000B29 }, /* 0B29 */
+ { 0x000B31, 0x000B31 }, /* 0B31 */
+ { 0x000B34, 0x000B35 }, /* 0B34-0B35 */
+ { 0x000B3A, 0x000B3B }, /* 0B3A-0B3B */
+ { 0x000B44, 0x000B46 }, /* 0B44-0B46 */
+ { 0x000B49, 0x000B4A }, /* 0B49-0B4A */
+ { 0x000B4E, 0x000B55 }, /* 0B4E-0B55 */
+ { 0x000B58, 0x000B5B }, /* 0B58-0B5B */
+ { 0x000B5E, 0x000B5E }, /* 0B5E */
+ { 0x000B62, 0x000B65 }, /* 0B62-0B65 */
+ { 0x000B71, 0x000B81 }, /* 0B71-0B81 */
+ { 0x000B84, 0x000B84 }, /* 0B84 */
+ { 0x000B8B, 0x000B8D }, /* 0B8B-0B8D */
+ { 0x000B91, 0x000B91 }, /* 0B91 */
+ { 0x000B96, 0x000B98 }, /* 0B96-0B98 */
+ { 0x000B9B, 0x000B9B }, /* 0B9B */
+ { 0x000B9D, 0x000B9D }, /* 0B9D */
+ { 0x000BA0, 0x000BA2 }, /* 0BA0-0BA2 */
+ { 0x000BA5, 0x000BA7 }, /* 0BA5-0BA7 */
+ { 0x000BAB, 0x000BAD }, /* 0BAB-0BAD */
+ { 0x000BB6, 0x000BB6 }, /* 0BB6 */
+ { 0x000BBA, 0x000BBD }, /* 0BBA-0BBD */
+ { 0x000BC3, 0x000BC5 }, /* 0BC3-0BC5 */
+ { 0x000BC9, 0x000BC9 }, /* 0BC9 */
+ { 0x000BCE, 0x000BD6 }, /* 0BCE-0BD6 */
+ { 0x000BD8, 0x000BE6 }, /* 0BD8-0BE6 */
+ { 0x000BF3, 0x000C00 }, /* 0BF3-0C00 */
+ { 0x000C04, 0x000C04 }, /* 0C04 */
+ { 0x000C0D, 0x000C0D }, /* 0C0D */
+ { 0x000C11, 0x000C11 }, /* 0C11 */
+ { 0x000C29, 0x000C29 }, /* 0C29 */
+ { 0x000C34, 0x000C34 }, /* 0C34 */
+ { 0x000C3A, 0x000C3D }, /* 0C3A-0C3D */
+ { 0x000C45, 0x000C45 }, /* 0C45 */
+ { 0x000C49, 0x000C49 }, /* 0C49 */
+ { 0x000C4E, 0x000C54 }, /* 0C4E-0C54 */
+ { 0x000C57, 0x000C5F }, /* 0C57-0C5F */
+ { 0x000C62, 0x000C65 }, /* 0C62-0C65 */
+ { 0x000C70, 0x000C81 }, /* 0C70-0C81 */
+ { 0x000C84, 0x000C84 }, /* 0C84 */
+ { 0x000C8D, 0x000C8D }, /* 0C8D */
+ { 0x000C91, 0x000C91 }, /* 0C91 */
+ { 0x000CA9, 0x000CA9 }, /* 0CA9 */
+ { 0x000CB4, 0x000CB4 }, /* 0CB4 */
+ { 0x000CBA, 0x000CBD }, /* 0CBA-0CBD */
+ { 0x000CC5, 0x000CC5 }, /* 0CC5 */
+ { 0x000CC9, 0x000CC9 }, /* 0CC9 */
+ { 0x000CCE, 0x000CD4 }, /* 0CCE-0CD4 */
+ { 0x000CD7, 0x000CDD }, /* 0CD7-0CDD */
+ { 0x000CDF, 0x000CDF }, /* 0CDF */
+ { 0x000CE2, 0x000CE5 }, /* 0CE2-0CE5 */
+ { 0x000CF0, 0x000D01 }, /* 0CF0-0D01 */
+ { 0x000D04, 0x000D04 }, /* 0D04 */
+ { 0x000D0D, 0x000D0D }, /* 0D0D */
+ { 0x000D11, 0x000D11 }, /* 0D11 */
+ { 0x000D29, 0x000D29 }, /* 0D29 */
+ { 0x000D3A, 0x000D3D }, /* 0D3A-0D3D */
+ { 0x000D44, 0x000D45 }, /* 0D44-0D45 */
+ { 0x000D49, 0x000D49 }, /* 0D49 */
+ { 0x000D4E, 0x000D56 }, /* 0D4E-0D56 */
+ { 0x000D58, 0x000D5F }, /* 0D58-0D5F */
+ { 0x000D62, 0x000D65 }, /* 0D62-0D65 */
+ { 0x000D70, 0x000D81 }, /* 0D70-0D81 */
+ { 0x000D84, 0x000D84 }, /* 0D84 */
+ { 0x000D97, 0x000D99 }, /* 0D97-0D99 */
+ { 0x000DB2, 0x000DB2 }, /* 0DB2 */
+ { 0x000DBC, 0x000DBC }, /* 0DBC */
+ { 0x000DBE, 0x000DBF }, /* 0DBE-0DBF */
+ { 0x000DC7, 0x000DC9 }, /* 0DC7-0DC9 */
+ { 0x000DCB, 0x000DCE }, /* 0DCB-0DCE */
+ { 0x000DD5, 0x000DD5 }, /* 0DD5 */
+ { 0x000DD7, 0x000DD7 }, /* 0DD7 */
+ { 0x000DE0, 0x000DF1 }, /* 0DE0-0DF1 */
+ { 0x000DF5, 0x000E00 }, /* 0DF5-0E00 */
+ { 0x000E3B, 0x000E3E }, /* 0E3B-0E3E */
+ { 0x000E5C, 0x000E80 }, /* 0E5C-0E80 */
+ { 0x000E83, 0x000E83 }, /* 0E83 */
+ { 0x000E85, 0x000E86 }, /* 0E85-0E86 */
+ { 0x000E89, 0x000E89 }, /* 0E89 */
+ { 0x000E8B, 0x000E8C }, /* 0E8B-0E8C */
+ { 0x000E8E, 0x000E93 }, /* 0E8E-0E93 */
+ { 0x000E98, 0x000E98 }, /* 0E98 */
+ { 0x000EA0, 0x000EA0 }, /* 0EA0 */
+ { 0x000EA4, 0x000EA4 }, /* 0EA4 */
+ { 0x000EA6, 0x000EA6 }, /* 0EA6 */
+ { 0x000EA8, 0x000EA9 }, /* 0EA8-0EA9 */
+ { 0x000EAC, 0x000EAC }, /* 0EAC */
+ { 0x000EBA, 0x000EBA }, /* 0EBA */
+ { 0x000EBE, 0x000EBF }, /* 0EBE-0EBF */
+ { 0x000EC5, 0x000EC5 }, /* 0EC5 */
+ { 0x000EC7, 0x000EC7 }, /* 0EC7 */
+ { 0x000ECE, 0x000ECF }, /* 0ECE-0ECF */
+ { 0x000EDA, 0x000EDB }, /* 0EDA-0EDB */
+ { 0x000EDE, 0x000EFF }, /* 0EDE-0EFF */
+ { 0x000F48, 0x000F48 }, /* 0F48 */
+ { 0x000F6B, 0x000F70 }, /* 0F6B-0F70 */
+ { 0x000F8C, 0x000F8F }, /* 0F8C-0F8F */
+ { 0x000F98, 0x000F98 }, /* 0F98 */
+ { 0x000FBD, 0x000FBD }, /* 0FBD */
+ { 0x000FCD, 0x000FCE }, /* 0FCD-0FCE */
+ { 0x000FD0, 0x000FFF }, /* 0FD0-0FFF */
+ { 0x001022, 0x001022 }, /* 1022 */
+ { 0x001028, 0x001028 }, /* 1028 */
+ { 0x00102B, 0x00102B }, /* 102B */
+ { 0x001033, 0x001035 }, /* 1033-1035 */
+ { 0x00103A, 0x00103F }, /* 103A-103F */
+ { 0x00105A, 0x00109F }, /* 105A-109F */
+ { 0x0010C6, 0x0010CF }, /* 10C6-10CF */
+ { 0x0010F9, 0x0010FA }, /* 10F9-10FA */
+ { 0x0010FC, 0x0010FF }, /* 10FC-10FF */
+ { 0x00115A, 0x00115E }, /* 115A-115E */
+ { 0x0011A3, 0x0011A7 }, /* 11A3-11A7 */
+ { 0x0011FA, 0x0011FF }, /* 11FA-11FF */
+ { 0x001207, 0x001207 }, /* 1207 */
+ { 0x001247, 0x001247 }, /* 1247 */
+ { 0x001249, 0x001249 }, /* 1249 */
+ { 0x00124E, 0x00124F }, /* 124E-124F */
+ { 0x001257, 0x001257 }, /* 1257 */
+ { 0x001259, 0x001259 }, /* 1259 */
+ { 0x00125E, 0x00125F }, /* 125E-125F */
+ { 0x001287, 0x001287 }, /* 1287 */
+ { 0x001289, 0x001289 }, /* 1289 */
+ { 0x00128E, 0x00128F }, /* 128E-128F */
+ { 0x0012AF, 0x0012AF }, /* 12AF */
+ { 0x0012B1, 0x0012B1 }, /* 12B1 */
+ { 0x0012B6, 0x0012B7 }, /* 12B6-12B7 */
+ { 0x0012BF, 0x0012BF }, /* 12BF */
+ { 0x0012C1, 0x0012C1 }, /* 12C1 */
+ { 0x0012C6, 0x0012C7 }, /* 12C6-12C7 */
+ { 0x0012CF, 0x0012CF }, /* 12CF */
+ { 0x0012D7, 0x0012D7 }, /* 12D7 */
+ { 0x0012EF, 0x0012EF }, /* 12EF */
+ { 0x00130F, 0x00130F }, /* 130F */
+ { 0x001311, 0x001311 }, /* 1311 */
+ { 0x001316, 0x001317 }, /* 1316-1317 */
+ { 0x00131F, 0x00131F }, /* 131F */
+ { 0x001347, 0x001347 }, /* 1347 */
+ { 0x00135B, 0x001360 }, /* 135B-1360 */
+ { 0x00137D, 0x00139F }, /* 137D-139F */
+ { 0x0013F5, 0x001400 }, /* 13F5-1400 */
+ { 0x001677, 0x00167F }, /* 1677-167F */
+ { 0x00169D, 0x00169F }, /* 169D-169F */
+ { 0x0016F1, 0x0016FF }, /* 16F1-16FF */
+ { 0x00170D, 0x00170D }, /* 170D */
+ { 0x001715, 0x00171F }, /* 1715-171F */
+ { 0x001737, 0x00173F }, /* 1737-173F */
+ { 0x001754, 0x00175F }, /* 1754-175F */
+ { 0x00176D, 0x00176D }, /* 176D */
+ { 0x001771, 0x001771 }, /* 1771 */
+ { 0x001774, 0x00177F }, /* 1774-177F */
+ { 0x0017DD, 0x0017DF }, /* 17DD-17DF */
+ { 0x0017EA, 0x0017FF }, /* 17EA-17FF */
+ { 0x00180F, 0x00180F }, /* 180F */
+ { 0x00181A, 0x00181F }, /* 181A-181F */
+ { 0x001878, 0x00187F }, /* 1878-187F */
+ { 0x0018AA, 0x001DFF }, /* 18AA-1DFF */
+ { 0x001E9C, 0x001E9F }, /* 1E9C-1E9F */
+ { 0x001EFA, 0x001EFF }, /* 1EFA-1EFF */
+ { 0x001F16, 0x001F17 }, /* 1F16-1F17 */
+ { 0x001F1E, 0x001F1F }, /* 1F1E-1F1F */
+ { 0x001F46, 0x001F47 }, /* 1F46-1F47 */
+ { 0x001F4E, 0x001F4F }, /* 1F4E-1F4F */
+ { 0x001F58, 0x001F58 }, /* 1F58 */
+ { 0x001F5A, 0x001F5A }, /* 1F5A */
+ { 0x001F5C, 0x001F5C }, /* 1F5C */
+ { 0x001F5E, 0x001F5E }, /* 1F5E */
+ { 0x001F7E, 0x001F7F }, /* 1F7E-1F7F */
+ { 0x001FB5, 0x001FB5 }, /* 1FB5 */
+ { 0x001FC5, 0x001FC5 }, /* 1FC5 */
+ { 0x001FD4, 0x001FD5 }, /* 1FD4-1FD5 */
+ { 0x001FDC, 0x001FDC }, /* 1FDC */
+ { 0x001FF0, 0x001FF1 }, /* 1FF0-1FF1 */
+ { 0x001FF5, 0x001FF5 }, /* 1FF5 */
+ { 0x001FFF, 0x001FFF }, /* 1FFF */
+ { 0x002053, 0x002056 }, /* 2053-2056 */
+ { 0x002058, 0x00205E }, /* 2058-205E */
+ { 0x002064, 0x002069 }, /* 2064-2069 */
+ { 0x002072, 0x002073 }, /* 2072-2073 */
+ { 0x00208F, 0x00209F }, /* 208F-209F */
+ { 0x0020B2, 0x0020CF }, /* 20B2-20CF */
+ { 0x0020EB, 0x0020FF }, /* 20EB-20FF */
+ { 0x00213B, 0x00213C }, /* 213B-213C */
+ { 0x00214C, 0x002152 }, /* 214C-2152 */
+ { 0x002184, 0x00218F }, /* 2184-218F */
+ { 0x0023CF, 0x0023FF }, /* 23CF-23FF */
+ { 0x002427, 0x00243F }, /* 2427-243F */
+ { 0x00244B, 0x00245F }, /* 244B-245F */
+ { 0x0024FF, 0x0024FF }, /* 24FF */
+ { 0x002614, 0x002615 }, /* 2614-2615 */
+ { 0x002618, 0x002618 }, /* 2618 */
+ { 0x00267E, 0x00267F }, /* 267E-267F */
+ { 0x00268A, 0x002700 }, /* 268A-2700 */
+ { 0x002705, 0x002705 }, /* 2705 */
+ { 0x00270A, 0x00270B }, /* 270A-270B */
+ { 0x002728, 0x002728 }, /* 2728 */
+ { 0x00274C, 0x00274C }, /* 274C */
+ { 0x00274E, 0x00274E }, /* 274E */
+ { 0x002753, 0x002755 }, /* 2753-2755 */
+ { 0x002757, 0x002757 }, /* 2757 */
+ { 0x00275F, 0x002760 }, /* 275F-2760 */
+ { 0x002795, 0x002797 }, /* 2795-2797 */
+ { 0x0027B0, 0x0027B0 }, /* 27B0 */
+ { 0x0027BF, 0x0027CF }, /* 27BF-27CF */
+ { 0x0027EC, 0x0027EF }, /* 27EC-27EF */
+ { 0x002B00, 0x002E7F }, /* 2B00-2E7F */
+ { 0x002E9A, 0x002E9A }, /* 2E9A */
+ { 0x002EF4, 0x002EFF }, /* 2EF4-2EFF */
+ { 0x002FD6, 0x002FEF }, /* 2FD6-2FEF */
+ { 0x002FFC, 0x002FFF }, /* 2FFC-2FFF */
+ { 0x003040, 0x003040 }, /* 3040 */
+ { 0x003097, 0x003098 }, /* 3097-3098 */
+ { 0x003100, 0x003104 }, /* 3100-3104 */
+ { 0x00312D, 0x003130 }, /* 312D-3130 */
+ { 0x00318F, 0x00318F }, /* 318F */
+ { 0x0031B8, 0x0031EF }, /* 31B8-31EF */
+ { 0x00321D, 0x00321F }, /* 321D-321F */
+ { 0x003244, 0x003250 }, /* 3244-3250 */
+ { 0x00327C, 0x00327E }, /* 327C-327E */
+ { 0x0032CC, 0x0032CF }, /* 32CC-32CF */
+ { 0x0032FF, 0x0032FF }, /* 32FF */
+ { 0x003377, 0x00337A }, /* 3377-337A */
+ { 0x0033DE, 0x0033DF }, /* 33DE-33DF */
+ { 0x0033FF, 0x0033FF }, /* 33FF */
+ { 0x004DB6, 0x004DFF }, /* 4DB6-4DFF */
+ { 0x009FA6, 0x009FFF }, /* 9FA6-9FFF */
+ { 0x00A48D, 0x00A48F }, /* A48D-A48F */
+ { 0x00A4C7, 0x00ABFF }, /* A4C7-ABFF */
+ { 0x00D7A4, 0x00D7FF }, /* D7A4-D7FF */
+ { 0x00FA2E, 0x00FA2F }, /* FA2E-FA2F */
+ { 0x00FA6B, 0x00FAFF }, /* FA6B-FAFF */
+ { 0x00FB07, 0x00FB12 }, /* FB07-FB12 */
+ { 0x00FB18, 0x00FB1C }, /* FB18-FB1C */
+ { 0x00FB37, 0x00FB37 }, /* FB37 */
+ { 0x00FB3D, 0x00FB3D }, /* FB3D */
+ { 0x00FB3F, 0x00FB3F }, /* FB3F */
+ { 0x00FB42, 0x00FB42 }, /* FB42 */
+ { 0x00FB45, 0x00FB45 }, /* FB45 */
+ { 0x00FBB2, 0x00FBD2 }, /* FBB2-FBD2 */
+ { 0x00FD40, 0x00FD4F }, /* FD40-FD4F */
+ { 0x00FD90, 0x00FD91 }, /* FD90-FD91 */
+ { 0x00FDC8, 0x00FDCF }, /* FDC8-FDCF */
+ { 0x00FDFD, 0x00FDFF }, /* FDFD-FDFF */
+ { 0x00FE10, 0x00FE1F }, /* FE10-FE1F */
+ { 0x00FE24, 0x00FE2F }, /* FE24-FE2F */
+ { 0x00FE47, 0x00FE48 }, /* FE47-FE48 */
+ { 0x00FE53, 0x00FE53 }, /* FE53 */
+ { 0x00FE67, 0x00FE67 }, /* FE67 */
+ { 0x00FE6C, 0x00FE6F }, /* FE6C-FE6F */
+ { 0x00FE75, 0x00FE75 }, /* FE75 */
+ { 0x00FEFD, 0x00FEFE }, /* FEFD-FEFE */
+ { 0x00FF00, 0x00FF00 }, /* FF00 */
+ { 0x00FFBF, 0x00FFC1 }, /* FFBF-FFC1 */
+ { 0x00FFC8, 0x00FFC9 }, /* FFC8-FFC9 */
+ { 0x00FFD0, 0x00FFD1 }, /* FFD0-FFD1 */
+ { 0x00FFD8, 0x00FFD9 }, /* FFD8-FFD9 */
+ { 0x00FFDD, 0x00FFDF }, /* FFDD-FFDF */
+ { 0x00FFE7, 0x00FFE7 }, /* FFE7 */
+ { 0x00FFEF, 0x00FFF8 }, /* FFEF-FFF8 */
+ { 0x010000, 0x0102FF }, /* 10000-102FF */
+ { 0x01031F, 0x01031F }, /* 1031F */
+ { 0x010324, 0x01032F }, /* 10324-1032F */
+ { 0x01034B, 0x0103FF }, /* 1034B-103FF */
+ { 0x010426, 0x010427 }, /* 10426-10427 */
+ { 0x01044E, 0x01CFFF }, /* 1044E-1CFFF */
+ { 0x01D0F6, 0x01D0FF }, /* 1D0F6-1D0FF */
+ { 0x01D127, 0x01D129 }, /* 1D127-1D129 */
+ { 0x01D1DE, 0x01D3FF }, /* 1D1DE-1D3FF */
+ { 0x01D455, 0x01D455 }, /* 1D455 */
+ { 0x01D49D, 0x01D49D }, /* 1D49D */
+ { 0x01D4A0, 0x01D4A1 }, /* 1D4A0-1D4A1 */
+ { 0x01D4A3, 0x01D4A4 }, /* 1D4A3-1D4A4 */
+ { 0x01D4A7, 0x01D4A8 }, /* 1D4A7-1D4A8 */
+ { 0x01D4AD, 0x01D4AD }, /* 1D4AD */
+ { 0x01D4BA, 0x01D4BA }, /* 1D4BA */
+ { 0x01D4BC, 0x01D4BC }, /* 1D4BC */
+ { 0x01D4C1, 0x01D4C1 }, /* 1D4C1 */
+ { 0x01D4C4, 0x01D4C4 }, /* 1D4C4 */
+ { 0x01D506, 0x01D506 }, /* 1D506 */
+ { 0x01D50B, 0x01D50C }, /* 1D50B-1D50C */
+ { 0x01D515, 0x01D515 }, /* 1D515 */
+ { 0x01D51D, 0x01D51D }, /* 1D51D */
+ { 0x01D53A, 0x01D53A }, /* 1D53A */
+ { 0x01D53F, 0x01D53F }, /* 1D53F */
+ { 0x01D545, 0x01D545 }, /* 1D545 */
+ { 0x01D547, 0x01D549 }, /* 1D547-1D549 */
+ { 0x01D551, 0x01D551 }, /* 1D551 */
+ { 0x01D6A4, 0x01D6A7 }, /* 1D6A4-1D6A7 */
+ { 0x01D7CA, 0x01D7CD }, /* 1D7CA-1D7CD */
+ { 0x01D800, 0x01FFFD }, /* 1D800-1FFFD */
+ { 0x02A6D7, 0x02F7FF }, /* 2A6D7-2F7FF */
+ { 0x02FA1E, 0x02FFFD }, /* 2FA1E-2FFFD */
+ { 0x030000, 0x03FFFD }, /* 30000-3FFFD */
+ { 0x040000, 0x04FFFD }, /* 40000-4FFFD */
+ { 0x050000, 0x05FFFD }, /* 50000-5FFFD */
+ { 0x060000, 0x06FFFD }, /* 60000-6FFFD */
+ { 0x070000, 0x07FFFD }, /* 70000-7FFFD */
+ { 0x080000, 0x08FFFD }, /* 80000-8FFFD */
+ { 0x090000, 0x09FFFD }, /* 90000-9FFFD */
+ { 0x0A0000, 0x0AFFFD }, /* A0000-AFFFD */
+ { 0x0B0000, 0x0BFFFD }, /* B0000-BFFFD */
+ { 0x0C0000, 0x0CFFFD }, /* C0000-CFFFD */
+ { 0x0D0000, 0x0DFFFD }, /* D0000-DFFFD */
+ { 0x0E0000, 0x0E0000 }, /* E0000 */
+ { 0x0E0002, 0x0E001F }, /* E0002-E001F */
+ { 0x0E0080, 0x0EFFFD }, /* E0080-EFFFD */
+ { 0 },
+};
+
+/*
+ * E0080-EFFFD
+ *
+ */
+
+const Stringprep_table_element stringprep_rfc3454_B_1[] = {
+ { 0x0000AD, 0x0000AD }, /* 00AD; ; Map to nothing */
+ { 0x00034F, 0x00034F }, /* 034F; ; Map to nothing */
+ { 0x001806, 0x001806 }, /* 1806; ; Map to nothing */
+ { 0x00180B, 0x00180B }, /* 180B; ; Map to nothing */
+ { 0x00180C, 0x00180C }, /* 180C; ; Map to nothing */
+ { 0x00180D, 0x00180D }, /* 180D; ; Map to nothing */
+ { 0x00200B, 0x00200B }, /* 200B; ; Map to nothing */
+ { 0x00200C, 0x00200C }, /* 200C; ; Map to nothing */
+ { 0x00200D, 0x00200D }, /* 200D; ; Map to nothing */
+ { 0x002060, 0x002060 }, /* 2060; ; Map to nothing */
+ { 0x00FE00, 0x00FE00 }, /* FE00; ; Map to nothing */
+ { 0x00FE01, 0x00FE01 }, /* FE01; ; Map to nothing */
+ { 0x00FE02, 0x00FE02 }, /* FE02; ; Map to nothing */
+ { 0x00FE03, 0x00FE03 }, /* FE03; ; Map to nothing */
+ { 0x00FE04, 0x00FE04 }, /* FE04; ; Map to nothing */
+ { 0x00FE05, 0x00FE05 }, /* FE05; ; Map to nothing */
+ { 0x00FE06, 0x00FE06 }, /* FE06; ; Map to nothing */
+ { 0x00FE07, 0x00FE07 }, /* FE07; ; Map to nothing */
+ { 0x00FE08, 0x00FE08 }, /* FE08; ; Map to nothing */
+ { 0x00FE09, 0x00FE09 }, /* FE09; ; Map to nothing */
+ { 0x00FE0A, 0x00FE0A }, /* FE0A; ; Map to nothing */
+ { 0x00FE0B, 0x00FE0B }, /* FE0B; ; Map to nothing */
+ { 0x00FE0C, 0x00FE0C }, /* FE0C; ; Map to nothing */
+ { 0x00FE0D, 0x00FE0D }, /* FE0D; ; Map to nothing */
+ { 0x00FE0E, 0x00FE0E }, /* FE0E; ; Map to nothing */
+ { 0x00FE0F, 0x00FE0F }, /* FE0F; ; Map to nothing */
+ { 0x00FEFF, 0x00FEFF }, /* FEFF; ; Map to nothing */
+ { 0 },
+};
+
+/*
+ * FEFF; ; Map to nothing
+ *
+ */
+
+const Stringprep_table_element stringprep_rfc3454_B_2[] = {
+ { 0x000041, 0x000041, { 0x000061 } }, /* 0041; 0061; Case map */
+ { 0x000042, 0x000042, { 0x000062 } }, /* 0042; 0062; Case map */
+ { 0x000043, 0x000043, { 0x000063 } }, /* 0043; 0063; Case map */
+ { 0x000044, 0x000044, { 0x000064 } }, /* 0044; 0064; Case map */
+ { 0x000045, 0x000045, { 0x000065 } }, /* 0045; 0065; Case map */
+ { 0x000046, 0x000046, { 0x000066 } }, /* 0046; 0066; Case map */
+ { 0x000047, 0x000047, { 0x000067 } }, /* 0047; 0067; Case map */
+ { 0x000048, 0x000048, { 0x000068 } }, /* 0048; 0068; Case map */
+ { 0x000049, 0x000049, { 0x000069 } }, /* 0049; 0069; Case map */
+ { 0x00004A, 0x00004A, { 0x00006A } }, /* 004A; 006A; Case map */
+ { 0x00004B, 0x00004B, { 0x00006B } }, /* 004B; 006B; Case map */
+ { 0x00004C, 0x00004C, { 0x00006C } }, /* 004C; 006C; Case map */
+ { 0x00004D, 0x00004D, { 0x00006D } }, /* 004D; 006D; Case map */
+ { 0x00004E, 0x00004E, { 0x00006E } }, /* 004E; 006E; Case map */
+ { 0x00004F, 0x00004F, { 0x00006F } }, /* 004F; 006F; Case map */
+ { 0x000050, 0x000050, { 0x000070 } }, /* 0050; 0070; Case map */
+ { 0x000051, 0x000051, { 0x000071 } }, /* 0051; 0071; Case map */
+ { 0x000052, 0x000052, { 0x000072 } }, /* 0052; 0072; Case map */
+ { 0x000053, 0x000053, { 0x000073 } }, /* 0053; 0073; Case map */
+ { 0x000054, 0x000054, { 0x000074 } }, /* 0054; 0074; Case map */
+ { 0x000055, 0x000055, { 0x000075 } }, /* 0055; 0075; Case map */
+ { 0x000056, 0x000056, { 0x000076 } }, /* 0056; 0076; Case map */
+ { 0x000057, 0x000057, { 0x000077 } }, /* 0057; 0077; Case map */
+ { 0x000058, 0x000058, { 0x000078 } }, /* 0058; 0078; Case map */
+ { 0x000059, 0x000059, { 0x000079 } }, /* 0059; 0079; Case map */
+ { 0x00005A, 0x00005A, { 0x00007A } }, /* 005A; 007A; Case map */
+ { 0x0000B5, 0x0000B5, { 0x0003BC } }, /* 00B5; 03BC; Case map */
+ { 0x0000C0, 0x0000C0, { 0x0000E0 } }, /* 00C0; 00E0; Case map */
+ { 0x0000C1, 0x0000C1, { 0x0000E1 } }, /* 00C1; 00E1; Case map */
+ { 0x0000C2, 0x0000C2, { 0x0000E2 } }, /* 00C2; 00E2; Case map */
+ { 0x0000C3, 0x0000C3, { 0x0000E3 } }, /* 00C3; 00E3; Case map */
+ { 0x0000C4, 0x0000C4, { 0x0000E4 } }, /* 00C4; 00E4; Case map */
+ { 0x0000C5, 0x0000C5, { 0x0000E5 } }, /* 00C5; 00E5; Case map */
+ { 0x0000C6, 0x0000C6, { 0x0000E6 } }, /* 00C6; 00E6; Case map */
+ { 0x0000C7, 0x0000C7, { 0x0000E7 } }, /* 00C7; 00E7; Case map */
+ { 0x0000C8, 0x0000C8, { 0x0000E8 } }, /* 00C8; 00E8; Case map */
+ { 0x0000C9, 0x0000C9, { 0x0000E9 } }, /* 00C9; 00E9; Case map */
+ { 0x0000CA, 0x0000CA, { 0x0000EA } }, /* 00CA; 00EA; Case map */
+ { 0x0000CB, 0x0000CB, { 0x0000EB } }, /* 00CB; 00EB; Case map */
+ { 0x0000CC, 0x0000CC, { 0x0000EC } }, /* 00CC; 00EC; Case map */
+ { 0x0000CD, 0x0000CD, { 0x0000ED } }, /* 00CD; 00ED; Case map */
+ { 0x0000CE, 0x0000CE, { 0x0000EE } }, /* 00CE; 00EE; Case map */
+ { 0x0000CF, 0x0000CF, { 0x0000EF } }, /* 00CF; 00EF; Case map */
+ { 0x0000D0, 0x0000D0, { 0x0000F0 } }, /* 00D0; 00F0; Case map */
+ { 0x0000D1, 0x0000D1, { 0x0000F1 } }, /* 00D1; 00F1; Case map */
+ { 0x0000D2, 0x0000D2, { 0x0000F2 } }, /* 00D2; 00F2; Case map */
+ { 0x0000D3, 0x0000D3, { 0x0000F3 } }, /* 00D3; 00F3; Case map */
+ { 0x0000D4, 0x0000D4, { 0x0000F4 } }, /* 00D4; 00F4; Case map */
+ { 0x0000D5, 0x0000D5, { 0x0000F5 } }, /* 00D5; 00F5; Case map */
+ { 0x0000D6, 0x0000D6, { 0x0000F6 } }, /* 00D6; 00F6; Case map */
+ { 0x0000D8, 0x0000D8, { 0x0000F8 } }, /* 00D8; 00F8; Case map */
+ { 0x0000D9, 0x0000D9, { 0x0000F9 } }, /* 00D9; 00F9; Case map */
+ { 0x0000DA, 0x0000DA, { 0x0000FA } }, /* 00DA; 00FA; Case map */
+ { 0x0000DB, 0x0000DB, { 0x0000FB } }, /* 00DB; 00FB; Case map */
+ { 0x0000DC, 0x0000DC, { 0x0000FC } }, /* 00DC; 00FC; Case map */
+ { 0x0000DD, 0x0000DD, { 0x0000FD } }, /* 00DD; 00FD; Case map */
+ { 0x0000DE, 0x0000DE, { 0x0000FE } }, /* 00DE; 00FE; Case map */
+ { 0x0000DF,
+ 0x0000DF,
+ { 0x000073, /* 00DF; 0073 0073; Case map */
+ 0x000073 } },
+ { 0x000100, 0x000100, { 0x000101 } }, /* 0100; 0101; Case map */
+ { 0x000102, 0x000102, { 0x000103 } }, /* 0102; 0103; Case map */
+ { 0x000104, 0x000104, { 0x000105 } }, /* 0104; 0105; Case map */
+ { 0x000106, 0x000106, { 0x000107 } }, /* 0106; 0107; Case map */
+ { 0x000108, 0x000108, { 0x000109 } }, /* 0108; 0109; Case map */
+ { 0x00010A, 0x00010A, { 0x00010B } }, /* 010A; 010B; Case map */
+ { 0x00010C, 0x00010C, { 0x00010D } }, /* 010C; 010D; Case map */
+ { 0x00010E, 0x00010E, { 0x00010F } }, /* 010E; 010F; Case map */
+ { 0x000110, 0x000110, { 0x000111 } }, /* 0110; 0111; Case map */
+ { 0x000112, 0x000112, { 0x000113 } }, /* 0112; 0113; Case map */
+ { 0x000114, 0x000114, { 0x000115 } }, /* 0114; 0115; Case map */
+ { 0x000116, 0x000116, { 0x000117 } }, /* 0116; 0117; Case map */
+ { 0x000118, 0x000118, { 0x000119 } }, /* 0118; 0119; Case map */
+ { 0x00011A, 0x00011A, { 0x00011B } }, /* 011A; 011B; Case map */
+ { 0x00011C, 0x00011C, { 0x00011D } }, /* 011C; 011D; Case map */
+ { 0x00011E, 0x00011E, { 0x00011F } }, /* 011E; 011F; Case map */
+ { 0x000120, 0x000120, { 0x000121 } }, /* 0120; 0121; Case map */
+ { 0x000122, 0x000122, { 0x000123 } }, /* 0122; 0123; Case map */
+ { 0x000124, 0x000124, { 0x000125 } }, /* 0124; 0125; Case map */
+ { 0x000126, 0x000126, { 0x000127 } }, /* 0126; 0127; Case map */
+ { 0x000128, 0x000128, { 0x000129 } }, /* 0128; 0129; Case map */
+ { 0x00012A, 0x00012A, { 0x00012B } }, /* 012A; 012B; Case map */
+ { 0x00012C, 0x00012C, { 0x00012D } }, /* 012C; 012D; Case map */
+ { 0x00012E, 0x00012E, { 0x00012F } }, /* 012E; 012F; Case map */
+ { 0x000130,
+ 0x000130,
+ { 0x000069, /* 0130; 0069 0307; Case map */
+ 0x000307 } },
+ { 0x000132, 0x000132, { 0x000133 } }, /* 0132; 0133; Case map */
+ { 0x000134, 0x000134, { 0x000135 } }, /* 0134; 0135; Case map */
+ { 0x000136, 0x000136, { 0x000137 } }, /* 0136; 0137; Case map */
+ { 0x000139, 0x000139, { 0x00013A } }, /* 0139; 013A; Case map */
+ { 0x00013B, 0x00013B, { 0x00013C } }, /* 013B; 013C; Case map */
+ { 0x00013D, 0x00013D, { 0x00013E } }, /* 013D; 013E; Case map */
+ { 0x00013F, 0x00013F, { 0x000140 } }, /* 013F; 0140; Case map */
+ { 0x000141, 0x000141, { 0x000142 } }, /* 0141; 0142; Case map */
+ { 0x000143, 0x000143, { 0x000144 } }, /* 0143; 0144; Case map */
+ { 0x000145, 0x000145, { 0x000146 } }, /* 0145; 0146; Case map */
+ { 0x000147, 0x000147, { 0x000148 } }, /* 0147; 0148; Case map */
+ { 0x000149,
+ 0x000149,
+ { 0x0002BC, /* 0149; 02BC 006E; Case map */
+ 0x00006E } },
+ { 0x00014A, 0x00014A, { 0x00014B } }, /* 014A; 014B; Case map */
+ { 0x00014C, 0x00014C, { 0x00014D } }, /* 014C; 014D; Case map */
+ { 0x00014E, 0x00014E, { 0x00014F } }, /* 014E; 014F; Case map */
+ { 0x000150, 0x000150, { 0x000151 } }, /* 0150; 0151; Case map */
+ { 0x000152, 0x000152, { 0x000153 } }, /* 0152; 0153; Case map */
+ { 0x000154, 0x000154, { 0x000155 } }, /* 0154; 0155; Case map */
+ { 0x000156, 0x000156, { 0x000157 } }, /* 0156; 0157; Case map */
+ { 0x000158, 0x000158, { 0x000159 } }, /* 0158; 0159; Case map */
+ { 0x00015A, 0x00015A, { 0x00015B } }, /* 015A; 015B; Case map */
+ { 0x00015C, 0x00015C, { 0x00015D } }, /* 015C; 015D; Case map */
+ { 0x00015E, 0x00015E, { 0x00015F } }, /* 015E; 015F; Case map */
+ { 0x000160, 0x000160, { 0x000161 } }, /* 0160; 0161; Case map */
+ { 0x000162, 0x000162, { 0x000163 } }, /* 0162; 0163; Case map */
+ { 0x000164, 0x000164, { 0x000165 } }, /* 0164; 0165; Case map */
+ { 0x000166, 0x000166, { 0x000167 } }, /* 0166; 0167; Case map */
+ { 0x000168, 0x000168, { 0x000169 } }, /* 0168; 0169; Case map */
+ { 0x00016A, 0x00016A, { 0x00016B } }, /* 016A; 016B; Case map */
+ { 0x00016C, 0x00016C, { 0x00016D } }, /* 016C; 016D; Case map */
+ { 0x00016E, 0x00016E, { 0x00016F } }, /* 016E; 016F; Case map */
+ { 0x000170, 0x000170, { 0x000171 } }, /* 0170; 0171; Case map */
+ { 0x000172, 0x000172, { 0x000173 } }, /* 0172; 0173; Case map */
+ { 0x000174, 0x000174, { 0x000175 } }, /* 0174; 0175; Case map */
+ { 0x000176, 0x000176, { 0x000177 } }, /* 0176; 0177; Case map */
+ { 0x000178, 0x000178, { 0x0000FF } }, /* 0178; 00FF; Case map */
+ { 0x000179, 0x000179, { 0x00017A } }, /* 0179; 017A; Case map */
+ { 0x00017B, 0x00017B, { 0x00017C } }, /* 017B; 017C; Case map */
+ { 0x00017D, 0x00017D, { 0x00017E } }, /* 017D; 017E; Case map */
+ { 0x00017F, 0x00017F, { 0x000073 } }, /* 017F; 0073; Case map */
+ { 0x000181, 0x000181, { 0x000253 } }, /* 0181; 0253; Case map */
+ { 0x000182, 0x000182, { 0x000183 } }, /* 0182; 0183; Case map */
+ { 0x000184, 0x000184, { 0x000185 } }, /* 0184; 0185; Case map */
+ { 0x000186, 0x000186, { 0x000254 } }, /* 0186; 0254; Case map */
+ { 0x000187, 0x000187, { 0x000188 } }, /* 0187; 0188; Case map */
+ { 0x000189, 0x000189, { 0x000256 } }, /* 0189; 0256; Case map */
+ { 0x00018A, 0x00018A, { 0x000257 } }, /* 018A; 0257; Case map */
+ { 0x00018B, 0x00018B, { 0x00018C } }, /* 018B; 018C; Case map */
+ { 0x00018E, 0x00018E, { 0x0001DD } }, /* 018E; 01DD; Case map */
+ { 0x00018F, 0x00018F, { 0x000259 } }, /* 018F; 0259; Case map */
+ { 0x000190, 0x000190, { 0x00025B } }, /* 0190; 025B; Case map */
+ { 0x000191, 0x000191, { 0x000192 } }, /* 0191; 0192; Case map */
+ { 0x000193, 0x000193, { 0x000260 } }, /* 0193; 0260; Case map */
+ { 0x000194, 0x000194, { 0x000263 } }, /* 0194; 0263; Case map */
+ { 0x000196, 0x000196, { 0x000269 } }, /* 0196; 0269; Case map */
+ { 0x000197, 0x000197, { 0x000268 } }, /* 0197; 0268; Case map */
+ { 0x000198, 0x000198, { 0x000199 } }, /* 0198; 0199; Case map */
+ { 0x00019C, 0x00019C, { 0x00026F } }, /* 019C; 026F; Case map */
+ { 0x00019D, 0x00019D, { 0x000272 } }, /* 019D; 0272; Case map */
+ { 0x00019F, 0x00019F, { 0x000275 } }, /* 019F; 0275; Case map */
+ { 0x0001A0, 0x0001A0, { 0x0001A1 } }, /* 01A0; 01A1; Case map */
+ { 0x0001A2, 0x0001A2, { 0x0001A3 } }, /* 01A2; 01A3; Case map */
+ { 0x0001A4, 0x0001A4, { 0x0001A5 } }, /* 01A4; 01A5; Case map */
+ { 0x0001A6, 0x0001A6, { 0x000280 } }, /* 01A6; 0280; Case map */
+ { 0x0001A7, 0x0001A7, { 0x0001A8 } }, /* 01A7; 01A8; Case map */
+ { 0x0001A9, 0x0001A9, { 0x000283 } }, /* 01A9; 0283; Case map */
+ { 0x0001AC, 0x0001AC, { 0x0001AD } }, /* 01AC; 01AD; Case map */
+ { 0x0001AE, 0x0001AE, { 0x000288 } }, /* 01AE; 0288; Case map */
+ { 0x0001AF, 0x0001AF, { 0x0001B0 } }, /* 01AF; 01B0; Case map */
+ { 0x0001B1, 0x0001B1, { 0x00028A } }, /* 01B1; 028A; Case map */
+ { 0x0001B2, 0x0001B2, { 0x00028B } }, /* 01B2; 028B; Case map */
+ { 0x0001B3, 0x0001B3, { 0x0001B4 } }, /* 01B3; 01B4; Case map */
+ { 0x0001B5, 0x0001B5, { 0x0001B6 } }, /* 01B5; 01B6; Case map */
+ { 0x0001B7, 0x0001B7, { 0x000292 } }, /* 01B7; 0292; Case map */
+ { 0x0001B8, 0x0001B8, { 0x0001B9 } }, /* 01B8; 01B9; Case map */
+ { 0x0001BC, 0x0001BC, { 0x0001BD } }, /* 01BC; 01BD; Case map */
+ { 0x0001C4, 0x0001C4, { 0x0001C6 } }, /* 01C4; 01C6; Case map */
+ { 0x0001C5, 0x0001C5, { 0x0001C6 } }, /* 01C5; 01C6; Case map */
+ { 0x0001C7, 0x0001C7, { 0x0001C9 } }, /* 01C7; 01C9; Case map */
+ { 0x0001C8, 0x0001C8, { 0x0001C9 } }, /* 01C8; 01C9; Case map */
+ { 0x0001CA, 0x0001CA, { 0x0001CC } }, /* 01CA; 01CC; Case map */
+ { 0x0001CB, 0x0001CB, { 0x0001CC } }, /* 01CB; 01CC; Case map */
+ { 0x0001CD, 0x0001CD, { 0x0001CE } }, /* 01CD; 01CE; Case map */
+ { 0x0001CF, 0x0001CF, { 0x0001D0 } }, /* 01CF; 01D0; Case map */
+ { 0x0001D1, 0x0001D1, { 0x0001D2 } }, /* 01D1; 01D2; Case map */
+ { 0x0001D3, 0x0001D3, { 0x0001D4 } }, /* 01D3; 01D4; Case map */
+ { 0x0001D5, 0x0001D5, { 0x0001D6 } }, /* 01D5; 01D6; Case map */
+ { 0x0001D7, 0x0001D7, { 0x0001D8 } }, /* 01D7; 01D8; Case map */
+ { 0x0001D9, 0x0001D9, { 0x0001DA } }, /* 01D9; 01DA; Case map */
+ { 0x0001DB, 0x0001DB, { 0x0001DC } }, /* 01DB; 01DC; Case map */
+ { 0x0001DE, 0x0001DE, { 0x0001DF } }, /* 01DE; 01DF; Case map */
+ { 0x0001E0, 0x0001E0, { 0x0001E1 } }, /* 01E0; 01E1; Case map */
+ { 0x0001E2, 0x0001E2, { 0x0001E3 } }, /* 01E2; 01E3; Case map */
+ { 0x0001E4, 0x0001E4, { 0x0001E5 } }, /* 01E4; 01E5; Case map */
+ { 0x0001E6, 0x0001E6, { 0x0001E7 } }, /* 01E6; 01E7; Case map */
+ { 0x0001E8, 0x0001E8, { 0x0001E9 } }, /* 01E8; 01E9; Case map */
+ { 0x0001EA, 0x0001EA, { 0x0001EB } }, /* 01EA; 01EB; Case map */
+ { 0x0001EC, 0x0001EC, { 0x0001ED } }, /* 01EC; 01ED; Case map */
+ { 0x0001EE, 0x0001EE, { 0x0001EF } }, /* 01EE; 01EF; Case map */
+ { 0x0001F0,
+ 0x0001F0,
+ { 0x00006A, /* 01F0; 006A 030C; Case map */
+ 0x00030C } },
+ { 0x0001F1, 0x0001F1, { 0x0001F3 } }, /* 01F1; 01F3; Case map */
+ { 0x0001F2, 0x0001F2, { 0x0001F3 } }, /* 01F2; 01F3; Case map */
+ { 0x0001F4, 0x0001F4, { 0x0001F5 } }, /* 01F4; 01F5; Case map */
+ { 0x0001F6, 0x0001F6, { 0x000195 } }, /* 01F6; 0195; Case map */
+ { 0x0001F7, 0x0001F7, { 0x0001BF } }, /* 01F7; 01BF; Case map */
+ { 0x0001F8, 0x0001F8, { 0x0001F9 } }, /* 01F8; 01F9; Case map */
+ { 0x0001FA, 0x0001FA, { 0x0001FB } }, /* 01FA; 01FB; Case map */
+ { 0x0001FC, 0x0001FC, { 0x0001FD } }, /* 01FC; 01FD; Case map */
+ { 0x0001FE, 0x0001FE, { 0x0001FF } }, /* 01FE; 01FF; Case map */
+ { 0x000200, 0x000200, { 0x000201 } }, /* 0200; 0201; Case map */
+ { 0x000202, 0x000202, { 0x000203 } }, /* 0202; 0203; Case map */
+ { 0x000204, 0x000204, { 0x000205 } }, /* 0204; 0205; Case map */
+ { 0x000206, 0x000206, { 0x000207 } }, /* 0206; 0207; Case map */
+ { 0x000208, 0x000208, { 0x000209 } }, /* 0208; 0209; Case map */
+ { 0x00020A, 0x00020A, { 0x00020B } }, /* 020A; 020B; Case map */
+ { 0x00020C, 0x00020C, { 0x00020D } }, /* 020C; 020D; Case map */
+ { 0x00020E, 0x00020E, { 0x00020F } }, /* 020E; 020F; Case map */
+ { 0x000210, 0x000210, { 0x000211 } }, /* 0210; 0211; Case map */
+ { 0x000212, 0x000212, { 0x000213 } }, /* 0212; 0213; Case map */
+ { 0x000214, 0x000214, { 0x000215 } }, /* 0214; 0215; Case map */
+ { 0x000216, 0x000216, { 0x000217 } }, /* 0216; 0217; Case map */
+ { 0x000218, 0x000218, { 0x000219 } }, /* 0218; 0219; Case map */
+ { 0x00021A, 0x00021A, { 0x00021B } }, /* 021A; 021B; Case map */
+ { 0x00021C, 0x00021C, { 0x00021D } }, /* 021C; 021D; Case map */
+ { 0x00021E, 0x00021E, { 0x00021F } }, /* 021E; 021F; Case map */
+ { 0x000220, 0x000220, { 0x00019E } }, /* 0220; 019E; Case map */
+ { 0x000222, 0x000222, { 0x000223 } }, /* 0222; 0223; Case map */
+ { 0x000224, 0x000224, { 0x000225 } }, /* 0224; 0225; Case map */
+ { 0x000226, 0x000226, { 0x000227 } }, /* 0226; 0227; Case map */
+ { 0x000228, 0x000228, { 0x000229 } }, /* 0228; 0229; Case map */
+ { 0x00022A, 0x00022A, { 0x00022B } }, /* 022A; 022B; Case map */
+ { 0x00022C, 0x00022C, { 0x00022D } }, /* 022C; 022D; Case map */
+ { 0x00022E, 0x00022E, { 0x00022F } }, /* 022E; 022F; Case map */
+ { 0x000230, 0x000230, { 0x000231 } }, /* 0230; 0231; Case map */
+ { 0x000232, 0x000232, { 0x000233 } }, /* 0232; 0233; Case map */
+ { 0x000345, 0x000345, { 0x0003B9 } }, /* 0345; 03B9; Case map */
+ { 0x00037A,
+ 0x00037A,
+ { 0x000020, /* 037A; 0020 03B9; Additional folding */
+ 0x0003B9 } },
+ { 0x000386, 0x000386, { 0x0003AC } }, /* 0386; 03AC; Case map */
+ { 0x000388, 0x000388, { 0x0003AD } }, /* 0388; 03AD; Case map */
+ { 0x000389, 0x000389, { 0x0003AE } }, /* 0389; 03AE; Case map */
+ { 0x00038A, 0x00038A, { 0x0003AF } }, /* 038A; 03AF; Case map */
+ { 0x00038C, 0x00038C, { 0x0003CC } }, /* 038C; 03CC; Case map */
+ { 0x00038E, 0x00038E, { 0x0003CD } }, /* 038E; 03CD; Case map */
+ { 0x00038F, 0x00038F, { 0x0003CE } }, /* 038F; 03CE; Case map */
+ { 0x000390,
+ 0x000390,
+ { 0x0003B9, /* 0390; 03B9 0308 0301; Case map */
+ 0x000308, 0x000301 } },
+ { 0x000391, 0x000391, { 0x0003B1 } }, /* 0391; 03B1; Case map */
+ { 0x000392, 0x000392, { 0x0003B2 } }, /* 0392; 03B2; Case map */
+ { 0x000393, 0x000393, { 0x0003B3 } }, /* 0393; 03B3; Case map */
+ { 0x000394, 0x000394, { 0x0003B4 } }, /* 0394; 03B4; Case map */
+ { 0x000395, 0x000395, { 0x0003B5 } }, /* 0395; 03B5; Case map */
+ { 0x000396, 0x000396, { 0x0003B6 } }, /* 0396; 03B6; Case map */
+ { 0x000397, 0x000397, { 0x0003B7 } }, /* 0397; 03B7; Case map */
+ { 0x000398, 0x000398, { 0x0003B8 } }, /* 0398; 03B8; Case map */
+ { 0x000399, 0x000399, { 0x0003B9 } }, /* 0399; 03B9; Case map */
+ { 0x00039A, 0x00039A, { 0x0003BA } }, /* 039A; 03BA; Case map */
+ { 0x00039B, 0x00039B, { 0x0003BB } }, /* 039B; 03BB; Case map */
+ { 0x00039C, 0x00039C, { 0x0003BC } }, /* 039C; 03BC; Case map */
+ { 0x00039D, 0x00039D, { 0x0003BD } }, /* 039D; 03BD; Case map */
+ { 0x00039E, 0x00039E, { 0x0003BE } }, /* 039E; 03BE; Case map */
+ { 0x00039F, 0x00039F, { 0x0003BF } }, /* 039F; 03BF; Case map */
+ { 0x0003A0, 0x0003A0, { 0x0003C0 } }, /* 03A0; 03C0; Case map */
+ { 0x0003A1, 0x0003A1, { 0x0003C1 } }, /* 03A1; 03C1; Case map */
+ { 0x0003A3, 0x0003A3, { 0x0003C3 } }, /* 03A3; 03C3; Case map */
+ { 0x0003A4, 0x0003A4, { 0x0003C4 } }, /* 03A4; 03C4; Case map */
+ { 0x0003A5, 0x0003A5, { 0x0003C5 } }, /* 03A5; 03C5; Case map */
+ { 0x0003A6, 0x0003A6, { 0x0003C6 } }, /* 03A6; 03C6; Case map */
+ { 0x0003A7, 0x0003A7, { 0x0003C7 } }, /* 03A7; 03C7; Case map */
+ { 0x0003A8, 0x0003A8, { 0x0003C8 } }, /* 03A8; 03C8; Case map */
+ { 0x0003A9, 0x0003A9, { 0x0003C9 } }, /* 03A9; 03C9; Case map */
+ { 0x0003AA, 0x0003AA, { 0x0003CA } }, /* 03AA; 03CA; Case map */
+ { 0x0003AB, 0x0003AB, { 0x0003CB } }, /* 03AB; 03CB; Case map */
+ { 0x0003B0,
+ 0x0003B0,
+ { 0x0003C5, /* 03B0; 03C5 0308 0301; Case map */
+ 0x000308, 0x000301 } },
+ { 0x0003C2, 0x0003C2, { 0x0003C3 } }, /* 03C2; 03C3; Case map */
+ { 0x0003D0, 0x0003D0, { 0x0003B2 } }, /* 03D0; 03B2; Case map */
+ { 0x0003D1, 0x0003D1, { 0x0003B8 } }, /* 03D1; 03B8; Case map */
+ { 0x0003D2, 0x0003D2, { 0x0003C5 } }, /* 03D2; 03C5; Additional folding */
+ { 0x0003D3, 0x0003D3, { 0x0003CD } }, /* 03D3; 03CD; Additional folding */
+ { 0x0003D4, 0x0003D4, { 0x0003CB } }, /* 03D4; 03CB; Additional folding */
+ { 0x0003D5, 0x0003D5, { 0x0003C6 } }, /* 03D5; 03C6; Case map */
+ { 0x0003D6, 0x0003D6, { 0x0003C0 } }, /* 03D6; 03C0; Case map */
+ { 0x0003D8, 0x0003D8, { 0x0003D9 } }, /* 03D8; 03D9; Case map */
+ { 0x0003DA, 0x0003DA, { 0x0003DB } }, /* 03DA; 03DB; Case map */
+ { 0x0003DC, 0x0003DC, { 0x0003DD } }, /* 03DC; 03DD; Case map */
+ { 0x0003DE, 0x0003DE, { 0x0003DF } }, /* 03DE; 03DF; Case map */
+ { 0x0003E0, 0x0003E0, { 0x0003E1 } }, /* 03E0; 03E1; Case map */
+ { 0x0003E2, 0x0003E2, { 0x0003E3 } }, /* 03E2; 03E3; Case map */
+ { 0x0003E4, 0x0003E4, { 0x0003E5 } }, /* 03E4; 03E5; Case map */
+ { 0x0003E6, 0x0003E6, { 0x0003E7 } }, /* 03E6; 03E7; Case map */
+ { 0x0003E8, 0x0003E8, { 0x0003E9 } }, /* 03E8; 03E9; Case map */
+ { 0x0003EA, 0x0003EA, { 0x0003EB } }, /* 03EA; 03EB; Case map */
+ { 0x0003EC, 0x0003EC, { 0x0003ED } }, /* 03EC; 03ED; Case map */
+ { 0x0003EE, 0x0003EE, { 0x0003EF } }, /* 03EE; 03EF; Case map */
+ { 0x0003F0, 0x0003F0, { 0x0003BA } }, /* 03F0; 03BA; Case map */
+ { 0x0003F1, 0x0003F1, { 0x0003C1 } }, /* 03F1; 03C1; Case map */
+ { 0x0003F2, 0x0003F2, { 0x0003C3 } }, /* 03F2; 03C3; Case map */
+ { 0x0003F4, 0x0003F4, { 0x0003B8 } }, /* 03F4; 03B8; Case map */
+ { 0x0003F5, 0x0003F5, { 0x0003B5 } }, /* 03F5; 03B5; Case map */
+ { 0x000400, 0x000400, { 0x000450 } }, /* 0400; 0450; Case map */
+ { 0x000401, 0x000401, { 0x000451 } }, /* 0401; 0451; Case map */
+ { 0x000402, 0x000402, { 0x000452 } }, /* 0402; 0452; Case map */
+ { 0x000403, 0x000403, { 0x000453 } }, /* 0403; 0453; Case map */
+ { 0x000404, 0x000404, { 0x000454 } }, /* 0404; 0454; Case map */
+ { 0x000405, 0x000405, { 0x000455 } }, /* 0405; 0455; Case map */
+ { 0x000406, 0x000406, { 0x000456 } }, /* 0406; 0456; Case map */
+ { 0x000407, 0x000407, { 0x000457 } }, /* 0407; 0457; Case map */
+ { 0x000408, 0x000408, { 0x000458 } }, /* 0408; 0458; Case map */
+ { 0x000409, 0x000409, { 0x000459 } }, /* 0409; 0459; Case map */
+ { 0x00040A, 0x00040A, { 0x00045A } }, /* 040A; 045A; Case map */
+ { 0x00040B, 0x00040B, { 0x00045B } }, /* 040B; 045B; Case map */
+ { 0x00040C, 0x00040C, { 0x00045C } }, /* 040C; 045C; Case map */
+ { 0x00040D, 0x00040D, { 0x00045D } }, /* 040D; 045D; Case map */
+ { 0x00040E, 0x00040E, { 0x00045E } }, /* 040E; 045E; Case map */
+ { 0x00040F, 0x00040F, { 0x00045F } }, /* 040F; 045F; Case map */
+ { 0x000410, 0x000410, { 0x000430 } }, /* 0410; 0430; Case map */
+ { 0x000411, 0x000411, { 0x000431 } }, /* 0411; 0431; Case map */
+ { 0x000412, 0x000412, { 0x000432 } }, /* 0412; 0432; Case map */
+ { 0x000413, 0x000413, { 0x000433 } }, /* 0413; 0433; Case map */
+ { 0x000414, 0x000414, { 0x000434 } }, /* 0414; 0434; Case map */
+ { 0x000415, 0x000415, { 0x000435 } }, /* 0415; 0435; Case map */
+ { 0x000416, 0x000416, { 0x000436 } }, /* 0416; 0436; Case map */
+ { 0x000417, 0x000417, { 0x000437 } }, /* 0417; 0437; Case map */
+ { 0x000418, 0x000418, { 0x000438 } }, /* 0418; 0438; Case map */
+ { 0x000419, 0x000419, { 0x000439 } }, /* 0419; 0439; Case map */
+ { 0x00041A, 0x00041A, { 0x00043A } }, /* 041A; 043A; Case map */
+ { 0x00041B, 0x00041B, { 0x00043B } }, /* 041B; 043B; Case map */
+ { 0x00041C, 0x00041C, { 0x00043C } }, /* 041C; 043C; Case map */
+ { 0x00041D, 0x00041D, { 0x00043D } }, /* 041D; 043D; Case map */
+ { 0x00041E, 0x00041E, { 0x00043E } }, /* 041E; 043E; Case map */
+ { 0x00041F, 0x00041F, { 0x00043F } }, /* 041F; 043F; Case map */
+ { 0x000420, 0x000420, { 0x000440 } }, /* 0420; 0440; Case map */
+ { 0x000421, 0x000421, { 0x000441 } }, /* 0421; 0441; Case map */
+ { 0x000422, 0x000422, { 0x000442 } }, /* 0422; 0442; Case map */
+ { 0x000423, 0x000423, { 0x000443 } }, /* 0423; 0443; Case map */
+ { 0x000424, 0x000424, { 0x000444 } }, /* 0424; 0444; Case map */
+ { 0x000425, 0x000425, { 0x000445 } }, /* 0425; 0445; Case map */
+ { 0x000426, 0x000426, { 0x000446 } }, /* 0426; 0446; Case map */
+ { 0x000427, 0x000427, { 0x000447 } }, /* 0427; 0447; Case map */
+ { 0x000428, 0x000428, { 0x000448 } }, /* 0428; 0448; Case map */
+ { 0x000429, 0x000429, { 0x000449 } }, /* 0429; 0449; Case map */
+ { 0x00042A, 0x00042A, { 0x00044A } }, /* 042A; 044A; Case map */
+ { 0x00042B, 0x00042B, { 0x00044B } }, /* 042B; 044B; Case map */
+ { 0x00042C, 0x00042C, { 0x00044C } }, /* 042C; 044C; Case map */
+ { 0x00042D, 0x00042D, { 0x00044D } }, /* 042D; 044D; Case map */
+ { 0x00042E, 0x00042E, { 0x00044E } }, /* 042E; 044E; Case map */
+ { 0x00042F, 0x00042F, { 0x00044F } }, /* 042F; 044F; Case map */
+ { 0x000460, 0x000460, { 0x000461 } }, /* 0460; 0461; Case map */
+ { 0x000462, 0x000462, { 0x000463 } }, /* 0462; 0463; Case map */
+ { 0x000464, 0x000464, { 0x000465 } }, /* 0464; 0465; Case map */
+ { 0x000466, 0x000466, { 0x000467 } }, /* 0466; 0467; Case map */
+ { 0x000468, 0x000468, { 0x000469 } }, /* 0468; 0469; Case map */
+ { 0x00046A, 0x00046A, { 0x00046B } }, /* 046A; 046B; Case map */
+ { 0x00046C, 0x00046C, { 0x00046D } }, /* 046C; 046D; Case map */
+ { 0x00046E, 0x00046E, { 0x00046F } }, /* 046E; 046F; Case map */
+ { 0x000470, 0x000470, { 0x000471 } }, /* 0470; 0471; Case map */
+ { 0x000472, 0x000472, { 0x000473 } }, /* 0472; 0473; Case map */
+ { 0x000474, 0x000474, { 0x000475 } }, /* 0474; 0475; Case map */
+ { 0x000476, 0x000476, { 0x000477 } }, /* 0476; 0477; Case map */
+ { 0x000478, 0x000478, { 0x000479 } }, /* 0478; 0479; Case map */
+ { 0x00047A, 0x00047A, { 0x00047B } }, /* 047A; 047B; Case map */
+ { 0x00047C, 0x00047C, { 0x00047D } }, /* 047C; 047D; Case map */
+ { 0x00047E, 0x00047E, { 0x00047F } }, /* 047E; 047F; Case map */
+ { 0x000480, 0x000480, { 0x000481 } }, /* 0480; 0481; Case map */
+ { 0x00048A, 0x00048A, { 0x00048B } }, /* 048A; 048B; Case map */
+ { 0x00048C, 0x00048C, { 0x00048D } }, /* 048C; 048D; Case map */
+ { 0x00048E, 0x00048E, { 0x00048F } }, /* 048E; 048F; Case map */
+ { 0x000490, 0x000490, { 0x000491 } }, /* 0490; 0491; Case map */
+ { 0x000492, 0x000492, { 0x000493 } }, /* 0492; 0493; Case map */
+ { 0x000494, 0x000494, { 0x000495 } }, /* 0494; 0495; Case map */
+ { 0x000496, 0x000496, { 0x000497 } }, /* 0496; 0497; Case map */
+ { 0x000498, 0x000498, { 0x000499 } }, /* 0498; 0499; Case map */
+ { 0x00049A, 0x00049A, { 0x00049B } }, /* 049A; 049B; Case map */
+ { 0x00049C, 0x00049C, { 0x00049D } }, /* 049C; 049D; Case map */
+ { 0x00049E, 0x00049E, { 0x00049F } }, /* 049E; 049F; Case map */
+ { 0x0004A0, 0x0004A0, { 0x0004A1 } }, /* 04A0; 04A1; Case map */
+ { 0x0004A2, 0x0004A2, { 0x0004A3 } }, /* 04A2; 04A3; Case map */
+ { 0x0004A4, 0x0004A4, { 0x0004A5 } }, /* 04A4; 04A5; Case map */
+ { 0x0004A6, 0x0004A6, { 0x0004A7 } }, /* 04A6; 04A7; Case map */
+ { 0x0004A8, 0x0004A8, { 0x0004A9 } }, /* 04A8; 04A9; Case map */
+ { 0x0004AA, 0x0004AA, { 0x0004AB } }, /* 04AA; 04AB; Case map */
+ { 0x0004AC, 0x0004AC, { 0x0004AD } }, /* 04AC; 04AD; Case map */
+ { 0x0004AE, 0x0004AE, { 0x0004AF } }, /* 04AE; 04AF; Case map */
+ { 0x0004B0, 0x0004B0, { 0x0004B1 } }, /* 04B0; 04B1; Case map */
+ { 0x0004B2, 0x0004B2, { 0x0004B3 } }, /* 04B2; 04B3; Case map */
+ { 0x0004B4, 0x0004B4, { 0x0004B5 } }, /* 04B4; 04B5; Case map */
+ { 0x0004B6, 0x0004B6, { 0x0004B7 } }, /* 04B6; 04B7; Case map */
+ { 0x0004B8, 0x0004B8, { 0x0004B9 } }, /* 04B8; 04B9; Case map */
+ { 0x0004BA, 0x0004BA, { 0x0004BB } }, /* 04BA; 04BB; Case map */
+ { 0x0004BC, 0x0004BC, { 0x0004BD } }, /* 04BC; 04BD; Case map */
+ { 0x0004BE, 0x0004BE, { 0x0004BF } }, /* 04BE; 04BF; Case map */
+ { 0x0004C1, 0x0004C1, { 0x0004C2 } }, /* 04C1; 04C2; Case map */
+ { 0x0004C3, 0x0004C3, { 0x0004C4 } }, /* 04C3; 04C4; Case map */
+ { 0x0004C5, 0x0004C5, { 0x0004C6 } }, /* 04C5; 04C6; Case map */
+ { 0x0004C7, 0x0004C7, { 0x0004C8 } }, /* 04C7; 04C8; Case map */
+ { 0x0004C9, 0x0004C9, { 0x0004CA } }, /* 04C9; 04CA; Case map */
+ { 0x0004CB, 0x0004CB, { 0x0004CC } }, /* 04CB; 04CC; Case map */
+ { 0x0004CD, 0x0004CD, { 0x0004CE } }, /* 04CD; 04CE; Case map */
+ { 0x0004D0, 0x0004D0, { 0x0004D1 } }, /* 04D0; 04D1; Case map */
+ { 0x0004D2, 0x0004D2, { 0x0004D3 } }, /* 04D2; 04D3; Case map */
+ { 0x0004D4, 0x0004D4, { 0x0004D5 } }, /* 04D4; 04D5; Case map */
+ { 0x0004D6, 0x0004D6, { 0x0004D7 } }, /* 04D6; 04D7; Case map */
+ { 0x0004D8, 0x0004D8, { 0x0004D9 } }, /* 04D8; 04D9; Case map */
+ { 0x0004DA, 0x0004DA, { 0x0004DB } }, /* 04DA; 04DB; Case map */
+ { 0x0004DC, 0x0004DC, { 0x0004DD } }, /* 04DC; 04DD; Case map */
+ { 0x0004DE, 0x0004DE, { 0x0004DF } }, /* 04DE; 04DF; Case map */
+ { 0x0004E0, 0x0004E0, { 0x0004E1 } }, /* 04E0; 04E1; Case map */
+ { 0x0004E2, 0x0004E2, { 0x0004E3 } }, /* 04E2; 04E3; Case map */
+ { 0x0004E4, 0x0004E4, { 0x0004E5 } }, /* 04E4; 04E5; Case map */
+ { 0x0004E6, 0x0004E6, { 0x0004E7 } }, /* 04E6; 04E7; Case map */
+ { 0x0004E8, 0x0004E8, { 0x0004E9 } }, /* 04E8; 04E9; Case map */
+ { 0x0004EA, 0x0004EA, { 0x0004EB } }, /* 04EA; 04EB; Case map */
+ { 0x0004EC, 0x0004EC, { 0x0004ED } }, /* 04EC; 04ED; Case map */
+ { 0x0004EE, 0x0004EE, { 0x0004EF } }, /* 04EE; 04EF; Case map */
+ { 0x0004F0, 0x0004F0, { 0x0004F1 } }, /* 04F0; 04F1; Case map */
+ { 0x0004F2, 0x0004F2, { 0x0004F3 } }, /* 04F2; 04F3; Case map */
+ { 0x0004F4, 0x0004F4, { 0x0004F5 } }, /* 04F4; 04F5; Case map */
+ { 0x0004F8, 0x0004F8, { 0x0004F9 } }, /* 04F8; 04F9; Case map */
+ { 0x000500, 0x000500, { 0x000501 } }, /* 0500; 0501; Case map */
+ { 0x000502, 0x000502, { 0x000503 } }, /* 0502; 0503; Case map */
+ { 0x000504, 0x000504, { 0x000505 } }, /* 0504; 0505; Case map */
+ { 0x000506, 0x000506, { 0x000507 } }, /* 0506; 0507; Case map */
+ { 0x000508, 0x000508, { 0x000509 } }, /* 0508; 0509; Case map */
+ { 0x00050A, 0x00050A, { 0x00050B } }, /* 050A; 050B; Case map */
+ { 0x00050C, 0x00050C, { 0x00050D } }, /* 050C; 050D; Case map */
+ { 0x00050E, 0x00050E, { 0x00050F } }, /* 050E; 050F; Case map */
+ { 0x000531, 0x000531, { 0x000561 } }, /* 0531; 0561; Case map */
+ { 0x000532, 0x000532, { 0x000562 } }, /* 0532; 0562; Case map */
+ { 0x000533, 0x000533, { 0x000563 } }, /* 0533; 0563; Case map */
+ { 0x000534, 0x000534, { 0x000564 } }, /* 0534; 0564; Case map */
+ { 0x000535, 0x000535, { 0x000565 } }, /* 0535; 0565; Case map */
+ { 0x000536, 0x000536, { 0x000566 } }, /* 0536; 0566; Case map */
+ { 0x000537, 0x000537, { 0x000567 } }, /* 0537; 0567; Case map */
+ { 0x000538, 0x000538, { 0x000568 } }, /* 0538; 0568; Case map */
+ { 0x000539, 0x000539, { 0x000569 } }, /* 0539; 0569; Case map */
+ { 0x00053A, 0x00053A, { 0x00056A } }, /* 053A; 056A; Case map */
+ { 0x00053B, 0x00053B, { 0x00056B } }, /* 053B; 056B; Case map */
+ { 0x00053C, 0x00053C, { 0x00056C } }, /* 053C; 056C; Case map */
+ { 0x00053D, 0x00053D, { 0x00056D } }, /* 053D; 056D; Case map */
+ { 0x00053E, 0x00053E, { 0x00056E } }, /* 053E; 056E; Case map */
+ { 0x00053F, 0x00053F, { 0x00056F } }, /* 053F; 056F; Case map */
+ { 0x000540, 0x000540, { 0x000570 } }, /* 0540; 0570; Case map */
+ { 0x000541, 0x000541, { 0x000571 } }, /* 0541; 0571; Case map */
+ { 0x000542, 0x000542, { 0x000572 } }, /* 0542; 0572; Case map */
+ { 0x000543, 0x000543, { 0x000573 } }, /* 0543; 0573; Case map */
+ { 0x000544, 0x000544, { 0x000574 } }, /* 0544; 0574; Case map */
+ { 0x000545, 0x000545, { 0x000575 } }, /* 0545; 0575; Case map */
+ { 0x000546, 0x000546, { 0x000576 } }, /* 0546; 0576; Case map */
+ { 0x000547, 0x000547, { 0x000577 } }, /* 0547; 0577; Case map */
+ { 0x000548, 0x000548, { 0x000578 } }, /* 0548; 0578; Case map */
+ { 0x000549, 0x000549, { 0x000579 } }, /* 0549; 0579; Case map */
+ { 0x00054A, 0x00054A, { 0x00057A } }, /* 054A; 057A; Case map */
+ { 0x00054B, 0x00054B, { 0x00057B } }, /* 054B; 057B; Case map */
+ { 0x00054C, 0x00054C, { 0x00057C } }, /* 054C; 057C; Case map */
+ { 0x00054D, 0x00054D, { 0x00057D } }, /* 054D; 057D; Case map */
+ { 0x00054E, 0x00054E, { 0x00057E } }, /* 054E; 057E; Case map */
+ { 0x00054F, 0x00054F, { 0x00057F } }, /* 054F; 057F; Case map */
+ { 0x000550, 0x000550, { 0x000580 } }, /* 0550; 0580; Case map */
+ { 0x000551, 0x000551, { 0x000581 } }, /* 0551; 0581; Case map */
+ { 0x000552, 0x000552, { 0x000582 } }, /* 0552; 0582; Case map */
+ { 0x000553, 0x000553, { 0x000583 } }, /* 0553; 0583; Case map */
+ { 0x000554, 0x000554, { 0x000584 } }, /* 0554; 0584; Case map */
+ { 0x000555, 0x000555, { 0x000585 } }, /* 0555; 0585; Case map */
+ { 0x000556, 0x000556, { 0x000586 } }, /* 0556; 0586; Case map */
+ { 0x000587,
+ 0x000587,
+ { 0x000565, /* 0587; 0565 0582; Case map */
+ 0x000582 } },
+ { 0x001E00, 0x001E00, { 0x001E01 } }, /* 1E00; 1E01; Case map */
+ { 0x001E02, 0x001E02, { 0x001E03 } }, /* 1E02; 1E03; Case map */
+ { 0x001E04, 0x001E04, { 0x001E05 } }, /* 1E04; 1E05; Case map */
+ { 0x001E06, 0x001E06, { 0x001E07 } }, /* 1E06; 1E07; Case map */
+ { 0x001E08, 0x001E08, { 0x001E09 } }, /* 1E08; 1E09; Case map */
+ { 0x001E0A, 0x001E0A, { 0x001E0B } }, /* 1E0A; 1E0B; Case map */
+ { 0x001E0C, 0x001E0C, { 0x001E0D } }, /* 1E0C; 1E0D; Case map */
+ { 0x001E0E, 0x001E0E, { 0x001E0F } }, /* 1E0E; 1E0F; Case map */
+ { 0x001E10, 0x001E10, { 0x001E11 } }, /* 1E10; 1E11; Case map */
+ { 0x001E12, 0x001E12, { 0x001E13 } }, /* 1E12; 1E13; Case map */
+ { 0x001E14, 0x001E14, { 0x001E15 } }, /* 1E14; 1E15; Case map */
+ { 0x001E16, 0x001E16, { 0x001E17 } }, /* 1E16; 1E17; Case map */
+ { 0x001E18, 0x001E18, { 0x001E19 } }, /* 1E18; 1E19; Case map */
+ { 0x001E1A, 0x001E1A, { 0x001E1B } }, /* 1E1A; 1E1B; Case map */
+ { 0x001E1C, 0x001E1C, { 0x001E1D } }, /* 1E1C; 1E1D; Case map */
+ { 0x001E1E, 0x001E1E, { 0x001E1F } }, /* 1E1E; 1E1F; Case map */
+ { 0x001E20, 0x001E20, { 0x001E21 } }, /* 1E20; 1E21; Case map */
+ { 0x001E22, 0x001E22, { 0x001E23 } }, /* 1E22; 1E23; Case map */
+ { 0x001E24, 0x001E24, { 0x001E25 } }, /* 1E24; 1E25; Case map */
+ { 0x001E26, 0x001E26, { 0x001E27 } }, /* 1E26; 1E27; Case map */
+ { 0x001E28, 0x001E28, { 0x001E29 } }, /* 1E28; 1E29; Case map */
+ { 0x001E2A, 0x001E2A, { 0x001E2B } }, /* 1E2A; 1E2B; Case map */
+ { 0x001E2C, 0x001E2C, { 0x001E2D } }, /* 1E2C; 1E2D; Case map */
+ { 0x001E2E, 0x001E2E, { 0x001E2F } }, /* 1E2E; 1E2F; Case map */
+ { 0x001E30, 0x001E30, { 0x001E31 } }, /* 1E30; 1E31; Case map */
+ { 0x001E32, 0x001E32, { 0x001E33 } }, /* 1E32; 1E33; Case map */
+ { 0x001E34, 0x001E34, { 0x001E35 } }, /* 1E34; 1E35; Case map */
+ { 0x001E36, 0x001E36, { 0x001E37 } }, /* 1E36; 1E37; Case map */
+ { 0x001E38, 0x001E38, { 0x001E39 } }, /* 1E38; 1E39; Case map */
+ { 0x001E3A, 0x001E3A, { 0x001E3B } }, /* 1E3A; 1E3B; Case map */
+ { 0x001E3C, 0x001E3C, { 0x001E3D } }, /* 1E3C; 1E3D; Case map */
+ { 0x001E3E, 0x001E3E, { 0x001E3F } }, /* 1E3E; 1E3F; Case map */
+ { 0x001E40, 0x001E40, { 0x001E41 } }, /* 1E40; 1E41; Case map */
+ { 0x001E42, 0x001E42, { 0x001E43 } }, /* 1E42; 1E43; Case map */
+ { 0x001E44, 0x001E44, { 0x001E45 } }, /* 1E44; 1E45; Case map */
+ { 0x001E46, 0x001E46, { 0x001E47 } }, /* 1E46; 1E47; Case map */
+ { 0x001E48, 0x001E48, { 0x001E49 } }, /* 1E48; 1E49; Case map */
+ { 0x001E4A, 0x001E4A, { 0x001E4B } }, /* 1E4A; 1E4B; Case map */
+ { 0x001E4C, 0x001E4C, { 0x001E4D } }, /* 1E4C; 1E4D; Case map */
+ { 0x001E4E, 0x001E4E, { 0x001E4F } }, /* 1E4E; 1E4F; Case map */
+ { 0x001E50, 0x001E50, { 0x001E51 } }, /* 1E50; 1E51; Case map */
+ { 0x001E52, 0x001E52, { 0x001E53 } }, /* 1E52; 1E53; Case map */
+ { 0x001E54, 0x001E54, { 0x001E55 } }, /* 1E54; 1E55; Case map */
+ { 0x001E56, 0x001E56, { 0x001E57 } }, /* 1E56; 1E57; Case map */
+ { 0x001E58, 0x001E58, { 0x001E59 } }, /* 1E58; 1E59; Case map */
+ { 0x001E5A, 0x001E5A, { 0x001E5B } }, /* 1E5A; 1E5B; Case map */
+ { 0x001E5C, 0x001E5C, { 0x001E5D } }, /* 1E5C; 1E5D; Case map */
+ { 0x001E5E, 0x001E5E, { 0x001E5F } }, /* 1E5E; 1E5F; Case map */
+ { 0x001E60, 0x001E60, { 0x001E61 } }, /* 1E60; 1E61; Case map */
+ { 0x001E62, 0x001E62, { 0x001E63 } }, /* 1E62; 1E63; Case map */
+ { 0x001E64, 0x001E64, { 0x001E65 } }, /* 1E64; 1E65; Case map */
+ { 0x001E66, 0x001E66, { 0x001E67 } }, /* 1E66; 1E67; Case map */
+ { 0x001E68, 0x001E68, { 0x001E69 } }, /* 1E68; 1E69; Case map */
+ { 0x001E6A, 0x001E6A, { 0x001E6B } }, /* 1E6A; 1E6B; Case map */
+ { 0x001E6C, 0x001E6C, { 0x001E6D } }, /* 1E6C; 1E6D; Case map */
+ { 0x001E6E, 0x001E6E, { 0x001E6F } }, /* 1E6E; 1E6F; Case map */
+ { 0x001E70, 0x001E70, { 0x001E71 } }, /* 1E70; 1E71; Case map */
+ { 0x001E72, 0x001E72, { 0x001E73 } }, /* 1E72; 1E73; Case map */
+ { 0x001E74, 0x001E74, { 0x001E75 } }, /* 1E74; 1E75; Case map */
+ { 0x001E76, 0x001E76, { 0x001E77 } }, /* 1E76; 1E77; Case map */
+ { 0x001E78, 0x001E78, { 0x001E79 } }, /* 1E78; 1E79; Case map */
+ { 0x001E7A, 0x001E7A, { 0x001E7B } }, /* 1E7A; 1E7B; Case map */
+ { 0x001E7C, 0x001E7C, { 0x001E7D } }, /* 1E7C; 1E7D; Case map */
+ { 0x001E7E, 0x001E7E, { 0x001E7F } }, /* 1E7E; 1E7F; Case map */
+ { 0x001E80, 0x001E80, { 0x001E81 } }, /* 1E80; 1E81; Case map */
+ { 0x001E82, 0x001E82, { 0x001E83 } }, /* 1E82; 1E83; Case map */
+ { 0x001E84, 0x001E84, { 0x001E85 } }, /* 1E84; 1E85; Case map */
+ { 0x001E86, 0x001E86, { 0x001E87 } }, /* 1E86; 1E87; Case map */
+ { 0x001E88, 0x001E88, { 0x001E89 } }, /* 1E88; 1E89; Case map */
+ { 0x001E8A, 0x001E8A, { 0x001E8B } }, /* 1E8A; 1E8B; Case map */
+ { 0x001E8C, 0x001E8C, { 0x001E8D } }, /* 1E8C; 1E8D; Case map */
+ { 0x001E8E, 0x001E8E, { 0x001E8F } }, /* 1E8E; 1E8F; Case map */
+ { 0x001E90, 0x001E90, { 0x001E91 } }, /* 1E90; 1E91; Case map */
+ { 0x001E92, 0x001E92, { 0x001E93 } }, /* 1E92; 1E93; Case map */
+ { 0x001E94, 0x001E94, { 0x001E95 } }, /* 1E94; 1E95; Case map */
+ { 0x001E96,
+ 0x001E96,
+ { 0x000068, /* 1E96; 0068 0331; Case map */
+ 0x000331 } },
+ { 0x001E97,
+ 0x001E97,
+ { 0x000074, /* 1E97; 0074 0308; Case map */
+ 0x000308 } },
+ { 0x001E98,
+ 0x001E98,
+ { 0x000077, /* 1E98; 0077 030A; Case map */
+ 0x00030A } },
+ { 0x001E99,
+ 0x001E99,
+ { 0x000079, /* 1E99; 0079 030A; Case map */
+ 0x00030A } },
+ { 0x001E9A,
+ 0x001E9A,
+ { 0x000061, /* 1E9A; 0061 02BE; Case map */
+ 0x0002BE } },
+ { 0x001E9B, 0x001E9B, { 0x001E61 } }, /* 1E9B; 1E61; Case map */
+ { 0x001EA0, 0x001EA0, { 0x001EA1 } }, /* 1EA0; 1EA1; Case map */
+ { 0x001EA2, 0x001EA2, { 0x001EA3 } }, /* 1EA2; 1EA3; Case map */
+ { 0x001EA4, 0x001EA4, { 0x001EA5 } }, /* 1EA4; 1EA5; Case map */
+ { 0x001EA6, 0x001EA6, { 0x001EA7 } }, /* 1EA6; 1EA7; Case map */
+ { 0x001EA8, 0x001EA8, { 0x001EA9 } }, /* 1EA8; 1EA9; Case map */
+ { 0x001EAA, 0x001EAA, { 0x001EAB } }, /* 1EAA; 1EAB; Case map */
+ { 0x001EAC, 0x001EAC, { 0x001EAD } }, /* 1EAC; 1EAD; Case map */
+ { 0x001EAE, 0x001EAE, { 0x001EAF } }, /* 1EAE; 1EAF; Case map */
+ { 0x001EB0, 0x001EB0, { 0x001EB1 } }, /* 1EB0; 1EB1; Case map */
+ { 0x001EB2, 0x001EB2, { 0x001EB3 } }, /* 1EB2; 1EB3; Case map */
+ { 0x001EB4, 0x001EB4, { 0x001EB5 } }, /* 1EB4; 1EB5; Case map */
+ { 0x001EB6, 0x001EB6, { 0x001EB7 } }, /* 1EB6; 1EB7; Case map */
+ { 0x001EB8, 0x001EB8, { 0x001EB9 } }, /* 1EB8; 1EB9; Case map */
+ { 0x001EBA, 0x001EBA, { 0x001EBB } }, /* 1EBA; 1EBB; Case map */
+ { 0x001EBC, 0x001EBC, { 0x001EBD } }, /* 1EBC; 1EBD; Case map */
+ { 0x001EBE, 0x001EBE, { 0x001EBF } }, /* 1EBE; 1EBF; Case map */
+ { 0x001EC0, 0x001EC0, { 0x001EC1 } }, /* 1EC0; 1EC1; Case map */
+ { 0x001EC2, 0x001EC2, { 0x001EC3 } }, /* 1EC2; 1EC3; Case map */
+ { 0x001EC4, 0x001EC4, { 0x001EC5 } }, /* 1EC4; 1EC5; Case map */
+ { 0x001EC6, 0x001EC6, { 0x001EC7 } }, /* 1EC6; 1EC7; Case map */
+ { 0x001EC8, 0x001EC8, { 0x001EC9 } }, /* 1EC8; 1EC9; Case map */
+ { 0x001ECA, 0x001ECA, { 0x001ECB } }, /* 1ECA; 1ECB; Case map */
+ { 0x001ECC, 0x001ECC, { 0x001ECD } }, /* 1ECC; 1ECD; Case map */
+ { 0x001ECE, 0x001ECE, { 0x001ECF } }, /* 1ECE; 1ECF; Case map */
+ { 0x001ED0, 0x001ED0, { 0x001ED1 } }, /* 1ED0; 1ED1; Case map */
+ { 0x001ED2, 0x001ED2, { 0x001ED3 } }, /* 1ED2; 1ED3; Case map */
+ { 0x001ED4, 0x001ED4, { 0x001ED5 } }, /* 1ED4; 1ED5; Case map */
+ { 0x001ED6, 0x001ED6, { 0x001ED7 } }, /* 1ED6; 1ED7; Case map */
+ { 0x001ED8, 0x001ED8, { 0x001ED9 } }, /* 1ED8; 1ED9; Case map */
+ { 0x001EDA, 0x001EDA, { 0x001EDB } }, /* 1EDA; 1EDB; Case map */
+ { 0x001EDC, 0x001EDC, { 0x001EDD } }, /* 1EDC; 1EDD; Case map */
+ { 0x001EDE, 0x001EDE, { 0x001EDF } }, /* 1EDE; 1EDF; Case map */
+ { 0x001EE0, 0x001EE0, { 0x001EE1 } }, /* 1EE0; 1EE1; Case map */
+ { 0x001EE2, 0x001EE2, { 0x001EE3 } }, /* 1EE2; 1EE3; Case map */
+ { 0x001EE4, 0x001EE4, { 0x001EE5 } }, /* 1EE4; 1EE5; Case map */
+ { 0x001EE6, 0x001EE6, { 0x001EE7 } }, /* 1EE6; 1EE7; Case map */
+ { 0x001EE8, 0x001EE8, { 0x001EE9 } }, /* 1EE8; 1EE9; Case map */
+ { 0x001EEA, 0x001EEA, { 0x001EEB } }, /* 1EEA; 1EEB; Case map */
+ { 0x001EEC, 0x001EEC, { 0x001EED } }, /* 1EEC; 1EED; Case map */
+ { 0x001EEE, 0x001EEE, { 0x001EEF } }, /* 1EEE; 1EEF; Case map */
+ { 0x001EF0, 0x001EF0, { 0x001EF1 } }, /* 1EF0; 1EF1; Case map */
+ { 0x001EF2, 0x001EF2, { 0x001EF3 } }, /* 1EF2; 1EF3; Case map */
+ { 0x001EF4, 0x001EF4, { 0x001EF5 } }, /* 1EF4; 1EF5; Case map */
+ { 0x001EF6, 0x001EF6, { 0x001EF7 } }, /* 1EF6; 1EF7; Case map */
+ { 0x001EF8, 0x001EF8, { 0x001EF9 } }, /* 1EF8; 1EF9; Case map */
+ { 0x001F08, 0x001F08, { 0x001F00 } }, /* 1F08; 1F00; Case map */
+ { 0x001F09, 0x001F09, { 0x001F01 } }, /* 1F09; 1F01; Case map */
+ { 0x001F0A, 0x001F0A, { 0x001F02 } }, /* 1F0A; 1F02; Case map */
+ { 0x001F0B, 0x001F0B, { 0x001F03 } }, /* 1F0B; 1F03; Case map */
+ { 0x001F0C, 0x001F0C, { 0x001F04 } }, /* 1F0C; 1F04; Case map */
+ { 0x001F0D, 0x001F0D, { 0x001F05 } }, /* 1F0D; 1F05; Case map */
+ { 0x001F0E, 0x001F0E, { 0x001F06 } }, /* 1F0E; 1F06; Case map */
+ { 0x001F0F, 0x001F0F, { 0x001F07 } }, /* 1F0F; 1F07; Case map */
+ { 0x001F18, 0x001F18, { 0x001F10 } }, /* 1F18; 1F10; Case map */
+ { 0x001F19, 0x001F19, { 0x001F11 } }, /* 1F19; 1F11; Case map */
+ { 0x001F1A, 0x001F1A, { 0x001F12 } }, /* 1F1A; 1F12; Case map */
+ { 0x001F1B, 0x001F1B, { 0x001F13 } }, /* 1F1B; 1F13; Case map */
+ { 0x001F1C, 0x001F1C, { 0x001F14 } }, /* 1F1C; 1F14; Case map */
+ { 0x001F1D, 0x001F1D, { 0x001F15 } }, /* 1F1D; 1F15; Case map */
+ { 0x001F28, 0x001F28, { 0x001F20 } }, /* 1F28; 1F20; Case map */
+ { 0x001F29, 0x001F29, { 0x001F21 } }, /* 1F29; 1F21; Case map */
+ { 0x001F2A, 0x001F2A, { 0x001F22 } }, /* 1F2A; 1F22; Case map */
+ { 0x001F2B, 0x001F2B, { 0x001F23 } }, /* 1F2B; 1F23; Case map */
+ { 0x001F2C, 0x001F2C, { 0x001F24 } }, /* 1F2C; 1F24; Case map */
+ { 0x001F2D, 0x001F2D, { 0x001F25 } }, /* 1F2D; 1F25; Case map */
+ { 0x001F2E, 0x001F2E, { 0x001F26 } }, /* 1F2E; 1F26; Case map */
+ { 0x001F2F, 0x001F2F, { 0x001F27 } }, /* 1F2F; 1F27; Case map */
+ { 0x001F38, 0x001F38, { 0x001F30 } }, /* 1F38; 1F30; Case map */
+ { 0x001F39, 0x001F39, { 0x001F31 } }, /* 1F39; 1F31; Case map */
+ { 0x001F3A, 0x001F3A, { 0x001F32 } }, /* 1F3A; 1F32; Case map */
+ { 0x001F3B, 0x001F3B, { 0x001F33 } }, /* 1F3B; 1F33; Case map */
+ { 0x001F3C, 0x001F3C, { 0x001F34 } }, /* 1F3C; 1F34; Case map */
+ { 0x001F3D, 0x001F3D, { 0x001F35 } }, /* 1F3D; 1F35; Case map */
+ { 0x001F3E, 0x001F3E, { 0x001F36 } }, /* 1F3E; 1F36; Case map */
+ { 0x001F3F, 0x001F3F, { 0x001F37 } }, /* 1F3F; 1F37; Case map */
+ { 0x001F48, 0x001F48, { 0x001F40 } }, /* 1F48; 1F40; Case map */
+ { 0x001F49, 0x001F49, { 0x001F41 } }, /* 1F49; 1F41; Case map */
+ { 0x001F4A, 0x001F4A, { 0x001F42 } }, /* 1F4A; 1F42; Case map */
+ { 0x001F4B, 0x001F4B, { 0x001F43 } }, /* 1F4B; 1F43; Case map */
+ { 0x001F4C, 0x001F4C, { 0x001F44 } }, /* 1F4C; 1F44; Case map */
+ { 0x001F4D, 0x001F4D, { 0x001F45 } }, /* 1F4D; 1F45; Case map */
+ { 0x001F50,
+ 0x001F50,
+ { 0x0003C5, /* 1F50; 03C5 0313; Case map */
+ 0x000313 } },
+ { 0x001F52,
+ 0x001F52,
+ { 0x0003C5, /* 1F52; 03C5 0313 0300; Case map */
+ 0x000313, 0x000300 } },
+ { 0x001F54,
+ 0x001F54,
+ { 0x0003C5, /* 1F54; 03C5 0313 0301; Case map */
+ 0x000313, 0x000301 } },
+ { 0x001F56,
+ 0x001F56,
+ { 0x0003C5, /* 1F56; 03C5 0313 0342; Case map */
+ 0x000313, 0x000342 } },
+ { 0x001F59, 0x001F59, { 0x001F51 } }, /* 1F59; 1F51; Case map */
+ { 0x001F5B, 0x001F5B, { 0x001F53 } }, /* 1F5B; 1F53; Case map */
+ { 0x001F5D, 0x001F5D, { 0x001F55 } }, /* 1F5D; 1F55; Case map */
+ { 0x001F5F, 0x001F5F, { 0x001F57 } }, /* 1F5F; 1F57; Case map */
+ { 0x001F68, 0x001F68, { 0x001F60 } }, /* 1F68; 1F60; Case map */
+ { 0x001F69, 0x001F69, { 0x001F61 } }, /* 1F69; 1F61; Case map */
+ { 0x001F6A, 0x001F6A, { 0x001F62 } }, /* 1F6A; 1F62; Case map */
+ { 0x001F6B, 0x001F6B, { 0x001F63 } }, /* 1F6B; 1F63; Case map */
+ { 0x001F6C, 0x001F6C, { 0x001F64 } }, /* 1F6C; 1F64; Case map */
+ { 0x001F6D, 0x001F6D, { 0x001F65 } }, /* 1F6D; 1F65; Case map */
+ { 0x001F6E, 0x001F6E, { 0x001F66 } }, /* 1F6E; 1F66; Case map */
+ { 0x001F6F, 0x001F6F, { 0x001F67 } }, /* 1F6F; 1F67; Case map */
+ { 0x001F80,
+ 0x001F80,
+ { 0x001F00, /* 1F80; 1F00 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F81,
+ 0x001F81,
+ { 0x001F01, /* 1F81; 1F01 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F82,
+ 0x001F82,
+ { 0x001F02, /* 1F82; 1F02 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F83,
+ 0x001F83,
+ { 0x001F03, /* 1F83; 1F03 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F84,
+ 0x001F84,
+ { 0x001F04, /* 1F84; 1F04 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F85,
+ 0x001F85,
+ { 0x001F05, /* 1F85; 1F05 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F86,
+ 0x001F86,
+ { 0x001F06, /* 1F86; 1F06 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F87,
+ 0x001F87,
+ { 0x001F07, /* 1F87; 1F07 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F88,
+ 0x001F88,
+ { 0x001F00, /* 1F88; 1F00 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F89,
+ 0x001F89,
+ { 0x001F01, /* 1F89; 1F01 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F8A,
+ 0x001F8A,
+ { 0x001F02, /* 1F8A; 1F02 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F8B,
+ 0x001F8B,
+ { 0x001F03, /* 1F8B; 1F03 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F8C,
+ 0x001F8C,
+ { 0x001F04, /* 1F8C; 1F04 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F8D,
+ 0x001F8D,
+ { 0x001F05, /* 1F8D; 1F05 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F8E,
+ 0x001F8E,
+ { 0x001F06, /* 1F8E; 1F06 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F8F,
+ 0x001F8F,
+ { 0x001F07, /* 1F8F; 1F07 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F90,
+ 0x001F90,
+ { 0x001F20, /* 1F90; 1F20 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F91,
+ 0x001F91,
+ { 0x001F21, /* 1F91; 1F21 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F92,
+ 0x001F92,
+ { 0x001F22, /* 1F92; 1F22 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F93,
+ 0x001F93,
+ { 0x001F23, /* 1F93; 1F23 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F94,
+ 0x001F94,
+ { 0x001F24, /* 1F94; 1F24 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F95,
+ 0x001F95,
+ { 0x001F25, /* 1F95; 1F25 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F96,
+ 0x001F96,
+ { 0x001F26, /* 1F96; 1F26 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F97,
+ 0x001F97,
+ { 0x001F27, /* 1F97; 1F27 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F98,
+ 0x001F98,
+ { 0x001F20, /* 1F98; 1F20 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F99,
+ 0x001F99,
+ { 0x001F21, /* 1F99; 1F21 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F9A,
+ 0x001F9A,
+ { 0x001F22, /* 1F9A; 1F22 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F9B,
+ 0x001F9B,
+ { 0x001F23, /* 1F9B; 1F23 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F9C,
+ 0x001F9C,
+ { 0x001F24, /* 1F9C; 1F24 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F9D,
+ 0x001F9D,
+ { 0x001F25, /* 1F9D; 1F25 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F9E,
+ 0x001F9E,
+ { 0x001F26, /* 1F9E; 1F26 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F9F,
+ 0x001F9F,
+ { 0x001F27, /* 1F9F; 1F27 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA0,
+ 0x001FA0,
+ { 0x001F60, /* 1FA0; 1F60 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA1,
+ 0x001FA1,
+ { 0x001F61, /* 1FA1; 1F61 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA2,
+ 0x001FA2,
+ { 0x001F62, /* 1FA2; 1F62 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA3,
+ 0x001FA3,
+ { 0x001F63, /* 1FA3; 1F63 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA4,
+ 0x001FA4,
+ { 0x001F64, /* 1FA4; 1F64 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA5,
+ 0x001FA5,
+ { 0x001F65, /* 1FA5; 1F65 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA6,
+ 0x001FA6,
+ { 0x001F66, /* 1FA6; 1F66 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA7,
+ 0x001FA7,
+ { 0x001F67, /* 1FA7; 1F67 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA8,
+ 0x001FA8,
+ { 0x001F60, /* 1FA8; 1F60 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA9,
+ 0x001FA9,
+ { 0x001F61, /* 1FA9; 1F61 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FAA,
+ 0x001FAA,
+ { 0x001F62, /* 1FAA; 1F62 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FAB,
+ 0x001FAB,
+ { 0x001F63, /* 1FAB; 1F63 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FAC,
+ 0x001FAC,
+ { 0x001F64, /* 1FAC; 1F64 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FAD,
+ 0x001FAD,
+ { 0x001F65, /* 1FAD; 1F65 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FAE,
+ 0x001FAE,
+ { 0x001F66, /* 1FAE; 1F66 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FAF,
+ 0x001FAF,
+ { 0x001F67, /* 1FAF; 1F67 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FB2,
+ 0x001FB2,
+ { 0x001F70, /* 1FB2; 1F70 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FB3,
+ 0x001FB3,
+ { 0x0003B1, /* 1FB3; 03B1 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FB4,
+ 0x001FB4,
+ { 0x0003AC, /* 1FB4; 03AC 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FB6,
+ 0x001FB6,
+ { 0x0003B1, /* 1FB6; 03B1 0342; Case map */
+ 0x000342 } },
+ { 0x001FB7,
+ 0x001FB7,
+ { 0x0003B1, /* 1FB7; 03B1 0342 03B9; Case map */
+ 0x000342, 0x0003B9 } },
+ { 0x001FB8, 0x001FB8, { 0x001FB0 } }, /* 1FB8; 1FB0; Case map */
+ { 0x001FB9, 0x001FB9, { 0x001FB1 } }, /* 1FB9; 1FB1; Case map */
+ { 0x001FBA, 0x001FBA, { 0x001F70 } }, /* 1FBA; 1F70; Case map */
+ { 0x001FBB, 0x001FBB, { 0x001F71 } }, /* 1FBB; 1F71; Case map */
+ { 0x001FBC,
+ 0x001FBC,
+ { 0x0003B1, /* 1FBC; 03B1 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FBE, 0x001FBE, { 0x0003B9 } }, /* 1FBE; 03B9; Case map */
+ { 0x001FC2,
+ 0x001FC2,
+ { 0x001F74, /* 1FC2; 1F74 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FC3,
+ 0x001FC3,
+ { 0x0003B7, /* 1FC3; 03B7 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FC4,
+ 0x001FC4,
+ { 0x0003AE, /* 1FC4; 03AE 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FC6,
+ 0x001FC6,
+ { 0x0003B7, /* 1FC6; 03B7 0342; Case map */
+ 0x000342 } },
+ { 0x001FC7,
+ 0x001FC7,
+ { 0x0003B7, /* 1FC7; 03B7 0342 03B9; Case map */
+ 0x000342, 0x0003B9 } },
+ { 0x001FC8, 0x001FC8, { 0x001F72 } }, /* 1FC8; 1F72; Case map */
+ { 0x001FC9, 0x001FC9, { 0x001F73 } }, /* 1FC9; 1F73; Case map */
+ { 0x001FCA, 0x001FCA, { 0x001F74 } }, /* 1FCA; 1F74; Case map */
+ { 0x001FCB, 0x001FCB, { 0x001F75 } }, /* 1FCB; 1F75; Case map */
+ { 0x001FCC,
+ 0x001FCC,
+ { 0x0003B7, /* 1FCC; 03B7 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FD2,
+ 0x001FD2,
+ { 0x0003B9, /* 1FD2; 03B9 0308 0300; Case map */
+ 0x000308, 0x000300 } },
+ { 0x001FD3,
+ 0x001FD3,
+ { 0x0003B9, /* 1FD3; 03B9 0308 0301; Case map */
+ 0x000308, 0x000301 } },
+ { 0x001FD6,
+ 0x001FD6,
+ { 0x0003B9, /* 1FD6; 03B9 0342; Case map */
+ 0x000342 } },
+ { 0x001FD7,
+ 0x001FD7,
+ { 0x0003B9, /* 1FD7; 03B9 0308 0342; Case map */
+ 0x000308, 0x000342 } },
+ { 0x001FD8, 0x001FD8, { 0x001FD0 } }, /* 1FD8; 1FD0; Case map */
+ { 0x001FD9, 0x001FD9, { 0x001FD1 } }, /* 1FD9; 1FD1; Case map */
+ { 0x001FDA, 0x001FDA, { 0x001F76 } }, /* 1FDA; 1F76; Case map */
+ { 0x001FDB, 0x001FDB, { 0x001F77 } }, /* 1FDB; 1F77; Case map */
+ { 0x001FE2,
+ 0x001FE2,
+ { 0x0003C5, /* 1FE2; 03C5 0308 0300; Case map */
+ 0x000308, 0x000300 } },
+ { 0x001FE3,
+ 0x001FE3,
+ { 0x0003C5, /* 1FE3; 03C5 0308 0301; Case map */
+ 0x000308, 0x000301 } },
+ { 0x001FE4,
+ 0x001FE4,
+ { 0x0003C1, /* 1FE4; 03C1 0313; Case map */
+ 0x000313 } },
+ { 0x001FE6,
+ 0x001FE6,
+ { 0x0003C5, /* 1FE6; 03C5 0342; Case map */
+ 0x000342 } },
+ { 0x001FE7,
+ 0x001FE7,
+ { 0x0003C5, /* 1FE7; 03C5 0308 0342; Case map */
+ 0x000308, 0x000342 } },
+ { 0x001FE8, 0x001FE8, { 0x001FE0 } }, /* 1FE8; 1FE0; Case map */
+ { 0x001FE9, 0x001FE9, { 0x001FE1 } }, /* 1FE9; 1FE1; Case map */
+ { 0x001FEA, 0x001FEA, { 0x001F7A } }, /* 1FEA; 1F7A; Case map */
+ { 0x001FEB, 0x001FEB, { 0x001F7B } }, /* 1FEB; 1F7B; Case map */
+ { 0x001FEC, 0x001FEC, { 0x001FE5 } }, /* 1FEC; 1FE5; Case map */
+ { 0x001FF2,
+ 0x001FF2,
+ { 0x001F7C, /* 1FF2; 1F7C 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FF3,
+ 0x001FF3,
+ { 0x0003C9, /* 1FF3; 03C9 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FF4,
+ 0x001FF4,
+ { 0x0003CE, /* 1FF4; 03CE 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FF6,
+ 0x001FF6,
+ { 0x0003C9, /* 1FF6; 03C9 0342; Case map */
+ 0x000342 } },
+ { 0x001FF7,
+ 0x001FF7,
+ { 0x0003C9, /* 1FF7; 03C9 0342 03B9; Case map */
+ 0x000342, 0x0003B9 } },
+ { 0x001FF8, 0x001FF8, { 0x001F78 } }, /* 1FF8; 1F78; Case map */
+ { 0x001FF9, 0x001FF9, { 0x001F79 } }, /* 1FF9; 1F79; Case map */
+ { 0x001FFA, 0x001FFA, { 0x001F7C } }, /* 1FFA; 1F7C; Case map */
+ { 0x001FFB, 0x001FFB, { 0x001F7D } }, /* 1FFB; 1F7D; Case map */
+ { 0x001FFC,
+ 0x001FFC,
+ { 0x0003C9, /* 1FFC; 03C9 03B9; Case map */
+ 0x0003B9 } },
+ { 0x0020A8,
+ 0x0020A8,
+ { 0x000072, /* 20A8; 0072 0073; Additional folding */
+ 0x000073 } },
+ { 0x002102, 0x002102, { 0x000063 } }, /* 2102; 0063; Additional folding */
+ { 0x002103,
+ 0x002103,
+ { 0x0000B0, /* 2103; 00B0 0063; Additional folding */
+ 0x000063 } },
+ { 0x002107, 0x002107, { 0x00025B } }, /* 2107; 025B; Additional folding */
+ { 0x002109,
+ 0x002109,
+ { 0x0000B0, /* 2109; 00B0 0066; Additional folding */
+ 0x000066 } },
+ { 0x00210B, 0x00210B, { 0x000068 } }, /* 210B; 0068; Additional folding */
+ { 0x00210C, 0x00210C, { 0x000068 } }, /* 210C; 0068; Additional folding */
+ { 0x00210D, 0x00210D, { 0x000068 } }, /* 210D; 0068; Additional folding */
+ { 0x002110, 0x002110, { 0x000069 } }, /* 2110; 0069; Additional folding */
+ { 0x002111, 0x002111, { 0x000069 } }, /* 2111; 0069; Additional folding */
+ { 0x002112, 0x002112, { 0x00006C } }, /* 2112; 006C; Additional folding */
+ { 0x002115, 0x002115, { 0x00006E } }, /* 2115; 006E; Additional folding */
+ { 0x002116,
+ 0x002116,
+ { 0x00006E, /* 2116; 006E 006F; Additional folding */
+ 0x00006F } },
+ { 0x002119, 0x002119, { 0x000070 } }, /* 2119; 0070; Additional folding */
+ { 0x00211A, 0x00211A, { 0x000071 } }, /* 211A; 0071; Additional folding */
+ { 0x00211B, 0x00211B, { 0x000072 } }, /* 211B; 0072; Additional folding */
+ { 0x00211C, 0x00211C, { 0x000072 } }, /* 211C; 0072; Additional folding */
+ { 0x00211D, 0x00211D, { 0x000072 } }, /* 211D; 0072; Additional folding */
+ { 0x002120,
+ 0x002120,
+ { 0x000073, /* 2120; 0073 006D; Additional folding */
+ 0x00006D } },
+ { 0x002121,
+ 0x002121,
+ { 0x000074, /* 2121; 0074 0065 006C; Additional folding */
+ 0x000065, 0x00006C } },
+ { 0x002122,
+ 0x002122,
+ { 0x000074, /* 2122; 0074 006D; Additional folding */
+ 0x00006D } },
+ { 0x002124, 0x002124, { 0x00007A } }, /* 2124; 007A; Additional folding */
+ { 0x002126, 0x002126, { 0x0003C9 } }, /* 2126; 03C9; Case map */
+ { 0x002128, 0x002128, { 0x00007A } }, /* 2128; 007A; Additional folding */
+ { 0x00212A, 0x00212A, { 0x00006B } }, /* 212A; 006B; Case map */
+ { 0x00212B, 0x00212B, { 0x0000E5 } }, /* 212B; 00E5; Case map */
+ { 0x00212C, 0x00212C, { 0x000062 } }, /* 212C; 0062; Additional folding */
+ { 0x00212D, 0x00212D, { 0x000063 } }, /* 212D; 0063; Additional folding */
+ { 0x002130, 0x002130, { 0x000065 } }, /* 2130; 0065; Additional folding */
+ { 0x002131, 0x002131, { 0x000066 } }, /* 2131; 0066; Additional folding */
+ { 0x002133, 0x002133, { 0x00006D } }, /* 2133; 006D; Additional folding */
+ { 0x00213E, 0x00213E, { 0x0003B3 } }, /* 213E; 03B3; Additional folding */
+ { 0x00213F, 0x00213F, { 0x0003C0 } }, /* 213F; 03C0; Additional folding */
+ { 0x002145, 0x002145, { 0x000064 } }, /* 2145; 0064; Additional folding */
+ { 0x002160, 0x002160, { 0x002170 } }, /* 2160; 2170; Case map */
+ { 0x002161, 0x002161, { 0x002171 } }, /* 2161; 2171; Case map */
+ { 0x002162, 0x002162, { 0x002172 } }, /* 2162; 2172; Case map */
+ { 0x002163, 0x002163, { 0x002173 } }, /* 2163; 2173; Case map */
+ { 0x002164, 0x002164, { 0x002174 } }, /* 2164; 2174; Case map */
+ { 0x002165, 0x002165, { 0x002175 } }, /* 2165; 2175; Case map */
+ { 0x002166, 0x002166, { 0x002176 } }, /* 2166; 2176; Case map */
+ { 0x002167, 0x002167, { 0x002177 } }, /* 2167; 2177; Case map */
+ { 0x002168, 0x002168, { 0x002178 } }, /* 2168; 2178; Case map */
+ { 0x002169, 0x002169, { 0x002179 } }, /* 2169; 2179; Case map */
+ { 0x00216A, 0x00216A, { 0x00217A } }, /* 216A; 217A; Case map */
+ { 0x00216B, 0x00216B, { 0x00217B } }, /* 216B; 217B; Case map */
+ { 0x00216C, 0x00216C, { 0x00217C } }, /* 216C; 217C; Case map */
+ { 0x00216D, 0x00216D, { 0x00217D } }, /* 216D; 217D; Case map */
+ { 0x00216E, 0x00216E, { 0x00217E } }, /* 216E; 217E; Case map */
+ { 0x00216F, 0x00216F, { 0x00217F } }, /* 216F; 217F; Case map */
+ { 0x0024B6, 0x0024B6, { 0x0024D0 } }, /* 24B6; 24D0; Case map */
+ { 0x0024B7, 0x0024B7, { 0x0024D1 } }, /* 24B7; 24D1; Case map */
+ { 0x0024B8, 0x0024B8, { 0x0024D2 } }, /* 24B8; 24D2; Case map */
+ { 0x0024B9, 0x0024B9, { 0x0024D3 } }, /* 24B9; 24D3; Case map */
+ { 0x0024BA, 0x0024BA, { 0x0024D4 } }, /* 24BA; 24D4; Case map */
+ { 0x0024BB, 0x0024BB, { 0x0024D5 } }, /* 24BB; 24D5; Case map */
+ { 0x0024BC, 0x0024BC, { 0x0024D6 } }, /* 24BC; 24D6; Case map */
+ { 0x0024BD, 0x0024BD, { 0x0024D7 } }, /* 24BD; 24D7; Case map */
+ { 0x0024BE, 0x0024BE, { 0x0024D8 } }, /* 24BE; 24D8; Case map */
+ { 0x0024BF, 0x0024BF, { 0x0024D9 } }, /* 24BF; 24D9; Case map */
+ { 0x0024C0, 0x0024C0, { 0x0024DA } }, /* 24C0; 24DA; Case map */
+ { 0x0024C1, 0x0024C1, { 0x0024DB } }, /* 24C1; 24DB; Case map */
+ { 0x0024C2, 0x0024C2, { 0x0024DC } }, /* 24C2; 24DC; Case map */
+ { 0x0024C3, 0x0024C3, { 0x0024DD } }, /* 24C3; 24DD; Case map */
+ { 0x0024C4, 0x0024C4, { 0x0024DE } }, /* 24C4; 24DE; Case map */
+ { 0x0024C5, 0x0024C5, { 0x0024DF } }, /* 24C5; 24DF; Case map */
+ { 0x0024C6, 0x0024C6, { 0x0024E0 } }, /* 24C6; 24E0; Case map */
+ { 0x0024C7, 0x0024C7, { 0x0024E1 } }, /* 24C7; 24E1; Case map */
+ { 0x0024C8, 0x0024C8, { 0x0024E2 } }, /* 24C8; 24E2; Case map */
+ { 0x0024C9, 0x0024C9, { 0x0024E3 } }, /* 24C9; 24E3; Case map */
+ { 0x0024CA, 0x0024CA, { 0x0024E4 } }, /* 24CA; 24E4; Case map */
+ { 0x0024CB, 0x0024CB, { 0x0024E5 } }, /* 24CB; 24E5; Case map */
+ { 0x0024CC, 0x0024CC, { 0x0024E6 } }, /* 24CC; 24E6; Case map */
+ { 0x0024CD, 0x0024CD, { 0x0024E7 } }, /* 24CD; 24E7; Case map */
+ { 0x0024CE, 0x0024CE, { 0x0024E8 } }, /* 24CE; 24E8; Case map */
+ { 0x0024CF, 0x0024CF, { 0x0024E9 } }, /* 24CF; 24E9; Case map */
+ { 0x003371,
+ 0x003371,
+ { 0x000068, /* 3371; 0068 0070 0061; Additional folding */
+ 0x000070, 0x000061 } },
+ { 0x003373,
+ 0x003373,
+ { 0x000061, /* 3373; 0061 0075; Additional folding */
+ 0x000075 } },
+ { 0x003375,
+ 0x003375,
+ { 0x00006F, /* 3375; 006F 0076; Additional folding */
+ 0x000076 } },
+ { 0x003380,
+ 0x003380,
+ { 0x000070, /* 3380; 0070 0061; Additional folding */
+ 0x000061 } },
+ { 0x003381,
+ 0x003381,
+ { 0x00006E, /* 3381; 006E 0061; Additional folding */
+ 0x000061 } },
+ { 0x003382,
+ 0x003382,
+ { 0x0003BC, /* 3382; 03BC 0061; Additional folding */
+ 0x000061 } },
+ { 0x003383,
+ 0x003383,
+ { 0x00006D, /* 3383; 006D 0061; Additional folding */
+ 0x000061 } },
+ { 0x003384,
+ 0x003384,
+ { 0x00006B, /* 3384; 006B 0061; Additional folding */
+ 0x000061 } },
+ { 0x003385,
+ 0x003385,
+ { 0x00006B, /* 3385; 006B 0062; Additional folding */
+ 0x000062 } },
+ { 0x003386,
+ 0x003386,
+ { 0x00006D, /* 3386; 006D 0062; Additional folding */
+ 0x000062 } },
+ { 0x003387,
+ 0x003387,
+ { 0x000067, /* 3387; 0067 0062; Additional folding */
+ 0x000062 } },
+ { 0x00338A,
+ 0x00338A,
+ { 0x000070, /* 338A; 0070 0066; Additional folding */
+ 0x000066 } },
+ { 0x00338B,
+ 0x00338B,
+ { 0x00006E, /* 338B; 006E 0066; Additional folding */
+ 0x000066 } },
+ { 0x00338C,
+ 0x00338C,
+ { 0x0003BC, /* 338C; 03BC 0066; Additional folding */
+ 0x000066 } },
+ { 0x003390,
+ 0x003390,
+ { 0x000068, /* 3390; 0068 007A; Additional folding */
+ 0x00007A } },
+ { 0x003391,
+ 0x003391,
+ { 0x00006B, /* 3391; 006B 0068 007A; Additional folding */
+ 0x000068, 0x00007A } },
+ { 0x003392,
+ 0x003392,
+ { 0x00006D, /* 3392; 006D 0068 007A; Additional folding */
+ 0x000068, 0x00007A } },
+ { 0x003393,
+ 0x003393,
+ { 0x000067, /* 3393; 0067 0068 007A; Additional folding */
+ 0x000068, 0x00007A } },
+ { 0x003394,
+ 0x003394,
+ { 0x000074, /* 3394; 0074 0068 007A; Additional folding */
+ 0x000068, 0x00007A } },
+ { 0x0033A9,
+ 0x0033A9,
+ { 0x000070, /* 33A9; 0070 0061; Additional folding */
+ 0x000061 } },
+ { 0x0033AA,
+ 0x0033AA,
+ { 0x00006B, /* 33AA; 006B 0070 0061; Additional folding */
+ 0x000070, 0x000061 } },
+ { 0x0033AB,
+ 0x0033AB,
+ { 0x00006D, /* 33AB; 006D 0070 0061; Additional folding */
+ 0x000070, 0x000061 } },
+ { 0x0033AC,
+ 0x0033AC,
+ { 0x000067, /* 33AC; 0067 0070 0061; Additional folding */
+ 0x000070, 0x000061 } },
+ { 0x0033B4,
+ 0x0033B4,
+ { 0x000070, /* 33B4; 0070 0076; Additional folding */
+ 0x000076 } },
+ { 0x0033B5,
+ 0x0033B5,
+ { 0x00006E, /* 33B5; 006E 0076; Additional folding */
+ 0x000076 } },
+ { 0x0033B6,
+ 0x0033B6,
+ { 0x0003BC, /* 33B6; 03BC 0076; Additional folding */
+ 0x000076 } },
+ { 0x0033B7,
+ 0x0033B7,
+ { 0x00006D, /* 33B7; 006D 0076; Additional folding */
+ 0x000076 } },
+ { 0x0033B8,
+ 0x0033B8,
+ { 0x00006B, /* 33B8; 006B 0076; Additional folding */
+ 0x000076 } },
+ { 0x0033B9,
+ 0x0033B9,
+ { 0x00006D, /* 33B9; 006D 0076; Additional folding */
+ 0x000076 } },
+ { 0x0033BA,
+ 0x0033BA,
+ { 0x000070, /* 33BA; 0070 0077; Additional folding */
+ 0x000077 } },
+ { 0x0033BB,
+ 0x0033BB,
+ { 0x00006E, /* 33BB; 006E 0077; Additional folding */
+ 0x000077 } },
+ { 0x0033BC,
+ 0x0033BC,
+ { 0x0003BC, /* 33BC; 03BC 0077; Additional folding */
+ 0x000077 } },
+ { 0x0033BD,
+ 0x0033BD,
+ { 0x00006D, /* 33BD; 006D 0077; Additional folding */
+ 0x000077 } },
+ { 0x0033BE,
+ 0x0033BE,
+ { 0x00006B, /* 33BE; 006B 0077; Additional folding */
+ 0x000077 } },
+ { 0x0033BF,
+ 0x0033BF,
+ { 0x00006D, /* 33BF; 006D 0077; Additional folding */
+ 0x000077 } },
+ { 0x0033C0,
+ 0x0033C0,
+ { 0x00006B, /* 33C0; 006B 03C9; Additional folding */
+ 0x0003C9 } },
+ { 0x0033C1,
+ 0x0033C1,
+ { 0x00006D, /* 33C1; 006D 03C9; Additional folding */
+ 0x0003C9 } },
+ { 0x0033C3,
+ 0x0033C3,
+ { 0x000062, /* 33C3; 0062 0071; Additional folding */
+ 0x000071 } },
+ { 0x0033C6,
+ 0x0033C6,
+ { 0x000063, /* 33C6; 0063 2215 006B 0067; Additional folding */
+ 0x002215, 0x00006B, 0x000067 } },
+ { 0x0033C7,
+ 0x0033C7,
+ { 0x000063, /* 33C7; 0063 006F 002E; Additional folding */
+ 0x00006F, 0x00002E } },
+ { 0x0033C8,
+ 0x0033C8,
+ { 0x000064, /* 33C8; 0064 0062; Additional folding */
+ 0x000062 } },
+ { 0x0033C9,
+ 0x0033C9,
+ { 0x000067, /* 33C9; 0067 0079; Additional folding */
+ 0x000079 } },
+ { 0x0033CB,
+ 0x0033CB,
+ { 0x000068, /* 33CB; 0068 0070; Additional folding */
+ 0x000070 } },
+ { 0x0033CD,
+ 0x0033CD,
+ { 0x00006B, /* 33CD; 006B 006B; Additional folding */
+ 0x00006B } },
+ { 0x0033CE,
+ 0x0033CE,
+ { 0x00006B, /* 33CE; 006B 006D; Additional folding */
+ 0x00006D } },
+ { 0x0033D7,
+ 0x0033D7,
+ { 0x000070, /* 33D7; 0070 0068; Additional folding */
+ 0x000068 } },
+ { 0x0033D9,
+ 0x0033D9,
+ { 0x000070, /* 33D9; 0070 0070 006D; Additional folding */
+ 0x000070, 0x00006D } },
+ { 0x0033DA,
+ 0x0033DA,
+ { 0x000070, /* 33DA; 0070 0072; Additional folding */
+ 0x000072 } },
+ { 0x0033DC,
+ 0x0033DC,
+ { 0x000073, /* 33DC; 0073 0076; Additional folding */
+ 0x000076 } },
+ { 0x0033DD,
+ 0x0033DD,
+ { 0x000077, /* 33DD; 0077 0062; Additional folding */
+ 0x000062 } },
+ { 0x00FB00,
+ 0x00FB00,
+ { 0x000066, /* FB00; 0066 0066; Case map */
+ 0x000066 } },
+ { 0x00FB01,
+ 0x00FB01,
+ { 0x000066, /* FB01; 0066 0069; Case map */
+ 0x000069 } },
+ { 0x00FB02,
+ 0x00FB02,
+ { 0x000066, /* FB02; 0066 006C; Case map */
+ 0x00006C } },
+ { 0x00FB03,
+ 0x00FB03,
+ { 0x000066, /* FB03; 0066 0066 0069; Case map */
+ 0x000066, 0x000069 } },
+ { 0x00FB04,
+ 0x00FB04,
+ { 0x000066, /* FB04; 0066 0066 006C; Case map */
+ 0x000066, 0x00006C } },
+ { 0x00FB05,
+ 0x00FB05,
+ { 0x000073, /* FB05; 0073 0074; Case map */
+ 0x000074 } },
+ { 0x00FB06,
+ 0x00FB06,
+ { 0x000073, /* FB06; 0073 0074; Case map */
+ 0x000074 } },
+ { 0x00FB13,
+ 0x00FB13,
+ { 0x000574, /* FB13; 0574 0576; Case map */
+ 0x000576 } },
+ { 0x00FB14,
+ 0x00FB14,
+ { 0x000574, /* FB14; 0574 0565; Case map */
+ 0x000565 } },
+ { 0x00FB15,
+ 0x00FB15,
+ { 0x000574, /* FB15; 0574 056B; Case map */
+ 0x00056B } },
+ { 0x00FB16,
+ 0x00FB16,
+ { 0x00057E, /* FB16; 057E 0576; Case map */
+ 0x000576 } },
+ { 0x00FB17,
+ 0x00FB17,
+ { 0x000574, /* FB17; 0574 056D; Case map */
+ 0x00056D } },
+ { 0x00FF21, 0x00FF21, { 0x00FF41 } }, /* FF21; FF41; Case map */
+ { 0x00FF22, 0x00FF22, { 0x00FF42 } }, /* FF22; FF42; Case map */
+ { 0x00FF23, 0x00FF23, { 0x00FF43 } }, /* FF23; FF43; Case map */
+ { 0x00FF24, 0x00FF24, { 0x00FF44 } }, /* FF24; FF44; Case map */
+ { 0x00FF25, 0x00FF25, { 0x00FF45 } }, /* FF25; FF45; Case map */
+ { 0x00FF26, 0x00FF26, { 0x00FF46 } }, /* FF26; FF46; Case map */
+ { 0x00FF27, 0x00FF27, { 0x00FF47 } }, /* FF27; FF47; Case map */
+ { 0x00FF28, 0x00FF28, { 0x00FF48 } }, /* FF28; FF48; Case map */
+ { 0x00FF29, 0x00FF29, { 0x00FF49 } }, /* FF29; FF49; Case map */
+ { 0x00FF2A, 0x00FF2A, { 0x00FF4A } }, /* FF2A; FF4A; Case map */
+ { 0x00FF2B, 0x00FF2B, { 0x00FF4B } }, /* FF2B; FF4B; Case map */
+ { 0x00FF2C, 0x00FF2C, { 0x00FF4C } }, /* FF2C; FF4C; Case map */
+ { 0x00FF2D, 0x00FF2D, { 0x00FF4D } }, /* FF2D; FF4D; Case map */
+ { 0x00FF2E, 0x00FF2E, { 0x00FF4E } }, /* FF2E; FF4E; Case map */
+ { 0x00FF2F, 0x00FF2F, { 0x00FF4F } }, /* FF2F; FF4F; Case map */
+ { 0x00FF30, 0x00FF30, { 0x00FF50 } }, /* FF30; FF50; Case map */
+ { 0x00FF31, 0x00FF31, { 0x00FF51 } }, /* FF31; FF51; Case map */
+ { 0x00FF32, 0x00FF32, { 0x00FF52 } }, /* FF32; FF52; Case map */
+ { 0x00FF33, 0x00FF33, { 0x00FF53 } }, /* FF33; FF53; Case map */
+ { 0x00FF34, 0x00FF34, { 0x00FF54 } }, /* FF34; FF54; Case map */
+ { 0x00FF35, 0x00FF35, { 0x00FF55 } }, /* FF35; FF55; Case map */
+ { 0x00FF36, 0x00FF36, { 0x00FF56 } }, /* FF36; FF56; Case map */
+ { 0x00FF37, 0x00FF37, { 0x00FF57 } }, /* FF37; FF57; Case map */
+ { 0x00FF38, 0x00FF38, { 0x00FF58 } }, /* FF38; FF58; Case map */
+ { 0x00FF39, 0x00FF39, { 0x00FF59 } }, /* FF39; FF59; Case map */
+ { 0x00FF3A, 0x00FF3A, { 0x00FF5A } }, /* FF3A; FF5A; Case map */
+ { 0x010400, 0x010400, { 0x010428 } }, /* 10400; 10428; Case map */
+ { 0x010401, 0x010401, { 0x010429 } }, /* 10401; 10429; Case map */
+ { 0x010402, 0x010402, { 0x01042A } }, /* 10402; 1042A; Case map */
+ { 0x010403, 0x010403, { 0x01042B } }, /* 10403; 1042B; Case map */
+ { 0x010404, 0x010404, { 0x01042C } }, /* 10404; 1042C; Case map */
+ { 0x010405, 0x010405, { 0x01042D } }, /* 10405; 1042D; Case map */
+ { 0x010406, 0x010406, { 0x01042E } }, /* 10406; 1042E; Case map */
+ { 0x010407, 0x010407, { 0x01042F } }, /* 10407; 1042F; Case map */
+ { 0x010408, 0x010408, { 0x010430 } }, /* 10408; 10430; Case map */
+ { 0x010409, 0x010409, { 0x010431 } }, /* 10409; 10431; Case map */
+ { 0x01040A, 0x01040A, { 0x010432 } }, /* 1040A; 10432; Case map */
+ { 0x01040B, 0x01040B, { 0x010433 } }, /* 1040B; 10433; Case map */
+ { 0x01040C, 0x01040C, { 0x010434 } }, /* 1040C; 10434; Case map */
+ { 0x01040D, 0x01040D, { 0x010435 } }, /* 1040D; 10435; Case map */
+ { 0x01040E, 0x01040E, { 0x010436 } }, /* 1040E; 10436; Case map */
+ { 0x01040F, 0x01040F, { 0x010437 } }, /* 1040F; 10437; Case map */
+ { 0x010410, 0x010410, { 0x010438 } }, /* 10410; 10438; Case map */
+ { 0x010411, 0x010411, { 0x010439 } }, /* 10411; 10439; Case map */
+ { 0x010412, 0x010412, { 0x01043A } }, /* 10412; 1043A; Case map */
+ { 0x010413, 0x010413, { 0x01043B } }, /* 10413; 1043B; Case map */
+ { 0x010414, 0x010414, { 0x01043C } }, /* 10414; 1043C; Case map */
+ { 0x010415, 0x010415, { 0x01043D } }, /* 10415; 1043D; Case map */
+ { 0x010416, 0x010416, { 0x01043E } }, /* 10416; 1043E; Case map */
+ { 0x010417, 0x010417, { 0x01043F } }, /* 10417; 1043F; Case map */
+ { 0x010418, 0x010418, { 0x010440 } }, /* 10418; 10440; Case map */
+ { 0x010419, 0x010419, { 0x010441 } }, /* 10419; 10441; Case map */
+ { 0x01041A, 0x01041A, { 0x010442 } }, /* 1041A; 10442; Case map */
+ { 0x01041B, 0x01041B, { 0x010443 } }, /* 1041B; 10443; Case map */
+ { 0x01041C, 0x01041C, { 0x010444 } }, /* 1041C; 10444; Case map */
+ { 0x01041D, 0x01041D, { 0x010445 } }, /* 1041D; 10445; Case map */
+ { 0x01041E, 0x01041E, { 0x010446 } }, /* 1041E; 10446; Case map */
+ { 0x01041F, 0x01041F, { 0x010447 } }, /* 1041F; 10447; Case map */
+ { 0x010420, 0x010420, { 0x010448 } }, /* 10420; 10448; Case map */
+ { 0x010421, 0x010421, { 0x010449 } }, /* 10421; 10449; Case map */
+ { 0x010422, 0x010422, { 0x01044A } }, /* 10422; 1044A; Case map */
+ { 0x010423, 0x010423, { 0x01044B } }, /* 10423; 1044B; Case map */
+ { 0x010424, 0x010424, { 0x01044C } }, /* 10424; 1044C; Case map */
+ { 0x010425, 0x010425, { 0x01044D } }, /* 10425; 1044D; Case map */
+ { 0x01D400, 0x01D400, { 0x000061 } }, /* 1D400; 0061; Additional folding */
+ { 0x01D401, 0x01D401, { 0x000062 } }, /* 1D401; 0062; Additional folding */
+ { 0x01D402, 0x01D402, { 0x000063 } }, /* 1D402; 0063; Additional folding */
+ { 0x01D403, 0x01D403, { 0x000064 } }, /* 1D403; 0064; Additional folding */
+ { 0x01D404, 0x01D404, { 0x000065 } }, /* 1D404; 0065; Additional folding */
+ { 0x01D405, 0x01D405, { 0x000066 } }, /* 1D405; 0066; Additional folding */
+ { 0x01D406, 0x01D406, { 0x000067 } }, /* 1D406; 0067; Additional folding */
+ { 0x01D407, 0x01D407, { 0x000068 } }, /* 1D407; 0068; Additional folding */
+ { 0x01D408, 0x01D408, { 0x000069 } }, /* 1D408; 0069; Additional folding */
+ { 0x01D409, 0x01D409, { 0x00006A } }, /* 1D409; 006A; Additional folding */
+ { 0x01D40A, 0x01D40A, { 0x00006B } }, /* 1D40A; 006B; Additional folding */
+ { 0x01D40B, 0x01D40B, { 0x00006C } }, /* 1D40B; 006C; Additional folding */
+ { 0x01D40C, 0x01D40C, { 0x00006D } }, /* 1D40C; 006D; Additional folding */
+ { 0x01D40D, 0x01D40D, { 0x00006E } }, /* 1D40D; 006E; Additional folding */
+ { 0x01D40E, 0x01D40E, { 0x00006F } }, /* 1D40E; 006F; Additional folding */
+ { 0x01D40F, 0x01D40F, { 0x000070 } }, /* 1D40F; 0070; Additional folding */
+ { 0x01D410, 0x01D410, { 0x000071 } }, /* 1D410; 0071; Additional folding */
+ { 0x01D411, 0x01D411, { 0x000072 } }, /* 1D411; 0072; Additional folding */
+ { 0x01D412, 0x01D412, { 0x000073 } }, /* 1D412; 0073; Additional folding */
+ { 0x01D413, 0x01D413, { 0x000074 } }, /* 1D413; 0074; Additional folding */
+ { 0x01D414, 0x01D414, { 0x000075 } }, /* 1D414; 0075; Additional folding */
+ { 0x01D415, 0x01D415, { 0x000076 } }, /* 1D415; 0076; Additional folding */
+ { 0x01D416, 0x01D416, { 0x000077 } }, /* 1D416; 0077; Additional folding */
+ { 0x01D417, 0x01D417, { 0x000078 } }, /* 1D417; 0078; Additional folding */
+ { 0x01D418, 0x01D418, { 0x000079 } }, /* 1D418; 0079; Additional folding */
+ { 0x01D419, 0x01D419, { 0x00007A } }, /* 1D419; 007A; Additional folding */
+ { 0x01D434, 0x01D434, { 0x000061 } }, /* 1D434; 0061; Additional folding */
+ { 0x01D435, 0x01D435, { 0x000062 } }, /* 1D435; 0062; Additional folding */
+ { 0x01D436, 0x01D436, { 0x000063 } }, /* 1D436; 0063; Additional folding */
+ { 0x01D437, 0x01D437, { 0x000064 } }, /* 1D437; 0064; Additional folding */
+ { 0x01D438, 0x01D438, { 0x000065 } }, /* 1D438; 0065; Additional folding */
+ { 0x01D439, 0x01D439, { 0x000066 } }, /* 1D439; 0066; Additional folding */
+ { 0x01D43A, 0x01D43A, { 0x000067 } }, /* 1D43A; 0067; Additional folding */
+ { 0x01D43B, 0x01D43B, { 0x000068 } }, /* 1D43B; 0068; Additional folding */
+ { 0x01D43C, 0x01D43C, { 0x000069 } }, /* 1D43C; 0069; Additional folding */
+ { 0x01D43D, 0x01D43D, { 0x00006A } }, /* 1D43D; 006A; Additional folding */
+ { 0x01D43E, 0x01D43E, { 0x00006B } }, /* 1D43E; 006B; Additional folding */
+ { 0x01D43F, 0x01D43F, { 0x00006C } }, /* 1D43F; 006C; Additional folding */
+ { 0x01D440, 0x01D440, { 0x00006D } }, /* 1D440; 006D; Additional folding */
+ { 0x01D441, 0x01D441, { 0x00006E } }, /* 1D441; 006E; Additional folding */
+ { 0x01D442, 0x01D442, { 0x00006F } }, /* 1D442; 006F; Additional folding */
+ { 0x01D443, 0x01D443, { 0x000070 } }, /* 1D443; 0070; Additional folding */
+ { 0x01D444, 0x01D444, { 0x000071 } }, /* 1D444; 0071; Additional folding */
+ { 0x01D445, 0x01D445, { 0x000072 } }, /* 1D445; 0072; Additional folding */
+ { 0x01D446, 0x01D446, { 0x000073 } }, /* 1D446; 0073; Additional folding */
+ { 0x01D447, 0x01D447, { 0x000074 } }, /* 1D447; 0074; Additional folding */
+ { 0x01D448, 0x01D448, { 0x000075 } }, /* 1D448; 0075; Additional folding */
+ { 0x01D449, 0x01D449, { 0x000076 } }, /* 1D449; 0076; Additional folding */
+ { 0x01D44A, 0x01D44A, { 0x000077 } }, /* 1D44A; 0077; Additional folding */
+ { 0x01D44B, 0x01D44B, { 0x000078 } }, /* 1D44B; 0078; Additional folding */
+ { 0x01D44C, 0x01D44C, { 0x000079 } }, /* 1D44C; 0079; Additional folding */
+ { 0x01D44D, 0x01D44D, { 0x00007A } }, /* 1D44D; 007A; Additional folding */
+ { 0x01D468, 0x01D468, { 0x000061 } }, /* 1D468; 0061; Additional folding */
+ { 0x01D469, 0x01D469, { 0x000062 } }, /* 1D469; 0062; Additional folding */
+ { 0x01D46A, 0x01D46A, { 0x000063 } }, /* 1D46A; 0063; Additional folding */
+ { 0x01D46B, 0x01D46B, { 0x000064 } }, /* 1D46B; 0064; Additional folding */
+ { 0x01D46C, 0x01D46C, { 0x000065 } }, /* 1D46C; 0065; Additional folding */
+ { 0x01D46D, 0x01D46D, { 0x000066 } }, /* 1D46D; 0066; Additional folding */
+ { 0x01D46E, 0x01D46E, { 0x000067 } }, /* 1D46E; 0067; Additional folding */
+ { 0x01D46F, 0x01D46F, { 0x000068 } }, /* 1D46F; 0068; Additional folding */
+ { 0x01D470, 0x01D470, { 0x000069 } }, /* 1D470; 0069; Additional folding */
+ { 0x01D471, 0x01D471, { 0x00006A } }, /* 1D471; 006A; Additional folding */
+ { 0x01D472, 0x01D472, { 0x00006B } }, /* 1D472; 006B; Additional folding */
+ { 0x01D473, 0x01D473, { 0x00006C } }, /* 1D473; 006C; Additional folding */
+ { 0x01D474, 0x01D474, { 0x00006D } }, /* 1D474; 006D; Additional folding */
+ { 0x01D475, 0x01D475, { 0x00006E } }, /* 1D475; 006E; Additional folding */
+ { 0x01D476, 0x01D476, { 0x00006F } }, /* 1D476; 006F; Additional folding */
+ { 0x01D477, 0x01D477, { 0x000070 } }, /* 1D477; 0070; Additional folding */
+ { 0x01D478, 0x01D478, { 0x000071 } }, /* 1D478; 0071; Additional folding */
+ { 0x01D479, 0x01D479, { 0x000072 } }, /* 1D479; 0072; Additional folding */
+ { 0x01D47A, 0x01D47A, { 0x000073 } }, /* 1D47A; 0073; Additional folding */
+ { 0x01D47B, 0x01D47B, { 0x000074 } }, /* 1D47B; 0074; Additional folding */
+ { 0x01D47C, 0x01D47C, { 0x000075 } }, /* 1D47C; 0075; Additional folding */
+ { 0x01D47D, 0x01D47D, { 0x000076 } }, /* 1D47D; 0076; Additional folding */
+ { 0x01D47E, 0x01D47E, { 0x000077 } }, /* 1D47E; 0077; Additional folding */
+ { 0x01D47F, 0x01D47F, { 0x000078 } }, /* 1D47F; 0078; Additional folding */
+ { 0x01D480, 0x01D480, { 0x000079 } }, /* 1D480; 0079; Additional folding */
+ { 0x01D481, 0x01D481, { 0x00007A } }, /* 1D481; 007A; Additional folding */
+ { 0x01D49C, 0x01D49C, { 0x000061 } }, /* 1D49C; 0061; Additional folding */
+ { 0x01D49E, 0x01D49E, { 0x000063 } }, /* 1D49E; 0063; Additional folding */
+ { 0x01D49F, 0x01D49F, { 0x000064 } }, /* 1D49F; 0064; Additional folding */
+ { 0x01D4A2, 0x01D4A2, { 0x000067 } }, /* 1D4A2; 0067; Additional folding */
+ { 0x01D4A5, 0x01D4A5, { 0x00006A } }, /* 1D4A5; 006A; Additional folding */
+ { 0x01D4A6, 0x01D4A6, { 0x00006B } }, /* 1D4A6; 006B; Additional folding */
+ { 0x01D4A9, 0x01D4A9, { 0x00006E } }, /* 1D4A9; 006E; Additional folding */
+ { 0x01D4AA, 0x01D4AA, { 0x00006F } }, /* 1D4AA; 006F; Additional folding */
+ { 0x01D4AB, 0x01D4AB, { 0x000070 } }, /* 1D4AB; 0070; Additional folding */
+ { 0x01D4AC, 0x01D4AC, { 0x000071 } }, /* 1D4AC; 0071; Additional folding */
+ { 0x01D4AE, 0x01D4AE, { 0x000073 } }, /* 1D4AE; 0073; Additional folding */
+ { 0x01D4AF, 0x01D4AF, { 0x000074 } }, /* 1D4AF; 0074; Additional folding */
+ { 0x01D4B0, 0x01D4B0, { 0x000075 } }, /* 1D4B0; 0075; Additional folding */
+ { 0x01D4B1, 0x01D4B1, { 0x000076 } }, /* 1D4B1; 0076; Additional folding */
+ { 0x01D4B2, 0x01D4B2, { 0x000077 } }, /* 1D4B2; 0077; Additional folding */
+ { 0x01D4B3, 0x01D4B3, { 0x000078 } }, /* 1D4B3; 0078; Additional folding */
+ { 0x01D4B4, 0x01D4B4, { 0x000079 } }, /* 1D4B4; 0079; Additional folding */
+ { 0x01D4B5, 0x01D4B5, { 0x00007A } }, /* 1D4B5; 007A; Additional folding */
+ { 0x01D4D0, 0x01D4D0, { 0x000061 } }, /* 1D4D0; 0061; Additional folding */
+ { 0x01D4D1, 0x01D4D1, { 0x000062 } }, /* 1D4D1; 0062; Additional folding */
+ { 0x01D4D2, 0x01D4D2, { 0x000063 } }, /* 1D4D2; 0063; Additional folding */
+ { 0x01D4D3, 0x01D4D3, { 0x000064 } }, /* 1D4D3; 0064; Additional folding */
+ { 0x01D4D4, 0x01D4D4, { 0x000065 } }, /* 1D4D4; 0065; Additional folding */
+ { 0x01D4D5, 0x01D4D5, { 0x000066 } }, /* 1D4D5; 0066; Additional folding */
+ { 0x01D4D6, 0x01D4D6, { 0x000067 } }, /* 1D4D6; 0067; Additional folding */
+ { 0x01D4D7, 0x01D4D7, { 0x000068 } }, /* 1D4D7; 0068; Additional folding */
+ { 0x01D4D8, 0x01D4D8, { 0x000069 } }, /* 1D4D8; 0069; Additional folding */
+ { 0x01D4D9, 0x01D4D9, { 0x00006A } }, /* 1D4D9; 006A; Additional folding */
+ { 0x01D4DA, 0x01D4DA, { 0x00006B } }, /* 1D4DA; 006B; Additional folding */
+ { 0x01D4DB, 0x01D4DB, { 0x00006C } }, /* 1D4DB; 006C; Additional folding */
+ { 0x01D4DC, 0x01D4DC, { 0x00006D } }, /* 1D4DC; 006D; Additional folding */
+ { 0x01D4DD, 0x01D4DD, { 0x00006E } }, /* 1D4DD; 006E; Additional folding */
+ { 0x01D4DE, 0x01D4DE, { 0x00006F } }, /* 1D4DE; 006F; Additional folding */
+ { 0x01D4DF, 0x01D4DF, { 0x000070 } }, /* 1D4DF; 0070; Additional folding */
+ { 0x01D4E0, 0x01D4E0, { 0x000071 } }, /* 1D4E0; 0071; Additional folding */
+ { 0x01D4E1, 0x01D4E1, { 0x000072 } }, /* 1D4E1; 0072; Additional folding */
+ { 0x01D4E2, 0x01D4E2, { 0x000073 } }, /* 1D4E2; 0073; Additional folding */
+ { 0x01D4E3, 0x01D4E3, { 0x000074 } }, /* 1D4E3; 0074; Additional folding */
+ { 0x01D4E4, 0x01D4E4, { 0x000075 } }, /* 1D4E4; 0075; Additional folding */
+ { 0x01D4E5, 0x01D4E5, { 0x000076 } }, /* 1D4E5; 0076; Additional folding */
+ { 0x01D4E6, 0x01D4E6, { 0x000077 } }, /* 1D4E6; 0077; Additional folding */
+ { 0x01D4E7, 0x01D4E7, { 0x000078 } }, /* 1D4E7; 0078; Additional folding */
+ { 0x01D4E8, 0x01D4E8, { 0x000079 } }, /* 1D4E8; 0079; Additional folding */
+ { 0x01D4E9, 0x01D4E9, { 0x00007A } }, /* 1D4E9; 007A; Additional folding */
+ { 0x01D504, 0x01D504, { 0x000061 } }, /* 1D504; 0061; Additional folding */
+ { 0x01D505, 0x01D505, { 0x000062 } }, /* 1D505; 0062; Additional folding */
+ { 0x01D507, 0x01D507, { 0x000064 } }, /* 1D507; 0064; Additional folding */
+ { 0x01D508, 0x01D508, { 0x000065 } }, /* 1D508; 0065; Additional folding */
+ { 0x01D509, 0x01D509, { 0x000066 } }, /* 1D509; 0066; Additional folding */
+ { 0x01D50A, 0x01D50A, { 0x000067 } }, /* 1D50A; 0067; Additional folding */
+ { 0x01D50D, 0x01D50D, { 0x00006A } }, /* 1D50D; 006A; Additional folding */
+ { 0x01D50E, 0x01D50E, { 0x00006B } }, /* 1D50E; 006B; Additional folding */
+ { 0x01D50F, 0x01D50F, { 0x00006C } }, /* 1D50F; 006C; Additional folding */
+ { 0x01D510, 0x01D510, { 0x00006D } }, /* 1D510; 006D; Additional folding */
+ { 0x01D511, 0x01D511, { 0x00006E } }, /* 1D511; 006E; Additional folding */
+ { 0x01D512, 0x01D512, { 0x00006F } }, /* 1D512; 006F; Additional folding */
+ { 0x01D513, 0x01D513, { 0x000070 } }, /* 1D513; 0070; Additional folding */
+ { 0x01D514, 0x01D514, { 0x000071 } }, /* 1D514; 0071; Additional folding */
+ { 0x01D516, 0x01D516, { 0x000073 } }, /* 1D516; 0073; Additional folding */
+ { 0x01D517, 0x01D517, { 0x000074 } }, /* 1D517; 0074; Additional folding */
+ { 0x01D518, 0x01D518, { 0x000075 } }, /* 1D518; 0075; Additional folding */
+ { 0x01D519, 0x01D519, { 0x000076 } }, /* 1D519; 0076; Additional folding */
+ { 0x01D51A, 0x01D51A, { 0x000077 } }, /* 1D51A; 0077; Additional folding */
+ { 0x01D51B, 0x01D51B, { 0x000078 } }, /* 1D51B; 0078; Additional folding */
+ { 0x01D51C, 0x01D51C, { 0x000079 } }, /* 1D51C; 0079; Additional folding */
+ { 0x01D538, 0x01D538, { 0x000061 } }, /* 1D538; 0061; Additional folding */
+ { 0x01D539, 0x01D539, { 0x000062 } }, /* 1D539; 0062; Additional folding */
+ { 0x01D53B, 0x01D53B, { 0x000064 } }, /* 1D53B; 0064; Additional folding */
+ { 0x01D53C, 0x01D53C, { 0x000065 } }, /* 1D53C; 0065; Additional folding */
+ { 0x01D53D, 0x01D53D, { 0x000066 } }, /* 1D53D; 0066; Additional folding */
+ { 0x01D53E, 0x01D53E, { 0x000067 } }, /* 1D53E; 0067; Additional folding */
+ { 0x01D540, 0x01D540, { 0x000069 } }, /* 1D540; 0069; Additional folding */
+ { 0x01D541, 0x01D541, { 0x00006A } }, /* 1D541; 006A; Additional folding */
+ { 0x01D542, 0x01D542, { 0x00006B } }, /* 1D542; 006B; Additional folding */
+ { 0x01D543, 0x01D543, { 0x00006C } }, /* 1D543; 006C; Additional folding */
+ { 0x01D544, 0x01D544, { 0x00006D } }, /* 1D544; 006D; Additional folding */
+ { 0x01D546, 0x01D546, { 0x00006F } }, /* 1D546; 006F; Additional folding */
+ { 0x01D54A, 0x01D54A, { 0x000073 } }, /* 1D54A; 0073; Additional folding */
+ { 0x01D54B, 0x01D54B, { 0x000074 } }, /* 1D54B; 0074; Additional folding */
+ { 0x01D54C, 0x01D54C, { 0x000075 } }, /* 1D54C; 0075; Additional folding */
+ { 0x01D54D, 0x01D54D, { 0x000076 } }, /* 1D54D; 0076; Additional folding */
+ { 0x01D54E, 0x01D54E, { 0x000077 } }, /* 1D54E; 0077; Additional folding */
+ { 0x01D54F, 0x01D54F, { 0x000078 } }, /* 1D54F; 0078; Additional folding */
+ { 0x01D550, 0x01D550, { 0x000079 } }, /* 1D550; 0079; Additional folding */
+ { 0x01D56C, 0x01D56C, { 0x000061 } }, /* 1D56C; 0061; Additional folding */
+ { 0x01D56D, 0x01D56D, { 0x000062 } }, /* 1D56D; 0062; Additional folding */
+ { 0x01D56E, 0x01D56E, { 0x000063 } }, /* 1D56E; 0063; Additional folding */
+ { 0x01D56F, 0x01D56F, { 0x000064 } }, /* 1D56F; 0064; Additional folding */
+ { 0x01D570, 0x01D570, { 0x000065 } }, /* 1D570; 0065; Additional folding */
+ { 0x01D571, 0x01D571, { 0x000066 } }, /* 1D571; 0066; Additional folding */
+ { 0x01D572, 0x01D572, { 0x000067 } }, /* 1D572; 0067; Additional folding */
+ { 0x01D573, 0x01D573, { 0x000068 } }, /* 1D573; 0068; Additional folding */
+ { 0x01D574, 0x01D574, { 0x000069 } }, /* 1D574; 0069; Additional folding */
+ { 0x01D575, 0x01D575, { 0x00006A } }, /* 1D575; 006A; Additional folding */
+ { 0x01D576, 0x01D576, { 0x00006B } }, /* 1D576; 006B; Additional folding */
+ { 0x01D577, 0x01D577, { 0x00006C } }, /* 1D577; 006C; Additional folding */
+ { 0x01D578, 0x01D578, { 0x00006D } }, /* 1D578; 006D; Additional folding */
+ { 0x01D579, 0x01D579, { 0x00006E } }, /* 1D579; 006E; Additional folding */
+ { 0x01D57A, 0x01D57A, { 0x00006F } }, /* 1D57A; 006F; Additional folding */
+ { 0x01D57B, 0x01D57B, { 0x000070 } }, /* 1D57B; 0070; Additional folding */
+ { 0x01D57C, 0x01D57C, { 0x000071 } }, /* 1D57C; 0071; Additional folding */
+ { 0x01D57D, 0x01D57D, { 0x000072 } }, /* 1D57D; 0072; Additional folding */
+ { 0x01D57E, 0x01D57E, { 0x000073 } }, /* 1D57E; 0073; Additional folding */
+ { 0x01D57F, 0x01D57F, { 0x000074 } }, /* 1D57F; 0074; Additional folding */
+ { 0x01D580, 0x01D580, { 0x000075 } }, /* 1D580; 0075; Additional folding */
+ { 0x01D581, 0x01D581, { 0x000076 } }, /* 1D581; 0076; Additional folding */
+ { 0x01D582, 0x01D582, { 0x000077 } }, /* 1D582; 0077; Additional folding */
+ { 0x01D583, 0x01D583, { 0x000078 } }, /* 1D583; 0078; Additional folding */
+ { 0x01D584, 0x01D584, { 0x000079 } }, /* 1D584; 0079; Additional folding */
+ { 0x01D585, 0x01D585, { 0x00007A } }, /* 1D585; 007A; Additional folding */
+ { 0x01D5A0, 0x01D5A0, { 0x000061 } }, /* 1D5A0; 0061; Additional folding */
+ { 0x01D5A1, 0x01D5A1, { 0x000062 } }, /* 1D5A1; 0062; Additional folding */
+ { 0x01D5A2, 0x01D5A2, { 0x000063 } }, /* 1D5A2; 0063; Additional folding */
+ { 0x01D5A3, 0x01D5A3, { 0x000064 } }, /* 1D5A3; 0064; Additional folding */
+ { 0x01D5A4, 0x01D5A4, { 0x000065 } }, /* 1D5A4; 0065; Additional folding */
+ { 0x01D5A5, 0x01D5A5, { 0x000066 } }, /* 1D5A5; 0066; Additional folding */
+ { 0x01D5A6, 0x01D5A6, { 0x000067 } }, /* 1D5A6; 0067; Additional folding */
+ { 0x01D5A7, 0x01D5A7, { 0x000068 } }, /* 1D5A7; 0068; Additional folding */
+ { 0x01D5A8, 0x01D5A8, { 0x000069 } }, /* 1D5A8; 0069; Additional folding */
+ { 0x01D5A9, 0x01D5A9, { 0x00006A } }, /* 1D5A9; 006A; Additional folding */
+ { 0x01D5AA, 0x01D5AA, { 0x00006B } }, /* 1D5AA; 006B; Additional folding */
+ { 0x01D5AB, 0x01D5AB, { 0x00006C } }, /* 1D5AB; 006C; Additional folding */
+ { 0x01D5AC, 0x01D5AC, { 0x00006D } }, /* 1D5AC; 006D; Additional folding */
+ { 0x01D5AD, 0x01D5AD, { 0x00006E } }, /* 1D5AD; 006E; Additional folding */
+ { 0x01D5AE, 0x01D5AE, { 0x00006F } }, /* 1D5AE; 006F; Additional folding */
+ { 0x01D5AF, 0x01D5AF, { 0x000070 } }, /* 1D5AF; 0070; Additional folding */
+ { 0x01D5B0, 0x01D5B0, { 0x000071 } }, /* 1D5B0; 0071; Additional folding */
+ { 0x01D5B1, 0x01D5B1, { 0x000072 } }, /* 1D5B1; 0072; Additional folding */
+ { 0x01D5B2, 0x01D5B2, { 0x000073 } }, /* 1D5B2; 0073; Additional folding */
+ { 0x01D5B3, 0x01D5B3, { 0x000074 } }, /* 1D5B3; 0074; Additional folding */
+ { 0x01D5B4, 0x01D5B4, { 0x000075 } }, /* 1D5B4; 0075; Additional folding */
+ { 0x01D5B5, 0x01D5B5, { 0x000076 } }, /* 1D5B5; 0076; Additional folding */
+ { 0x01D5B6, 0x01D5B6, { 0x000077 } }, /* 1D5B6; 0077; Additional folding */
+ { 0x01D5B7, 0x01D5B7, { 0x000078 } }, /* 1D5B7; 0078; Additional folding */
+ { 0x01D5B8, 0x01D5B8, { 0x000079 } }, /* 1D5B8; 0079; Additional folding */
+ { 0x01D5B9, 0x01D5B9, { 0x00007A } }, /* 1D5B9; 007A; Additional folding */
+ { 0x01D5D4, 0x01D5D4, { 0x000061 } }, /* 1D5D4; 0061; Additional folding */
+ { 0x01D5D5, 0x01D5D5, { 0x000062 } }, /* 1D5D5; 0062; Additional folding */
+ { 0x01D5D6, 0x01D5D6, { 0x000063 } }, /* 1D5D6; 0063; Additional folding */
+ { 0x01D5D7, 0x01D5D7, { 0x000064 } }, /* 1D5D7; 0064; Additional folding */
+ { 0x01D5D8, 0x01D5D8, { 0x000065 } }, /* 1D5D8; 0065; Additional folding */
+ { 0x01D5D9, 0x01D5D9, { 0x000066 } }, /* 1D5D9; 0066; Additional folding */
+ { 0x01D5DA, 0x01D5DA, { 0x000067 } }, /* 1D5DA; 0067; Additional folding */
+ { 0x01D5DB, 0x01D5DB, { 0x000068 } }, /* 1D5DB; 0068; Additional folding */
+ { 0x01D5DC, 0x01D5DC, { 0x000069 } }, /* 1D5DC; 0069; Additional folding */
+ { 0x01D5DD, 0x01D5DD, { 0x00006A } }, /* 1D5DD; 006A; Additional folding */
+ { 0x01D5DE, 0x01D5DE, { 0x00006B } }, /* 1D5DE; 006B; Additional folding */
+ { 0x01D5DF, 0x01D5DF, { 0x00006C } }, /* 1D5DF; 006C; Additional folding */
+ { 0x01D5E0, 0x01D5E0, { 0x00006D } }, /* 1D5E0; 006D; Additional folding */
+ { 0x01D5E1, 0x01D5E1, { 0x00006E } }, /* 1D5E1; 006E; Additional folding */
+ { 0x01D5E2, 0x01D5E2, { 0x00006F } }, /* 1D5E2; 006F; Additional folding */
+ { 0x01D5E3, 0x01D5E3, { 0x000070 } }, /* 1D5E3; 0070; Additional folding */
+ { 0x01D5E4, 0x01D5E4, { 0x000071 } }, /* 1D5E4; 0071; Additional folding */
+ { 0x01D5E5, 0x01D5E5, { 0x000072 } }, /* 1D5E5; 0072; Additional folding */
+ { 0x01D5E6, 0x01D5E6, { 0x000073 } }, /* 1D5E6; 0073; Additional folding */
+ { 0x01D5E7, 0x01D5E7, { 0x000074 } }, /* 1D5E7; 0074; Additional folding */
+ { 0x01D5E8, 0x01D5E8, { 0x000075 } }, /* 1D5E8; 0075; Additional folding */
+ { 0x01D5E9, 0x01D5E9, { 0x000076 } }, /* 1D5E9; 0076; Additional folding */
+ { 0x01D5EA, 0x01D5EA, { 0x000077 } }, /* 1D5EA; 0077; Additional folding */
+ { 0x01D5EB, 0x01D5EB, { 0x000078 } }, /* 1D5EB; 0078; Additional folding */
+ { 0x01D5EC, 0x01D5EC, { 0x000079 } }, /* 1D5EC; 0079; Additional folding */
+ { 0x01D5ED, 0x01D5ED, { 0x00007A } }, /* 1D5ED; 007A; Additional folding */
+ { 0x01D608, 0x01D608, { 0x000061 } }, /* 1D608; 0061; Additional folding */
+ { 0x01D609, 0x01D609, { 0x000062 } }, /* 1D609; 0062; Additional folding */
+ { 0x01D60A, 0x01D60A, { 0x000063 } }, /* 1D60A; 0063; Additional folding */
+ { 0x01D60B, 0x01D60B, { 0x000064 } }, /* 1D60B; 0064; Additional folding */
+ { 0x01D60C, 0x01D60C, { 0x000065 } }, /* 1D60C; 0065; Additional folding */
+ { 0x01D60D, 0x01D60D, { 0x000066 } }, /* 1D60D; 0066; Additional folding */
+ { 0x01D60E, 0x01D60E, { 0x000067 } }, /* 1D60E; 0067; Additional folding */
+ { 0x01D60F, 0x01D60F, { 0x000068 } }, /* 1D60F; 0068; Additional folding */
+ { 0x01D610, 0x01D610, { 0x000069 } }, /* 1D610; 0069; Additional folding */
+ { 0x01D611, 0x01D611, { 0x00006A } }, /* 1D611; 006A; Additional folding */
+ { 0x01D612, 0x01D612, { 0x00006B } }, /* 1D612; 006B; Additional folding */
+ { 0x01D613, 0x01D613, { 0x00006C } }, /* 1D613; 006C; Additional folding */
+ { 0x01D614, 0x01D614, { 0x00006D } }, /* 1D614; 006D; Additional folding */
+ { 0x01D615, 0x01D615, { 0x00006E } }, /* 1D615; 006E; Additional folding */
+ { 0x01D616, 0x01D616, { 0x00006F } }, /* 1D616; 006F; Additional folding */
+ { 0x01D617, 0x01D617, { 0x000070 } }, /* 1D617; 0070; Additional folding */
+ { 0x01D618, 0x01D618, { 0x000071 } }, /* 1D618; 0071; Additional folding */
+ { 0x01D619, 0x01D619, { 0x000072 } }, /* 1D619; 0072; Additional folding */
+ { 0x01D61A, 0x01D61A, { 0x000073 } }, /* 1D61A; 0073; Additional folding */
+ { 0x01D61B, 0x01D61B, { 0x000074 } }, /* 1D61B; 0074; Additional folding */
+ { 0x01D61C, 0x01D61C, { 0x000075 } }, /* 1D61C; 0075; Additional folding */
+ { 0x01D61D, 0x01D61D, { 0x000076 } }, /* 1D61D; 0076; Additional folding */
+ { 0x01D61E, 0x01D61E, { 0x000077 } }, /* 1D61E; 0077; Additional folding */
+ { 0x01D61F, 0x01D61F, { 0x000078 } }, /* 1D61F; 0078; Additional folding */
+ { 0x01D620, 0x01D620, { 0x000079 } }, /* 1D620; 0079; Additional folding */
+ { 0x01D621, 0x01D621, { 0x00007A } }, /* 1D621; 007A; Additional folding */
+ { 0x01D63C, 0x01D63C, { 0x000061 } }, /* 1D63C; 0061; Additional folding */
+ { 0x01D63D, 0x01D63D, { 0x000062 } }, /* 1D63D; 0062; Additional folding */
+ { 0x01D63E, 0x01D63E, { 0x000063 } }, /* 1D63E; 0063; Additional folding */
+ { 0x01D63F, 0x01D63F, { 0x000064 } }, /* 1D63F; 0064; Additional folding */
+ { 0x01D640, 0x01D640, { 0x000065 } }, /* 1D640; 0065; Additional folding */
+ { 0x01D641, 0x01D641, { 0x000066 } }, /* 1D641; 0066; Additional folding */
+ { 0x01D642, 0x01D642, { 0x000067 } }, /* 1D642; 0067; Additional folding */
+ { 0x01D643, 0x01D643, { 0x000068 } }, /* 1D643; 0068; Additional folding */
+ { 0x01D644, 0x01D644, { 0x000069 } }, /* 1D644; 0069; Additional folding */
+ { 0x01D645, 0x01D645, { 0x00006A } }, /* 1D645; 006A; Additional folding */
+ { 0x01D646, 0x01D646, { 0x00006B } }, /* 1D646; 006B; Additional folding */
+ { 0x01D647, 0x01D647, { 0x00006C } }, /* 1D647; 006C; Additional folding */
+ { 0x01D648, 0x01D648, { 0x00006D } }, /* 1D648; 006D; Additional folding */
+ { 0x01D649, 0x01D649, { 0x00006E } }, /* 1D649; 006E; Additional folding */
+ { 0x01D64A, 0x01D64A, { 0x00006F } }, /* 1D64A; 006F; Additional folding */
+ { 0x01D64B, 0x01D64B, { 0x000070 } }, /* 1D64B; 0070; Additional folding */
+ { 0x01D64C, 0x01D64C, { 0x000071 } }, /* 1D64C; 0071; Additional folding */
+ { 0x01D64D, 0x01D64D, { 0x000072 } }, /* 1D64D; 0072; Additional folding */
+ { 0x01D64E, 0x01D64E, { 0x000073 } }, /* 1D64E; 0073; Additional folding */
+ { 0x01D64F, 0x01D64F, { 0x000074 } }, /* 1D64F; 0074; Additional folding */
+ { 0x01D650, 0x01D650, { 0x000075 } }, /* 1D650; 0075; Additional folding */
+ { 0x01D651, 0x01D651, { 0x000076 } }, /* 1D651; 0076; Additional folding */
+ { 0x01D652, 0x01D652, { 0x000077 } }, /* 1D652; 0077; Additional folding */
+ { 0x01D653, 0x01D653, { 0x000078 } }, /* 1D653; 0078; Additional folding */
+ { 0x01D654, 0x01D654, { 0x000079 } }, /* 1D654; 0079; Additional folding */
+ { 0x01D655, 0x01D655, { 0x00007A } }, /* 1D655; 007A; Additional folding */
+ { 0x01D670, 0x01D670, { 0x000061 } }, /* 1D670; 0061; Additional folding */
+ { 0x01D671, 0x01D671, { 0x000062 } }, /* 1D671; 0062; Additional folding */
+ { 0x01D672, 0x01D672, { 0x000063 } }, /* 1D672; 0063; Additional folding */
+ { 0x01D673, 0x01D673, { 0x000064 } }, /* 1D673; 0064; Additional folding */
+ { 0x01D674, 0x01D674, { 0x000065 } }, /* 1D674; 0065; Additional folding */
+ { 0x01D675, 0x01D675, { 0x000066 } }, /* 1D675; 0066; Additional folding */
+ { 0x01D676, 0x01D676, { 0x000067 } }, /* 1D676; 0067; Additional folding */
+ { 0x01D677, 0x01D677, { 0x000068 } }, /* 1D677; 0068; Additional folding */
+ { 0x01D678, 0x01D678, { 0x000069 } }, /* 1D678; 0069; Additional folding */
+ { 0x01D679, 0x01D679, { 0x00006A } }, /* 1D679; 006A; Additional folding */
+ { 0x01D67A, 0x01D67A, { 0x00006B } }, /* 1D67A; 006B; Additional folding */
+ { 0x01D67B, 0x01D67B, { 0x00006C } }, /* 1D67B; 006C; Additional folding */
+ { 0x01D67C, 0x01D67C, { 0x00006D } }, /* 1D67C; 006D; Additional folding */
+ { 0x01D67D, 0x01D67D, { 0x00006E } }, /* 1D67D; 006E; Additional folding */
+ { 0x01D67E, 0x01D67E, { 0x00006F } }, /* 1D67E; 006F; Additional folding */
+ { 0x01D67F, 0x01D67F, { 0x000070 } }, /* 1D67F; 0070; Additional folding */
+ { 0x01D680, 0x01D680, { 0x000071 } }, /* 1D680; 0071; Additional folding */
+ { 0x01D681, 0x01D681, { 0x000072 } }, /* 1D681; 0072; Additional folding */
+ { 0x01D682, 0x01D682, { 0x000073 } }, /* 1D682; 0073; Additional folding */
+ { 0x01D683, 0x01D683, { 0x000074 } }, /* 1D683; 0074; Additional folding */
+ { 0x01D684, 0x01D684, { 0x000075 } }, /* 1D684; 0075; Additional folding */
+ { 0x01D685, 0x01D685, { 0x000076 } }, /* 1D685; 0076; Additional folding */
+ { 0x01D686, 0x01D686, { 0x000077 } }, /* 1D686; 0077; Additional folding */
+ { 0x01D687, 0x01D687, { 0x000078 } }, /* 1D687; 0078; Additional folding */
+ { 0x01D688, 0x01D688, { 0x000079 } }, /* 1D688; 0079; Additional folding */
+ { 0x01D689, 0x01D689, { 0x00007A } }, /* 1D689; 007A; Additional folding */
+ { 0x01D6A8, 0x01D6A8, { 0x0003B1 } }, /* 1D6A8; 03B1; Additional folding */
+ { 0x01D6A9, 0x01D6A9, { 0x0003B2 } }, /* 1D6A9; 03B2; Additional folding */
+ { 0x01D6AA, 0x01D6AA, { 0x0003B3 } }, /* 1D6AA; 03B3; Additional folding */
+ { 0x01D6AB, 0x01D6AB, { 0x0003B4 } }, /* 1D6AB; 03B4; Additional folding */
+ { 0x01D6AC, 0x01D6AC, { 0x0003B5 } }, /* 1D6AC; 03B5; Additional folding */
+ { 0x01D6AD, 0x01D6AD, { 0x0003B6 } }, /* 1D6AD; 03B6; Additional folding */
+ { 0x01D6AE, 0x01D6AE, { 0x0003B7 } }, /* 1D6AE; 03B7; Additional folding */
+ { 0x01D6AF, 0x01D6AF, { 0x0003B8 } }, /* 1D6AF; 03B8; Additional folding */
+ { 0x01D6B0, 0x01D6B0, { 0x0003B9 } }, /* 1D6B0; 03B9; Additional folding */
+ { 0x01D6B1, 0x01D6B1, { 0x0003BA } }, /* 1D6B1; 03BA; Additional folding */
+ { 0x01D6B2, 0x01D6B2, { 0x0003BB } }, /* 1D6B2; 03BB; Additional folding */
+ { 0x01D6B3, 0x01D6B3, { 0x0003BC } }, /* 1D6B3; 03BC; Additional folding */
+ { 0x01D6B4, 0x01D6B4, { 0x0003BD } }, /* 1D6B4; 03BD; Additional folding */
+ { 0x01D6B5, 0x01D6B5, { 0x0003BE } }, /* 1D6B5; 03BE; Additional folding */
+ { 0x01D6B6, 0x01D6B6, { 0x0003BF } }, /* 1D6B6; 03BF; Additional folding */
+ { 0x01D6B7, 0x01D6B7, { 0x0003C0 } }, /* 1D6B7; 03C0; Additional folding */
+ { 0x01D6B8, 0x01D6B8, { 0x0003C1 } }, /* 1D6B8; 03C1; Additional folding */
+ { 0x01D6B9, 0x01D6B9, { 0x0003B8 } }, /* 1D6B9; 03B8; Additional folding */
+ { 0x01D6BA, 0x01D6BA, { 0x0003C3 } }, /* 1D6BA; 03C3; Additional folding */
+ { 0x01D6BB, 0x01D6BB, { 0x0003C4 } }, /* 1D6BB; 03C4; Additional folding */
+ { 0x01D6BC, 0x01D6BC, { 0x0003C5 } }, /* 1D6BC; 03C5; Additional folding */
+ { 0x01D6BD, 0x01D6BD, { 0x0003C6 } }, /* 1D6BD; 03C6; Additional folding */
+ { 0x01D6BE, 0x01D6BE, { 0x0003C7 } }, /* 1D6BE; 03C7; Additional folding */
+ { 0x01D6BF, 0x01D6BF, { 0x0003C8 } }, /* 1D6BF; 03C8; Additional folding */
+ { 0x01D6C0, 0x01D6C0, { 0x0003C9 } }, /* 1D6C0; 03C9; Additional folding */
+ { 0x01D6D3, 0x01D6D3, { 0x0003C3 } }, /* 1D6D3; 03C3; Additional folding */
+ { 0x01D6E2, 0x01D6E2, { 0x0003B1 } }, /* 1D6E2; 03B1; Additional folding */
+ { 0x01D6E3, 0x01D6E3, { 0x0003B2 } }, /* 1D6E3; 03B2; Additional folding */
+ { 0x01D6E4, 0x01D6E4, { 0x0003B3 } }, /* 1D6E4; 03B3; Additional folding */
+ { 0x01D6E5, 0x01D6E5, { 0x0003B4 } }, /* 1D6E5; 03B4; Additional folding */
+ { 0x01D6E6, 0x01D6E6, { 0x0003B5 } }, /* 1D6E6; 03B5; Additional folding */
+ { 0x01D6E7, 0x01D6E7, { 0x0003B6 } }, /* 1D6E7; 03B6; Additional folding */
+ { 0x01D6E8, 0x01D6E8, { 0x0003B7 } }, /* 1D6E8; 03B7; Additional folding */
+ { 0x01D6E9, 0x01D6E9, { 0x0003B8 } }, /* 1D6E9; 03B8; Additional folding */
+ { 0x01D6EA, 0x01D6EA, { 0x0003B9 } }, /* 1D6EA; 03B9; Additional folding */
+ { 0x01D6EB, 0x01D6EB, { 0x0003BA } }, /* 1D6EB; 03BA; Additional folding */
+ { 0x01D6EC, 0x01D6EC, { 0x0003BB } }, /* 1D6EC; 03BB; Additional folding */
+ { 0x01D6ED, 0x01D6ED, { 0x0003BC } }, /* 1D6ED; 03BC; Additional folding */
+ { 0x01D6EE, 0x01D6EE, { 0x0003BD } }, /* 1D6EE; 03BD; Additional folding */
+ { 0x01D6EF, 0x01D6EF, { 0x0003BE } }, /* 1D6EF; 03BE; Additional folding */
+ { 0x01D6F0, 0x01D6F0, { 0x0003BF } }, /* 1D6F0; 03BF; Additional folding */
+ { 0x01D6F1, 0x01D6F1, { 0x0003C0 } }, /* 1D6F1; 03C0; Additional folding */
+ { 0x01D6F2, 0x01D6F2, { 0x0003C1 } }, /* 1D6F2; 03C1; Additional folding */
+ { 0x01D6F3, 0x01D6F3, { 0x0003B8 } }, /* 1D6F3; 03B8; Additional folding */
+ { 0x01D6F4, 0x01D6F4, { 0x0003C3 } }, /* 1D6F4; 03C3; Additional folding */
+ { 0x01D6F5, 0x01D6F5, { 0x0003C4 } }, /* 1D6F5; 03C4; Additional folding */
+ { 0x01D6F6, 0x01D6F6, { 0x0003C5 } }, /* 1D6F6; 03C5; Additional folding */
+ { 0x01D6F7, 0x01D6F7, { 0x0003C6 } }, /* 1D6F7; 03C6; Additional folding */
+ { 0x01D6F8, 0x01D6F8, { 0x0003C7 } }, /* 1D6F8; 03C7; Additional folding */
+ { 0x01D6F9, 0x01D6F9, { 0x0003C8 } }, /* 1D6F9; 03C8; Additional folding */
+ { 0x01D6FA, 0x01D6FA, { 0x0003C9 } }, /* 1D6FA; 03C9; Additional folding */
+ { 0x01D70D, 0x01D70D, { 0x0003C3 } }, /* 1D70D; 03C3; Additional folding */
+ { 0x01D71C, 0x01D71C, { 0x0003B1 } }, /* 1D71C; 03B1; Additional folding */
+ { 0x01D71D, 0x01D71D, { 0x0003B2 } }, /* 1D71D; 03B2; Additional folding */
+ { 0x01D71E, 0x01D71E, { 0x0003B3 } }, /* 1D71E; 03B3; Additional folding */
+ { 0x01D71F, 0x01D71F, { 0x0003B4 } }, /* 1D71F; 03B4; Additional folding */
+ { 0x01D720, 0x01D720, { 0x0003B5 } }, /* 1D720; 03B5; Additional folding */
+ { 0x01D721, 0x01D721, { 0x0003B6 } }, /* 1D721; 03B6; Additional folding */
+ { 0x01D722, 0x01D722, { 0x0003B7 } }, /* 1D722; 03B7; Additional folding */
+ { 0x01D723, 0x01D723, { 0x0003B8 } }, /* 1D723; 03B8; Additional folding */
+ { 0x01D724, 0x01D724, { 0x0003B9 } }, /* 1D724; 03B9; Additional folding */
+ { 0x01D725, 0x01D725, { 0x0003BA } }, /* 1D725; 03BA; Additional folding */
+ { 0x01D726, 0x01D726, { 0x0003BB } }, /* 1D726; 03BB; Additional folding */
+ { 0x01D727, 0x01D727, { 0x0003BC } }, /* 1D727; 03BC; Additional folding */
+ { 0x01D728, 0x01D728, { 0x0003BD } }, /* 1D728; 03BD; Additional folding */
+ { 0x01D729, 0x01D729, { 0x0003BE } }, /* 1D729; 03BE; Additional folding */
+ { 0x01D72A, 0x01D72A, { 0x0003BF } }, /* 1D72A; 03BF; Additional folding */
+ { 0x01D72B, 0x01D72B, { 0x0003C0 } }, /* 1D72B; 03C0; Additional folding */
+ { 0x01D72C, 0x01D72C, { 0x0003C1 } }, /* 1D72C; 03C1; Additional folding */
+ { 0x01D72D, 0x01D72D, { 0x0003B8 } }, /* 1D72D; 03B8; Additional folding */
+ { 0x01D72E, 0x01D72E, { 0x0003C3 } }, /* 1D72E; 03C3; Additional folding */
+ { 0x01D72F, 0x01D72F, { 0x0003C4 } }, /* 1D72F; 03C4; Additional folding */
+ { 0x01D730, 0x01D730, { 0x0003C5 } }, /* 1D730; 03C5; Additional folding */
+ { 0x01D731, 0x01D731, { 0x0003C6 } }, /* 1D731; 03C6; Additional folding */
+ { 0x01D732, 0x01D732, { 0x0003C7 } }, /* 1D732; 03C7; Additional folding */
+ { 0x01D733, 0x01D733, { 0x0003C8 } }, /* 1D733; 03C8; Additional folding */
+ { 0x01D734, 0x01D734, { 0x0003C9 } }, /* 1D734; 03C9; Additional folding */
+ { 0x01D747, 0x01D747, { 0x0003C3 } }, /* 1D747; 03C3; Additional folding */
+ { 0x01D756, 0x01D756, { 0x0003B1 } }, /* 1D756; 03B1; Additional folding */
+ { 0x01D757, 0x01D757, { 0x0003B2 } }, /* 1D757; 03B2; Additional folding */
+ { 0x01D758, 0x01D758, { 0x0003B3 } }, /* 1D758; 03B3; Additional folding */
+ { 0x01D759, 0x01D759, { 0x0003B4 } }, /* 1D759; 03B4; Additional folding */
+ { 0x01D75A, 0x01D75A, { 0x0003B5 } }, /* 1D75A; 03B5; Additional folding */
+ { 0x01D75B, 0x01D75B, { 0x0003B6 } }, /* 1D75B; 03B6; Additional folding */
+ { 0x01D75C, 0x01D75C, { 0x0003B7 } }, /* 1D75C; 03B7; Additional folding */
+ { 0x01D75D, 0x01D75D, { 0x0003B8 } }, /* 1D75D; 03B8; Additional folding */
+ { 0x01D75E, 0x01D75E, { 0x0003B9 } }, /* 1D75E; 03B9; Additional folding */
+ { 0x01D75F, 0x01D75F, { 0x0003BA } }, /* 1D75F; 03BA; Additional folding */
+ { 0x01D760, 0x01D760, { 0x0003BB } }, /* 1D760; 03BB; Additional folding */
+ { 0x01D761, 0x01D761, { 0x0003BC } }, /* 1D761; 03BC; Additional folding */
+ { 0x01D762, 0x01D762, { 0x0003BD } }, /* 1D762; 03BD; Additional folding */
+ { 0x01D763, 0x01D763, { 0x0003BE } }, /* 1D763; 03BE; Additional folding */
+ { 0x01D764, 0x01D764, { 0x0003BF } }, /* 1D764; 03BF; Additional folding */
+ { 0x01D765, 0x01D765, { 0x0003C0 } }, /* 1D765; 03C0; Additional folding */
+ { 0x01D766, 0x01D766, { 0x0003C1 } }, /* 1D766; 03C1; Additional folding */
+ { 0x01D767, 0x01D767, { 0x0003B8 } }, /* 1D767; 03B8; Additional folding */
+ { 0x01D768, 0x01D768, { 0x0003C3 } }, /* 1D768; 03C3; Additional folding */
+ { 0x01D769, 0x01D769, { 0x0003C4 } }, /* 1D769; 03C4; Additional folding */
+ { 0x01D76A, 0x01D76A, { 0x0003C5 } }, /* 1D76A; 03C5; Additional folding */
+ { 0x01D76B, 0x01D76B, { 0x0003C6 } }, /* 1D76B; 03C6; Additional folding */
+ { 0x01D76C, 0x01D76C, { 0x0003C7 } }, /* 1D76C; 03C7; Additional folding */
+ { 0x01D76D, 0x01D76D, { 0x0003C8 } }, /* 1D76D; 03C8; Additional folding */
+ { 0x01D76E, 0x01D76E, { 0x0003C9 } }, /* 1D76E; 03C9; Additional folding */
+ { 0x01D781, 0x01D781, { 0x0003C3 } }, /* 1D781; 03C3; Additional folding */
+ { 0x01D790, 0x01D790, { 0x0003B1 } }, /* 1D790; 03B1; Additional folding */
+ { 0x01D791, 0x01D791, { 0x0003B2 } }, /* 1D791; 03B2; Additional folding */
+ { 0x01D792, 0x01D792, { 0x0003B3 } }, /* 1D792; 03B3; Additional folding */
+ { 0x01D793, 0x01D793, { 0x0003B4 } }, /* 1D793; 03B4; Additional folding */
+ { 0x01D794, 0x01D794, { 0x0003B5 } }, /* 1D794; 03B5; Additional folding */
+ { 0x01D795, 0x01D795, { 0x0003B6 } }, /* 1D795; 03B6; Additional folding */
+ { 0x01D796, 0x01D796, { 0x0003B7 } }, /* 1D796; 03B7; Additional folding */
+ { 0x01D797, 0x01D797, { 0x0003B8 } }, /* 1D797; 03B8; Additional folding */
+ { 0x01D798, 0x01D798, { 0x0003B9 } }, /* 1D798; 03B9; Additional folding */
+ { 0x01D799, 0x01D799, { 0x0003BA } }, /* 1D799; 03BA; Additional folding */
+ { 0x01D79A, 0x01D79A, { 0x0003BB } }, /* 1D79A; 03BB; Additional folding */
+ { 0x01D79B, 0x01D79B, { 0x0003BC } }, /* 1D79B; 03BC; Additional folding */
+ { 0x01D79C, 0x01D79C, { 0x0003BD } }, /* 1D79C; 03BD; Additional folding */
+ { 0x01D79D, 0x01D79D, { 0x0003BE } }, /* 1D79D; 03BE; Additional folding */
+ { 0x01D79E, 0x01D79E, { 0x0003BF } }, /* 1D79E; 03BF; Additional folding */
+ { 0x01D79F, 0x01D79F, { 0x0003C0 } }, /* 1D79F; 03C0; Additional folding */
+ { 0x01D7A0, 0x01D7A0, { 0x0003C1 } }, /* 1D7A0; 03C1; Additional folding */
+ { 0x01D7A1, 0x01D7A1, { 0x0003B8 } }, /* 1D7A1; 03B8; Additional folding */
+ { 0x01D7A2, 0x01D7A2, { 0x0003C3 } }, /* 1D7A2; 03C3; Additional folding */
+ { 0x01D7A3, 0x01D7A3, { 0x0003C4 } }, /* 1D7A3; 03C4; Additional folding */
+ { 0x01D7A4, 0x01D7A4, { 0x0003C5 } }, /* 1D7A4; 03C5; Additional folding */
+ { 0x01D7A5, 0x01D7A5, { 0x0003C6 } }, /* 1D7A5; 03C6; Additional folding */
+ { 0x01D7A6, 0x01D7A6, { 0x0003C7 } }, /* 1D7A6; 03C7; Additional folding */
+ { 0x01D7A7, 0x01D7A7, { 0x0003C8 } }, /* 1D7A7; 03C8; Additional folding */
+ { 0x01D7A8, 0x01D7A8, { 0x0003C9 } }, /* 1D7A8; 03C9; Additional folding */
+ { 0x01D7BB, 0x01D7BB, { 0x0003C3 } }, /* 1D7BB; 03C3; Additional folding */
+ { 0 },
+};
+
+/*
+ * FF3A; FF5A; Case map
+ * 10400; 10428; Case map
+10401; 10429; Case map
+10402; 1042A; Case map
+10403; 1042B; Case map
+10404; 1042C; Case map
+10405; 1042D; Case map
+10406; 1042E; Case map
+10407; 1042F; Case map
+10408; 10430; Case map
+10409; 10431; Case map
+1040A; 10432; Case map
+1040B; 10433; Case map
+1040C; 10434; Case map
+1040D; 10435; Case map
+1040E; 10436; Case map
+1040F; 10437; Case map
+10410; 10438; Case map
+10411; 10439; Case map
+10412; 1043A; Case map
+10413; 1043B; Case map
+10414; 1043C; Case map
+10415; 1043D; Case map
+10416; 1043E; Case map
+10417; 1043F; Case map
+10418; 10440; Case map
+10419; 10441; Case map
+1041A; 10442; Case map
+1041B; 10443; Case map
+1041C; 10444; Case map
+1041D; 10445; Case map
+1041E; 10446; Case map
+1041F; 10447; Case map
+10420; 10448; Case map
+10421; 10449; Case map
+10422; 1044A; Case map
+10423; 1044B; Case map
+10424; 1044C; Case map
+10425; 1044D; Case map
+1D400; 0061; Additional folding
+1D401; 0062; Additional folding
+1D402; 0063; Additional folding
+1D403; 0064; Additional folding
+1D404; 0065; Additional folding
+1D405; 0066; Additional folding
+1D406; 0067; Additional folding
+1D407; 0068; Additional folding
+1D408; 0069; Additional folding
+1D409; 006A; Additional folding
+1D40A; 006B; Additional folding
+1D40B; 006C; Additional folding
+1D40C; 006D; Additional folding
+1D40D; 006E; Additional folding
+1D40E; 006F; Additional folding
+1D40F; 0070; Additional folding
+1D410; 0071; Additional folding
+1D411; 0072; Additional folding
+1D412; 0073; Additional folding
+1D413; 0074; Additional folding
+1D414; 0075; Additional folding
+1D415; 0076; Additional folding
+1D416; 0077; Additional folding
+1D417; 0078; Additional folding
+1D418; 0079; Additional folding
+1D419; 007A; Additional folding
+1D434; 0061; Additional folding
+1D435; 0062; Additional folding
+1D436; 0063; Additional folding
+1D437; 0064; Additional folding
+1D438; 0065; Additional folding
+1D439; 0066; Additional folding
+1D43A; 0067; Additional folding
+1D43B; 0068; Additional folding
+1D43C; 0069; Additional folding
+1D43D; 006A; Additional folding
+1D43E; 006B; Additional folding
+1D43F; 006C; Additional folding
+1D440; 006D; Additional folding
+1D441; 006E; Additional folding
+1D442; 006F; Additional folding
+1D443; 0070; Additional folding
+1D444; 0071; Additional folding
+1D445; 0072; Additional folding
+1D446; 0073; Additional folding
+1D447; 0074; Additional folding
+1D448; 0075; Additional folding
+1D449; 0076; Additional folding
+1D44A; 0077; Additional folding
+1D44B; 0078; Additional folding
+1D44C; 0079; Additional folding
+1D44D; 007A; Additional folding
+1D468; 0061; Additional folding
+1D469; 0062; Additional folding
+1D46A; 0063; Additional folding
+1D46B; 0064; Additional folding
+1D46C; 0065; Additional folding
+1D46D; 0066; Additional folding
+1D46E; 0067; Additional folding
+1D46F; 0068; Additional folding
+1D470; 0069; Additional folding
+1D471; 006A; Additional folding
+1D472; 006B; Additional folding
+1D473; 006C; Additional folding
+1D474; 006D; Additional folding
+1D475; 006E; Additional folding
+1D476; 006F; Additional folding
+1D477; 0070; Additional folding
+1D478; 0071; Additional folding
+1D479; 0072; Additional folding
+1D47A; 0073; Additional folding
+1D47B; 0074; Additional folding
+1D47C; 0075; Additional folding
+1D47D; 0076; Additional folding
+1D47E; 0077; Additional folding
+1D47F; 0078; Additional folding
+1D480; 0079; Additional folding
+1D481; 007A; Additional folding
+1D49C; 0061; Additional folding
+1D49E; 0063; Additional folding
+1D49F; 0064; Additional folding
+1D4A2; 0067; Additional folding
+1D4A5; 006A; Additional folding
+1D4A6; 006B; Additional folding
+1D4A9; 006E; Additional folding
+1D4AA; 006F; Additional folding
+1D4AB; 0070; Additional folding
+1D4AC; 0071; Additional folding
+1D4AE; 0073; Additional folding
+1D4AF; 0074; Additional folding
+1D4B0; 0075; Additional folding
+1D4B1; 0076; Additional folding
+1D4B2; 0077; Additional folding
+1D4B3; 0078; Additional folding
+1D4B4; 0079; Additional folding
+1D4B5; 007A; Additional folding
+1D4D0; 0061; Additional folding
+1D4D1; 0062; Additional folding
+1D4D2; 0063; Additional folding
+1D4D3; 0064; Additional folding
+1D4D4; 0065; Additional folding
+1D4D5; 0066; Additional folding
+1D4D6; 0067; Additional folding
+1D4D7; 0068; Additional folding
+1D4D8; 0069; Additional folding
+1D4D9; 006A; Additional folding
+1D4DA; 006B; Additional folding
+1D4DB; 006C; Additional folding
+1D4DC; 006D; Additional folding
+1D4DD; 006E; Additional folding
+1D4DE; 006F; Additional folding
+1D4DF; 0070; Additional folding
+1D4E0; 0071; Additional folding
+1D4E1; 0072; Additional folding
+1D4E2; 0073; Additional folding
+1D4E3; 0074; Additional folding
+1D4E4; 0075; Additional folding
+1D4E5; 0076; Additional folding
+1D4E6; 0077; Additional folding
+1D4E7; 0078; Additional folding
+1D4E8; 0079; Additional folding
+1D4E9; 007A; Additional folding
+1D504; 0061; Additional folding
+1D505; 0062; Additional folding
+1D507; 0064; Additional folding
+1D508; 0065; Additional folding
+1D509; 0066; Additional folding
+1D50A; 0067; Additional folding
+1D50D; 006A; Additional folding
+1D50E; 006B; Additional folding
+1D50F; 006C; Additional folding
+1D510; 006D; Additional folding
+1D511; 006E; Additional folding
+1D512; 006F; Additional folding
+1D513; 0070; Additional folding
+1D514; 0071; Additional folding
+1D516; 0073; Additional folding
+1D517; 0074; Additional folding
+1D518; 0075; Additional folding
+1D519; 0076; Additional folding
+1D51A; 0077; Additional folding
+1D51B; 0078; Additional folding
+1D51C; 0079; Additional folding
+1D538; 0061; Additional folding
+1D539; 0062; Additional folding
+1D53B; 0064; Additional folding
+1D53C; 0065; Additional folding
+1D53D; 0066; Additional folding
+1D53E; 0067; Additional folding
+1D540; 0069; Additional folding
+1D541; 006A; Additional folding
+1D542; 006B; Additional folding
+1D543; 006C; Additional folding
+1D544; 006D; Additional folding
+1D546; 006F; Additional folding
+1D54A; 0073; Additional folding
+1D54B; 0074; Additional folding
+1D54C; 0075; Additional folding
+1D54D; 0076; Additional folding
+1D54E; 0077; Additional folding
+1D54F; 0078; Additional folding
+1D550; 0079; Additional folding
+1D56C; 0061; Additional folding
+1D56D; 0062; Additional folding
+1D56E; 0063; Additional folding
+1D56F; 0064; Additional folding
+1D570; 0065; Additional folding
+1D571; 0066; Additional folding
+1D572; 0067; Additional folding
+1D573; 0068; Additional folding
+1D574; 0069; Additional folding
+1D575; 006A; Additional folding
+1D576; 006B; Additional folding
+1D577; 006C; Additional folding
+1D578; 006D; Additional folding
+1D579; 006E; Additional folding
+1D57A; 006F; Additional folding
+1D57B; 0070; Additional folding
+1D57C; 0071; Additional folding
+1D57D; 0072; Additional folding
+1D57E; 0073; Additional folding
+1D57F; 0074; Additional folding
+1D580; 0075; Additional folding
+1D581; 0076; Additional folding
+1D582; 0077; Additional folding
+1D583; 0078; Additional folding
+1D584; 0079; Additional folding
+1D585; 007A; Additional folding
+1D5A0; 0061; Additional folding
+1D5A1; 0062; Additional folding
+1D5A2; 0063; Additional folding
+1D5A3; 0064; Additional folding
+1D5A4; 0065; Additional folding
+1D5A5; 0066; Additional folding
+1D5A6; 0067; Additional folding
+1D5A7; 0068; Additional folding
+1D5A8; 0069; Additional folding
+1D5A9; 006A; Additional folding
+1D5AA; 006B; Additional folding
+1D5AB; 006C; Additional folding
+1D5AC; 006D; Additional folding
+1D5AD; 006E; Additional folding
+1D5AE; 006F; Additional folding
+1D5AF; 0070; Additional folding
+1D5B0; 0071; Additional folding
+1D5B1; 0072; Additional folding
+1D5B2; 0073; Additional folding
+1D5B3; 0074; Additional folding
+1D5B4; 0075; Additional folding
+1D5B5; 0076; Additional folding
+1D5B6; 0077; Additional folding
+1D5B7; 0078; Additional folding
+1D5B8; 0079; Additional folding
+1D5B9; 007A; Additional folding
+1D5D4; 0061; Additional folding
+1D5D5; 0062; Additional folding
+1D5D6; 0063; Additional folding
+1D5D7; 0064; Additional folding
+1D5D8; 0065; Additional folding
+1D5D9; 0066; Additional folding
+1D5DA; 0067; Additional folding
+1D5DB; 0068; Additional folding
+1D5DC; 0069; Additional folding
+1D5DD; 006A; Additional folding
+1D5DE; 006B; Additional folding
+1D5DF; 006C; Additional folding
+1D5E0; 006D; Additional folding
+1D5E1; 006E; Additional folding
+1D5E2; 006F; Additional folding
+1D5E3; 0070; Additional folding
+1D5E4; 0071; Additional folding
+1D5E5; 0072; Additional folding
+1D5E6; 0073; Additional folding
+1D5E7; 0074; Additional folding
+1D5E8; 0075; Additional folding
+1D5E9; 0076; Additional folding
+1D5EA; 0077; Additional folding
+1D5EB; 0078; Additional folding
+1D5EC; 0079; Additional folding
+1D5ED; 007A; Additional folding
+1D608; 0061; Additional folding
+1D609; 0062; Additional folding
+1D60A; 0063; Additional folding
+1D60B; 0064; Additional folding
+1D60C; 0065; Additional folding
+1D60D; 0066; Additional folding
+1D60E; 0067; Additional folding
+1D60F; 0068; Additional folding
+1D610; 0069; Additional folding
+1D611; 006A; Additional folding
+1D612; 006B; Additional folding
+1D613; 006C; Additional folding
+1D614; 006D; Additional folding
+1D615; 006E; Additional folding
+1D616; 006F; Additional folding
+1D617; 0070; Additional folding
+1D618; 0071; Additional folding
+1D619; 0072; Additional folding
+1D61A; 0073; Additional folding
+1D61B; 0074; Additional folding
+1D61C; 0075; Additional folding
+1D61D; 0076; Additional folding
+1D61E; 0077; Additional folding
+1D61F; 0078; Additional folding
+1D620; 0079; Additional folding
+1D621; 007A; Additional folding
+1D63C; 0061; Additional folding
+1D63D; 0062; Additional folding
+1D63E; 0063; Additional folding
+1D63F; 0064; Additional folding
+1D640; 0065; Additional folding
+1D641; 0066; Additional folding
+1D642; 0067; Additional folding
+1D643; 0068; Additional folding
+1D644; 0069; Additional folding
+1D645; 006A; Additional folding
+1D646; 006B; Additional folding
+1D647; 006C; Additional folding
+1D648; 006D; Additional folding
+1D649; 006E; Additional folding
+1D64A; 006F; Additional folding
+1D64B; 0070; Additional folding
+1D64C; 0071; Additional folding
+1D64D; 0072; Additional folding
+1D64E; 0073; Additional folding
+1D64F; 0074; Additional folding
+1D650; 0075; Additional folding
+1D651; 0076; Additional folding
+1D652; 0077; Additional folding
+1D653; 0078; Additional folding
+1D654; 0079; Additional folding
+1D655; 007A; Additional folding
+1D670; 0061; Additional folding
+1D671; 0062; Additional folding
+1D672; 0063; Additional folding
+1D673; 0064; Additional folding
+1D674; 0065; Additional folding
+1D675; 0066; Additional folding
+1D676; 0067; Additional folding
+1D677; 0068; Additional folding
+1D678; 0069; Additional folding
+1D679; 006A; Additional folding
+1D67A; 006B; Additional folding
+1D67B; 006C; Additional folding
+1D67C; 006D; Additional folding
+1D67D; 006E; Additional folding
+1D67E; 006F; Additional folding
+1D67F; 0070; Additional folding
+1D680; 0071; Additional folding
+1D681; 0072; Additional folding
+1D682; 0073; Additional folding
+1D683; 0074; Additional folding
+1D684; 0075; Additional folding
+1D685; 0076; Additional folding
+1D686; 0077; Additional folding
+1D687; 0078; Additional folding
+1D688; 0079; Additional folding
+1D689; 007A; Additional folding
+1D6A8; 03B1; Additional folding
+1D6A9; 03B2; Additional folding
+1D6AA; 03B3; Additional folding
+1D6AB; 03B4; Additional folding
+1D6AC; 03B5; Additional folding
+1D6AD; 03B6; Additional folding
+1D6AE; 03B7; Additional folding
+1D6AF; 03B8; Additional folding
+1D6B0; 03B9; Additional folding
+1D6B1; 03BA; Additional folding
+1D6B2; 03BB; Additional folding
+1D6B3; 03BC; Additional folding
+1D6B4; 03BD; Additional folding
+1D6B5; 03BE; Additional folding
+1D6B6; 03BF; Additional folding
+1D6B7; 03C0; Additional folding
+1D6B8; 03C1; Additional folding
+1D6B9; 03B8; Additional folding
+1D6BA; 03C3; Additional folding
+1D6BB; 03C4; Additional folding
+1D6BC; 03C5; Additional folding
+1D6BD; 03C6; Additional folding
+1D6BE; 03C7; Additional folding
+1D6BF; 03C8; Additional folding
+1D6C0; 03C9; Additional folding
+1D6D3; 03C3; Additional folding
+1D6E2; 03B1; Additional folding
+1D6E3; 03B2; Additional folding
+1D6E4; 03B3; Additional folding
+1D6E5; 03B4; Additional folding
+1D6E6; 03B5; Additional folding
+1D6E7; 03B6; Additional folding
+1D6E8; 03B7; Additional folding
+1D6E9; 03B8; Additional folding
+1D6EA; 03B9; Additional folding
+1D6EB; 03BA; Additional folding
+1D6EC; 03BB; Additional folding
+1D6ED; 03BC; Additional folding
+1D6EE; 03BD; Additional folding
+1D6EF; 03BE; Additional folding
+1D6F0; 03BF; Additional folding
+1D6F1; 03C0; Additional folding
+1D6F2; 03C1; Additional folding
+1D6F3; 03B8; Additional folding
+1D6F4; 03C3; Additional folding
+1D6F5; 03C4; Additional folding
+1D6F6; 03C5; Additional folding
+1D6F7; 03C6; Additional folding
+1D6F8; 03C7; Additional folding
+1D6F9; 03C8; Additional folding
+1D6FA; 03C9; Additional folding
+1D70D; 03C3; Additional folding
+1D71C; 03B1; Additional folding
+1D71D; 03B2; Additional folding
+1D71E; 03B3; Additional folding
+1D71F; 03B4; Additional folding
+1D720; 03B5; Additional folding
+1D721; 03B6; Additional folding
+1D722; 03B7; Additional folding
+1D723; 03B8; Additional folding
+1D724; 03B9; Additional folding
+1D725; 03BA; Additional folding
+1D726; 03BB; Additional folding
+1D727; 03BC; Additional folding
+1D728; 03BD; Additional folding
+1D729; 03BE; Additional folding
+1D72A; 03BF; Additional folding
+1D72B; 03C0; Additional folding
+1D72C; 03C1; Additional folding
+1D72D; 03B8; Additional folding
+1D72E; 03C3; Additional folding
+1D72F; 03C4; Additional folding
+1D730; 03C5; Additional folding
+1D731; 03C6; Additional folding
+1D732; 03C7; Additional folding
+1D733; 03C8; Additional folding
+1D734; 03C9; Additional folding
+1D747; 03C3; Additional folding
+1D756; 03B1; Additional folding
+1D757; 03B2; Additional folding
+1D758; 03B3; Additional folding
+1D759; 03B4; Additional folding
+1D75A; 03B5; Additional folding
+1D75B; 03B6; Additional folding
+1D75C; 03B7; Additional folding
+1D75D; 03B8; Additional folding
+1D75E; 03B9; Additional folding
+1D75F; 03BA; Additional folding
+1D760; 03BB; Additional folding
+1D761; 03BC; Additional folding
+1D762; 03BD; Additional folding
+1D763; 03BE; Additional folding
+1D764; 03BF; Additional folding
+1D765; 03C0; Additional folding
+1D766; 03C1; Additional folding
+1D767; 03B8; Additional folding
+1D768; 03C3; Additional folding
+1D769; 03C4; Additional folding
+1D76A; 03C5; Additional folding
+1D76B; 03C6; Additional folding
+1D76C; 03C7; Additional folding
+1D76D; 03C8; Additional folding
+1D76E; 03C9; Additional folding
+1D781; 03C3; Additional folding
+1D790; 03B1; Additional folding
+1D791; 03B2; Additional folding
+1D792; 03B3; Additional folding
+1D793; 03B4; Additional folding
+1D794; 03B5; Additional folding
+1D795; 03B6; Additional folding
+1D796; 03B7; Additional folding
+1D797; 03B8; Additional folding
+1D798; 03B9; Additional folding
+1D799; 03BA; Additional folding
+1D79A; 03BB; Additional folding
+1D79B; 03BC; Additional folding
+1D79C; 03BD; Additional folding
+1D79D; 03BE; Additional folding
+1D79E; 03BF; Additional folding
+1D79F; 03C0; Additional folding
+1D7A0; 03C1; Additional folding
+1D7A1; 03B8; Additional folding
+1D7A2; 03C3; Additional folding
+1D7A3; 03C4; Additional folding
+1D7A4; 03C5; Additional folding
+1D7A5; 03C6; Additional folding
+1D7A6; 03C7; Additional folding
+1D7A7; 03C8; Additional folding
+1D7A8; 03C9; Additional folding
+1D7BB; 03C3; Additional folding
+
+ */
+
+const Stringprep_table_element stringprep_rfc3454_B_3[] = {
+ { 0x000041, 0x000041, { 0x000061 } }, /* 0041; 0061; Case map */
+ { 0x000042, 0x000042, { 0x000062 } }, /* 0042; 0062; Case map */
+ { 0x000043, 0x000043, { 0x000063 } }, /* 0043; 0063; Case map */
+ { 0x000044, 0x000044, { 0x000064 } }, /* 0044; 0064; Case map */
+ { 0x000045, 0x000045, { 0x000065 } }, /* 0045; 0065; Case map */
+ { 0x000046, 0x000046, { 0x000066 } }, /* 0046; 0066; Case map */
+ { 0x000047, 0x000047, { 0x000067 } }, /* 0047; 0067; Case map */
+ { 0x000048, 0x000048, { 0x000068 } }, /* 0048; 0068; Case map */
+ { 0x000049, 0x000049, { 0x000069 } }, /* 0049; 0069; Case map */
+ { 0x00004A, 0x00004A, { 0x00006A } }, /* 004A; 006A; Case map */
+ { 0x00004B, 0x00004B, { 0x00006B } }, /* 004B; 006B; Case map */
+ { 0x00004C, 0x00004C, { 0x00006C } }, /* 004C; 006C; Case map */
+ { 0x00004D, 0x00004D, { 0x00006D } }, /* 004D; 006D; Case map */
+ { 0x00004E, 0x00004E, { 0x00006E } }, /* 004E; 006E; Case map */
+ { 0x00004F, 0x00004F, { 0x00006F } }, /* 004F; 006F; Case map */
+ { 0x000050, 0x000050, { 0x000070 } }, /* 0050; 0070; Case map */
+ { 0x000051, 0x000051, { 0x000071 } }, /* 0051; 0071; Case map */
+ { 0x000052, 0x000052, { 0x000072 } }, /* 0052; 0072; Case map */
+ { 0x000053, 0x000053, { 0x000073 } }, /* 0053; 0073; Case map */
+ { 0x000054, 0x000054, { 0x000074 } }, /* 0054; 0074; Case map */
+ { 0x000055, 0x000055, { 0x000075 } }, /* 0055; 0075; Case map */
+ { 0x000056, 0x000056, { 0x000076 } }, /* 0056; 0076; Case map */
+ { 0x000057, 0x000057, { 0x000077 } }, /* 0057; 0077; Case map */
+ { 0x000058, 0x000058, { 0x000078 } }, /* 0058; 0078; Case map */
+ { 0x000059, 0x000059, { 0x000079 } }, /* 0059; 0079; Case map */
+ { 0x00005A, 0x00005A, { 0x00007A } }, /* 005A; 007A; Case map */
+ { 0x0000B5, 0x0000B5, { 0x0003BC } }, /* 00B5; 03BC; Case map */
+ { 0x0000C0, 0x0000C0, { 0x0000E0 } }, /* 00C0; 00E0; Case map */
+ { 0x0000C1, 0x0000C1, { 0x0000E1 } }, /* 00C1; 00E1; Case map */
+ { 0x0000C2, 0x0000C2, { 0x0000E2 } }, /* 00C2; 00E2; Case map */
+ { 0x0000C3, 0x0000C3, { 0x0000E3 } }, /* 00C3; 00E3; Case map */
+ { 0x0000C4, 0x0000C4, { 0x0000E4 } }, /* 00C4; 00E4; Case map */
+ { 0x0000C5, 0x0000C5, { 0x0000E5 } }, /* 00C5; 00E5; Case map */
+ { 0x0000C6, 0x0000C6, { 0x0000E6 } }, /* 00C6; 00E6; Case map */
+ { 0x0000C7, 0x0000C7, { 0x0000E7 } }, /* 00C7; 00E7; Case map */
+ { 0x0000C8, 0x0000C8, { 0x0000E8 } }, /* 00C8; 00E8; Case map */
+ { 0x0000C9, 0x0000C9, { 0x0000E9 } }, /* 00C9; 00E9; Case map */
+ { 0x0000CA, 0x0000CA, { 0x0000EA } }, /* 00CA; 00EA; Case map */
+ { 0x0000CB, 0x0000CB, { 0x0000EB } }, /* 00CB; 00EB; Case map */
+ { 0x0000CC, 0x0000CC, { 0x0000EC } }, /* 00CC; 00EC; Case map */
+ { 0x0000CD, 0x0000CD, { 0x0000ED } }, /* 00CD; 00ED; Case map */
+ { 0x0000CE, 0x0000CE, { 0x0000EE } }, /* 00CE; 00EE; Case map */
+ { 0x0000CF, 0x0000CF, { 0x0000EF } }, /* 00CF; 00EF; Case map */
+ { 0x0000D0, 0x0000D0, { 0x0000F0 } }, /* 00D0; 00F0; Case map */
+ { 0x0000D1, 0x0000D1, { 0x0000F1 } }, /* 00D1; 00F1; Case map */
+ { 0x0000D2, 0x0000D2, { 0x0000F2 } }, /* 00D2; 00F2; Case map */
+ { 0x0000D3, 0x0000D3, { 0x0000F3 } }, /* 00D3; 00F3; Case map */
+ { 0x0000D4, 0x0000D4, { 0x0000F4 } }, /* 00D4; 00F4; Case map */
+ { 0x0000D5, 0x0000D5, { 0x0000F5 } }, /* 00D5; 00F5; Case map */
+ { 0x0000D6, 0x0000D6, { 0x0000F6 } }, /* 00D6; 00F6; Case map */
+ { 0x0000D8, 0x0000D8, { 0x0000F8 } }, /* 00D8; 00F8; Case map */
+ { 0x0000D9, 0x0000D9, { 0x0000F9 } }, /* 00D9; 00F9; Case map */
+ { 0x0000DA, 0x0000DA, { 0x0000FA } }, /* 00DA; 00FA; Case map */
+ { 0x0000DB, 0x0000DB, { 0x0000FB } }, /* 00DB; 00FB; Case map */
+ { 0x0000DC, 0x0000DC, { 0x0000FC } }, /* 00DC; 00FC; Case map */
+ { 0x0000DD, 0x0000DD, { 0x0000FD } }, /* 00DD; 00FD; Case map */
+ { 0x0000DE, 0x0000DE, { 0x0000FE } }, /* 00DE; 00FE; Case map */
+ { 0x0000DF,
+ 0x0000DF,
+ { 0x000073, /* 00DF; 0073 0073; Case map */
+ 0x000073 } },
+ { 0x000100, 0x000100, { 0x000101 } }, /* 0100; 0101; Case map */
+ { 0x000102, 0x000102, { 0x000103 } }, /* 0102; 0103; Case map */
+ { 0x000104, 0x000104, { 0x000105 } }, /* 0104; 0105; Case map */
+ { 0x000106, 0x000106, { 0x000107 } }, /* 0106; 0107; Case map */
+ { 0x000108, 0x000108, { 0x000109 } }, /* 0108; 0109; Case map */
+ { 0x00010A, 0x00010A, { 0x00010B } }, /* 010A; 010B; Case map */
+ { 0x00010C, 0x00010C, { 0x00010D } }, /* 010C; 010D; Case map */
+ { 0x00010E, 0x00010E, { 0x00010F } }, /* 010E; 010F; Case map */
+ { 0x000110, 0x000110, { 0x000111 } }, /* 0110; 0111; Case map */
+ { 0x000112, 0x000112, { 0x000113 } }, /* 0112; 0113; Case map */
+ { 0x000114, 0x000114, { 0x000115 } }, /* 0114; 0115; Case map */
+ { 0x000116, 0x000116, { 0x000117 } }, /* 0116; 0117; Case map */
+ { 0x000118, 0x000118, { 0x000119 } }, /* 0118; 0119; Case map */
+ { 0x00011A, 0x00011A, { 0x00011B } }, /* 011A; 011B; Case map */
+ { 0x00011C, 0x00011C, { 0x00011D } }, /* 011C; 011D; Case map */
+ { 0x00011E, 0x00011E, { 0x00011F } }, /* 011E; 011F; Case map */
+ { 0x000120, 0x000120, { 0x000121 } }, /* 0120; 0121; Case map */
+ { 0x000122, 0x000122, { 0x000123 } }, /* 0122; 0123; Case map */
+ { 0x000124, 0x000124, { 0x000125 } }, /* 0124; 0125; Case map */
+ { 0x000126, 0x000126, { 0x000127 } }, /* 0126; 0127; Case map */
+ { 0x000128, 0x000128, { 0x000129 } }, /* 0128; 0129; Case map */
+ { 0x00012A, 0x00012A, { 0x00012B } }, /* 012A; 012B; Case map */
+ { 0x00012C, 0x00012C, { 0x00012D } }, /* 012C; 012D; Case map */
+ { 0x00012E, 0x00012E, { 0x00012F } }, /* 012E; 012F; Case map */
+ { 0x000130,
+ 0x000130,
+ { 0x000069, /* 0130; 0069 0307; Case map */
+ 0x000307 } },
+ { 0x000132, 0x000132, { 0x000133 } }, /* 0132; 0133; Case map */
+ { 0x000134, 0x000134, { 0x000135 } }, /* 0134; 0135; Case map */
+ { 0x000136, 0x000136, { 0x000137 } }, /* 0136; 0137; Case map */
+ { 0x000139, 0x000139, { 0x00013A } }, /* 0139; 013A; Case map */
+ { 0x00013B, 0x00013B, { 0x00013C } }, /* 013B; 013C; Case map */
+ { 0x00013D, 0x00013D, { 0x00013E } }, /* 013D; 013E; Case map */
+ { 0x00013F, 0x00013F, { 0x000140 } }, /* 013F; 0140; Case map */
+ { 0x000141, 0x000141, { 0x000142 } }, /* 0141; 0142; Case map */
+ { 0x000143, 0x000143, { 0x000144 } }, /* 0143; 0144; Case map */
+ { 0x000145, 0x000145, { 0x000146 } }, /* 0145; 0146; Case map */
+ { 0x000147, 0x000147, { 0x000148 } }, /* 0147; 0148; Case map */
+ { 0x000149,
+ 0x000149,
+ { 0x0002BC, /* 0149; 02BC 006E; Case map */
+ 0x00006E } },
+ { 0x00014A, 0x00014A, { 0x00014B } }, /* 014A; 014B; Case map */
+ { 0x00014C, 0x00014C, { 0x00014D } }, /* 014C; 014D; Case map */
+ { 0x00014E, 0x00014E, { 0x00014F } }, /* 014E; 014F; Case map */
+ { 0x000150, 0x000150, { 0x000151 } }, /* 0150; 0151; Case map */
+ { 0x000152, 0x000152, { 0x000153 } }, /* 0152; 0153; Case map */
+ { 0x000154, 0x000154, { 0x000155 } }, /* 0154; 0155; Case map */
+ { 0x000156, 0x000156, { 0x000157 } }, /* 0156; 0157; Case map */
+ { 0x000158, 0x000158, { 0x000159 } }, /* 0158; 0159; Case map */
+ { 0x00015A, 0x00015A, { 0x00015B } }, /* 015A; 015B; Case map */
+ { 0x00015C, 0x00015C, { 0x00015D } }, /* 015C; 015D; Case map */
+ { 0x00015E, 0x00015E, { 0x00015F } }, /* 015E; 015F; Case map */
+ { 0x000160, 0x000160, { 0x000161 } }, /* 0160; 0161; Case map */
+ { 0x000162, 0x000162, { 0x000163 } }, /* 0162; 0163; Case map */
+ { 0x000164, 0x000164, { 0x000165 } }, /* 0164; 0165; Case map */
+ { 0x000166, 0x000166, { 0x000167 } }, /* 0166; 0167; Case map */
+ { 0x000168, 0x000168, { 0x000169 } }, /* 0168; 0169; Case map */
+ { 0x00016A, 0x00016A, { 0x00016B } }, /* 016A; 016B; Case map */
+ { 0x00016C, 0x00016C, { 0x00016D } }, /* 016C; 016D; Case map */
+ { 0x00016E, 0x00016E, { 0x00016F } }, /* 016E; 016F; Case map */
+ { 0x000170, 0x000170, { 0x000171 } }, /* 0170; 0171; Case map */
+ { 0x000172, 0x000172, { 0x000173 } }, /* 0172; 0173; Case map */
+ { 0x000174, 0x000174, { 0x000175 } }, /* 0174; 0175; Case map */
+ { 0x000176, 0x000176, { 0x000177 } }, /* 0176; 0177; Case map */
+ { 0x000178, 0x000178, { 0x0000FF } }, /* 0178; 00FF; Case map */
+ { 0x000179, 0x000179, { 0x00017A } }, /* 0179; 017A; Case map */
+ { 0x00017B, 0x00017B, { 0x00017C } }, /* 017B; 017C; Case map */
+ { 0x00017D, 0x00017D, { 0x00017E } }, /* 017D; 017E; Case map */
+ { 0x00017F, 0x00017F, { 0x000073 } }, /* 017F; 0073; Case map */
+ { 0x000181, 0x000181, { 0x000253 } }, /* 0181; 0253; Case map */
+ { 0x000182, 0x000182, { 0x000183 } }, /* 0182; 0183; Case map */
+ { 0x000184, 0x000184, { 0x000185 } }, /* 0184; 0185; Case map */
+ { 0x000186, 0x000186, { 0x000254 } }, /* 0186; 0254; Case map */
+ { 0x000187, 0x000187, { 0x000188 } }, /* 0187; 0188; Case map */
+ { 0x000189, 0x000189, { 0x000256 } }, /* 0189; 0256; Case map */
+ { 0x00018A, 0x00018A, { 0x000257 } }, /* 018A; 0257; Case map */
+ { 0x00018B, 0x00018B, { 0x00018C } }, /* 018B; 018C; Case map */
+ { 0x00018E, 0x00018E, { 0x0001DD } }, /* 018E; 01DD; Case map */
+ { 0x00018F, 0x00018F, { 0x000259 } }, /* 018F; 0259; Case map */
+ { 0x000190, 0x000190, { 0x00025B } }, /* 0190; 025B; Case map */
+ { 0x000191, 0x000191, { 0x000192 } }, /* 0191; 0192; Case map */
+ { 0x000193, 0x000193, { 0x000260 } }, /* 0193; 0260; Case map */
+ { 0x000194, 0x000194, { 0x000263 } }, /* 0194; 0263; Case map */
+ { 0x000196, 0x000196, { 0x000269 } }, /* 0196; 0269; Case map */
+ { 0x000197, 0x000197, { 0x000268 } }, /* 0197; 0268; Case map */
+ { 0x000198, 0x000198, { 0x000199 } }, /* 0198; 0199; Case map */
+ { 0x00019C, 0x00019C, { 0x00026F } }, /* 019C; 026F; Case map */
+ { 0x00019D, 0x00019D, { 0x000272 } }, /* 019D; 0272; Case map */
+ { 0x00019F, 0x00019F, { 0x000275 } }, /* 019F; 0275; Case map */
+ { 0x0001A0, 0x0001A0, { 0x0001A1 } }, /* 01A0; 01A1; Case map */
+ { 0x0001A2, 0x0001A2, { 0x0001A3 } }, /* 01A2; 01A3; Case map */
+ { 0x0001A4, 0x0001A4, { 0x0001A5 } }, /* 01A4; 01A5; Case map */
+ { 0x0001A6, 0x0001A6, { 0x000280 } }, /* 01A6; 0280; Case map */
+ { 0x0001A7, 0x0001A7, { 0x0001A8 } }, /* 01A7; 01A8; Case map */
+ { 0x0001A9, 0x0001A9, { 0x000283 } }, /* 01A9; 0283; Case map */
+ { 0x0001AC, 0x0001AC, { 0x0001AD } }, /* 01AC; 01AD; Case map */
+ { 0x0001AE, 0x0001AE, { 0x000288 } }, /* 01AE; 0288; Case map */
+ { 0x0001AF, 0x0001AF, { 0x0001B0 } }, /* 01AF; 01B0; Case map */
+ { 0x0001B1, 0x0001B1, { 0x00028A } }, /* 01B1; 028A; Case map */
+ { 0x0001B2, 0x0001B2, { 0x00028B } }, /* 01B2; 028B; Case map */
+ { 0x0001B3, 0x0001B3, { 0x0001B4 } }, /* 01B3; 01B4; Case map */
+ { 0x0001B5, 0x0001B5, { 0x0001B6 } }, /* 01B5; 01B6; Case map */
+ { 0x0001B7, 0x0001B7, { 0x000292 } }, /* 01B7; 0292; Case map */
+ { 0x0001B8, 0x0001B8, { 0x0001B9 } }, /* 01B8; 01B9; Case map */
+ { 0x0001BC, 0x0001BC, { 0x0001BD } }, /* 01BC; 01BD; Case map */
+ { 0x0001C4, 0x0001C4, { 0x0001C6 } }, /* 01C4; 01C6; Case map */
+ { 0x0001C5, 0x0001C5, { 0x0001C6 } }, /* 01C5; 01C6; Case map */
+ { 0x0001C7, 0x0001C7, { 0x0001C9 } }, /* 01C7; 01C9; Case map */
+ { 0x0001C8, 0x0001C8, { 0x0001C9 } }, /* 01C8; 01C9; Case map */
+ { 0x0001CA, 0x0001CA, { 0x0001CC } }, /* 01CA; 01CC; Case map */
+ { 0x0001CB, 0x0001CB, { 0x0001CC } }, /* 01CB; 01CC; Case map */
+ { 0x0001CD, 0x0001CD, { 0x0001CE } }, /* 01CD; 01CE; Case map */
+ { 0x0001CF, 0x0001CF, { 0x0001D0 } }, /* 01CF; 01D0; Case map */
+ { 0x0001D1, 0x0001D1, { 0x0001D2 } }, /* 01D1; 01D2; Case map */
+ { 0x0001D3, 0x0001D3, { 0x0001D4 } }, /* 01D3; 01D4; Case map */
+ { 0x0001D5, 0x0001D5, { 0x0001D6 } }, /* 01D5; 01D6; Case map */
+ { 0x0001D7, 0x0001D7, { 0x0001D8 } }, /* 01D7; 01D8; Case map */
+ { 0x0001D9, 0x0001D9, { 0x0001DA } }, /* 01D9; 01DA; Case map */
+ { 0x0001DB, 0x0001DB, { 0x0001DC } }, /* 01DB; 01DC; Case map */
+ { 0x0001DE, 0x0001DE, { 0x0001DF } }, /* 01DE; 01DF; Case map */
+ { 0x0001E0, 0x0001E0, { 0x0001E1 } }, /* 01E0; 01E1; Case map */
+ { 0x0001E2, 0x0001E2, { 0x0001E3 } }, /* 01E2; 01E3; Case map */
+ { 0x0001E4, 0x0001E4, { 0x0001E5 } }, /* 01E4; 01E5; Case map */
+ { 0x0001E6, 0x0001E6, { 0x0001E7 } }, /* 01E6; 01E7; Case map */
+ { 0x0001E8, 0x0001E8, { 0x0001E9 } }, /* 01E8; 01E9; Case map */
+ { 0x0001EA, 0x0001EA, { 0x0001EB } }, /* 01EA; 01EB; Case map */
+ { 0x0001EC, 0x0001EC, { 0x0001ED } }, /* 01EC; 01ED; Case map */
+ { 0x0001EE, 0x0001EE, { 0x0001EF } }, /* 01EE; 01EF; Case map */
+ { 0x0001F0,
+ 0x0001F0,
+ { 0x00006A, /* 01F0; 006A 030C; Case map */
+ 0x00030C } },
+ { 0x0001F1, 0x0001F1, { 0x0001F3 } }, /* 01F1; 01F3; Case map */
+ { 0x0001F2, 0x0001F2, { 0x0001F3 } }, /* 01F2; 01F3; Case map */
+ { 0x0001F4, 0x0001F4, { 0x0001F5 } }, /* 01F4; 01F5; Case map */
+ { 0x0001F6, 0x0001F6, { 0x000195 } }, /* 01F6; 0195; Case map */
+ { 0x0001F7, 0x0001F7, { 0x0001BF } }, /* 01F7; 01BF; Case map */
+ { 0x0001F8, 0x0001F8, { 0x0001F9 } }, /* 01F8; 01F9; Case map */
+ { 0x0001FA, 0x0001FA, { 0x0001FB } }, /* 01FA; 01FB; Case map */
+ { 0x0001FC, 0x0001FC, { 0x0001FD } }, /* 01FC; 01FD; Case map */
+ { 0x0001FE, 0x0001FE, { 0x0001FF } }, /* 01FE; 01FF; Case map */
+ { 0x000200, 0x000200, { 0x000201 } }, /* 0200; 0201; Case map */
+ { 0x000202, 0x000202, { 0x000203 } }, /* 0202; 0203; Case map */
+ { 0x000204, 0x000204, { 0x000205 } }, /* 0204; 0205; Case map */
+ { 0x000206, 0x000206, { 0x000207 } }, /* 0206; 0207; Case map */
+ { 0x000208, 0x000208, { 0x000209 } }, /* 0208; 0209; Case map */
+ { 0x00020A, 0x00020A, { 0x00020B } }, /* 020A; 020B; Case map */
+ { 0x00020C, 0x00020C, { 0x00020D } }, /* 020C; 020D; Case map */
+ { 0x00020E, 0x00020E, { 0x00020F } }, /* 020E; 020F; Case map */
+ { 0x000210, 0x000210, { 0x000211 } }, /* 0210; 0211; Case map */
+ { 0x000212, 0x000212, { 0x000213 } }, /* 0212; 0213; Case map */
+ { 0x000214, 0x000214, { 0x000215 } }, /* 0214; 0215; Case map */
+ { 0x000216, 0x000216, { 0x000217 } }, /* 0216; 0217; Case map */
+ { 0x000218, 0x000218, { 0x000219 } }, /* 0218; 0219; Case map */
+ { 0x00021A, 0x00021A, { 0x00021B } }, /* 021A; 021B; Case map */
+ { 0x00021C, 0x00021C, { 0x00021D } }, /* 021C; 021D; Case map */
+ { 0x00021E, 0x00021E, { 0x00021F } }, /* 021E; 021F; Case map */
+ { 0x000220, 0x000220, { 0x00019E } }, /* 0220; 019E; Case map */
+ { 0x000222, 0x000222, { 0x000223 } }, /* 0222; 0223; Case map */
+ { 0x000224, 0x000224, { 0x000225 } }, /* 0224; 0225; Case map */
+ { 0x000226, 0x000226, { 0x000227 } }, /* 0226; 0227; Case map */
+ { 0x000228, 0x000228, { 0x000229 } }, /* 0228; 0229; Case map */
+ { 0x00022A, 0x00022A, { 0x00022B } }, /* 022A; 022B; Case map */
+ { 0x00022C, 0x00022C, { 0x00022D } }, /* 022C; 022D; Case map */
+ { 0x00022E, 0x00022E, { 0x00022F } }, /* 022E; 022F; Case map */
+ { 0x000230, 0x000230, { 0x000231 } }, /* 0230; 0231; Case map */
+ { 0x000232, 0x000232, { 0x000233 } }, /* 0232; 0233; Case map */
+ { 0x000345, 0x000345, { 0x0003B9 } }, /* 0345; 03B9; Case map */
+ { 0x000386, 0x000386, { 0x0003AC } }, /* 0386; 03AC; Case map */
+ { 0x000388, 0x000388, { 0x0003AD } }, /* 0388; 03AD; Case map */
+ { 0x000389, 0x000389, { 0x0003AE } }, /* 0389; 03AE; Case map */
+ { 0x00038A, 0x00038A, { 0x0003AF } }, /* 038A; 03AF; Case map */
+ { 0x00038C, 0x00038C, { 0x0003CC } }, /* 038C; 03CC; Case map */
+ { 0x00038E, 0x00038E, { 0x0003CD } }, /* 038E; 03CD; Case map */
+ { 0x00038F, 0x00038F, { 0x0003CE } }, /* 038F; 03CE; Case map */
+ { 0x000390,
+ 0x000390,
+ { 0x0003B9, /* 0390; 03B9 0308 0301; Case map */
+ 0x000308, 0x000301 } },
+ { 0x000391, 0x000391, { 0x0003B1 } }, /* 0391; 03B1; Case map */
+ { 0x000392, 0x000392, { 0x0003B2 } }, /* 0392; 03B2; Case map */
+ { 0x000393, 0x000393, { 0x0003B3 } }, /* 0393; 03B3; Case map */
+ { 0x000394, 0x000394, { 0x0003B4 } }, /* 0394; 03B4; Case map */
+ { 0x000395, 0x000395, { 0x0003B5 } }, /* 0395; 03B5; Case map */
+ { 0x000396, 0x000396, { 0x0003B6 } }, /* 0396; 03B6; Case map */
+ { 0x000397, 0x000397, { 0x0003B7 } }, /* 0397; 03B7; Case map */
+ { 0x000398, 0x000398, { 0x0003B8 } }, /* 0398; 03B8; Case map */
+ { 0x000399, 0x000399, { 0x0003B9 } }, /* 0399; 03B9; Case map */
+ { 0x00039A, 0x00039A, { 0x0003BA } }, /* 039A; 03BA; Case map */
+ { 0x00039B, 0x00039B, { 0x0003BB } }, /* 039B; 03BB; Case map */
+ { 0x00039C, 0x00039C, { 0x0003BC } }, /* 039C; 03BC; Case map */
+ { 0x00039D, 0x00039D, { 0x0003BD } }, /* 039D; 03BD; Case map */
+ { 0x00039E, 0x00039E, { 0x0003BE } }, /* 039E; 03BE; Case map */
+ { 0x00039F, 0x00039F, { 0x0003BF } }, /* 039F; 03BF; Case map */
+ { 0x0003A0, 0x0003A0, { 0x0003C0 } }, /* 03A0; 03C0; Case map */
+ { 0x0003A1, 0x0003A1, { 0x0003C1 } }, /* 03A1; 03C1; Case map */
+ { 0x0003A3, 0x0003A3, { 0x0003C3 } }, /* 03A3; 03C3; Case map */
+ { 0x0003A4, 0x0003A4, { 0x0003C4 } }, /* 03A4; 03C4; Case map */
+ { 0x0003A5, 0x0003A5, { 0x0003C5 } }, /* 03A5; 03C5; Case map */
+ { 0x0003A6, 0x0003A6, { 0x0003C6 } }, /* 03A6; 03C6; Case map */
+ { 0x0003A7, 0x0003A7, { 0x0003C7 } }, /* 03A7; 03C7; Case map */
+ { 0x0003A8, 0x0003A8, { 0x0003C8 } }, /* 03A8; 03C8; Case map */
+ { 0x0003A9, 0x0003A9, { 0x0003C9 } }, /* 03A9; 03C9; Case map */
+ { 0x0003AA, 0x0003AA, { 0x0003CA } }, /* 03AA; 03CA; Case map */
+ { 0x0003AB, 0x0003AB, { 0x0003CB } }, /* 03AB; 03CB; Case map */
+ { 0x0003B0,
+ 0x0003B0,
+ { 0x0003C5, /* 03B0; 03C5 0308 0301; Case map */
+ 0x000308, 0x000301 } },
+ { 0x0003C2, 0x0003C2, { 0x0003C3 } }, /* 03C2; 03C3; Case map */
+ { 0x0003D0, 0x0003D0, { 0x0003B2 } }, /* 03D0; 03B2; Case map */
+ { 0x0003D1, 0x0003D1, { 0x0003B8 } }, /* 03D1; 03B8; Case map */
+ { 0x0003D5, 0x0003D5, { 0x0003C6 } }, /* 03D5; 03C6; Case map */
+ { 0x0003D6, 0x0003D6, { 0x0003C0 } }, /* 03D6; 03C0; Case map */
+ { 0x0003D8, 0x0003D8, { 0x0003D9 } }, /* 03D8; 03D9; Case map */
+ { 0x0003DA, 0x0003DA, { 0x0003DB } }, /* 03DA; 03DB; Case map */
+ { 0x0003DC, 0x0003DC, { 0x0003DD } }, /* 03DC; 03DD; Case map */
+ { 0x0003DE, 0x0003DE, { 0x0003DF } }, /* 03DE; 03DF; Case map */
+ { 0x0003E0, 0x0003E0, { 0x0003E1 } }, /* 03E0; 03E1; Case map */
+ { 0x0003E2, 0x0003E2, { 0x0003E3 } }, /* 03E2; 03E3; Case map */
+ { 0x0003E4, 0x0003E4, { 0x0003E5 } }, /* 03E4; 03E5; Case map */
+ { 0x0003E6, 0x0003E6, { 0x0003E7 } }, /* 03E6; 03E7; Case map */
+ { 0x0003E8, 0x0003E8, { 0x0003E9 } }, /* 03E8; 03E9; Case map */
+ { 0x0003EA, 0x0003EA, { 0x0003EB } }, /* 03EA; 03EB; Case map */
+ { 0x0003EC, 0x0003EC, { 0x0003ED } }, /* 03EC; 03ED; Case map */
+ { 0x0003EE, 0x0003EE, { 0x0003EF } }, /* 03EE; 03EF; Case map */
+ { 0x0003F0, 0x0003F0, { 0x0003BA } }, /* 03F0; 03BA; Case map */
+ { 0x0003F1, 0x0003F1, { 0x0003C1 } }, /* 03F1; 03C1; Case map */
+ { 0x0003F2, 0x0003F2, { 0x0003C3 } }, /* 03F2; 03C3; Case map */
+ { 0x0003F4, 0x0003F4, { 0x0003B8 } }, /* 03F4; 03B8; Case map */
+ { 0x0003F5, 0x0003F5, { 0x0003B5 } }, /* 03F5; 03B5; Case map */
+ { 0x000400, 0x000400, { 0x000450 } }, /* 0400; 0450; Case map */
+ { 0x000401, 0x000401, { 0x000451 } }, /* 0401; 0451; Case map */
+ { 0x000402, 0x000402, { 0x000452 } }, /* 0402; 0452; Case map */
+ { 0x000403, 0x000403, { 0x000453 } }, /* 0403; 0453; Case map */
+ { 0x000404, 0x000404, { 0x000454 } }, /* 0404; 0454; Case map */
+ { 0x000405, 0x000405, { 0x000455 } }, /* 0405; 0455; Case map */
+ { 0x000406, 0x000406, { 0x000456 } }, /* 0406; 0456; Case map */
+ { 0x000407, 0x000407, { 0x000457 } }, /* 0407; 0457; Case map */
+ { 0x000408, 0x000408, { 0x000458 } }, /* 0408; 0458; Case map */
+ { 0x000409, 0x000409, { 0x000459 } }, /* 0409; 0459; Case map */
+ { 0x00040A, 0x00040A, { 0x00045A } }, /* 040A; 045A; Case map */
+ { 0x00040B, 0x00040B, { 0x00045B } }, /* 040B; 045B; Case map */
+ { 0x00040C, 0x00040C, { 0x00045C } }, /* 040C; 045C; Case map */
+ { 0x00040D, 0x00040D, { 0x00045D } }, /* 040D; 045D; Case map */
+ { 0x00040E, 0x00040E, { 0x00045E } }, /* 040E; 045E; Case map */
+ { 0x00040F, 0x00040F, { 0x00045F } }, /* 040F; 045F; Case map */
+ { 0x000410, 0x000410, { 0x000430 } }, /* 0410; 0430; Case map */
+ { 0x000411, 0x000411, { 0x000431 } }, /* 0411; 0431; Case map */
+ { 0x000412, 0x000412, { 0x000432 } }, /* 0412; 0432; Case map */
+ { 0x000413, 0x000413, { 0x000433 } }, /* 0413; 0433; Case map */
+ { 0x000414, 0x000414, { 0x000434 } }, /* 0414; 0434; Case map */
+ { 0x000415, 0x000415, { 0x000435 } }, /* 0415; 0435; Case map */
+ { 0x000416, 0x000416, { 0x000436 } }, /* 0416; 0436; Case map */
+ { 0x000417, 0x000417, { 0x000437 } }, /* 0417; 0437; Case map */
+ { 0x000418, 0x000418, { 0x000438 } }, /* 0418; 0438; Case map */
+ { 0x000419, 0x000419, { 0x000439 } }, /* 0419; 0439; Case map */
+ { 0x00041A, 0x00041A, { 0x00043A } }, /* 041A; 043A; Case map */
+ { 0x00041B, 0x00041B, { 0x00043B } }, /* 041B; 043B; Case map */
+ { 0x00041C, 0x00041C, { 0x00043C } }, /* 041C; 043C; Case map */
+ { 0x00041D, 0x00041D, { 0x00043D } }, /* 041D; 043D; Case map */
+ { 0x00041E, 0x00041E, { 0x00043E } }, /* 041E; 043E; Case map */
+ { 0x00041F, 0x00041F, { 0x00043F } }, /* 041F; 043F; Case map */
+ { 0x000420, 0x000420, { 0x000440 } }, /* 0420; 0440; Case map */
+ { 0x000421, 0x000421, { 0x000441 } }, /* 0421; 0441; Case map */
+ { 0x000422, 0x000422, { 0x000442 } }, /* 0422; 0442; Case map */
+ { 0x000423, 0x000423, { 0x000443 } }, /* 0423; 0443; Case map */
+ { 0x000424, 0x000424, { 0x000444 } }, /* 0424; 0444; Case map */
+ { 0x000425, 0x000425, { 0x000445 } }, /* 0425; 0445; Case map */
+ { 0x000426, 0x000426, { 0x000446 } }, /* 0426; 0446; Case map */
+ { 0x000427, 0x000427, { 0x000447 } }, /* 0427; 0447; Case map */
+ { 0x000428, 0x000428, { 0x000448 } }, /* 0428; 0448; Case map */
+ { 0x000429, 0x000429, { 0x000449 } }, /* 0429; 0449; Case map */
+ { 0x00042A, 0x00042A, { 0x00044A } }, /* 042A; 044A; Case map */
+ { 0x00042B, 0x00042B, { 0x00044B } }, /* 042B; 044B; Case map */
+ { 0x00042C, 0x00042C, { 0x00044C } }, /* 042C; 044C; Case map */
+ { 0x00042D, 0x00042D, { 0x00044D } }, /* 042D; 044D; Case map */
+ { 0x00042E, 0x00042E, { 0x00044E } }, /* 042E; 044E; Case map */
+ { 0x00042F, 0x00042F, { 0x00044F } }, /* 042F; 044F; Case map */
+ { 0x000460, 0x000460, { 0x000461 } }, /* 0460; 0461; Case map */
+ { 0x000462, 0x000462, { 0x000463 } }, /* 0462; 0463; Case map */
+ { 0x000464, 0x000464, { 0x000465 } }, /* 0464; 0465; Case map */
+ { 0x000466, 0x000466, { 0x000467 } }, /* 0466; 0467; Case map */
+ { 0x000468, 0x000468, { 0x000469 } }, /* 0468; 0469; Case map */
+ { 0x00046A, 0x00046A, { 0x00046B } }, /* 046A; 046B; Case map */
+ { 0x00046C, 0x00046C, { 0x00046D } }, /* 046C; 046D; Case map */
+ { 0x00046E, 0x00046E, { 0x00046F } }, /* 046E; 046F; Case map */
+ { 0x000470, 0x000470, { 0x000471 } }, /* 0470; 0471; Case map */
+ { 0x000472, 0x000472, { 0x000473 } }, /* 0472; 0473; Case map */
+ { 0x000474, 0x000474, { 0x000475 } }, /* 0474; 0475; Case map */
+ { 0x000476, 0x000476, { 0x000477 } }, /* 0476; 0477; Case map */
+ { 0x000478, 0x000478, { 0x000479 } }, /* 0478; 0479; Case map */
+ { 0x00047A, 0x00047A, { 0x00047B } }, /* 047A; 047B; Case map */
+ { 0x00047C, 0x00047C, { 0x00047D } }, /* 047C; 047D; Case map */
+ { 0x00047E, 0x00047E, { 0x00047F } }, /* 047E; 047F; Case map */
+ { 0x000480, 0x000480, { 0x000481 } }, /* 0480; 0481; Case map */
+ { 0x00048A, 0x00048A, { 0x00048B } }, /* 048A; 048B; Case map */
+ { 0x00048C, 0x00048C, { 0x00048D } }, /* 048C; 048D; Case map */
+ { 0x00048E, 0x00048E, { 0x00048F } }, /* 048E; 048F; Case map */
+ { 0x000490, 0x000490, { 0x000491 } }, /* 0490; 0491; Case map */
+ { 0x000492, 0x000492, { 0x000493 } }, /* 0492; 0493; Case map */
+ { 0x000494, 0x000494, { 0x000495 } }, /* 0494; 0495; Case map */
+ { 0x000496, 0x000496, { 0x000497 } }, /* 0496; 0497; Case map */
+ { 0x000498, 0x000498, { 0x000499 } }, /* 0498; 0499; Case map */
+ { 0x00049A, 0x00049A, { 0x00049B } }, /* 049A; 049B; Case map */
+ { 0x00049C, 0x00049C, { 0x00049D } }, /* 049C; 049D; Case map */
+ { 0x00049E, 0x00049E, { 0x00049F } }, /* 049E; 049F; Case map */
+ { 0x0004A0, 0x0004A0, { 0x0004A1 } }, /* 04A0; 04A1; Case map */
+ { 0x0004A2, 0x0004A2, { 0x0004A3 } }, /* 04A2; 04A3; Case map */
+ { 0x0004A4, 0x0004A4, { 0x0004A5 } }, /* 04A4; 04A5; Case map */
+ { 0x0004A6, 0x0004A6, { 0x0004A7 } }, /* 04A6; 04A7; Case map */
+ { 0x0004A8, 0x0004A8, { 0x0004A9 } }, /* 04A8; 04A9; Case map */
+ { 0x0004AA, 0x0004AA, { 0x0004AB } }, /* 04AA; 04AB; Case map */
+ { 0x0004AC, 0x0004AC, { 0x0004AD } }, /* 04AC; 04AD; Case map */
+ { 0x0004AE, 0x0004AE, { 0x0004AF } }, /* 04AE; 04AF; Case map */
+ { 0x0004B0, 0x0004B0, { 0x0004B1 } }, /* 04B0; 04B1; Case map */
+ { 0x0004B2, 0x0004B2, { 0x0004B3 } }, /* 04B2; 04B3; Case map */
+ { 0x0004B4, 0x0004B4, { 0x0004B5 } }, /* 04B4; 04B5; Case map */
+ { 0x0004B6, 0x0004B6, { 0x0004B7 } }, /* 04B6; 04B7; Case map */
+ { 0x0004B8, 0x0004B8, { 0x0004B9 } }, /* 04B8; 04B9; Case map */
+ { 0x0004BA, 0x0004BA, { 0x0004BB } }, /* 04BA; 04BB; Case map */
+ { 0x0004BC, 0x0004BC, { 0x0004BD } }, /* 04BC; 04BD; Case map */
+ { 0x0004BE, 0x0004BE, { 0x0004BF } }, /* 04BE; 04BF; Case map */
+ { 0x0004C1, 0x0004C1, { 0x0004C2 } }, /* 04C1; 04C2; Case map */
+ { 0x0004C3, 0x0004C3, { 0x0004C4 } }, /* 04C3; 04C4; Case map */
+ { 0x0004C5, 0x0004C5, { 0x0004C6 } }, /* 04C5; 04C6; Case map */
+ { 0x0004C7, 0x0004C7, { 0x0004C8 } }, /* 04C7; 04C8; Case map */
+ { 0x0004C9, 0x0004C9, { 0x0004CA } }, /* 04C9; 04CA; Case map */
+ { 0x0004CB, 0x0004CB, { 0x0004CC } }, /* 04CB; 04CC; Case map */
+ { 0x0004CD, 0x0004CD, { 0x0004CE } }, /* 04CD; 04CE; Case map */
+ { 0x0004D0, 0x0004D0, { 0x0004D1 } }, /* 04D0; 04D1; Case map */
+ { 0x0004D2, 0x0004D2, { 0x0004D3 } }, /* 04D2; 04D3; Case map */
+ { 0x0004D4, 0x0004D4, { 0x0004D5 } }, /* 04D4; 04D5; Case map */
+ { 0x0004D6, 0x0004D6, { 0x0004D7 } }, /* 04D6; 04D7; Case map */
+ { 0x0004D8, 0x0004D8, { 0x0004D9 } }, /* 04D8; 04D9; Case map */
+ { 0x0004DA, 0x0004DA, { 0x0004DB } }, /* 04DA; 04DB; Case map */
+ { 0x0004DC, 0x0004DC, { 0x0004DD } }, /* 04DC; 04DD; Case map */
+ { 0x0004DE, 0x0004DE, { 0x0004DF } }, /* 04DE; 04DF; Case map */
+ { 0x0004E0, 0x0004E0, { 0x0004E1 } }, /* 04E0; 04E1; Case map */
+ { 0x0004E2, 0x0004E2, { 0x0004E3 } }, /* 04E2; 04E3; Case map */
+ { 0x0004E4, 0x0004E4, { 0x0004E5 } }, /* 04E4; 04E5; Case map */
+ { 0x0004E6, 0x0004E6, { 0x0004E7 } }, /* 04E6; 04E7; Case map */
+ { 0x0004E8, 0x0004E8, { 0x0004E9 } }, /* 04E8; 04E9; Case map */
+ { 0x0004EA, 0x0004EA, { 0x0004EB } }, /* 04EA; 04EB; Case map */
+ { 0x0004EC, 0x0004EC, { 0x0004ED } }, /* 04EC; 04ED; Case map */
+ { 0x0004EE, 0x0004EE, { 0x0004EF } }, /* 04EE; 04EF; Case map */
+ { 0x0004F0, 0x0004F0, { 0x0004F1 } }, /* 04F0; 04F1; Case map */
+ { 0x0004F2, 0x0004F2, { 0x0004F3 } }, /* 04F2; 04F3; Case map */
+ { 0x0004F4, 0x0004F4, { 0x0004F5 } }, /* 04F4; 04F5; Case map */
+ { 0x0004F8, 0x0004F8, { 0x0004F9 } }, /* 04F8; 04F9; Case map */
+ { 0x000500, 0x000500, { 0x000501 } }, /* 0500; 0501; Case map */
+ { 0x000502, 0x000502, { 0x000503 } }, /* 0502; 0503; Case map */
+ { 0x000504, 0x000504, { 0x000505 } }, /* 0504; 0505; Case map */
+ { 0x000506, 0x000506, { 0x000507 } }, /* 0506; 0507; Case map */
+ { 0x000508, 0x000508, { 0x000509 } }, /* 0508; 0509; Case map */
+ { 0x00050A, 0x00050A, { 0x00050B } }, /* 050A; 050B; Case map */
+ { 0x00050C, 0x00050C, { 0x00050D } }, /* 050C; 050D; Case map */
+ { 0x00050E, 0x00050E, { 0x00050F } }, /* 050E; 050F; Case map */
+ { 0x000531, 0x000531, { 0x000561 } }, /* 0531; 0561; Case map */
+ { 0x000532, 0x000532, { 0x000562 } }, /* 0532; 0562; Case map */
+ { 0x000533, 0x000533, { 0x000563 } }, /* 0533; 0563; Case map */
+ { 0x000534, 0x000534, { 0x000564 } }, /* 0534; 0564; Case map */
+ { 0x000535, 0x000535, { 0x000565 } }, /* 0535; 0565; Case map */
+ { 0x000536, 0x000536, { 0x000566 } }, /* 0536; 0566; Case map */
+ { 0x000537, 0x000537, { 0x000567 } }, /* 0537; 0567; Case map */
+ { 0x000538, 0x000538, { 0x000568 } }, /* 0538; 0568; Case map */
+ { 0x000539, 0x000539, { 0x000569 } }, /* 0539; 0569; Case map */
+ { 0x00053A, 0x00053A, { 0x00056A } }, /* 053A; 056A; Case map */
+ { 0x00053B, 0x00053B, { 0x00056B } }, /* 053B; 056B; Case map */
+ { 0x00053C, 0x00053C, { 0x00056C } }, /* 053C; 056C; Case map */
+ { 0x00053D, 0x00053D, { 0x00056D } }, /* 053D; 056D; Case map */
+ { 0x00053E, 0x00053E, { 0x00056E } }, /* 053E; 056E; Case map */
+ { 0x00053F, 0x00053F, { 0x00056F } }, /* 053F; 056F; Case map */
+ { 0x000540, 0x000540, { 0x000570 } }, /* 0540; 0570; Case map */
+ { 0x000541, 0x000541, { 0x000571 } }, /* 0541; 0571; Case map */
+ { 0x000542, 0x000542, { 0x000572 } }, /* 0542; 0572; Case map */
+ { 0x000543, 0x000543, { 0x000573 } }, /* 0543; 0573; Case map */
+ { 0x000544, 0x000544, { 0x000574 } }, /* 0544; 0574; Case map */
+ { 0x000545, 0x000545, { 0x000575 } }, /* 0545; 0575; Case map */
+ { 0x000546, 0x000546, { 0x000576 } }, /* 0546; 0576; Case map */
+ { 0x000547, 0x000547, { 0x000577 } }, /* 0547; 0577; Case map */
+ { 0x000548, 0x000548, { 0x000578 } }, /* 0548; 0578; Case map */
+ { 0x000549, 0x000549, { 0x000579 } }, /* 0549; 0579; Case map */
+ { 0x00054A, 0x00054A, { 0x00057A } }, /* 054A; 057A; Case map */
+ { 0x00054B, 0x00054B, { 0x00057B } }, /* 054B; 057B; Case map */
+ { 0x00054C, 0x00054C, { 0x00057C } }, /* 054C; 057C; Case map */
+ { 0x00054D, 0x00054D, { 0x00057D } }, /* 054D; 057D; Case map */
+ { 0x00054E, 0x00054E, { 0x00057E } }, /* 054E; 057E; Case map */
+ { 0x00054F, 0x00054F, { 0x00057F } }, /* 054F; 057F; Case map */
+ { 0x000550, 0x000550, { 0x000580 } }, /* 0550; 0580; Case map */
+ { 0x000551, 0x000551, { 0x000581 } }, /* 0551; 0581; Case map */
+ { 0x000552, 0x000552, { 0x000582 } }, /* 0552; 0582; Case map */
+ { 0x000553, 0x000553, { 0x000583 } }, /* 0553; 0583; Case map */
+ { 0x000554, 0x000554, { 0x000584 } }, /* 0554; 0584; Case map */
+ { 0x000555, 0x000555, { 0x000585 } }, /* 0555; 0585; Case map */
+ { 0x000556, 0x000556, { 0x000586 } }, /* 0556; 0586; Case map */
+ { 0x000587,
+ 0x000587,
+ { 0x000565, /* 0587; 0565 0582; Case map */
+ 0x000582 } },
+ { 0x001E00, 0x001E00, { 0x001E01 } }, /* 1E00; 1E01; Case map */
+ { 0x001E02, 0x001E02, { 0x001E03 } }, /* 1E02; 1E03; Case map */
+ { 0x001E04, 0x001E04, { 0x001E05 } }, /* 1E04; 1E05; Case map */
+ { 0x001E06, 0x001E06, { 0x001E07 } }, /* 1E06; 1E07; Case map */
+ { 0x001E08, 0x001E08, { 0x001E09 } }, /* 1E08; 1E09; Case map */
+ { 0x001E0A, 0x001E0A, { 0x001E0B } }, /* 1E0A; 1E0B; Case map */
+ { 0x001E0C, 0x001E0C, { 0x001E0D } }, /* 1E0C; 1E0D; Case map */
+ { 0x001E0E, 0x001E0E, { 0x001E0F } }, /* 1E0E; 1E0F; Case map */
+ { 0x001E10, 0x001E10, { 0x001E11 } }, /* 1E10; 1E11; Case map */
+ { 0x001E12, 0x001E12, { 0x001E13 } }, /* 1E12; 1E13; Case map */
+ { 0x001E14, 0x001E14, { 0x001E15 } }, /* 1E14; 1E15; Case map */
+ { 0x001E16, 0x001E16, { 0x001E17 } }, /* 1E16; 1E17; Case map */
+ { 0x001E18, 0x001E18, { 0x001E19 } }, /* 1E18; 1E19; Case map */
+ { 0x001E1A, 0x001E1A, { 0x001E1B } }, /* 1E1A; 1E1B; Case map */
+ { 0x001E1C, 0x001E1C, { 0x001E1D } }, /* 1E1C; 1E1D; Case map */
+ { 0x001E1E, 0x001E1E, { 0x001E1F } }, /* 1E1E; 1E1F; Case map */
+ { 0x001E20, 0x001E20, { 0x001E21 } }, /* 1E20; 1E21; Case map */
+ { 0x001E22, 0x001E22, { 0x001E23 } }, /* 1E22; 1E23; Case map */
+ { 0x001E24, 0x001E24, { 0x001E25 } }, /* 1E24; 1E25; Case map */
+ { 0x001E26, 0x001E26, { 0x001E27 } }, /* 1E26; 1E27; Case map */
+ { 0x001E28, 0x001E28, { 0x001E29 } }, /* 1E28; 1E29; Case map */
+ { 0x001E2A, 0x001E2A, { 0x001E2B } }, /* 1E2A; 1E2B; Case map */
+ { 0x001E2C, 0x001E2C, { 0x001E2D } }, /* 1E2C; 1E2D; Case map */
+ { 0x001E2E, 0x001E2E, { 0x001E2F } }, /* 1E2E; 1E2F; Case map */
+ { 0x001E30, 0x001E30, { 0x001E31 } }, /* 1E30; 1E31; Case map */
+ { 0x001E32, 0x001E32, { 0x001E33 } }, /* 1E32; 1E33; Case map */
+ { 0x001E34, 0x001E34, { 0x001E35 } }, /* 1E34; 1E35; Case map */
+ { 0x001E36, 0x001E36, { 0x001E37 } }, /* 1E36; 1E37; Case map */
+ { 0x001E38, 0x001E38, { 0x001E39 } }, /* 1E38; 1E39; Case map */
+ { 0x001E3A, 0x001E3A, { 0x001E3B } }, /* 1E3A; 1E3B; Case map */
+ { 0x001E3C, 0x001E3C, { 0x001E3D } }, /* 1E3C; 1E3D; Case map */
+ { 0x001E3E, 0x001E3E, { 0x001E3F } }, /* 1E3E; 1E3F; Case map */
+ { 0x001E40, 0x001E40, { 0x001E41 } }, /* 1E40; 1E41; Case map */
+ { 0x001E42, 0x001E42, { 0x001E43 } }, /* 1E42; 1E43; Case map */
+ { 0x001E44, 0x001E44, { 0x001E45 } }, /* 1E44; 1E45; Case map */
+ { 0x001E46, 0x001E46, { 0x001E47 } }, /* 1E46; 1E47; Case map */
+ { 0x001E48, 0x001E48, { 0x001E49 } }, /* 1E48; 1E49; Case map */
+ { 0x001E4A, 0x001E4A, { 0x001E4B } }, /* 1E4A; 1E4B; Case map */
+ { 0x001E4C, 0x001E4C, { 0x001E4D } }, /* 1E4C; 1E4D; Case map */
+ { 0x001E4E, 0x001E4E, { 0x001E4F } }, /* 1E4E; 1E4F; Case map */
+ { 0x001E50, 0x001E50, { 0x001E51 } }, /* 1E50; 1E51; Case map */
+ { 0x001E52, 0x001E52, { 0x001E53 } }, /* 1E52; 1E53; Case map */
+ { 0x001E54, 0x001E54, { 0x001E55 } }, /* 1E54; 1E55; Case map */
+ { 0x001E56, 0x001E56, { 0x001E57 } }, /* 1E56; 1E57; Case map */
+ { 0x001E58, 0x001E58, { 0x001E59 } }, /* 1E58; 1E59; Case map */
+ { 0x001E5A, 0x001E5A, { 0x001E5B } }, /* 1E5A; 1E5B; Case map */
+ { 0x001E5C, 0x001E5C, { 0x001E5D } }, /* 1E5C; 1E5D; Case map */
+ { 0x001E5E, 0x001E5E, { 0x001E5F } }, /* 1E5E; 1E5F; Case map */
+ { 0x001E60, 0x001E60, { 0x001E61 } }, /* 1E60; 1E61; Case map */
+ { 0x001E62, 0x001E62, { 0x001E63 } }, /* 1E62; 1E63; Case map */
+ { 0x001E64, 0x001E64, { 0x001E65 } }, /* 1E64; 1E65; Case map */
+ { 0x001E66, 0x001E66, { 0x001E67 } }, /* 1E66; 1E67; Case map */
+ { 0x001E68, 0x001E68, { 0x001E69 } }, /* 1E68; 1E69; Case map */
+ { 0x001E6A, 0x001E6A, { 0x001E6B } }, /* 1E6A; 1E6B; Case map */
+ { 0x001E6C, 0x001E6C, { 0x001E6D } }, /* 1E6C; 1E6D; Case map */
+ { 0x001E6E, 0x001E6E, { 0x001E6F } }, /* 1E6E; 1E6F; Case map */
+ { 0x001E70, 0x001E70, { 0x001E71 } }, /* 1E70; 1E71; Case map */
+ { 0x001E72, 0x001E72, { 0x001E73 } }, /* 1E72; 1E73; Case map */
+ { 0x001E74, 0x001E74, { 0x001E75 } }, /* 1E74; 1E75; Case map */
+ { 0x001E76, 0x001E76, { 0x001E77 } }, /* 1E76; 1E77; Case map */
+ { 0x001E78, 0x001E78, { 0x001E79 } }, /* 1E78; 1E79; Case map */
+ { 0x001E7A, 0x001E7A, { 0x001E7B } }, /* 1E7A; 1E7B; Case map */
+ { 0x001E7C, 0x001E7C, { 0x001E7D } }, /* 1E7C; 1E7D; Case map */
+ { 0x001E7E, 0x001E7E, { 0x001E7F } }, /* 1E7E; 1E7F; Case map */
+ { 0x001E80, 0x001E80, { 0x001E81 } }, /* 1E80; 1E81; Case map */
+ { 0x001E82, 0x001E82, { 0x001E83 } }, /* 1E82; 1E83; Case map */
+ { 0x001E84, 0x001E84, { 0x001E85 } }, /* 1E84; 1E85; Case map */
+ { 0x001E86, 0x001E86, { 0x001E87 } }, /* 1E86; 1E87; Case map */
+ { 0x001E88, 0x001E88, { 0x001E89 } }, /* 1E88; 1E89; Case map */
+ { 0x001E8A, 0x001E8A, { 0x001E8B } }, /* 1E8A; 1E8B; Case map */
+ { 0x001E8C, 0x001E8C, { 0x001E8D } }, /* 1E8C; 1E8D; Case map */
+ { 0x001E8E, 0x001E8E, { 0x001E8F } }, /* 1E8E; 1E8F; Case map */
+ { 0x001E90, 0x001E90, { 0x001E91 } }, /* 1E90; 1E91; Case map */
+ { 0x001E92, 0x001E92, { 0x001E93 } }, /* 1E92; 1E93; Case map */
+ { 0x001E94, 0x001E94, { 0x001E95 } }, /* 1E94; 1E95; Case map */
+ { 0x001E96,
+ 0x001E96,
+ { 0x000068, /* 1E96; 0068 0331; Case map */
+ 0x000331 } },
+ { 0x001E97,
+ 0x001E97,
+ { 0x000074, /* 1E97; 0074 0308; Case map */
+ 0x000308 } },
+ { 0x001E98,
+ 0x001E98,
+ { 0x000077, /* 1E98; 0077 030A; Case map */
+ 0x00030A } },
+ { 0x001E99,
+ 0x001E99,
+ { 0x000079, /* 1E99; 0079 030A; Case map */
+ 0x00030A } },
+ { 0x001E9A,
+ 0x001E9A,
+ { 0x000061, /* 1E9A; 0061 02BE; Case map */
+ 0x0002BE } },
+ { 0x001E9B, 0x001E9B, { 0x001E61 } }, /* 1E9B; 1E61; Case map */
+ { 0x001EA0, 0x001EA0, { 0x001EA1 } }, /* 1EA0; 1EA1; Case map */
+ { 0x001EA2, 0x001EA2, { 0x001EA3 } }, /* 1EA2; 1EA3; Case map */
+ { 0x001EA4, 0x001EA4, { 0x001EA5 } }, /* 1EA4; 1EA5; Case map */
+ { 0x001EA6, 0x001EA6, { 0x001EA7 } }, /* 1EA6; 1EA7; Case map */
+ { 0x001EA8, 0x001EA8, { 0x001EA9 } }, /* 1EA8; 1EA9; Case map */
+ { 0x001EAA, 0x001EAA, { 0x001EAB } }, /* 1EAA; 1EAB; Case map */
+ { 0x001EAC, 0x001EAC, { 0x001EAD } }, /* 1EAC; 1EAD; Case map */
+ { 0x001EAE, 0x001EAE, { 0x001EAF } }, /* 1EAE; 1EAF; Case map */
+ { 0x001EB0, 0x001EB0, { 0x001EB1 } }, /* 1EB0; 1EB1; Case map */
+ { 0x001EB2, 0x001EB2, { 0x001EB3 } }, /* 1EB2; 1EB3; Case map */
+ { 0x001EB4, 0x001EB4, { 0x001EB5 } }, /* 1EB4; 1EB5; Case map */
+ { 0x001EB6, 0x001EB6, { 0x001EB7 } }, /* 1EB6; 1EB7; Case map */
+ { 0x001EB8, 0x001EB8, { 0x001EB9 } }, /* 1EB8; 1EB9; Case map */
+ { 0x001EBA, 0x001EBA, { 0x001EBB } }, /* 1EBA; 1EBB; Case map */
+ { 0x001EBC, 0x001EBC, { 0x001EBD } }, /* 1EBC; 1EBD; Case map */
+ { 0x001EBE, 0x001EBE, { 0x001EBF } }, /* 1EBE; 1EBF; Case map */
+ { 0x001EC0, 0x001EC0, { 0x001EC1 } }, /* 1EC0; 1EC1; Case map */
+ { 0x001EC2, 0x001EC2, { 0x001EC3 } }, /* 1EC2; 1EC3; Case map */
+ { 0x001EC4, 0x001EC4, { 0x001EC5 } }, /* 1EC4; 1EC5; Case map */
+ { 0x001EC6, 0x001EC6, { 0x001EC7 } }, /* 1EC6; 1EC7; Case map */
+ { 0x001EC8, 0x001EC8, { 0x001EC9 } }, /* 1EC8; 1EC9; Case map */
+ { 0x001ECA, 0x001ECA, { 0x001ECB } }, /* 1ECA; 1ECB; Case map */
+ { 0x001ECC, 0x001ECC, { 0x001ECD } }, /* 1ECC; 1ECD; Case map */
+ { 0x001ECE, 0x001ECE, { 0x001ECF } }, /* 1ECE; 1ECF; Case map */
+ { 0x001ED0, 0x001ED0, { 0x001ED1 } }, /* 1ED0; 1ED1; Case map */
+ { 0x001ED2, 0x001ED2, { 0x001ED3 } }, /* 1ED2; 1ED3; Case map */
+ { 0x001ED4, 0x001ED4, { 0x001ED5 } }, /* 1ED4; 1ED5; Case map */
+ { 0x001ED6, 0x001ED6, { 0x001ED7 } }, /* 1ED6; 1ED7; Case map */
+ { 0x001ED8, 0x001ED8, { 0x001ED9 } }, /* 1ED8; 1ED9; Case map */
+ { 0x001EDA, 0x001EDA, { 0x001EDB } }, /* 1EDA; 1EDB; Case map */
+ { 0x001EDC, 0x001EDC, { 0x001EDD } }, /* 1EDC; 1EDD; Case map */
+ { 0x001EDE, 0x001EDE, { 0x001EDF } }, /* 1EDE; 1EDF; Case map */
+ { 0x001EE0, 0x001EE0, { 0x001EE1 } }, /* 1EE0; 1EE1; Case map */
+ { 0x001EE2, 0x001EE2, { 0x001EE3 } }, /* 1EE2; 1EE3; Case map */
+ { 0x001EE4, 0x001EE4, { 0x001EE5 } }, /* 1EE4; 1EE5; Case map */
+ { 0x001EE6, 0x001EE6, { 0x001EE7 } }, /* 1EE6; 1EE7; Case map */
+ { 0x001EE8, 0x001EE8, { 0x001EE9 } }, /* 1EE8; 1EE9; Case map */
+ { 0x001EEA, 0x001EEA, { 0x001EEB } }, /* 1EEA; 1EEB; Case map */
+ { 0x001EEC, 0x001EEC, { 0x001EED } }, /* 1EEC; 1EED; Case map */
+ { 0x001EEE, 0x001EEE, { 0x001EEF } }, /* 1EEE; 1EEF; Case map */
+ { 0x001EF0, 0x001EF0, { 0x001EF1 } }, /* 1EF0; 1EF1; Case map */
+ { 0x001EF2, 0x001EF2, { 0x001EF3 } }, /* 1EF2; 1EF3; Case map */
+ { 0x001EF4, 0x001EF4, { 0x001EF5 } }, /* 1EF4; 1EF5; Case map */
+ { 0x001EF6, 0x001EF6, { 0x001EF7 } }, /* 1EF6; 1EF7; Case map */
+ { 0x001EF8, 0x001EF8, { 0x001EF9 } }, /* 1EF8; 1EF9; Case map */
+ { 0x001F08, 0x001F08, { 0x001F00 } }, /* 1F08; 1F00; Case map */
+ { 0x001F09, 0x001F09, { 0x001F01 } }, /* 1F09; 1F01; Case map */
+ { 0x001F0A, 0x001F0A, { 0x001F02 } }, /* 1F0A; 1F02; Case map */
+ { 0x001F0B, 0x001F0B, { 0x001F03 } }, /* 1F0B; 1F03; Case map */
+ { 0x001F0C, 0x001F0C, { 0x001F04 } }, /* 1F0C; 1F04; Case map */
+ { 0x001F0D, 0x001F0D, { 0x001F05 } }, /* 1F0D; 1F05; Case map */
+ { 0x001F0E, 0x001F0E, { 0x001F06 } }, /* 1F0E; 1F06; Case map */
+ { 0x001F0F, 0x001F0F, { 0x001F07 } }, /* 1F0F; 1F07; Case map */
+ { 0x001F18, 0x001F18, { 0x001F10 } }, /* 1F18; 1F10; Case map */
+ { 0x001F19, 0x001F19, { 0x001F11 } }, /* 1F19; 1F11; Case map */
+ { 0x001F1A, 0x001F1A, { 0x001F12 } }, /* 1F1A; 1F12; Case map */
+ { 0x001F1B, 0x001F1B, { 0x001F13 } }, /* 1F1B; 1F13; Case map */
+ { 0x001F1C, 0x001F1C, { 0x001F14 } }, /* 1F1C; 1F14; Case map */
+ { 0x001F1D, 0x001F1D, { 0x001F15 } }, /* 1F1D; 1F15; Case map */
+ { 0x001F28, 0x001F28, { 0x001F20 } }, /* 1F28; 1F20; Case map */
+ { 0x001F29, 0x001F29, { 0x001F21 } }, /* 1F29; 1F21; Case map */
+ { 0x001F2A, 0x001F2A, { 0x001F22 } }, /* 1F2A; 1F22; Case map */
+ { 0x001F2B, 0x001F2B, { 0x001F23 } }, /* 1F2B; 1F23; Case map */
+ { 0x001F2C, 0x001F2C, { 0x001F24 } }, /* 1F2C; 1F24; Case map */
+ { 0x001F2D, 0x001F2D, { 0x001F25 } }, /* 1F2D; 1F25; Case map */
+ { 0x001F2E, 0x001F2E, { 0x001F26 } }, /* 1F2E; 1F26; Case map */
+ { 0x001F2F, 0x001F2F, { 0x001F27 } }, /* 1F2F; 1F27; Case map */
+ { 0x001F38, 0x001F38, { 0x001F30 } }, /* 1F38; 1F30; Case map */
+ { 0x001F39, 0x001F39, { 0x001F31 } }, /* 1F39; 1F31; Case map */
+ { 0x001F3A, 0x001F3A, { 0x001F32 } }, /* 1F3A; 1F32; Case map */
+ { 0x001F3B, 0x001F3B, { 0x001F33 } }, /* 1F3B; 1F33; Case map */
+ { 0x001F3C, 0x001F3C, { 0x001F34 } }, /* 1F3C; 1F34; Case map */
+ { 0x001F3D, 0x001F3D, { 0x001F35 } }, /* 1F3D; 1F35; Case map */
+ { 0x001F3E, 0x001F3E, { 0x001F36 } }, /* 1F3E; 1F36; Case map */
+ { 0x001F3F, 0x001F3F, { 0x001F37 } }, /* 1F3F; 1F37; Case map */
+ { 0x001F48, 0x001F48, { 0x001F40 } }, /* 1F48; 1F40; Case map */
+ { 0x001F49, 0x001F49, { 0x001F41 } }, /* 1F49; 1F41; Case map */
+ { 0x001F4A, 0x001F4A, { 0x001F42 } }, /* 1F4A; 1F42; Case map */
+ { 0x001F4B, 0x001F4B, { 0x001F43 } }, /* 1F4B; 1F43; Case map */
+ { 0x001F4C, 0x001F4C, { 0x001F44 } }, /* 1F4C; 1F44; Case map */
+ { 0x001F4D, 0x001F4D, { 0x001F45 } }, /* 1F4D; 1F45; Case map */
+ { 0x001F50,
+ 0x001F50,
+ { 0x0003C5, /* 1F50; 03C5 0313; Case map */
+ 0x000313 } },
+ { 0x001F52,
+ 0x001F52,
+ { 0x0003C5, /* 1F52; 03C5 0313 0300; Case map */
+ 0x000313, 0x000300 } },
+ { 0x001F54,
+ 0x001F54,
+ { 0x0003C5, /* 1F54; 03C5 0313 0301; Case map */
+ 0x000313, 0x000301 } },
+ { 0x001F56,
+ 0x001F56,
+ { 0x0003C5, /* 1F56; 03C5 0313 0342; Case map */
+ 0x000313, 0x000342 } },
+ { 0x001F59, 0x001F59, { 0x001F51 } }, /* 1F59; 1F51; Case map */
+ { 0x001F5B, 0x001F5B, { 0x001F53 } }, /* 1F5B; 1F53; Case map */
+ { 0x001F5D, 0x001F5D, { 0x001F55 } }, /* 1F5D; 1F55; Case map */
+ { 0x001F5F, 0x001F5F, { 0x001F57 } }, /* 1F5F; 1F57; Case map */
+ { 0x001F68, 0x001F68, { 0x001F60 } }, /* 1F68; 1F60; Case map */
+ { 0x001F69, 0x001F69, { 0x001F61 } }, /* 1F69; 1F61; Case map */
+ { 0x001F6A, 0x001F6A, { 0x001F62 } }, /* 1F6A; 1F62; Case map */
+ { 0x001F6B, 0x001F6B, { 0x001F63 } }, /* 1F6B; 1F63; Case map */
+ { 0x001F6C, 0x001F6C, { 0x001F64 } }, /* 1F6C; 1F64; Case map */
+ { 0x001F6D, 0x001F6D, { 0x001F65 } }, /* 1F6D; 1F65; Case map */
+ { 0x001F6E, 0x001F6E, { 0x001F66 } }, /* 1F6E; 1F66; Case map */
+ { 0x001F6F, 0x001F6F, { 0x001F67 } }, /* 1F6F; 1F67; Case map */
+ { 0x001F80,
+ 0x001F80,
+ { 0x001F00, /* 1F80; 1F00 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F81,
+ 0x001F81,
+ { 0x001F01, /* 1F81; 1F01 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F82,
+ 0x001F82,
+ { 0x001F02, /* 1F82; 1F02 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F83,
+ 0x001F83,
+ { 0x001F03, /* 1F83; 1F03 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F84,
+ 0x001F84,
+ { 0x001F04, /* 1F84; 1F04 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F85,
+ 0x001F85,
+ { 0x001F05, /* 1F85; 1F05 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F86,
+ 0x001F86,
+ { 0x001F06, /* 1F86; 1F06 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F87,
+ 0x001F87,
+ { 0x001F07, /* 1F87; 1F07 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F88,
+ 0x001F88,
+ { 0x001F00, /* 1F88; 1F00 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F89,
+ 0x001F89,
+ { 0x001F01, /* 1F89; 1F01 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F8A,
+ 0x001F8A,
+ { 0x001F02, /* 1F8A; 1F02 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F8B,
+ 0x001F8B,
+ { 0x001F03, /* 1F8B; 1F03 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F8C,
+ 0x001F8C,
+ { 0x001F04, /* 1F8C; 1F04 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F8D,
+ 0x001F8D,
+ { 0x001F05, /* 1F8D; 1F05 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F8E,
+ 0x001F8E,
+ { 0x001F06, /* 1F8E; 1F06 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F8F,
+ 0x001F8F,
+ { 0x001F07, /* 1F8F; 1F07 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F90,
+ 0x001F90,
+ { 0x001F20, /* 1F90; 1F20 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F91,
+ 0x001F91,
+ { 0x001F21, /* 1F91; 1F21 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F92,
+ 0x001F92,
+ { 0x001F22, /* 1F92; 1F22 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F93,
+ 0x001F93,
+ { 0x001F23, /* 1F93; 1F23 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F94,
+ 0x001F94,
+ { 0x001F24, /* 1F94; 1F24 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F95,
+ 0x001F95,
+ { 0x001F25, /* 1F95; 1F25 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F96,
+ 0x001F96,
+ { 0x001F26, /* 1F96; 1F26 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F97,
+ 0x001F97,
+ { 0x001F27, /* 1F97; 1F27 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F98,
+ 0x001F98,
+ { 0x001F20, /* 1F98; 1F20 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F99,
+ 0x001F99,
+ { 0x001F21, /* 1F99; 1F21 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F9A,
+ 0x001F9A,
+ { 0x001F22, /* 1F9A; 1F22 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F9B,
+ 0x001F9B,
+ { 0x001F23, /* 1F9B; 1F23 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F9C,
+ 0x001F9C,
+ { 0x001F24, /* 1F9C; 1F24 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F9D,
+ 0x001F9D,
+ { 0x001F25, /* 1F9D; 1F25 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F9E,
+ 0x001F9E,
+ { 0x001F26, /* 1F9E; 1F26 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001F9F,
+ 0x001F9F,
+ { 0x001F27, /* 1F9F; 1F27 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA0,
+ 0x001FA0,
+ { 0x001F60, /* 1FA0; 1F60 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA1,
+ 0x001FA1,
+ { 0x001F61, /* 1FA1; 1F61 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA2,
+ 0x001FA2,
+ { 0x001F62, /* 1FA2; 1F62 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA3,
+ 0x001FA3,
+ { 0x001F63, /* 1FA3; 1F63 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA4,
+ 0x001FA4,
+ { 0x001F64, /* 1FA4; 1F64 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA5,
+ 0x001FA5,
+ { 0x001F65, /* 1FA5; 1F65 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA6,
+ 0x001FA6,
+ { 0x001F66, /* 1FA6; 1F66 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA7,
+ 0x001FA7,
+ { 0x001F67, /* 1FA7; 1F67 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA8,
+ 0x001FA8,
+ { 0x001F60, /* 1FA8; 1F60 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FA9,
+ 0x001FA9,
+ { 0x001F61, /* 1FA9; 1F61 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FAA,
+ 0x001FAA,
+ { 0x001F62, /* 1FAA; 1F62 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FAB,
+ 0x001FAB,
+ { 0x001F63, /* 1FAB; 1F63 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FAC,
+ 0x001FAC,
+ { 0x001F64, /* 1FAC; 1F64 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FAD,
+ 0x001FAD,
+ { 0x001F65, /* 1FAD; 1F65 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FAE,
+ 0x001FAE,
+ { 0x001F66, /* 1FAE; 1F66 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FAF,
+ 0x001FAF,
+ { 0x001F67, /* 1FAF; 1F67 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FB2,
+ 0x001FB2,
+ { 0x001F70, /* 1FB2; 1F70 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FB3,
+ 0x001FB3,
+ { 0x0003B1, /* 1FB3; 03B1 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FB4,
+ 0x001FB4,
+ { 0x0003AC, /* 1FB4; 03AC 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FB6,
+ 0x001FB6,
+ { 0x0003B1, /* 1FB6; 03B1 0342; Case map */
+ 0x000342 } },
+ { 0x001FB7,
+ 0x001FB7,
+ { 0x0003B1, /* 1FB7; 03B1 0342 03B9; Case map */
+ 0x000342, 0x0003B9 } },
+ { 0x001FB8, 0x001FB8, { 0x001FB0 } }, /* 1FB8; 1FB0; Case map */
+ { 0x001FB9, 0x001FB9, { 0x001FB1 } }, /* 1FB9; 1FB1; Case map */
+ { 0x001FBA, 0x001FBA, { 0x001F70 } }, /* 1FBA; 1F70; Case map */
+ { 0x001FBB, 0x001FBB, { 0x001F71 } }, /* 1FBB; 1F71; Case map */
+ { 0x001FBC,
+ 0x001FBC,
+ { 0x0003B1, /* 1FBC; 03B1 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FBE, 0x001FBE, { 0x0003B9 } }, /* 1FBE; 03B9; Case map */
+ { 0x001FC2,
+ 0x001FC2,
+ { 0x001F74, /* 1FC2; 1F74 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FC3,
+ 0x001FC3,
+ { 0x0003B7, /* 1FC3; 03B7 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FC4,
+ 0x001FC4,
+ { 0x0003AE, /* 1FC4; 03AE 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FC6,
+ 0x001FC6,
+ { 0x0003B7, /* 1FC6; 03B7 0342; Case map */
+ 0x000342 } },
+ { 0x001FC7,
+ 0x001FC7,
+ { 0x0003B7, /* 1FC7; 03B7 0342 03B9; Case map */
+ 0x000342, 0x0003B9 } },
+ { 0x001FC8, 0x001FC8, { 0x001F72 } }, /* 1FC8; 1F72; Case map */
+ { 0x001FC9, 0x001FC9, { 0x001F73 } }, /* 1FC9; 1F73; Case map */
+ { 0x001FCA, 0x001FCA, { 0x001F74 } }, /* 1FCA; 1F74; Case map */
+ { 0x001FCB, 0x001FCB, { 0x001F75 } }, /* 1FCB; 1F75; Case map */
+ { 0x001FCC,
+ 0x001FCC,
+ { 0x0003B7, /* 1FCC; 03B7 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FD2,
+ 0x001FD2,
+ { 0x0003B9, /* 1FD2; 03B9 0308 0300; Case map */
+ 0x000308, 0x000300 } },
+ { 0x001FD3,
+ 0x001FD3,
+ { 0x0003B9, /* 1FD3; 03B9 0308 0301; Case map */
+ 0x000308, 0x000301 } },
+ { 0x001FD6,
+ 0x001FD6,
+ { 0x0003B9, /* 1FD6; 03B9 0342; Case map */
+ 0x000342 } },
+ { 0x001FD7,
+ 0x001FD7,
+ { 0x0003B9, /* 1FD7; 03B9 0308 0342; Case map */
+ 0x000308, 0x000342 } },
+ { 0x001FD8, 0x001FD8, { 0x001FD0 } }, /* 1FD8; 1FD0; Case map */
+ { 0x001FD9, 0x001FD9, { 0x001FD1 } }, /* 1FD9; 1FD1; Case map */
+ { 0x001FDA, 0x001FDA, { 0x001F76 } }, /* 1FDA; 1F76; Case map */
+ { 0x001FDB, 0x001FDB, { 0x001F77 } }, /* 1FDB; 1F77; Case map */
+ { 0x001FE2,
+ 0x001FE2,
+ { 0x0003C5, /* 1FE2; 03C5 0308 0300; Case map */
+ 0x000308, 0x000300 } },
+ { 0x001FE3,
+ 0x001FE3,
+ { 0x0003C5, /* 1FE3; 03C5 0308 0301; Case map */
+ 0x000308, 0x000301 } },
+ { 0x001FE4,
+ 0x001FE4,
+ { 0x0003C1, /* 1FE4; 03C1 0313; Case map */
+ 0x000313 } },
+ { 0x001FE6,
+ 0x001FE6,
+ { 0x0003C5, /* 1FE6; 03C5 0342; Case map */
+ 0x000342 } },
+ { 0x001FE7,
+ 0x001FE7,
+ { 0x0003C5, /* 1FE7; 03C5 0308 0342; Case map */
+ 0x000308, 0x000342 } },
+ { 0x001FE8, 0x001FE8, { 0x001FE0 } }, /* 1FE8; 1FE0; Case map */
+ { 0x001FE9, 0x001FE9, { 0x001FE1 } }, /* 1FE9; 1FE1; Case map */
+ { 0x001FEA, 0x001FEA, { 0x001F7A } }, /* 1FEA; 1F7A; Case map */
+ { 0x001FEB, 0x001FEB, { 0x001F7B } }, /* 1FEB; 1F7B; Case map */
+ { 0x001FEC, 0x001FEC, { 0x001FE5 } }, /* 1FEC; 1FE5; Case map */
+ { 0x001FF2,
+ 0x001FF2,
+ { 0x001F7C, /* 1FF2; 1F7C 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FF3,
+ 0x001FF3,
+ { 0x0003C9, /* 1FF3; 03C9 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FF4,
+ 0x001FF4,
+ { 0x0003CE, /* 1FF4; 03CE 03B9; Case map */
+ 0x0003B9 } },
+ { 0x001FF6,
+ 0x001FF6,
+ { 0x0003C9, /* 1FF6; 03C9 0342; Case map */
+ 0x000342 } },
+ { 0x001FF7,
+ 0x001FF7,
+ { 0x0003C9, /* 1FF7; 03C9 0342 03B9; Case map */
+ 0x000342, 0x0003B9 } },
+ { 0x001FF8, 0x001FF8, { 0x001F78 } }, /* 1FF8; 1F78; Case map */
+ { 0x001FF9, 0x001FF9, { 0x001F79 } }, /* 1FF9; 1F79; Case map */
+ { 0x001FFA, 0x001FFA, { 0x001F7C } }, /* 1FFA; 1F7C; Case map */
+ { 0x001FFB, 0x001FFB, { 0x001F7D } }, /* 1FFB; 1F7D; Case map */
+ { 0x001FFC,
+ 0x001FFC,
+ { 0x0003C9, /* 1FFC; 03C9 03B9; Case map */
+ 0x0003B9 } },
+ { 0x002126, 0x002126, { 0x0003C9 } }, /* 2126; 03C9; Case map */
+ { 0x00212A, 0x00212A, { 0x00006B } }, /* 212A; 006B; Case map */
+ { 0x00212B, 0x00212B, { 0x0000E5 } }, /* 212B; 00E5; Case map */
+ { 0x002160, 0x002160, { 0x002170 } }, /* 2160; 2170; Case map */
+ { 0x002161, 0x002161, { 0x002171 } }, /* 2161; 2171; Case map */
+ { 0x002162, 0x002162, { 0x002172 } }, /* 2162; 2172; Case map */
+ { 0x002163, 0x002163, { 0x002173 } }, /* 2163; 2173; Case map */
+ { 0x002164, 0x002164, { 0x002174 } }, /* 2164; 2174; Case map */
+ { 0x002165, 0x002165, { 0x002175 } }, /* 2165; 2175; Case map */
+ { 0x002166, 0x002166, { 0x002176 } }, /* 2166; 2176; Case map */
+ { 0x002167, 0x002167, { 0x002177 } }, /* 2167; 2177; Case map */
+ { 0x002168, 0x002168, { 0x002178 } }, /* 2168; 2178; Case map */
+ { 0x002169, 0x002169, { 0x002179 } }, /* 2169; 2179; Case map */
+ { 0x00216A, 0x00216A, { 0x00217A } }, /* 216A; 217A; Case map */
+ { 0x00216B, 0x00216B, { 0x00217B } }, /* 216B; 217B; Case map */
+ { 0x00216C, 0x00216C, { 0x00217C } }, /* 216C; 217C; Case map */
+ { 0x00216D, 0x00216D, { 0x00217D } }, /* 216D; 217D; Case map */
+ { 0x00216E, 0x00216E, { 0x00217E } }, /* 216E; 217E; Case map */
+ { 0x00216F, 0x00216F, { 0x00217F } }, /* 216F; 217F; Case map */
+ { 0x0024B6, 0x0024B6, { 0x0024D0 } }, /* 24B6; 24D0; Case map */
+ { 0x0024B7, 0x0024B7, { 0x0024D1 } }, /* 24B7; 24D1; Case map */
+ { 0x0024B8, 0x0024B8, { 0x0024D2 } }, /* 24B8; 24D2; Case map */
+ { 0x0024B9, 0x0024B9, { 0x0024D3 } }, /* 24B9; 24D3; Case map */
+ { 0x0024BA, 0x0024BA, { 0x0024D4 } }, /* 24BA; 24D4; Case map */
+ { 0x0024BB, 0x0024BB, { 0x0024D5 } }, /* 24BB; 24D5; Case map */
+ { 0x0024BC, 0x0024BC, { 0x0024D6 } }, /* 24BC; 24D6; Case map */
+ { 0x0024BD, 0x0024BD, { 0x0024D7 } }, /* 24BD; 24D7; Case map */
+ { 0x0024BE, 0x0024BE, { 0x0024D8 } }, /* 24BE; 24D8; Case map */
+ { 0x0024BF, 0x0024BF, { 0x0024D9 } }, /* 24BF; 24D9; Case map */
+ { 0x0024C0, 0x0024C0, { 0x0024DA } }, /* 24C0; 24DA; Case map */
+ { 0x0024C1, 0x0024C1, { 0x0024DB } }, /* 24C1; 24DB; Case map */
+ { 0x0024C2, 0x0024C2, { 0x0024DC } }, /* 24C2; 24DC; Case map */
+ { 0x0024C3, 0x0024C3, { 0x0024DD } }, /* 24C3; 24DD; Case map */
+ { 0x0024C4, 0x0024C4, { 0x0024DE } }, /* 24C4; 24DE; Case map */
+ { 0x0024C5, 0x0024C5, { 0x0024DF } }, /* 24C5; 24DF; Case map */
+ { 0x0024C6, 0x0024C6, { 0x0024E0 } }, /* 24C6; 24E0; Case map */
+ { 0x0024C7, 0x0024C7, { 0x0024E1 } }, /* 24C7; 24E1; Case map */
+ { 0x0024C8, 0x0024C8, { 0x0024E2 } }, /* 24C8; 24E2; Case map */
+ { 0x0024C9, 0x0024C9, { 0x0024E3 } }, /* 24C9; 24E3; Case map */
+ { 0x0024CA, 0x0024CA, { 0x0024E4 } }, /* 24CA; 24E4; Case map */
+ { 0x0024CB, 0x0024CB, { 0x0024E5 } }, /* 24CB; 24E5; Case map */
+ { 0x0024CC, 0x0024CC, { 0x0024E6 } }, /* 24CC; 24E6; Case map */
+ { 0x0024CD, 0x0024CD, { 0x0024E7 } }, /* 24CD; 24E7; Case map */
+ { 0x0024CE, 0x0024CE, { 0x0024E8 } }, /* 24CE; 24E8; Case map */
+ { 0x0024CF, 0x0024CF, { 0x0024E9 } }, /* 24CF; 24E9; Case map */
+ { 0x00FB00,
+ 0x00FB00,
+ { 0x000066, /* FB00; 0066 0066; Case map */
+ 0x000066 } },
+ { 0x00FB01,
+ 0x00FB01,
+ { 0x000066, /* FB01; 0066 0069; Case map */
+ 0x000069 } },
+ { 0x00FB02,
+ 0x00FB02,
+ { 0x000066, /* FB02; 0066 006C; Case map */
+ 0x00006C } },
+ { 0x00FB03,
+ 0x00FB03,
+ { 0x000066, /* FB03; 0066 0066 0069; Case map */
+ 0x000066, 0x000069 } },
+ { 0x00FB04,
+ 0x00FB04,
+ { 0x000066, /* FB04; 0066 0066 006C; Case map */
+ 0x000066, 0x00006C } },
+ { 0x00FB05,
+ 0x00FB05,
+ { 0x000073, /* FB05; 0073 0074; Case map */
+ 0x000074 } },
+ { 0x00FB06,
+ 0x00FB06,
+ { 0x000073, /* FB06; 0073 0074; Case map */
+ 0x000074 } },
+ { 0x00FB13,
+ 0x00FB13,
+ { 0x000574, /* FB13; 0574 0576; Case map */
+ 0x000576 } },
+ { 0x00FB14,
+ 0x00FB14,
+ { 0x000574, /* FB14; 0574 0565; Case map */
+ 0x000565 } },
+ { 0x00FB15,
+ 0x00FB15,
+ { 0x000574, /* FB15; 0574 056B; Case map */
+ 0x00056B } },
+ { 0x00FB16,
+ 0x00FB16,
+ { 0x00057E, /* FB16; 057E 0576; Case map */
+ 0x000576 } },
+ { 0x00FB17,
+ 0x00FB17,
+ { 0x000574, /* FB17; 0574 056D; Case map */
+ 0x00056D } },
+ { 0x00FF21, 0x00FF21, { 0x00FF41 } }, /* FF21; FF41; Case map */
+ { 0x00FF22, 0x00FF22, { 0x00FF42 } }, /* FF22; FF42; Case map */
+ { 0x00FF23, 0x00FF23, { 0x00FF43 } }, /* FF23; FF43; Case map */
+ { 0x00FF24, 0x00FF24, { 0x00FF44 } }, /* FF24; FF44; Case map */
+ { 0x00FF25, 0x00FF25, { 0x00FF45 } }, /* FF25; FF45; Case map */
+ { 0x00FF26, 0x00FF26, { 0x00FF46 } }, /* FF26; FF46; Case map */
+ { 0x00FF27, 0x00FF27, { 0x00FF47 } }, /* FF27; FF47; Case map */
+ { 0x00FF28, 0x00FF28, { 0x00FF48 } }, /* FF28; FF48; Case map */
+ { 0x00FF29, 0x00FF29, { 0x00FF49 } }, /* FF29; FF49; Case map */
+ { 0x00FF2A, 0x00FF2A, { 0x00FF4A } }, /* FF2A; FF4A; Case map */
+ { 0x00FF2B, 0x00FF2B, { 0x00FF4B } }, /* FF2B; FF4B; Case map */
+ { 0x00FF2C, 0x00FF2C, { 0x00FF4C } }, /* FF2C; FF4C; Case map */
+ { 0x00FF2D, 0x00FF2D, { 0x00FF4D } }, /* FF2D; FF4D; Case map */
+ { 0x00FF2E, 0x00FF2E, { 0x00FF4E } }, /* FF2E; FF4E; Case map */
+ { 0x00FF2F, 0x00FF2F, { 0x00FF4F } }, /* FF2F; FF4F; Case map */
+ { 0x00FF30, 0x00FF30, { 0x00FF50 } }, /* FF30; FF50; Case map */
+ { 0x00FF31, 0x00FF31, { 0x00FF51 } }, /* FF31; FF51; Case map */
+ { 0x00FF32, 0x00FF32, { 0x00FF52 } }, /* FF32; FF52; Case map */
+ { 0x00FF33, 0x00FF33, { 0x00FF53 } }, /* FF33; FF53; Case map */
+ { 0x00FF34, 0x00FF34, { 0x00FF54 } }, /* FF34; FF54; Case map */
+ { 0x00FF35, 0x00FF35, { 0x00FF55 } }, /* FF35; FF55; Case map */
+ { 0x00FF36, 0x00FF36, { 0x00FF56 } }, /* FF36; FF56; Case map */
+ { 0x00FF37, 0x00FF37, { 0x00FF57 } }, /* FF37; FF57; Case map */
+ { 0x00FF38, 0x00FF38, { 0x00FF58 } }, /* FF38; FF58; Case map */
+ { 0x00FF39, 0x00FF39, { 0x00FF59 } }, /* FF39; FF59; Case map */
+ { 0x00FF3A, 0x00FF3A, { 0x00FF5A } }, /* FF3A; FF5A; Case map */
+ { 0x010400, 0x010400, { 0x010428 } }, /* 10400; 10428; Case map */
+ { 0x010401, 0x010401, { 0x010429 } }, /* 10401; 10429; Case map */
+ { 0x010402, 0x010402, { 0x01042A } }, /* 10402; 1042A; Case map */
+ { 0x010403, 0x010403, { 0x01042B } }, /* 10403; 1042B; Case map */
+ { 0x010404, 0x010404, { 0x01042C } }, /* 10404; 1042C; Case map */
+ { 0x010405, 0x010405, { 0x01042D } }, /* 10405; 1042D; Case map */
+ { 0x010406, 0x010406, { 0x01042E } }, /* 10406; 1042E; Case map */
+ { 0x010407, 0x010407, { 0x01042F } }, /* 10407; 1042F; Case map */
+ { 0x010408, 0x010408, { 0x010430 } }, /* 10408; 10430; Case map */
+ { 0x010409, 0x010409, { 0x010431 } }, /* 10409; 10431; Case map */
+ { 0x01040A, 0x01040A, { 0x010432 } }, /* 1040A; 10432; Case map */
+ { 0x01040B, 0x01040B, { 0x010433 } }, /* 1040B; 10433; Case map */
+ { 0x01040C, 0x01040C, { 0x010434 } }, /* 1040C; 10434; Case map */
+ { 0x01040D, 0x01040D, { 0x010435 } }, /* 1040D; 10435; Case map */
+ { 0x01040E, 0x01040E, { 0x010436 } }, /* 1040E; 10436; Case map */
+ { 0x01040F, 0x01040F, { 0x010437 } }, /* 1040F; 10437; Case map */
+ { 0x010410, 0x010410, { 0x010438 } }, /* 10410; 10438; Case map */
+ { 0x010411, 0x010411, { 0x010439 } }, /* 10411; 10439; Case map */
+ { 0x010412, 0x010412, { 0x01043A } }, /* 10412; 1043A; Case map */
+ { 0x010413, 0x010413, { 0x01043B } }, /* 10413; 1043B; Case map */
+ { 0x010414, 0x010414, { 0x01043C } }, /* 10414; 1043C; Case map */
+ { 0x010415, 0x010415, { 0x01043D } }, /* 10415; 1043D; Case map */
+ { 0x010416, 0x010416, { 0x01043E } }, /* 10416; 1043E; Case map */
+ { 0x010417, 0x010417, { 0x01043F } }, /* 10417; 1043F; Case map */
+ { 0x010418, 0x010418, { 0x010440 } }, /* 10418; 10440; Case map */
+ { 0x010419, 0x010419, { 0x010441 } }, /* 10419; 10441; Case map */
+ { 0x01041A, 0x01041A, { 0x010442 } }, /* 1041A; 10442; Case map */
+ { 0x01041B, 0x01041B, { 0x010443 } }, /* 1041B; 10443; Case map */
+ { 0x01041C, 0x01041C, { 0x010444 } }, /* 1041C; 10444; Case map */
+ { 0x01041D, 0x01041D, { 0x010445 } }, /* 1041D; 10445; Case map */
+ { 0x01041E, 0x01041E, { 0x010446 } }, /* 1041E; 10446; Case map */
+ { 0x01041F, 0x01041F, { 0x010447 } }, /* 1041F; 10447; Case map */
+ { 0x010420, 0x010420, { 0x010448 } }, /* 10420; 10448; Case map */
+ { 0x010421, 0x010421, { 0x010449 } }, /* 10421; 10449; Case map */
+ { 0x010422, 0x010422, { 0x01044A } }, /* 10422; 1044A; Case map */
+ { 0x010423, 0x010423, { 0x01044B } }, /* 10423; 1044B; Case map */
+ { 0x010424, 0x010424, { 0x01044C } }, /* 10424; 1044C; Case map */
+ { 0x010425, 0x010425, { 0x01044D } }, /* 10425; 1044D; Case map */
+ { 0 },
+};
+
+/*
+ * FF3A; FF5A; Case map
+ * 10400; 10428; Case map
+10401; 10429; Case map
+10402; 1042A; Case map
+10403; 1042B; Case map
+10404; 1042C; Case map
+10405; 1042D; Case map
+10406; 1042E; Case map
+10407; 1042F; Case map
+10408; 10430; Case map
+10409; 10431; Case map
+1040A; 10432; Case map
+1040B; 10433; Case map
+1040C; 10434; Case map
+1040D; 10435; Case map
+1040E; 10436; Case map
+1040F; 10437; Case map
+10410; 10438; Case map
+10411; 10439; Case map
+10412; 1043A; Case map
+10413; 1043B; Case map
+10414; 1043C; Case map
+10415; 1043D; Case map
+10416; 1043E; Case map
+10417; 1043F; Case map
+10418; 10440; Case map
+10419; 10441; Case map
+1041A; 10442; Case map
+1041B; 10443; Case map
+1041C; 10444; Case map
+1041D; 10445; Case map
+1041E; 10446; Case map
+1041F; 10447; Case map
+10420; 10448; Case map
+10421; 10449; Case map
+10422; 1044A; Case map
+10423; 1044B; Case map
+10424; 1044C; Case map
+10425; 1044D; Case map
+
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_1_1[] = {
+ { 0x000020, 0x000020 }, /* 0020; SPACE */
+ { 0 },
+};
+
+/*
+ * FF3A; FF5A; Case map
+ * * 10400; 10428; Case map
+10401; 10429; Case map
+10402; 1042A; Case map
+10403; 1042B; Case map
+10404; 1042C; Case map
+10405; 1042D; Case map
+10406; 1042E; Case map
+10407; 1042F; Case map
+10408; 10430; Case map
+10409; 10431; Case map
+1040A; 10432; Case map
+1040B; 10433; Case map
+1040C; 10434; Case map
+1040D; 10435; Case map
+1040E; 10436; Case map
+1040F; 10437; Case map
+10410; 10438; Case map
+10411; 10439; Case map
+10412; 1043A; Case map
+10413; 1043B; Case map
+10414; 1043C; Case map
+10415; 1043D; Case map
+10416; 1043E; Case map
+10417; 1043F; Case map
+10418; 10440; Case map
+10419; 10441; Case map
+1041A; 10442; Case map
+1041B; 10443; Case map
+1041C; 10444; Case map
+1041D; 10445; Case map
+1041E; 10446; Case map
+1041F; 10447; Case map
+10420; 10448; Case map
+10421; 10449; Case map
+10422; 1044A; Case map
+10423; 1044B; Case map
+10424; 1044C; Case map
+10425; 1044D; Case map
+
+0020; SPACE
+
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_1_2[] = {
+ { 0x0000A0, 0x0000A0 }, /* 00A0; NO-BREAK SPACE */
+ { 0x001680, 0x001680 }, /* 1680; OGHAM SPACE MARK */
+ { 0x002000, 0x002000 }, /* 2000; EN QUAD */
+ { 0x002001, 0x002001 }, /* 2001; EM QUAD */
+ { 0x002002, 0x002002 }, /* 2002; EN SPACE */
+ { 0x002003, 0x002003 }, /* 2003; EM SPACE */
+ { 0x002004, 0x002004 }, /* 2004; THREE-PER-EM SPACE */
+ { 0x002005, 0x002005 }, /* 2005; FOUR-PER-EM SPACE */
+ { 0x002006, 0x002006 }, /* 2006; SIX-PER-EM SPACE */
+ { 0x002007, 0x002007 }, /* 2007; FIGURE SPACE */
+ { 0x002008, 0x002008 }, /* 2008; PUNCTUATION SPACE */
+ { 0x002009, 0x002009 }, /* 2009; THIN SPACE */
+ { 0x00200A, 0x00200A }, /* 200A; HAIR SPACE */
+ { 0x00200B, 0x00200B }, /* 200B; ZERO WIDTH SPACE */
+ { 0x00202F, 0x00202F }, /* 202F; NARROW NO-BREAK SPACE */
+ { 0x00205F, 0x00205F }, /* 205F; MEDIUM MATHEMATICAL SPACE */
+ { 0x003000, 0x003000 }, /* 3000; IDEOGRAPHIC SPACE */
+ { 0 },
+};
+
+/*
+ * FF3A; FF5A; Case map
+ * * * 10400; 10428; Case map
+10401; 10429; Case map
+10402; 1042A; Case map
+10403; 1042B; Case map
+10404; 1042C; Case map
+10405; 1042D; Case map
+10406; 1042E; Case map
+10407; 1042F; Case map
+10408; 10430; Case map
+10409; 10431; Case map
+1040A; 10432; Case map
+1040B; 10433; Case map
+1040C; 10434; Case map
+1040D; 10435; Case map
+1040E; 10436; Case map
+1040F; 10437; Case map
+10410; 10438; Case map
+10411; 10439; Case map
+10412; 1043A; Case map
+10413; 1043B; Case map
+10414; 1043C; Case map
+10415; 1043D; Case map
+10416; 1043E; Case map
+10417; 1043F; Case map
+10418; 10440; Case map
+10419; 10441; Case map
+1041A; 10442; Case map
+1041B; 10443; Case map
+1041C; 10444; Case map
+1041D; 10445; Case map
+1041E; 10446; Case map
+1041F; 10447; Case map
+10420; 10448; Case map
+10421; 10449; Case map
+10422; 1044A; Case map
+10423; 1044B; Case map
+10424; 1044C; Case map
+10425; 1044D; Case map
+
+0020; SPACE
+
+00A0; NO-BREAK SPACE
+1680; OGHAM SPACE MARK
+2000; EN QUAD
+2001; EM QUAD
+2002; EN SPACE
+2003; EM SPACE
+2004; THREE-PER-EM SPACE
+2005; FOUR-PER-EM SPACE
+2006; SIX-PER-EM SPACE
+2007; FIGURE SPACE
+2008; PUNCTUATION SPACE
+2009; THIN SPACE
+200A; HAIR SPACE
+200B; ZERO WIDTH SPACE
+202F; NARROW NO-BREAK SPACE
+205F; MEDIUM MATHEMATICAL SPACE
+3000; IDEOGRAPHIC SPACE
+
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_2_1[] = {
+ { 0x000000, 0x00001F }, /* 0000-001F; [CONTROL CHARACTERS] */
+ { 0x00007F, 0x00007F }, /* 007F; DELETE */
+ { 0 },
+};
+
+/*
+ * FF3A; FF5A; Case map
+ * * * * 10400; 10428; Case map
+10401; 10429; Case map
+10402; 1042A; Case map
+10403; 1042B; Case map
+10404; 1042C; Case map
+10405; 1042D; Case map
+10406; 1042E; Case map
+10407; 1042F; Case map
+10408; 10430; Case map
+10409; 10431; Case map
+1040A; 10432; Case map
+1040B; 10433; Case map
+1040C; 10434; Case map
+1040D; 10435; Case map
+1040E; 10436; Case map
+1040F; 10437; Case map
+10410; 10438; Case map
+10411; 10439; Case map
+10412; 1043A; Case map
+10413; 1043B; Case map
+10414; 1043C; Case map
+10415; 1043D; Case map
+10416; 1043E; Case map
+10417; 1043F; Case map
+10418; 10440; Case map
+10419; 10441; Case map
+1041A; 10442; Case map
+1041B; 10443; Case map
+1041C; 10444; Case map
+1041D; 10445; Case map
+1041E; 10446; Case map
+1041F; 10447; Case map
+10420; 10448; Case map
+10421; 10449; Case map
+10422; 1044A; Case map
+10423; 1044B; Case map
+10424; 1044C; Case map
+10425; 1044D; Case map
+
+0020; SPACE
+
+00A0; NO-BREAK SPACE
+1680; OGHAM SPACE MARK
+2000; EN QUAD
+2001; EM QUAD
+2002; EN SPACE
+2003; EM SPACE
+2004; THREE-PER-EM SPACE
+2005; FOUR-PER-EM SPACE
+2006; SIX-PER-EM SPACE
+2007; FIGURE SPACE
+2008; PUNCTUATION SPACE
+2009; THIN SPACE
+200A; HAIR SPACE
+200B; ZERO WIDTH SPACE
+202F; NARROW NO-BREAK SPACE
+205F; MEDIUM MATHEMATICAL SPACE
+3000; IDEOGRAPHIC SPACE
+
+0000-001F; [CONTROL CHARACTERS]
+007F; DELETE
+
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_2_2[] = {
+ { 0x000080, 0x00009F }, /* 0080-009F; [CONTROL CHARACTERS] */
+ { 0x0006DD, 0x0006DD }, /* 06DD; ARABIC END OF AYAH */
+ { 0x00070F, 0x00070F }, /* 070F; SYRIAC ABBREVIATION MARK */
+ { 0x00180E, 0x00180E }, /* 180E; MONGOLIAN VOWEL SEPARATOR */
+ { 0x00200C, 0x00200C }, /* 200C; ZERO WIDTH NON-JOINER */
+ { 0x00200D, 0x00200D }, /* 200D; ZERO WIDTH JOINER */
+ { 0x002028, 0x002028 }, /* 2028; LINE SEPARATOR */
+ { 0x002029, 0x002029 }, /* 2029; PARAGRAPH SEPARATOR */
+ { 0x002060, 0x002060 }, /* 2060; WORD JOINER */
+ { 0x002061, 0x002061 }, /* 2061; FUNCTION APPLICATION */
+ { 0x002062, 0x002062 }, /* 2062; INVISIBLE TIMES */
+ { 0x002063, 0x002063 }, /* 2063; INVISIBLE SEPARATOR */
+ { 0x00206A, 0x00206F }, /* 206A-206F; [CONTROL CHARACTERS] */
+ { 0x00FEFF, 0x00FEFF }, /* FEFF; ZERO WIDTH NO-BREAK SPACE */
+ { 0x00FFF9, 0x00FFFC }, /* FFF9-FFFC; [CONTROL CHARACTERS] */
+ { 0x01D173, 0x01D17A }, /* 1D173-1D17A; [MUSICAL CONTROL CHARACTERS] */
+ { 0 },
+};
+
+/*
+ * FFF9-FFFC; [CONTROL CHARACTERS]
+ * 1D173-1D17A; [MUSICAL CONTROL CHARACTERS]
+
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_3[] = {
+ { 0x00E000, 0x00F8FF }, /* E000-F8FF; [PRIVATE USE, PLANE 0] */
+ { 0x0F0000, 0x0FFFFD }, /* F0000-FFFFD; [PRIVATE USE, PLANE 15] */
+ { 0x100000, 0x10FFFD }, /* 100000-10FFFD; [PRIVATE USE, PLANE 16] */
+ { 0 },
+};
+
+/*
+ * F0000-FFFFD; [PRIVATE USE, PLANE 15]
+ * 100000-10FFFD; [PRIVATE USE, PLANE 16]
+
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_4[] = {
+ { 0x00FDD0, 0x00FDEF }, /* FDD0-FDEF; [NONCHARACTER CODE POINTS] */
+ { 0x00FFFE, 0x00FFFF }, /* FFFE-FFFF; [NONCHARACTER CODE POINTS] */
+ { 0x01FFFE, 0x01FFFF }, /* 1FFFE-1FFFF; [NONCHARACTER CODE POINTS] */
+ { 0x02FFFE, 0x02FFFF }, /* 2FFFE-2FFFF; [NONCHARACTER CODE POINTS] */
+ { 0x03FFFE, 0x03FFFF }, /* 3FFFE-3FFFF; [NONCHARACTER CODE POINTS] */
+ { 0x04FFFE, 0x04FFFF }, /* 4FFFE-4FFFF; [NONCHARACTER CODE POINTS] */
+ { 0x05FFFE, 0x05FFFF }, /* 5FFFE-5FFFF; [NONCHARACTER CODE POINTS] */
+ { 0x06FFFE, 0x06FFFF }, /* 6FFFE-6FFFF; [NONCHARACTER CODE POINTS] */
+ { 0x07FFFE, 0x07FFFF }, /* 7FFFE-7FFFF; [NONCHARACTER CODE POINTS] */
+ { 0x08FFFE, 0x08FFFF }, /* 8FFFE-8FFFF; [NONCHARACTER CODE POINTS] */
+ { 0x09FFFE, 0x09FFFF }, /* 9FFFE-9FFFF; [NONCHARACTER CODE POINTS] */
+ { 0x0AFFFE, 0x0AFFFF }, /* AFFFE-AFFFF; [NONCHARACTER CODE POINTS] */
+ { 0x0BFFFE, 0x0BFFFF }, /* BFFFE-BFFFF; [NONCHARACTER CODE POINTS] */
+ { 0x0CFFFE, 0x0CFFFF }, /* CFFFE-CFFFF; [NONCHARACTER CODE POINTS] */
+ { 0x0DFFFE, 0x0DFFFF }, /* DFFFE-DFFFF; [NONCHARACTER CODE POINTS] */
+ { 0x0EFFFE, 0x0EFFFF }, /* EFFFE-EFFFF; [NONCHARACTER CODE POINTS] */
+ { 0x0FFFFE, 0x0FFFFF }, /* FFFFE-FFFFF; [NONCHARACTER CODE POINTS] */
+ { 0x10FFFE, 0x10FFFF }, /* 10FFFE-10FFFF; [NONCHARACTER CODE POINTS] */
+ { 0 },
+};
+
+/*
+ * FFFFE-FFFFF; [NONCHARACTER CODE POINTS]
+ * 10FFFE-10FFFF; [NONCHARACTER CODE POINTS]
+
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_5[] = {
+ { 0x00D800, 0x00DFFF }, /* D800-DFFF; [SURROGATE CODES] */
+ { 0 },
+};
+
+/*
+ * D800-DFFF; [SURROGATE CODES]
+ *
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_6[] = {
+ { 0x00FFF9, 0x00FFF9 }, /* FFF9; INTERLINEAR ANNOTATION ANCHOR */
+ { 0x00FFFA, 0x00FFFA }, /* FFFA; INTERLINEAR ANNOTATION SEPARATOR */
+ { 0x00FFFB, 0x00FFFB }, /* FFFB; INTERLINEAR ANNOTATION TERMINATOR */
+ { 0x00FFFC, 0x00FFFC }, /* FFFC; OBJECT REPLACEMENT CHARACTER */
+ { 0x00FFFD, 0x00FFFD }, /* FFFD; REPLACEMENT CHARACTER */
+ { 0 },
+};
+
+/*
+ * FFFD; REPLACEMENT CHARACTER
+ *
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_7[] = {
+ { 0x002FF0, 0x002FFB }, /* 2FF0-2FFB; [IDEOGRAPHIC DESCRIPTION CHARACTERS] */
+ { 0 },
+};
+
+/*
+ * FFFD; REPLACEMENT CHARACTER
+ * *
+2FF0-2FFB; [IDEOGRAPHIC DESCRIPTION CHARACTERS]
+
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_8[] = {
+ { 0x000340, 0x000340 }, /* 0340; COMBINING GRAVE TONE MARK */
+ { 0x000341, 0x000341 }, /* 0341; COMBINING ACUTE TONE MARK */
+ { 0x00200E, 0x00200E }, /* 200E; LEFT-TO-RIGHT MARK */
+ { 0x00200F, 0x00200F }, /* 200F; RIGHT-TO-LEFT MARK */
+ { 0x00202A, 0x00202A }, /* 202A; LEFT-TO-RIGHT EMBEDDING */
+ { 0x00202B, 0x00202B }, /* 202B; RIGHT-TO-LEFT EMBEDDING */
+ { 0x00202C, 0x00202C }, /* 202C; POP DIRECTIONAL FORMATTING */
+ { 0x00202D, 0x00202D }, /* 202D; LEFT-TO-RIGHT OVERRIDE */
+ { 0x00202E, 0x00202E }, /* 202E; RIGHT-TO-LEFT OVERRIDE */
+ { 0x00206A, 0x00206A }, /* 206A; INHIBIT SYMMETRIC SWAPPING */
+ { 0x00206B, 0x00206B }, /* 206B; ACTIVATE SYMMETRIC SWAPPING */
+ { 0x00206C, 0x00206C }, /* 206C; INHIBIT ARABIC FORM SHAPING */
+ { 0x00206D, 0x00206D }, /* 206D; ACTIVATE ARABIC FORM SHAPING */
+ { 0x00206E, 0x00206E }, /* 206E; NATIONAL DIGIT SHAPES */
+ { 0x00206F, 0x00206F }, /* 206F; NOMINAL DIGIT SHAPES */
+ { 0 },
+};
+
+/*
+ * FFFD; REPLACEMENT CHARACTER
+ * * *
+2FF0-2FFB; [IDEOGRAPHIC DESCRIPTION CHARACTERS]
+
+0340; COMBINING GRAVE TONE MARK
+0341; COMBINING ACUTE TONE MARK
+200E; LEFT-TO-RIGHT MARK
+200F; RIGHT-TO-LEFT MARK
+202A; LEFT-TO-RIGHT EMBEDDING
+202B; RIGHT-TO-LEFT EMBEDDING
+202C; POP DIRECTIONAL FORMATTING
+202D; LEFT-TO-RIGHT OVERRIDE
+202E; RIGHT-TO-LEFT OVERRIDE
+206A; INHIBIT SYMMETRIC SWAPPING
+206B; ACTIVATE SYMMETRIC SWAPPING
+206C; INHIBIT ARABIC FORM SHAPING
+206D; ACTIVATE ARABIC FORM SHAPING
+206E; NATIONAL DIGIT SHAPES
+206F; NOMINAL DIGIT SHAPES
+
+ */
+
+const Stringprep_table_element stringprep_rfc3454_C_9[] = {
+ { 0x0E0001, 0x0E0001 }, /* E0001; LANGUAGE TAG */
+ { 0x0E0020, 0x0E007F }, /* E0020-E007F; [TAGGING CHARACTERS] */
+ { 0 },
+};
+
+/*
+ * E0020-E007F; [TAGGING CHARACTERS]
+ *
+ */
+
+const Stringprep_table_element stringprep_rfc3454_D_1[] = {
+ { 0x0005BE, 0x0005BE }, /* 05BE */
+ { 0x0005C0, 0x0005C0 }, /* 05C0 */
+ { 0x0005C3, 0x0005C3 }, /* 05C3 */
+ { 0x0005D0, 0x0005EA }, /* 05D0-05EA */
+ { 0x0005F0, 0x0005F4 }, /* 05F0-05F4 */
+ { 0x00061B, 0x00061B }, /* 061B */
+ { 0x00061F, 0x00061F }, /* 061F */
+ { 0x000621, 0x00063A }, /* 0621-063A */
+ { 0x000640, 0x00064A }, /* 0640-064A */
+ { 0x00066D, 0x00066F }, /* 066D-066F */
+ { 0x000671, 0x0006D5 }, /* 0671-06D5 */
+ { 0x0006DD, 0x0006DD }, /* 06DD */
+ { 0x0006E5, 0x0006E6 }, /* 06E5-06E6 */
+ { 0x0006FA, 0x0006FE }, /* 06FA-06FE */
+ { 0x000700, 0x00070D }, /* 0700-070D */
+ { 0x000710, 0x000710 }, /* 0710 */
+ { 0x000712, 0x00072C }, /* 0712-072C */
+ { 0x000780, 0x0007A5 }, /* 0780-07A5 */
+ { 0x0007B1, 0x0007B1 }, /* 07B1 */
+ { 0x00200F, 0x00200F }, /* 200F */
+ { 0x00FB1D, 0x00FB1D }, /* FB1D */
+ { 0x00FB1F, 0x00FB28 }, /* FB1F-FB28 */
+ { 0x00FB2A, 0x00FB36 }, /* FB2A-FB36 */
+ { 0x00FB38, 0x00FB3C }, /* FB38-FB3C */
+ { 0x00FB3E, 0x00FB3E }, /* FB3E */
+ { 0x00FB40, 0x00FB41 }, /* FB40-FB41 */
+ { 0x00FB43, 0x00FB44 }, /* FB43-FB44 */
+ { 0x00FB46, 0x00FBB1 }, /* FB46-FBB1 */
+ { 0x00FBD3, 0x00FD3D }, /* FBD3-FD3D */
+ { 0x00FD50, 0x00FD8F }, /* FD50-FD8F */
+ { 0x00FD92, 0x00FDC7 }, /* FD92-FDC7 */
+ { 0x00FDF0, 0x00FDFC }, /* FDF0-FDFC */
+ { 0x00FE70, 0x00FE74 }, /* FE70-FE74 */
+ { 0x00FE76, 0x00FEFC }, /* FE76-FEFC */
+ { 0 },
+};
+
+/*
+ * FE76-FEFC
+ *
+ */
+
+const Stringprep_table_element stringprep_rfc3454_D_2[] = {
+ { 0x000041, 0x00005A }, /* 0041-005A */
+ { 0x000061, 0x00007A }, /* 0061-007A */
+ { 0x0000AA, 0x0000AA }, /* 00AA */
+ { 0x0000B5, 0x0000B5 }, /* 00B5 */
+ { 0x0000BA, 0x0000BA }, /* 00BA */
+ { 0x0000C0, 0x0000D6 }, /* 00C0-00D6 */
+ { 0x0000D8, 0x0000F6 }, /* 00D8-00F6 */
+ { 0x0000F8, 0x000220 }, /* 00F8-0220 */
+ { 0x000222, 0x000233 }, /* 0222-0233 */
+ { 0x000250, 0x0002AD }, /* 0250-02AD */
+ { 0x0002B0, 0x0002B8 }, /* 02B0-02B8 */
+ { 0x0002BB, 0x0002C1 }, /* 02BB-02C1 */
+ { 0x0002D0, 0x0002D1 }, /* 02D0-02D1 */
+ { 0x0002E0, 0x0002E4 }, /* 02E0-02E4 */
+ { 0x0002EE, 0x0002EE }, /* 02EE */
+ { 0x00037A, 0x00037A }, /* 037A */
+ { 0x000386, 0x000386 }, /* 0386 */
+ { 0x000388, 0x00038A }, /* 0388-038A */
+ { 0x00038C, 0x00038C }, /* 038C */
+ { 0x00038E, 0x0003A1 }, /* 038E-03A1 */
+ { 0x0003A3, 0x0003CE }, /* 03A3-03CE */
+ { 0x0003D0, 0x0003F5 }, /* 03D0-03F5 */
+ { 0x000400, 0x000482 }, /* 0400-0482 */
+ { 0x00048A, 0x0004CE }, /* 048A-04CE */
+ { 0x0004D0, 0x0004F5 }, /* 04D0-04F5 */
+ { 0x0004F8, 0x0004F9 }, /* 04F8-04F9 */
+ { 0x000500, 0x00050F }, /* 0500-050F */
+ { 0x000531, 0x000556 }, /* 0531-0556 */
+ { 0x000559, 0x00055F }, /* 0559-055F */
+ { 0x000561, 0x000587 }, /* 0561-0587 */
+ { 0x000589, 0x000589 }, /* 0589 */
+ { 0x000903, 0x000903 }, /* 0903 */
+ { 0x000905, 0x000939 }, /* 0905-0939 */
+ { 0x00093D, 0x000940 }, /* 093D-0940 */
+ { 0x000949, 0x00094C }, /* 0949-094C */
+ { 0x000950, 0x000950 }, /* 0950 */
+ { 0x000958, 0x000961 }, /* 0958-0961 */
+ { 0x000964, 0x000970 }, /* 0964-0970 */
+ { 0x000982, 0x000983 }, /* 0982-0983 */
+ { 0x000985, 0x00098C }, /* 0985-098C */
+ { 0x00098F, 0x000990 }, /* 098F-0990 */
+ { 0x000993, 0x0009A8 }, /* 0993-09A8 */
+ { 0x0009AA, 0x0009B0 }, /* 09AA-09B0 */
+ { 0x0009B2, 0x0009B2 }, /* 09B2 */
+ { 0x0009B6, 0x0009B9 }, /* 09B6-09B9 */
+ { 0x0009BE, 0x0009C0 }, /* 09BE-09C0 */
+ { 0x0009C7, 0x0009C8 }, /* 09C7-09C8 */
+ { 0x0009CB, 0x0009CC }, /* 09CB-09CC */
+ { 0x0009D7, 0x0009D7 }, /* 09D7 */
+ { 0x0009DC, 0x0009DD }, /* 09DC-09DD */
+ { 0x0009DF, 0x0009E1 }, /* 09DF-09E1 */
+ { 0x0009E6, 0x0009F1 }, /* 09E6-09F1 */
+ { 0x0009F4, 0x0009FA }, /* 09F4-09FA */
+ { 0x000A05, 0x000A0A }, /* 0A05-0A0A */
+ { 0x000A0F, 0x000A10 }, /* 0A0F-0A10 */
+ { 0x000A13, 0x000A28 }, /* 0A13-0A28 */
+ { 0x000A2A, 0x000A30 }, /* 0A2A-0A30 */
+ { 0x000A32, 0x000A33 }, /* 0A32-0A33 */
+ { 0x000A35, 0x000A36 }, /* 0A35-0A36 */
+ { 0x000A38, 0x000A39 }, /* 0A38-0A39 */
+ { 0x000A3E, 0x000A40 }, /* 0A3E-0A40 */
+ { 0x000A59, 0x000A5C }, /* 0A59-0A5C */
+ { 0x000A5E, 0x000A5E }, /* 0A5E */
+ { 0x000A66, 0x000A6F }, /* 0A66-0A6F */
+ { 0x000A72, 0x000A74 }, /* 0A72-0A74 */
+ { 0x000A83, 0x000A83 }, /* 0A83 */
+ { 0x000A85, 0x000A8B }, /* 0A85-0A8B */
+ { 0x000A8D, 0x000A8D }, /* 0A8D */
+ { 0x000A8F, 0x000A91 }, /* 0A8F-0A91 */
+ { 0x000A93, 0x000AA8 }, /* 0A93-0AA8 */
+ { 0x000AAA, 0x000AB0 }, /* 0AAA-0AB0 */
+ { 0x000AB2, 0x000AB3 }, /* 0AB2-0AB3 */
+ { 0x000AB5, 0x000AB9 }, /* 0AB5-0AB9 */
+ { 0x000ABD, 0x000AC0 }, /* 0ABD-0AC0 */
+ { 0x000AC9, 0x000AC9 }, /* 0AC9 */
+ { 0x000ACB, 0x000ACC }, /* 0ACB-0ACC */
+ { 0x000AD0, 0x000AD0 }, /* 0AD0 */
+ { 0x000AE0, 0x000AE0 }, /* 0AE0 */
+ { 0x000AE6, 0x000AEF }, /* 0AE6-0AEF */
+ { 0x000B02, 0x000B03 }, /* 0B02-0B03 */
+ { 0x000B05, 0x000B0C }, /* 0B05-0B0C */
+ { 0x000B0F, 0x000B10 }, /* 0B0F-0B10 */
+ { 0x000B13, 0x000B28 }, /* 0B13-0B28 */
+ { 0x000B2A, 0x000B30 }, /* 0B2A-0B30 */
+ { 0x000B32, 0x000B33 }, /* 0B32-0B33 */
+ { 0x000B36, 0x000B39 }, /* 0B36-0B39 */
+ { 0x000B3D, 0x000B3E }, /* 0B3D-0B3E */
+ { 0x000B40, 0x000B40 }, /* 0B40 */
+ { 0x000B47, 0x000B48 }, /* 0B47-0B48 */
+ { 0x000B4B, 0x000B4C }, /* 0B4B-0B4C */
+ { 0x000B57, 0x000B57 }, /* 0B57 */
+ { 0x000B5C, 0x000B5D }, /* 0B5C-0B5D */
+ { 0x000B5F, 0x000B61 }, /* 0B5F-0B61 */
+ { 0x000B66, 0x000B70 }, /* 0B66-0B70 */
+ { 0x000B83, 0x000B83 }, /* 0B83 */
+ { 0x000B85, 0x000B8A }, /* 0B85-0B8A */
+ { 0x000B8E, 0x000B90 }, /* 0B8E-0B90 */
+ { 0x000B92, 0x000B95 }, /* 0B92-0B95 */
+ { 0x000B99, 0x000B9A }, /* 0B99-0B9A */
+ { 0x000B9C, 0x000B9C }, /* 0B9C */
+ { 0x000B9E, 0x000B9F }, /* 0B9E-0B9F */
+ { 0x000BA3, 0x000BA4 }, /* 0BA3-0BA4 */
+ { 0x000BA8, 0x000BAA }, /* 0BA8-0BAA */
+ { 0x000BAE, 0x000BB5 }, /* 0BAE-0BB5 */
+ { 0x000BB7, 0x000BB9 }, /* 0BB7-0BB9 */
+ { 0x000BBE, 0x000BBF }, /* 0BBE-0BBF */
+ { 0x000BC1, 0x000BC2 }, /* 0BC1-0BC2 */
+ { 0x000BC6, 0x000BC8 }, /* 0BC6-0BC8 */
+ { 0x000BCA, 0x000BCC }, /* 0BCA-0BCC */
+ { 0x000BD7, 0x000BD7 }, /* 0BD7 */
+ { 0x000BE7, 0x000BF2 }, /* 0BE7-0BF2 */
+ { 0x000C01, 0x000C03 }, /* 0C01-0C03 */
+ { 0x000C05, 0x000C0C }, /* 0C05-0C0C */
+ { 0x000C0E, 0x000C10 }, /* 0C0E-0C10 */
+ { 0x000C12, 0x000C28 }, /* 0C12-0C28 */
+ { 0x000C2A, 0x000C33 }, /* 0C2A-0C33 */
+ { 0x000C35, 0x000C39 }, /* 0C35-0C39 */
+ { 0x000C41, 0x000C44 }, /* 0C41-0C44 */
+ { 0x000C60, 0x000C61 }, /* 0C60-0C61 */
+ { 0x000C66, 0x000C6F }, /* 0C66-0C6F */
+ { 0x000C82, 0x000C83 }, /* 0C82-0C83 */
+ { 0x000C85, 0x000C8C }, /* 0C85-0C8C */
+ { 0x000C8E, 0x000C90 }, /* 0C8E-0C90 */
+ { 0x000C92, 0x000CA8 }, /* 0C92-0CA8 */
+ { 0x000CAA, 0x000CB3 }, /* 0CAA-0CB3 */
+ { 0x000CB5, 0x000CB9 }, /* 0CB5-0CB9 */
+ { 0x000CBE, 0x000CBE }, /* 0CBE */
+ { 0x000CC0, 0x000CC4 }, /* 0CC0-0CC4 */
+ { 0x000CC7, 0x000CC8 }, /* 0CC7-0CC8 */
+ { 0x000CCA, 0x000CCB }, /* 0CCA-0CCB */
+ { 0x000CD5, 0x000CD6 }, /* 0CD5-0CD6 */
+ { 0x000CDE, 0x000CDE }, /* 0CDE */
+ { 0x000CE0, 0x000CE1 }, /* 0CE0-0CE1 */
+ { 0x000CE6, 0x000CEF }, /* 0CE6-0CEF */
+ { 0x000D02, 0x000D03 }, /* 0D02-0D03 */
+ { 0x000D05, 0x000D0C }, /* 0D05-0D0C */
+ { 0x000D0E, 0x000D10 }, /* 0D0E-0D10 */
+ { 0x000D12, 0x000D28 }, /* 0D12-0D28 */
+ { 0x000D2A, 0x000D39 }, /* 0D2A-0D39 */
+ { 0x000D3E, 0x000D40 }, /* 0D3E-0D40 */
+ { 0x000D46, 0x000D48 }, /* 0D46-0D48 */
+ { 0x000D4A, 0x000D4C }, /* 0D4A-0D4C */
+ { 0x000D57, 0x000D57 }, /* 0D57 */
+ { 0x000D60, 0x000D61 }, /* 0D60-0D61 */
+ { 0x000D66, 0x000D6F }, /* 0D66-0D6F */
+ { 0x000D82, 0x000D83 }, /* 0D82-0D83 */
+ { 0x000D85, 0x000D96 }, /* 0D85-0D96 */
+ { 0x000D9A, 0x000DB1 }, /* 0D9A-0DB1 */
+ { 0x000DB3, 0x000DBB }, /* 0DB3-0DBB */
+ { 0x000DBD, 0x000DBD }, /* 0DBD */
+ { 0x000DC0, 0x000DC6 }, /* 0DC0-0DC6 */
+ { 0x000DCF, 0x000DD1 }, /* 0DCF-0DD1 */
+ { 0x000DD8, 0x000DDF }, /* 0DD8-0DDF */
+ { 0x000DF2, 0x000DF4 }, /* 0DF2-0DF4 */
+ { 0x000E01, 0x000E30 }, /* 0E01-0E30 */
+ { 0x000E32, 0x000E33 }, /* 0E32-0E33 */
+ { 0x000E40, 0x000E46 }, /* 0E40-0E46 */
+ { 0x000E4F, 0x000E5B }, /* 0E4F-0E5B */
+ { 0x000E81, 0x000E82 }, /* 0E81-0E82 */
+ { 0x000E84, 0x000E84 }, /* 0E84 */
+ { 0x000E87, 0x000E88 }, /* 0E87-0E88 */
+ { 0x000E8A, 0x000E8A }, /* 0E8A */
+ { 0x000E8D, 0x000E8D }, /* 0E8D */
+ { 0x000E94, 0x000E97 }, /* 0E94-0E97 */
+ { 0x000E99, 0x000E9F }, /* 0E99-0E9F */
+ { 0x000EA1, 0x000EA3 }, /* 0EA1-0EA3 */
+ { 0x000EA5, 0x000EA5 }, /* 0EA5 */
+ { 0x000EA7, 0x000EA7 }, /* 0EA7 */
+ { 0x000EAA, 0x000EAB }, /* 0EAA-0EAB */
+ { 0x000EAD, 0x000EB0 }, /* 0EAD-0EB0 */
+ { 0x000EB2, 0x000EB3 }, /* 0EB2-0EB3 */
+ { 0x000EBD, 0x000EBD }, /* 0EBD */
+ { 0x000EC0, 0x000EC4 }, /* 0EC0-0EC4 */
+ { 0x000EC6, 0x000EC6 }, /* 0EC6 */
+ { 0x000ED0, 0x000ED9 }, /* 0ED0-0ED9 */
+ { 0x000EDC, 0x000EDD }, /* 0EDC-0EDD */
+ { 0x000F00, 0x000F17 }, /* 0F00-0F17 */
+ { 0x000F1A, 0x000F34 }, /* 0F1A-0F34 */
+ { 0x000F36, 0x000F36 }, /* 0F36 */
+ { 0x000F38, 0x000F38 }, /* 0F38 */
+ { 0x000F3E, 0x000F47 }, /* 0F3E-0F47 */
+ { 0x000F49, 0x000F6A }, /* 0F49-0F6A */
+ { 0x000F7F, 0x000F7F }, /* 0F7F */
+ { 0x000F85, 0x000F85 }, /* 0F85 */
+ { 0x000F88, 0x000F8B }, /* 0F88-0F8B */
+ { 0x000FBE, 0x000FC5 }, /* 0FBE-0FC5 */
+ { 0x000FC7, 0x000FCC }, /* 0FC7-0FCC */
+ { 0x000FCF, 0x000FCF }, /* 0FCF */
+ { 0x001000, 0x001021 }, /* 1000-1021 */
+ { 0x001023, 0x001027 }, /* 1023-1027 */
+ { 0x001029, 0x00102A }, /* 1029-102A */
+ { 0x00102C, 0x00102C }, /* 102C */
+ { 0x001031, 0x001031 }, /* 1031 */
+ { 0x001038, 0x001038 }, /* 1038 */
+ { 0x001040, 0x001057 }, /* 1040-1057 */
+ { 0x0010A0, 0x0010C5 }, /* 10A0-10C5 */
+ { 0x0010D0, 0x0010F8 }, /* 10D0-10F8 */
+ { 0x0010FB, 0x0010FB }, /* 10FB */
+ { 0x001100, 0x001159 }, /* 1100-1159 */
+ { 0x00115F, 0x0011A2 }, /* 115F-11A2 */
+ { 0x0011A8, 0x0011F9 }, /* 11A8-11F9 */
+ { 0x001200, 0x001206 }, /* 1200-1206 */
+ { 0x001208, 0x001246 }, /* 1208-1246 */
+ { 0x001248, 0x001248 }, /* 1248 */
+ { 0x00124A, 0x00124D }, /* 124A-124D */
+ { 0x001250, 0x001256 }, /* 1250-1256 */
+ { 0x001258, 0x001258 }, /* 1258 */
+ { 0x00125A, 0x00125D }, /* 125A-125D */
+ { 0x001260, 0x001286 }, /* 1260-1286 */
+ { 0x001288, 0x001288 }, /* 1288 */
+ { 0x00128A, 0x00128D }, /* 128A-128D */
+ { 0x001290, 0x0012AE }, /* 1290-12AE */
+ { 0x0012B0, 0x0012B0 }, /* 12B0 */
+ { 0x0012B2, 0x0012B5 }, /* 12B2-12B5 */
+ { 0x0012B8, 0x0012BE }, /* 12B8-12BE */
+ { 0x0012C0, 0x0012C0 }, /* 12C0 */
+ { 0x0012C2, 0x0012C5 }, /* 12C2-12C5 */
+ { 0x0012C8, 0x0012CE }, /* 12C8-12CE */
+ { 0x0012D0, 0x0012D6 }, /* 12D0-12D6 */
+ { 0x0012D8, 0x0012EE }, /* 12D8-12EE */
+ { 0x0012F0, 0x00130E }, /* 12F0-130E */
+ { 0x001310, 0x001310 }, /* 1310 */
+ { 0x001312, 0x001315 }, /* 1312-1315 */
+ { 0x001318, 0x00131E }, /* 1318-131E */
+ { 0x001320, 0x001346 }, /* 1320-1346 */
+ { 0x001348, 0x00135A }, /* 1348-135A */
+ { 0x001361, 0x00137C }, /* 1361-137C */
+ { 0x0013A0, 0x0013F4 }, /* 13A0-13F4 */
+ { 0x001401, 0x001676 }, /* 1401-1676 */
+ { 0x001681, 0x00169A }, /* 1681-169A */
+ { 0x0016A0, 0x0016F0 }, /* 16A0-16F0 */
+ { 0x001700, 0x00170C }, /* 1700-170C */
+ { 0x00170E, 0x001711 }, /* 170E-1711 */
+ { 0x001720, 0x001731 }, /* 1720-1731 */
+ { 0x001735, 0x001736 }, /* 1735-1736 */
+ { 0x001740, 0x001751 }, /* 1740-1751 */
+ { 0x001760, 0x00176C }, /* 1760-176C */
+ { 0x00176E, 0x001770 }, /* 176E-1770 */
+ { 0x001780, 0x0017B6 }, /* 1780-17B6 */
+ { 0x0017BE, 0x0017C5 }, /* 17BE-17C5 */
+ { 0x0017C7, 0x0017C8 }, /* 17C7-17C8 */
+ { 0x0017D4, 0x0017DA }, /* 17D4-17DA */
+ { 0x0017DC, 0x0017DC }, /* 17DC */
+ { 0x0017E0, 0x0017E9 }, /* 17E0-17E9 */
+ { 0x001810, 0x001819 }, /* 1810-1819 */
+ { 0x001820, 0x001877 }, /* 1820-1877 */
+ { 0x001880, 0x0018A8 }, /* 1880-18A8 */
+ { 0x001E00, 0x001E9B }, /* 1E00-1E9B */
+ { 0x001EA0, 0x001EF9 }, /* 1EA0-1EF9 */
+ { 0x001F00, 0x001F15 }, /* 1F00-1F15 */
+ { 0x001F18, 0x001F1D }, /* 1F18-1F1D */
+ { 0x001F20, 0x001F45 }, /* 1F20-1F45 */
+ { 0x001F48, 0x001F4D }, /* 1F48-1F4D */
+ { 0x001F50, 0x001F57 }, /* 1F50-1F57 */
+ { 0x001F59, 0x001F59 }, /* 1F59 */
+ { 0x001F5B, 0x001F5B }, /* 1F5B */
+ { 0x001F5D, 0x001F5D }, /* 1F5D */
+ { 0x001F5F, 0x001F7D }, /* 1F5F-1F7D */
+ { 0x001F80, 0x001FB4 }, /* 1F80-1FB4 */
+ { 0x001FB6, 0x001FBC }, /* 1FB6-1FBC */
+ { 0x001FBE, 0x001FBE }, /* 1FBE */
+ { 0x001FC2, 0x001FC4 }, /* 1FC2-1FC4 */
+ { 0x001FC6, 0x001FCC }, /* 1FC6-1FCC */
+ { 0x001FD0, 0x001FD3 }, /* 1FD0-1FD3 */
+ { 0x001FD6, 0x001FDB }, /* 1FD6-1FDB */
+ { 0x001FE0, 0x001FEC }, /* 1FE0-1FEC */
+ { 0x001FF2, 0x001FF4 }, /* 1FF2-1FF4 */
+ { 0x001FF6, 0x001FFC }, /* 1FF6-1FFC */
+ { 0x00200E, 0x00200E }, /* 200E */
+ { 0x002071, 0x002071 }, /* 2071 */
+ { 0x00207F, 0x00207F }, /* 207F */
+ { 0x002102, 0x002102 }, /* 2102 */
+ { 0x002107, 0x002107 }, /* 2107 */
+ { 0x00210A, 0x002113 }, /* 210A-2113 */
+ { 0x002115, 0x002115 }, /* 2115 */
+ { 0x002119, 0x00211D }, /* 2119-211D */
+ { 0x002124, 0x002124 }, /* 2124 */
+ { 0x002126, 0x002126 }, /* 2126 */
+ { 0x002128, 0x002128 }, /* 2128 */
+ { 0x00212A, 0x00212D }, /* 212A-212D */
+ { 0x00212F, 0x002131 }, /* 212F-2131 */
+ { 0x002133, 0x002139 }, /* 2133-2139 */
+ { 0x00213D, 0x00213F }, /* 213D-213F */
+ { 0x002145, 0x002149 }, /* 2145-2149 */
+ { 0x002160, 0x002183 }, /* 2160-2183 */
+ { 0x002336, 0x00237A }, /* 2336-237A */
+ { 0x002395, 0x002395 }, /* 2395 */
+ { 0x00249C, 0x0024E9 }, /* 249C-24E9 */
+ { 0x003005, 0x003007 }, /* 3005-3007 */
+ { 0x003021, 0x003029 }, /* 3021-3029 */
+ { 0x003031, 0x003035 }, /* 3031-3035 */
+ { 0x003038, 0x00303C }, /* 3038-303C */
+ { 0x003041, 0x003096 }, /* 3041-3096 */
+ { 0x00309D, 0x00309F }, /* 309D-309F */
+ { 0x0030A1, 0x0030FA }, /* 30A1-30FA */
+ { 0x0030FC, 0x0030FF }, /* 30FC-30FF */
+ { 0x003105, 0x00312C }, /* 3105-312C */
+ { 0x003131, 0x00318E }, /* 3131-318E */
+ { 0x003190, 0x0031B7 }, /* 3190-31B7 */
+ { 0x0031F0, 0x00321C }, /* 31F0-321C */
+ { 0x003220, 0x003243 }, /* 3220-3243 */
+ { 0x003260, 0x00327B }, /* 3260-327B */
+ { 0x00327F, 0x0032B0 }, /* 327F-32B0 */
+ { 0x0032C0, 0x0032CB }, /* 32C0-32CB */
+ { 0x0032D0, 0x0032FE }, /* 32D0-32FE */
+ { 0x003300, 0x003376 }, /* 3300-3376 */
+ { 0x00337B, 0x0033DD }, /* 337B-33DD */
+ { 0x0033E0, 0x0033FE }, /* 33E0-33FE */
+ { 0x003400, 0x004DB5 }, /* 3400-4DB5 */
+ { 0x004E00, 0x009FA5 }, /* 4E00-9FA5 */
+ { 0x00A000, 0x00A48C }, /* A000-A48C */
+ { 0x00AC00, 0x00D7A3 }, /* AC00-D7A3 */
+ { 0x00D800, 0x00FA2D }, /* D800-FA2D */
+ { 0x00FA30, 0x00FA6A }, /* FA30-FA6A */
+ { 0x00FB00, 0x00FB06 }, /* FB00-FB06 */
+ { 0x00FB13, 0x00FB17 }, /* FB13-FB17 */
+ { 0x00FF21, 0x00FF3A }, /* FF21-FF3A */
+ { 0x00FF41, 0x00FF5A }, /* FF41-FF5A */
+ { 0x00FF66, 0x00FFBE }, /* FF66-FFBE */
+ { 0x00FFC2, 0x00FFC7 }, /* FFC2-FFC7 */
+ { 0x00FFCA, 0x00FFCF }, /* FFCA-FFCF */
+ { 0x00FFD2, 0x00FFD7 }, /* FFD2-FFD7 */
+ { 0x00FFDA, 0x00FFDC }, /* FFDA-FFDC */
+ { 0x010300, 0x01031E }, /* 10300-1031E */
+ { 0x010320, 0x010323 }, /* 10320-10323 */
+ { 0x010330, 0x01034A }, /* 10330-1034A */
+ { 0x010400, 0x010425 }, /* 10400-10425 */
+ { 0x010428, 0x01044D }, /* 10428-1044D */
+ { 0x01D000, 0x01D0F5 }, /* 1D000-1D0F5 */
+ { 0x01D100, 0x01D126 }, /* 1D100-1D126 */
+ { 0x01D12A, 0x01D166 }, /* 1D12A-1D166 */
+ { 0x01D16A, 0x01D172 }, /* 1D16A-1D172 */
+ { 0x01D183, 0x01D184 }, /* 1D183-1D184 */
+ { 0x01D18C, 0x01D1A9 }, /* 1D18C-1D1A9 */
+ { 0x01D1AE, 0x01D1DD }, /* 1D1AE-1D1DD */
+ { 0x01D400, 0x01D454 }, /* 1D400-1D454 */
+ { 0x01D456, 0x01D49C }, /* 1D456-1D49C */
+ { 0x01D49E, 0x01D49F }, /* 1D49E-1D49F */
+ { 0x01D4A2, 0x01D4A2 }, /* 1D4A2 */
+ { 0x01D4A5, 0x01D4A6 }, /* 1D4A5-1D4A6 */
+ { 0x01D4A9, 0x01D4AC }, /* 1D4A9-1D4AC */
+ { 0x01D4AE, 0x01D4B9 }, /* 1D4AE-1D4B9 */
+ { 0x01D4BB, 0x01D4BB }, /* 1D4BB */
+ { 0x01D4BD, 0x01D4C0 }, /* 1D4BD-1D4C0 */
+ { 0x01D4C2, 0x01D4C3 }, /* 1D4C2-1D4C3 */
+ { 0x01D4C5, 0x01D505 }, /* 1D4C5-1D505 */
+ { 0x01D507, 0x01D50A }, /* 1D507-1D50A */
+ { 0x01D50D, 0x01D514 }, /* 1D50D-1D514 */
+ { 0x01D516, 0x01D51C }, /* 1D516-1D51C */
+ { 0x01D51E, 0x01D539 }, /* 1D51E-1D539 */
+ { 0x01D53B, 0x01D53E }, /* 1D53B-1D53E */
+ { 0x01D540, 0x01D544 }, /* 1D540-1D544 */
+ { 0x01D546, 0x01D546 }, /* 1D546 */
+ { 0x01D54A, 0x01D550 }, /* 1D54A-1D550 */
+ { 0x01D552, 0x01D6A3 }, /* 1D552-1D6A3 */
+ { 0x01D6A8, 0x01D7C9 }, /* 1D6A8-1D7C9 */
+ { 0x020000, 0x02A6D6 }, /* 20000-2A6D6 */
+ { 0x02F800, 0x02FA1D }, /* 2F800-2FA1D */
+ { 0x0F0000, 0x0FFFFD }, /* F0000-FFFFD */
+ { 0x100000, 0x10FFFD }, /* 100000-10FFFD */
+ { 0 },
+};
diff --git a/3rdparty/stringprep/rfc3454.h b/3rdparty/stringprep/rfc3454.h
new file mode 100644
index 00000000..eead9964
--- /dev/null
+++ b/3rdparty/stringprep/rfc3454.h
@@ -0,0 +1,20 @@
+/* This file is automatically generated. DO NOT EDIT!
+ Instead, edit gen-stringprep-tables.pl and re-run. */
+
+#define N_STRINGPREP_rfc3454_A_1 396
+#define N_STRINGPREP_rfc3454_B_1 27
+#define N_STRINGPREP_rfc3454_B_2 1371
+#define N_STRINGPREP_rfc3454_B_3 838
+#define N_STRINGPREP_rfc3454_C_1_1 1
+#define N_STRINGPREP_rfc3454_C_1_2 17
+#define N_STRINGPREP_rfc3454_C_2_1 2
+#define N_STRINGPREP_rfc3454_C_2_2 16
+#define N_STRINGPREP_rfc3454_C_3 3
+#define N_STRINGPREP_rfc3454_C_4 18
+#define N_STRINGPREP_rfc3454_C_5 1
+#define N_STRINGPREP_rfc3454_C_6 5
+#define N_STRINGPREP_rfc3454_C_7 1
+#define N_STRINGPREP_rfc3454_C_8 15
+#define N_STRINGPREP_rfc3454_C_9 2
+#define N_STRINGPREP_rfc3454_D_1 34
+#define N_STRINGPREP_rfc3454_D_2 360
diff --git a/3rdparty/stringprep/rfc3454.txt b/3rdparty/stringprep/rfc3454.txt
new file mode 100644
index 00000000..bdf8edb5
--- /dev/null
+++ b/3rdparty/stringprep/rfc3454.txt
@@ -0,0 +1,3246 @@
+Below there are data tables extracted from RFC 3454. The license for
+RFC 3454 is:
+
+ Copyright (C) The Internet Society (2002). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Unfortunately, that license is non-free according to
+licensing@fsf.org:
+
+ From: "Dave Turner via RT"
+ Date: Thu, 08 Dec 2005 16:33:57 -0500
+ Subject: [gnu.org #211910] Are RFC specifications freely licensed?
+
+ > Hi Dave! I know this is an old issue (last post in this thread was
+ > about a year ago), but have you heard back from the licensing
+ > committee on the RFC 2026 and RFC 3978 licenses?
+
+ Sorry for the delay. The old terms are officially non-free.
+
+However, to be copyrightable there needs to be some originality, which
+isn't present here, see:
+
+ From: "novalis@fsf.org via RT"
+ Subject: Re: [gnu.org #211910] Are RFC specifications freely licensed?
+ Date: Thu, 06 Jan 2005 18:32:02 -0500
+
+ >> >> > If not, it's entirely possible that they're not copyrightable, or that
+ >> >> > they have very thin protection. I would need to see them specifically
+ >> >> > to be able to determine this.
+ >> >>
+ >> >> The table fall under the old license. The ASN.1 schema fall under the
+ >> >> new license. I'm attaching the tables, and the ASN.1 schema below.
+ >> >> If it matters: Some tables are derived from Unicode tables, and some
+ >> >> were probably created by hand.
+ >> >
+ >> > It looks to me like these tables do not have enough originality to be
+ >> > copyrightable. The text surrounding them ("The following is the mapping
+ >> > table from section 3....") is probably minimally original and should be
+ >> > removed.
+ >>
+ >> Are you sure about this? I'm looking for something strong than "It
+ >> looks". The tables were not trivial to create, it took the IETF some
+ >> time (years) to arrive with the final tables. Perhaps the tables
+ >> could be argued to contain some artistic value. But I'm not an expert
+ >> on this, so these are just my thoughts.
+ >
+ > I'm not a lawyer. This isn't legal advice. If you need legal advice,
+ > talk to a lawyer. I can get a second opinion on this from our lawyers,
+ > if you think it's important, but it still won't be legal advice.
+ >
+ > From a copyright perspective, the time and effort ("sweat of the brow")
+ > that a given thing takes don't matter (Fiest v. Rural Telephone
+ > Service). What matters is the originality.
+ >
+ > I don't see a lot here that's original. The names are probably
+ > original, but names are generally unprotected. And if the names are
+ > needed for compatibility, the scenes a faire doctrine comes into play.
+
+ Right, the names are not required, only the actual numbers are.
+
+ Thanks, this information seem to solve my problem for the source code
+ in libidn.
+
+So we can use this material. There may be other legal analysis that
+also reach the same conclusion.
+
+ ----- Start Table A.1 -----
+ 0221
+ 0234-024F
+ 02AE-02AF
+ 02EF-02FF
+ 0350-035F
+ 0370-0373
+ 0376-0379
+ 037B-037D
+ 037F-0383
+ 038B
+ 038D
+ 03A2
+ 03CF
+ 03F7-03FF
+ 0487
+ 04CF
+ 04F6-04F7
+ 04FA-04FF
+ 0510-0530
+ 0557-0558
+ 0560
+ 0588
+ 058B-0590
+ 05A2
+ 05BA
+ 05C5-05CF
+ 05EB-05EF
+ 05F5-060B
+ 060D-061A
+ 061C-061E
+ 0620
+ 063B-063F
+ 0656-065F
+ 06EE-06EF
+ 06FF
+ 070E
+ 072D-072F
+ 074B-077F
+ 07B2-0900
+ 0904
+ 093A-093B
+ 094E-094F
+ 0955-0957
+ 0971-0980
+ 0984
+ 098D-098E
+ 0991-0992
+ 09A9
+ 09B1
+ 09B3-09B5
+ 09BA-09BB
+ 09BD
+ 09C5-09C6
+ 09C9-09CA
+ 09CE-09D6
+ 09D8-09DB
+ 09DE
+ 09E4-09E5
+ 09FB-0A01
+ 0A03-0A04
+ 0A0B-0A0E
+ 0A11-0A12
+ 0A29
+ 0A31
+ 0A34
+ 0A37
+ 0A3A-0A3B
+ 0A3D
+ 0A43-0A46
+ 0A49-0A4A
+ 0A4E-0A58
+ 0A5D
+ 0A5F-0A65
+ 0A75-0A80
+ 0A84
+ 0A8C
+ 0A8E
+ 0A92
+ 0AA9
+ 0AB1
+ 0AB4
+ 0ABA-0ABB
+ 0AC6
+ 0ACA
+ 0ACE-0ACF
+ 0AD1-0ADF
+ 0AE1-0AE5
+ 0AF0-0B00
+ 0B04
+ 0B0D-0B0E
+ 0B11-0B12
+ 0B29
+ 0B31
+ 0B34-0B35
+ 0B3A-0B3B
+ 0B44-0B46
+ 0B49-0B4A
+ 0B4E-0B55
+ 0B58-0B5B
+ 0B5E
+ 0B62-0B65
+ 0B71-0B81
+ 0B84
+ 0B8B-0B8D
+ 0B91
+ 0B96-0B98
+ 0B9B
+ 0B9D
+ 0BA0-0BA2
+ 0BA5-0BA7
+ 0BAB-0BAD
+ 0BB6
+ 0BBA-0BBD
+ 0BC3-0BC5
+ 0BC9
+ 0BCE-0BD6
+ 0BD8-0BE6
+ 0BF3-0C00
+ 0C04
+ 0C0D
+ 0C11
+ 0C29
+ 0C34
+ 0C3A-0C3D
+ 0C45
+ 0C49
+ 0C4E-0C54
+ 0C57-0C5F
+ 0C62-0C65
+ 0C70-0C81
+ 0C84
+ 0C8D
+ 0C91
+ 0CA9
+ 0CB4
+ 0CBA-0CBD
+ 0CC5
+ 0CC9
+ 0CCE-0CD4
+ 0CD7-0CDD
+ 0CDF
+ 0CE2-0CE5
+ 0CF0-0D01
+ 0D04
+ 0D0D
+ 0D11
+ 0D29
+ 0D3A-0D3D
+ 0D44-0D45
+ 0D49
+ 0D4E-0D56
+ 0D58-0D5F
+ 0D62-0D65
+ 0D70-0D81
+ 0D84
+ 0D97-0D99
+ 0DB2
+ 0DBC
+ 0DBE-0DBF
+ 0DC7-0DC9
+ 0DCB-0DCE
+ 0DD5
+ 0DD7
+ 0DE0-0DF1
+ 0DF5-0E00
+ 0E3B-0E3E
+ 0E5C-0E80
+ 0E83
+ 0E85-0E86
+ 0E89
+ 0E8B-0E8C
+ 0E8E-0E93
+ 0E98
+ 0EA0
+ 0EA4
+ 0EA6
+ 0EA8-0EA9
+ 0EAC
+ 0EBA
+ 0EBE-0EBF
+ 0EC5
+ 0EC7
+ 0ECE-0ECF
+ 0EDA-0EDB
+ 0EDE-0EFF
+ 0F48
+ 0F6B-0F70
+ 0F8C-0F8F
+ 0F98
+ 0FBD
+ 0FCD-0FCE
+ 0FD0-0FFF
+ 1022
+ 1028
+ 102B
+ 1033-1035
+ 103A-103F
+ 105A-109F
+ 10C6-10CF
+ 10F9-10FA
+ 10FC-10FF
+ 115A-115E
+ 11A3-11A7
+ 11FA-11FF
+ 1207
+ 1247
+ 1249
+ 124E-124F
+ 1257
+ 1259
+ 125E-125F
+ 1287
+ 1289
+ 128E-128F
+ 12AF
+ 12B1
+ 12B6-12B7
+ 12BF
+ 12C1
+ 12C6-12C7
+ 12CF
+ 12D7
+ 12EF
+ 130F
+ 1311
+ 1316-1317
+ 131F
+ 1347
+ 135B-1360
+ 137D-139F
+ 13F5-1400
+ 1677-167F
+ 169D-169F
+ 16F1-16FF
+ 170D
+ 1715-171F
+ 1737-173F
+ 1754-175F
+ 176D
+ 1771
+ 1774-177F
+ 17DD-17DF
+ 17EA-17FF
+ 180F
+ 181A-181F
+ 1878-187F
+ 18AA-1DFF
+ 1E9C-1E9F
+ 1EFA-1EFF
+ 1F16-1F17
+ 1F1E-1F1F
+ 1F46-1F47
+ 1F4E-1F4F
+ 1F58
+ 1F5A
+ 1F5C
+ 1F5E
+ 1F7E-1F7F
+ 1FB5
+ 1FC5
+ 1FD4-1FD5
+ 1FDC
+ 1FF0-1FF1
+ 1FF5
+ 1FFF
+ 2053-2056
+ 2058-205E
+ 2064-2069
+ 2072-2073
+ 208F-209F
+ 20B2-20CF
+ 20EB-20FF
+ 213B-213C
+ 214C-2152
+ 2184-218F
+ 23CF-23FF
+ 2427-243F
+ 244B-245F
+ 24FF
+ 2614-2615
+ 2618
+ 267E-267F
+ 268A-2700
+ 2705
+ 270A-270B
+ 2728
+ 274C
+ 274E
+ 2753-2755
+ 2757
+ 275F-2760
+ 2795-2797
+ 27B0
+ 27BF-27CF
+ 27EC-27EF
+ 2B00-2E7F
+ 2E9A
+ 2EF4-2EFF
+ 2FD6-2FEF
+ 2FFC-2FFF
+ 3040
+ 3097-3098
+ 3100-3104
+ 312D-3130
+ 318F
+ 31B8-31EF
+ 321D-321F
+ 3244-3250
+ 327C-327E
+ 32CC-32CF
+ 32FF
+ 3377-337A
+ 33DE-33DF
+ 33FF
+ 4DB6-4DFF
+ 9FA6-9FFF
+ A48D-A48F
+ A4C7-ABFF
+ D7A4-D7FF
+ FA2E-FA2F
+ FA6B-FAFF
+ FB07-FB12
+ FB18-FB1C
+ FB37
+ FB3D
+ FB3F
+ FB42
+ FB45
+ FBB2-FBD2
+ FD40-FD4F
+ FD90-FD91
+ FDC8-FDCF
+ FDFD-FDFF
+ FE10-FE1F
+ FE24-FE2F
+ FE47-FE48
+ FE53
+ FE67
+ FE6C-FE6F
+ FE75
+ FEFD-FEFE
+ FF00
+ FFBF-FFC1
+ FFC8-FFC9
+ FFD0-FFD1
+ FFD8-FFD9
+ FFDD-FFDF
+ FFE7
+ FFEF-FFF8
+ 10000-102FF
+ 1031F
+ 10324-1032F
+ 1034B-103FF
+ 10426-10427
+ 1044E-1CFFF
+ 1D0F6-1D0FF
+ 1D127-1D129
+ 1D1DE-1D3FF
+ 1D455
+ 1D49D
+ 1D4A0-1D4A1
+ 1D4A3-1D4A4
+ 1D4A7-1D4A8
+ 1D4AD
+ 1D4BA
+ 1D4BC
+ 1D4C1
+ 1D4C4
+ 1D506
+ 1D50B-1D50C
+ 1D515
+ 1D51D
+ 1D53A
+ 1D53F
+ 1D545
+ 1D547-1D549
+ 1D551
+ 1D6A4-1D6A7
+ 1D7CA-1D7CD
+ 1D800-1FFFD
+ 2A6D7-2F7FF
+ 2FA1E-2FFFD
+ 30000-3FFFD
+ 40000-4FFFD
+ 50000-5FFFD
+ 60000-6FFFD
+ 70000-7FFFD
+ 80000-8FFFD
+ 90000-9FFFD
+ A0000-AFFFD
+ B0000-BFFFD
+ C0000-CFFFD
+ D0000-DFFFD
+ E0000
+ E0002-E001F
+ E0080-EFFFD
+ ----- End Table A.1 -----
+
+ ----- Start Table B.1 -----
+ 00AD; ; Map to nothing
+ 034F; ; Map to nothing
+ 1806; ; Map to nothing
+ 180B; ; Map to nothing
+ 180C; ; Map to nothing
+ 180D; ; Map to nothing
+ 200B; ; Map to nothing
+ 200C; ; Map to nothing
+ 200D; ; Map to nothing
+ 2060; ; Map to nothing
+ FE00; ; Map to nothing
+ FE01; ; Map to nothing
+ FE02; ; Map to nothing
+ FE03; ; Map to nothing
+ FE04; ; Map to nothing
+ FE05; ; Map to nothing
+ FE06; ; Map to nothing
+ FE07; ; Map to nothing
+ FE08; ; Map to nothing
+ FE09; ; Map to nothing
+ FE0A; ; Map to nothing
+ FE0B; ; Map to nothing
+ FE0C; ; Map to nothing
+ FE0D; ; Map to nothing
+ FE0E; ; Map to nothing
+ FE0F; ; Map to nothing
+ FEFF; ; Map to nothing
+ ----- End Table B.1 -----
+
+ ----- Start Table B.2 -----
+ 0041; 0061; Case map
+ 0042; 0062; Case map
+ 0043; 0063; Case map
+ 0044; 0064; Case map
+ 0045; 0065; Case map
+ 0046; 0066; Case map
+ 0047; 0067; Case map
+ 0048; 0068; Case map
+ 0049; 0069; Case map
+ 004A; 006A; Case map
+ 004B; 006B; Case map
+ 004C; 006C; Case map
+ 004D; 006D; Case map
+ 004E; 006E; Case map
+ 004F; 006F; Case map
+ 0050; 0070; Case map
+ 0051; 0071; Case map
+ 0052; 0072; Case map
+ 0053; 0073; Case map
+ 0054; 0074; Case map
+ 0055; 0075; Case map
+ 0056; 0076; Case map
+ 0057; 0077; Case map
+ 0058; 0078; Case map
+ 0059; 0079; Case map
+ 005A; 007A; Case map
+ 00B5; 03BC; Case map
+ 00C0; 00E0; Case map
+ 00C1; 00E1; Case map
+ 00C2; 00E2; Case map
+ 00C3; 00E3; Case map
+ 00C4; 00E4; Case map
+ 00C5; 00E5; Case map
+ 00C6; 00E6; Case map
+ 00C7; 00E7; Case map
+ 00C8; 00E8; Case map
+ 00C9; 00E9; Case map
+ 00CA; 00EA; Case map
+ 00CB; 00EB; Case map
+ 00CC; 00EC; Case map
+ 00CD; 00ED; Case map
+ 00CE; 00EE; Case map
+ 00CF; 00EF; Case map
+ 00D0; 00F0; Case map
+ 00D1; 00F1; Case map
+ 00D2; 00F2; Case map
+ 00D3; 00F3; Case map
+ 00D4; 00F4; Case map
+ 00D5; 00F5; Case map
+ 00D6; 00F6; Case map
+ 00D8; 00F8; Case map
+ 00D9; 00F9; Case map
+ 00DA; 00FA; Case map
+ 00DB; 00FB; Case map
+ 00DC; 00FC; Case map
+ 00DD; 00FD; Case map
+ 00DE; 00FE; Case map
+ 00DF; 0073 0073; Case map
+ 0100; 0101; Case map
+ 0102; 0103; Case map
+ 0104; 0105; Case map
+ 0106; 0107; Case map
+ 0108; 0109; Case map
+ 010A; 010B; Case map
+ 010C; 010D; Case map
+ 010E; 010F; Case map
+ 0110; 0111; Case map
+ 0112; 0113; Case map
+ 0114; 0115; Case map
+ 0116; 0117; Case map
+ 0118; 0119; Case map
+ 011A; 011B; Case map
+ 011C; 011D; Case map
+ 011E; 011F; Case map
+ 0120; 0121; Case map
+ 0122; 0123; Case map
+ 0124; 0125; Case map
+ 0126; 0127; Case map
+ 0128; 0129; Case map
+ 012A; 012B; Case map
+ 012C; 012D; Case map
+ 012E; 012F; Case map
+ 0130; 0069 0307; Case map
+ 0132; 0133; Case map
+ 0134; 0135; Case map
+ 0136; 0137; Case map
+ 0139; 013A; Case map
+ 013B; 013C; Case map
+ 013D; 013E; Case map
+ 013F; 0140; Case map
+ 0141; 0142; Case map
+ 0143; 0144; Case map
+ 0145; 0146; Case map
+ 0147; 0148; Case map
+ 0149; 02BC 006E; Case map
+ 014A; 014B; Case map
+ 014C; 014D; Case map
+ 014E; 014F; Case map
+ 0150; 0151; Case map
+ 0152; 0153; Case map
+ 0154; 0155; Case map
+ 0156; 0157; Case map
+ 0158; 0159; Case map
+ 015A; 015B; Case map
+ 015C; 015D; Case map
+ 015E; 015F; Case map
+ 0160; 0161; Case map
+ 0162; 0163; Case map
+ 0164; 0165; Case map
+ 0166; 0167; Case map
+ 0168; 0169; Case map
+ 016A; 016B; Case map
+ 016C; 016D; Case map
+ 016E; 016F; Case map
+ 0170; 0171; Case map
+ 0172; 0173; Case map
+ 0174; 0175; Case map
+ 0176; 0177; Case map
+ 0178; 00FF; Case map
+ 0179; 017A; Case map
+ 017B; 017C; Case map
+ 017D; 017E; Case map
+ 017F; 0073; Case map
+ 0181; 0253; Case map
+ 0182; 0183; Case map
+ 0184; 0185; Case map
+ 0186; 0254; Case map
+ 0187; 0188; Case map
+ 0189; 0256; Case map
+ 018A; 0257; Case map
+ 018B; 018C; Case map
+ 018E; 01DD; Case map
+ 018F; 0259; Case map
+ 0190; 025B; Case map
+ 0191; 0192; Case map
+ 0193; 0260; Case map
+ 0194; 0263; Case map
+ 0196; 0269; Case map
+ 0197; 0268; Case map
+ 0198; 0199; Case map
+ 019C; 026F; Case map
+ 019D; 0272; Case map
+ 019F; 0275; Case map
+ 01A0; 01A1; Case map
+ 01A2; 01A3; Case map
+ 01A4; 01A5; Case map
+ 01A6; 0280; Case map
+ 01A7; 01A8; Case map
+ 01A9; 0283; Case map
+ 01AC; 01AD; Case map
+ 01AE; 0288; Case map
+ 01AF; 01B0; Case map
+ 01B1; 028A; Case map
+ 01B2; 028B; Case map
+ 01B3; 01B4; Case map
+ 01B5; 01B6; Case map
+ 01B7; 0292; Case map
+ 01B8; 01B9; Case map
+ 01BC; 01BD; Case map
+ 01C4; 01C6; Case map
+ 01C5; 01C6; Case map
+ 01C7; 01C9; Case map
+ 01C8; 01C9; Case map
+ 01CA; 01CC; Case map
+ 01CB; 01CC; Case map
+ 01CD; 01CE; Case map
+ 01CF; 01D0; Case map
+ 01D1; 01D2; Case map
+ 01D3; 01D4; Case map
+ 01D5; 01D6; Case map
+ 01D7; 01D8; Case map
+ 01D9; 01DA; Case map
+ 01DB; 01DC; Case map
+ 01DE; 01DF; Case map
+ 01E0; 01E1; Case map
+ 01E2; 01E3; Case map
+ 01E4; 01E5; Case map
+ 01E6; 01E7; Case map
+ 01E8; 01E9; Case map
+ 01EA; 01EB; Case map
+ 01EC; 01ED; Case map
+ 01EE; 01EF; Case map
+ 01F0; 006A 030C; Case map
+ 01F1; 01F3; Case map
+ 01F2; 01F3; Case map
+ 01F4; 01F5; Case map
+ 01F6; 0195; Case map
+ 01F7; 01BF; Case map
+ 01F8; 01F9; Case map
+ 01FA; 01FB; Case map
+ 01FC; 01FD; Case map
+ 01FE; 01FF; Case map
+ 0200; 0201; Case map
+ 0202; 0203; Case map
+ 0204; 0205; Case map
+ 0206; 0207; Case map
+ 0208; 0209; Case map
+ 020A; 020B; Case map
+ 020C; 020D; Case map
+ 020E; 020F; Case map
+ 0210; 0211; Case map
+ 0212; 0213; Case map
+ 0214; 0215; Case map
+ 0216; 0217; Case map
+ 0218; 0219; Case map
+ 021A; 021B; Case map
+ 021C; 021D; Case map
+ 021E; 021F; Case map
+ 0220; 019E; Case map
+ 0222; 0223; Case map
+ 0224; 0225; Case map
+ 0226; 0227; Case map
+ 0228; 0229; Case map
+ 022A; 022B; Case map
+ 022C; 022D; Case map
+ 022E; 022F; Case map
+ 0230; 0231; Case map
+ 0232; 0233; Case map
+ 0345; 03B9; Case map
+ 037A; 0020 03B9; Additional folding
+ 0386; 03AC; Case map
+ 0388; 03AD; Case map
+ 0389; 03AE; Case map
+ 038A; 03AF; Case map
+ 038C; 03CC; Case map
+ 038E; 03CD; Case map
+ 038F; 03CE; Case map
+ 0390; 03B9 0308 0301; Case map
+ 0391; 03B1; Case map
+ 0392; 03B2; Case map
+ 0393; 03B3; Case map
+ 0394; 03B4; Case map
+ 0395; 03B5; Case map
+ 0396; 03B6; Case map
+ 0397; 03B7; Case map
+ 0398; 03B8; Case map
+ 0399; 03B9; Case map
+ 039A; 03BA; Case map
+ 039B; 03BB; Case map
+ 039C; 03BC; Case map
+ 039D; 03BD; Case map
+ 039E; 03BE; Case map
+ 039F; 03BF; Case map
+ 03A0; 03C0; Case map
+ 03A1; 03C1; Case map
+ 03A3; 03C3; Case map
+ 03A4; 03C4; Case map
+ 03A5; 03C5; Case map
+ 03A6; 03C6; Case map
+ 03A7; 03C7; Case map
+ 03A8; 03C8; Case map
+ 03A9; 03C9; Case map
+ 03AA; 03CA; Case map
+ 03AB; 03CB; Case map
+ 03B0; 03C5 0308 0301; Case map
+ 03C2; 03C3; Case map
+ 03D0; 03B2; Case map
+ 03D1; 03B8; Case map
+ 03D2; 03C5; Additional folding
+ 03D3; 03CD; Additional folding
+ 03D4; 03CB; Additional folding
+ 03D5; 03C6; Case map
+ 03D6; 03C0; Case map
+ 03D8; 03D9; Case map
+ 03DA; 03DB; Case map
+ 03DC; 03DD; Case map
+ 03DE; 03DF; Case map
+ 03E0; 03E1; Case map
+ 03E2; 03E3; Case map
+ 03E4; 03E5; Case map
+ 03E6; 03E7; Case map
+ 03E8; 03E9; Case map
+ 03EA; 03EB; Case map
+ 03EC; 03ED; Case map
+ 03EE; 03EF; Case map
+ 03F0; 03BA; Case map
+ 03F1; 03C1; Case map
+ 03F2; 03C3; Case map
+ 03F4; 03B8; Case map
+ 03F5; 03B5; Case map
+ 0400; 0450; Case map
+ 0401; 0451; Case map
+ 0402; 0452; Case map
+ 0403; 0453; Case map
+ 0404; 0454; Case map
+ 0405; 0455; Case map
+ 0406; 0456; Case map
+ 0407; 0457; Case map
+ 0408; 0458; Case map
+ 0409; 0459; Case map
+ 040A; 045A; Case map
+ 040B; 045B; Case map
+ 040C; 045C; Case map
+ 040D; 045D; Case map
+ 040E; 045E; Case map
+ 040F; 045F; Case map
+ 0410; 0430; Case map
+ 0411; 0431; Case map
+ 0412; 0432; Case map
+ 0413; 0433; Case map
+ 0414; 0434; Case map
+ 0415; 0435; Case map
+ 0416; 0436; Case map
+ 0417; 0437; Case map
+ 0418; 0438; Case map
+ 0419; 0439; Case map
+ 041A; 043A; Case map
+ 041B; 043B; Case map
+ 041C; 043C; Case map
+ 041D; 043D; Case map
+ 041E; 043E; Case map
+ 041F; 043F; Case map
+ 0420; 0440; Case map
+ 0421; 0441; Case map
+ 0422; 0442; Case map
+ 0423; 0443; Case map
+ 0424; 0444; Case map
+ 0425; 0445; Case map
+ 0426; 0446; Case map
+ 0427; 0447; Case map
+ 0428; 0448; Case map
+ 0429; 0449; Case map
+ 042A; 044A; Case map
+ 042B; 044B; Case map
+ 042C; 044C; Case map
+ 042D; 044D; Case map
+ 042E; 044E; Case map
+ 042F; 044F; Case map
+ 0460; 0461; Case map
+ 0462; 0463; Case map
+ 0464; 0465; Case map
+ 0466; 0467; Case map
+ 0468; 0469; Case map
+ 046A; 046B; Case map
+ 046C; 046D; Case map
+ 046E; 046F; Case map
+ 0470; 0471; Case map
+ 0472; 0473; Case map
+ 0474; 0475; Case map
+ 0476; 0477; Case map
+ 0478; 0479; Case map
+ 047A; 047B; Case map
+ 047C; 047D; Case map
+ 047E; 047F; Case map
+ 0480; 0481; Case map
+ 048A; 048B; Case map
+ 048C; 048D; Case map
+ 048E; 048F; Case map
+ 0490; 0491; Case map
+ 0492; 0493; Case map
+ 0494; 0495; Case map
+ 0496; 0497; Case map
+ 0498; 0499; Case map
+ 049A; 049B; Case map
+ 049C; 049D; Case map
+ 049E; 049F; Case map
+ 04A0; 04A1; Case map
+ 04A2; 04A3; Case map
+ 04A4; 04A5; Case map
+ 04A6; 04A7; Case map
+ 04A8; 04A9; Case map
+ 04AA; 04AB; Case map
+ 04AC; 04AD; Case map
+ 04AE; 04AF; Case map
+ 04B0; 04B1; Case map
+ 04B2; 04B3; Case map
+ 04B4; 04B5; Case map
+ 04B6; 04B7; Case map
+ 04B8; 04B9; Case map
+ 04BA; 04BB; Case map
+ 04BC; 04BD; Case map
+ 04BE; 04BF; Case map
+ 04C1; 04C2; Case map
+ 04C3; 04C4; Case map
+ 04C5; 04C6; Case map
+ 04C7; 04C8; Case map
+ 04C9; 04CA; Case map
+ 04CB; 04CC; Case map
+ 04CD; 04CE; Case map
+ 04D0; 04D1; Case map
+ 04D2; 04D3; Case map
+ 04D4; 04D5; Case map
+ 04D6; 04D7; Case map
+ 04D8; 04D9; Case map
+ 04DA; 04DB; Case map
+ 04DC; 04DD; Case map
+ 04DE; 04DF; Case map
+ 04E0; 04E1; Case map
+ 04E2; 04E3; Case map
+ 04E4; 04E5; Case map
+ 04E6; 04E7; Case map
+ 04E8; 04E9; Case map
+ 04EA; 04EB; Case map
+ 04EC; 04ED; Case map
+ 04EE; 04EF; Case map
+ 04F0; 04F1; Case map
+ 04F2; 04F3; Case map
+ 04F4; 04F5; Case map
+ 04F8; 04F9; Case map
+ 0500; 0501; Case map
+ 0502; 0503; Case map
+ 0504; 0505; Case map
+ 0506; 0507; Case map
+ 0508; 0509; Case map
+ 050A; 050B; Case map
+ 050C; 050D; Case map
+ 050E; 050F; Case map
+ 0531; 0561; Case map
+ 0532; 0562; Case map
+ 0533; 0563; Case map
+ 0534; 0564; Case map
+ 0535; 0565; Case map
+ 0536; 0566; Case map
+ 0537; 0567; Case map
+ 0538; 0568; Case map
+ 0539; 0569; Case map
+ 053A; 056A; Case map
+ 053B; 056B; Case map
+ 053C; 056C; Case map
+ 053D; 056D; Case map
+ 053E; 056E; Case map
+ 053F; 056F; Case map
+ 0540; 0570; Case map
+ 0541; 0571; Case map
+ 0542; 0572; Case map
+ 0543; 0573; Case map
+ 0544; 0574; Case map
+ 0545; 0575; Case map
+ 0546; 0576; Case map
+ 0547; 0577; Case map
+ 0548; 0578; Case map
+ 0549; 0579; Case map
+ 054A; 057A; Case map
+ 054B; 057B; Case map
+ 054C; 057C; Case map
+ 054D; 057D; Case map
+ 054E; 057E; Case map
+ 054F; 057F; Case map
+ 0550; 0580; Case map
+ 0551; 0581; Case map
+ 0552; 0582; Case map
+ 0553; 0583; Case map
+ 0554; 0584; Case map
+ 0555; 0585; Case map
+ 0556; 0586; Case map
+ 0587; 0565 0582; Case map
+ 1E00; 1E01; Case map
+ 1E02; 1E03; Case map
+ 1E04; 1E05; Case map
+ 1E06; 1E07; Case map
+ 1E08; 1E09; Case map
+ 1E0A; 1E0B; Case map
+ 1E0C; 1E0D; Case map
+ 1E0E; 1E0F; Case map
+ 1E10; 1E11; Case map
+ 1E12; 1E13; Case map
+ 1E14; 1E15; Case map
+ 1E16; 1E17; Case map
+ 1E18; 1E19; Case map
+ 1E1A; 1E1B; Case map
+ 1E1C; 1E1D; Case map
+ 1E1E; 1E1F; Case map
+ 1E20; 1E21; Case map
+ 1E22; 1E23; Case map
+ 1E24; 1E25; Case map
+ 1E26; 1E27; Case map
+ 1E28; 1E29; Case map
+ 1E2A; 1E2B; Case map
+ 1E2C; 1E2D; Case map
+ 1E2E; 1E2F; Case map
+ 1E30; 1E31; Case map
+ 1E32; 1E33; Case map
+ 1E34; 1E35; Case map
+ 1E36; 1E37; Case map
+ 1E38; 1E39; Case map
+ 1E3A; 1E3B; Case map
+ 1E3C; 1E3D; Case map
+ 1E3E; 1E3F; Case map
+ 1E40; 1E41; Case map
+ 1E42; 1E43; Case map
+ 1E44; 1E45; Case map
+ 1E46; 1E47; Case map
+ 1E48; 1E49; Case map
+ 1E4A; 1E4B; Case map
+ 1E4C; 1E4D; Case map
+ 1E4E; 1E4F; Case map
+ 1E50; 1E51; Case map
+ 1E52; 1E53; Case map
+ 1E54; 1E55; Case map
+ 1E56; 1E57; Case map
+ 1E58; 1E59; Case map
+ 1E5A; 1E5B; Case map
+ 1E5C; 1E5D; Case map
+ 1E5E; 1E5F; Case map
+ 1E60; 1E61; Case map
+ 1E62; 1E63; Case map
+ 1E64; 1E65; Case map
+ 1E66; 1E67; Case map
+ 1E68; 1E69; Case map
+ 1E6A; 1E6B; Case map
+ 1E6C; 1E6D; Case map
+ 1E6E; 1E6F; Case map
+ 1E70; 1E71; Case map
+ 1E72; 1E73; Case map
+ 1E74; 1E75; Case map
+ 1E76; 1E77; Case map
+ 1E78; 1E79; Case map
+ 1E7A; 1E7B; Case map
+ 1E7C; 1E7D; Case map
+ 1E7E; 1E7F; Case map
+ 1E80; 1E81; Case map
+ 1E82; 1E83; Case map
+ 1E84; 1E85; Case map
+ 1E86; 1E87; Case map
+ 1E88; 1E89; Case map
+ 1E8A; 1E8B; Case map
+ 1E8C; 1E8D; Case map
+ 1E8E; 1E8F; Case map
+ 1E90; 1E91; Case map
+ 1E92; 1E93; Case map
+ 1E94; 1E95; Case map
+ 1E96; 0068 0331; Case map
+ 1E97; 0074 0308; Case map
+ 1E98; 0077 030A; Case map
+ 1E99; 0079 030A; Case map
+ 1E9A; 0061 02BE; Case map
+ 1E9B; 1E61; Case map
+ 1EA0; 1EA1; Case map
+ 1EA2; 1EA3; Case map
+ 1EA4; 1EA5; Case map
+ 1EA6; 1EA7; Case map
+ 1EA8; 1EA9; Case map
+ 1EAA; 1EAB; Case map
+ 1EAC; 1EAD; Case map
+ 1EAE; 1EAF; Case map
+ 1EB0; 1EB1; Case map
+ 1EB2; 1EB3; Case map
+ 1EB4; 1EB5; Case map
+ 1EB6; 1EB7; Case map
+ 1EB8; 1EB9; Case map
+ 1EBA; 1EBB; Case map
+ 1EBC; 1EBD; Case map
+ 1EBE; 1EBF; Case map
+ 1EC0; 1EC1; Case map
+ 1EC2; 1EC3; Case map
+ 1EC4; 1EC5; Case map
+ 1EC6; 1EC7; Case map
+ 1EC8; 1EC9; Case map
+ 1ECA; 1ECB; Case map
+ 1ECC; 1ECD; Case map
+ 1ECE; 1ECF; Case map
+ 1ED0; 1ED1; Case map
+ 1ED2; 1ED3; Case map
+ 1ED4; 1ED5; Case map
+ 1ED6; 1ED7; Case map
+ 1ED8; 1ED9; Case map
+ 1EDA; 1EDB; Case map
+ 1EDC; 1EDD; Case map
+ 1EDE; 1EDF; Case map
+ 1EE0; 1EE1; Case map
+ 1EE2; 1EE3; Case map
+ 1EE4; 1EE5; Case map
+ 1EE6; 1EE7; Case map
+ 1EE8; 1EE9; Case map
+ 1EEA; 1EEB; Case map
+ 1EEC; 1EED; Case map
+ 1EEE; 1EEF; Case map
+ 1EF0; 1EF1; Case map
+ 1EF2; 1EF3; Case map
+ 1EF4; 1EF5; Case map
+ 1EF6; 1EF7; Case map
+ 1EF8; 1EF9; Case map
+ 1F08; 1F00; Case map
+ 1F09; 1F01; Case map
+ 1F0A; 1F02; Case map
+ 1F0B; 1F03; Case map
+ 1F0C; 1F04; Case map
+ 1F0D; 1F05; Case map
+ 1F0E; 1F06; Case map
+ 1F0F; 1F07; Case map
+ 1F18; 1F10; Case map
+ 1F19; 1F11; Case map
+ 1F1A; 1F12; Case map
+ 1F1B; 1F13; Case map
+ 1F1C; 1F14; Case map
+ 1F1D; 1F15; Case map
+ 1F28; 1F20; Case map
+ 1F29; 1F21; Case map
+ 1F2A; 1F22; Case map
+ 1F2B; 1F23; Case map
+ 1F2C; 1F24; Case map
+ 1F2D; 1F25; Case map
+ 1F2E; 1F26; Case map
+ 1F2F; 1F27; Case map
+ 1F38; 1F30; Case map
+ 1F39; 1F31; Case map
+ 1F3A; 1F32; Case map
+ 1F3B; 1F33; Case map
+ 1F3C; 1F34; Case map
+ 1F3D; 1F35; Case map
+ 1F3E; 1F36; Case map
+ 1F3F; 1F37; Case map
+ 1F48; 1F40; Case map
+ 1F49; 1F41; Case map
+ 1F4A; 1F42; Case map
+ 1F4B; 1F43; Case map
+ 1F4C; 1F44; Case map
+ 1F4D; 1F45; Case map
+ 1F50; 03C5 0313; Case map
+ 1F52; 03C5 0313 0300; Case map
+ 1F54; 03C5 0313 0301; Case map
+ 1F56; 03C5 0313 0342; Case map
+ 1F59; 1F51; Case map
+ 1F5B; 1F53; Case map
+ 1F5D; 1F55; Case map
+ 1F5F; 1F57; Case map
+ 1F68; 1F60; Case map
+ 1F69; 1F61; Case map
+ 1F6A; 1F62; Case map
+ 1F6B; 1F63; Case map
+ 1F6C; 1F64; Case map
+ 1F6D; 1F65; Case map
+ 1F6E; 1F66; Case map
+ 1F6F; 1F67; Case map
+ 1F80; 1F00 03B9; Case map
+ 1F81; 1F01 03B9; Case map
+ 1F82; 1F02 03B9; Case map
+ 1F83; 1F03 03B9; Case map
+ 1F84; 1F04 03B9; Case map
+ 1F85; 1F05 03B9; Case map
+ 1F86; 1F06 03B9; Case map
+ 1F87; 1F07 03B9; Case map
+ 1F88; 1F00 03B9; Case map
+ 1F89; 1F01 03B9; Case map
+ 1F8A; 1F02 03B9; Case map
+ 1F8B; 1F03 03B9; Case map
+ 1F8C; 1F04 03B9; Case map
+ 1F8D; 1F05 03B9; Case map
+ 1F8E; 1F06 03B9; Case map
+ 1F8F; 1F07 03B9; Case map
+ 1F90; 1F20 03B9; Case map
+ 1F91; 1F21 03B9; Case map
+ 1F92; 1F22 03B9; Case map
+ 1F93; 1F23 03B9; Case map
+ 1F94; 1F24 03B9; Case map
+ 1F95; 1F25 03B9; Case map
+ 1F96; 1F26 03B9; Case map
+ 1F97; 1F27 03B9; Case map
+ 1F98; 1F20 03B9; Case map
+ 1F99; 1F21 03B9; Case map
+ 1F9A; 1F22 03B9; Case map
+ 1F9B; 1F23 03B9; Case map
+ 1F9C; 1F24 03B9; Case map
+ 1F9D; 1F25 03B9; Case map
+ 1F9E; 1F26 03B9; Case map
+ 1F9F; 1F27 03B9; Case map
+ 1FA0; 1F60 03B9; Case map
+ 1FA1; 1F61 03B9; Case map
+ 1FA2; 1F62 03B9; Case map
+ 1FA3; 1F63 03B9; Case map
+ 1FA4; 1F64 03B9; Case map
+ 1FA5; 1F65 03B9; Case map
+ 1FA6; 1F66 03B9; Case map
+ 1FA7; 1F67 03B9; Case map
+ 1FA8; 1F60 03B9; Case map
+ 1FA9; 1F61 03B9; Case map
+ 1FAA; 1F62 03B9; Case map
+ 1FAB; 1F63 03B9; Case map
+ 1FAC; 1F64 03B9; Case map
+ 1FAD; 1F65 03B9; Case map
+ 1FAE; 1F66 03B9; Case map
+ 1FAF; 1F67 03B9; Case map
+ 1FB2; 1F70 03B9; Case map
+ 1FB3; 03B1 03B9; Case map
+ 1FB4; 03AC 03B9; Case map
+ 1FB6; 03B1 0342; Case map
+ 1FB7; 03B1 0342 03B9; Case map
+ 1FB8; 1FB0; Case map
+ 1FB9; 1FB1; Case map
+ 1FBA; 1F70; Case map
+ 1FBB; 1F71; Case map
+ 1FBC; 03B1 03B9; Case map
+ 1FBE; 03B9; Case map
+ 1FC2; 1F74 03B9; Case map
+ 1FC3; 03B7 03B9; Case map
+ 1FC4; 03AE 03B9; Case map
+ 1FC6; 03B7 0342; Case map
+ 1FC7; 03B7 0342 03B9; Case map
+ 1FC8; 1F72; Case map
+ 1FC9; 1F73; Case map
+ 1FCA; 1F74; Case map
+ 1FCB; 1F75; Case map
+ 1FCC; 03B7 03B9; Case map
+ 1FD2; 03B9 0308 0300; Case map
+ 1FD3; 03B9 0308 0301; Case map
+ 1FD6; 03B9 0342; Case map
+ 1FD7; 03B9 0308 0342; Case map
+ 1FD8; 1FD0; Case map
+ 1FD9; 1FD1; Case map
+ 1FDA; 1F76; Case map
+ 1FDB; 1F77; Case map
+ 1FE2; 03C5 0308 0300; Case map
+ 1FE3; 03C5 0308 0301; Case map
+ 1FE4; 03C1 0313; Case map
+ 1FE6; 03C5 0342; Case map
+ 1FE7; 03C5 0308 0342; Case map
+ 1FE8; 1FE0; Case map
+ 1FE9; 1FE1; Case map
+ 1FEA; 1F7A; Case map
+ 1FEB; 1F7B; Case map
+ 1FEC; 1FE5; Case map
+ 1FF2; 1F7C 03B9; Case map
+ 1FF3; 03C9 03B9; Case map
+ 1FF4; 03CE 03B9; Case map
+ 1FF6; 03C9 0342; Case map
+ 1FF7; 03C9 0342 03B9; Case map
+ 1FF8; 1F78; Case map
+ 1FF9; 1F79; Case map
+ 1FFA; 1F7C; Case map
+ 1FFB; 1F7D; Case map
+ 1FFC; 03C9 03B9; Case map
+ 20A8; 0072 0073; Additional folding
+ 2102; 0063; Additional folding
+ 2103; 00B0 0063; Additional folding
+ 2107; 025B; Additional folding
+ 2109; 00B0 0066; Additional folding
+ 210B; 0068; Additional folding
+ 210C; 0068; Additional folding
+ 210D; 0068; Additional folding
+ 2110; 0069; Additional folding
+ 2111; 0069; Additional folding
+ 2112; 006C; Additional folding
+ 2115; 006E; Additional folding
+ 2116; 006E 006F; Additional folding
+ 2119; 0070; Additional folding
+ 211A; 0071; Additional folding
+ 211B; 0072; Additional folding
+ 211C; 0072; Additional folding
+ 211D; 0072; Additional folding
+ 2120; 0073 006D; Additional folding
+ 2121; 0074 0065 006C; Additional folding
+ 2122; 0074 006D; Additional folding
+ 2124; 007A; Additional folding
+ 2126; 03C9; Case map
+ 2128; 007A; Additional folding
+ 212A; 006B; Case map
+ 212B; 00E5; Case map
+ 212C; 0062; Additional folding
+ 212D; 0063; Additional folding
+ 2130; 0065; Additional folding
+ 2131; 0066; Additional folding
+ 2133; 006D; Additional folding
+ 213E; 03B3; Additional folding
+ 213F; 03C0; Additional folding
+ 2145; 0064; Additional folding
+ 2160; 2170; Case map
+ 2161; 2171; Case map
+ 2162; 2172; Case map
+ 2163; 2173; Case map
+ 2164; 2174; Case map
+ 2165; 2175; Case map
+ 2166; 2176; Case map
+ 2167; 2177; Case map
+ 2168; 2178; Case map
+ 2169; 2179; Case map
+ 216A; 217A; Case map
+ 216B; 217B; Case map
+ 216C; 217C; Case map
+ 216D; 217D; Case map
+ 216E; 217E; Case map
+ 216F; 217F; Case map
+ 24B6; 24D0; Case map
+ 24B7; 24D1; Case map
+ 24B8; 24D2; Case map
+ 24B9; 24D3; Case map
+ 24BA; 24D4; Case map
+ 24BB; 24D5; Case map
+ 24BC; 24D6; Case map
+ 24BD; 24D7; Case map
+ 24BE; 24D8; Case map
+ 24BF; 24D9; Case map
+ 24C0; 24DA; Case map
+ 24C1; 24DB; Case map
+ 24C2; 24DC; Case map
+ 24C3; 24DD; Case map
+ 24C4; 24DE; Case map
+ 24C5; 24DF; Case map
+ 24C6; 24E0; Case map
+ 24C7; 24E1; Case map
+ 24C8; 24E2; Case map
+ 24C9; 24E3; Case map
+ 24CA; 24E4; Case map
+ 24CB; 24E5; Case map
+ 24CC; 24E6; Case map
+ 24CD; 24E7; Case map
+ 24CE; 24E8; Case map
+ 24CF; 24E9; Case map
+ 3371; 0068 0070 0061; Additional folding
+ 3373; 0061 0075; Additional folding
+ 3375; 006F 0076; Additional folding
+ 3380; 0070 0061; Additional folding
+ 3381; 006E 0061; Additional folding
+ 3382; 03BC 0061; Additional folding
+ 3383; 006D 0061; Additional folding
+ 3384; 006B 0061; Additional folding
+ 3385; 006B 0062; Additional folding
+ 3386; 006D 0062; Additional folding
+ 3387; 0067 0062; Additional folding
+ 338A; 0070 0066; Additional folding
+ 338B; 006E 0066; Additional folding
+ 338C; 03BC 0066; Additional folding
+ 3390; 0068 007A; Additional folding
+ 3391; 006B 0068 007A; Additional folding
+ 3392; 006D 0068 007A; Additional folding
+ 3393; 0067 0068 007A; Additional folding
+ 3394; 0074 0068 007A; Additional folding
+ 33A9; 0070 0061; Additional folding
+ 33AA; 006B 0070 0061; Additional folding
+ 33AB; 006D 0070 0061; Additional folding
+ 33AC; 0067 0070 0061; Additional folding
+ 33B4; 0070 0076; Additional folding
+ 33B5; 006E 0076; Additional folding
+ 33B6; 03BC 0076; Additional folding
+ 33B7; 006D 0076; Additional folding
+ 33B8; 006B 0076; Additional folding
+ 33B9; 006D 0076; Additional folding
+ 33BA; 0070 0077; Additional folding
+ 33BB; 006E 0077; Additional folding
+ 33BC; 03BC 0077; Additional folding
+ 33BD; 006D 0077; Additional folding
+ 33BE; 006B 0077; Additional folding
+ 33BF; 006D 0077; Additional folding
+ 33C0; 006B 03C9; Additional folding
+ 33C1; 006D 03C9; Additional folding
+ 33C3; 0062 0071; Additional folding
+ 33C6; 0063 2215 006B 0067; Additional folding
+ 33C7; 0063 006F 002E; Additional folding
+ 33C8; 0064 0062; Additional folding
+ 33C9; 0067 0079; Additional folding
+ 33CB; 0068 0070; Additional folding
+ 33CD; 006B 006B; Additional folding
+ 33CE; 006B 006D; Additional folding
+ 33D7; 0070 0068; Additional folding
+ 33D9; 0070 0070 006D; Additional folding
+ 33DA; 0070 0072; Additional folding
+ 33DC; 0073 0076; Additional folding
+ 33DD; 0077 0062; Additional folding
+ FB00; 0066 0066; Case map
+ FB01; 0066 0069; Case map
+ FB02; 0066 006C; Case map
+ FB03; 0066 0066 0069; Case map
+ FB04; 0066 0066 006C; Case map
+ FB05; 0073 0074; Case map
+ FB06; 0073 0074; Case map
+ FB13; 0574 0576; Case map
+ FB14; 0574 0565; Case map
+ FB15; 0574 056B; Case map
+ FB16; 057E 0576; Case map
+ FB17; 0574 056D; Case map
+ FF21; FF41; Case map
+ FF22; FF42; Case map
+ FF23; FF43; Case map
+ FF24; FF44; Case map
+ FF25; FF45; Case map
+ FF26; FF46; Case map
+ FF27; FF47; Case map
+ FF28; FF48; Case map
+ FF29; FF49; Case map
+ FF2A; FF4A; Case map
+ FF2B; FF4B; Case map
+ FF2C; FF4C; Case map
+ FF2D; FF4D; Case map
+ FF2E; FF4E; Case map
+ FF2F; FF4F; Case map
+ FF30; FF50; Case map
+ FF31; FF51; Case map
+ FF32; FF52; Case map
+ FF33; FF53; Case map
+ FF34; FF54; Case map
+ FF35; FF55; Case map
+ FF36; FF56; Case map
+ FF37; FF57; Case map
+ FF38; FF58; Case map
+ FF39; FF59; Case map
+ FF3A; FF5A; Case map
+ 10400; 10428; Case map
+ 10401; 10429; Case map
+ 10402; 1042A; Case map
+ 10403; 1042B; Case map
+ 10404; 1042C; Case map
+ 10405; 1042D; Case map
+ 10406; 1042E; Case map
+ 10407; 1042F; Case map
+ 10408; 10430; Case map
+ 10409; 10431; Case map
+ 1040A; 10432; Case map
+ 1040B; 10433; Case map
+ 1040C; 10434; Case map
+ 1040D; 10435; Case map
+ 1040E; 10436; Case map
+ 1040F; 10437; Case map
+ 10410; 10438; Case map
+ 10411; 10439; Case map
+ 10412; 1043A; Case map
+ 10413; 1043B; Case map
+ 10414; 1043C; Case map
+ 10415; 1043D; Case map
+ 10416; 1043E; Case map
+ 10417; 1043F; Case map
+ 10418; 10440; Case map
+ 10419; 10441; Case map
+ 1041A; 10442; Case map
+ 1041B; 10443; Case map
+ 1041C; 10444; Case map
+ 1041D; 10445; Case map
+ 1041E; 10446; Case map
+ 1041F; 10447; Case map
+ 10420; 10448; Case map
+ 10421; 10449; Case map
+ 10422; 1044A; Case map
+ 10423; 1044B; Case map
+ 10424; 1044C; Case map
+ 10425; 1044D; Case map
+ 1D400; 0061; Additional folding
+ 1D401; 0062; Additional folding
+ 1D402; 0063; Additional folding
+ 1D403; 0064; Additional folding
+ 1D404; 0065; Additional folding
+ 1D405; 0066; Additional folding
+ 1D406; 0067; Additional folding
+ 1D407; 0068; Additional folding
+ 1D408; 0069; Additional folding
+ 1D409; 006A; Additional folding
+ 1D40A; 006B; Additional folding
+ 1D40B; 006C; Additional folding
+ 1D40C; 006D; Additional folding
+ 1D40D; 006E; Additional folding
+ 1D40E; 006F; Additional folding
+ 1D40F; 0070; Additional folding
+ 1D410; 0071; Additional folding
+ 1D411; 0072; Additional folding
+ 1D412; 0073; Additional folding
+ 1D413; 0074; Additional folding
+ 1D414; 0075; Additional folding
+ 1D415; 0076; Additional folding
+ 1D416; 0077; Additional folding
+ 1D417; 0078; Additional folding
+ 1D418; 0079; Additional folding
+ 1D419; 007A; Additional folding
+ 1D434; 0061; Additional folding
+ 1D435; 0062; Additional folding
+ 1D436; 0063; Additional folding
+ 1D437; 0064; Additional folding
+ 1D438; 0065; Additional folding
+ 1D439; 0066; Additional folding
+ 1D43A; 0067; Additional folding
+ 1D43B; 0068; Additional folding
+ 1D43C; 0069; Additional folding
+ 1D43D; 006A; Additional folding
+ 1D43E; 006B; Additional folding
+ 1D43F; 006C; Additional folding
+ 1D440; 006D; Additional folding
+ 1D441; 006E; Additional folding
+ 1D442; 006F; Additional folding
+ 1D443; 0070; Additional folding
+ 1D444; 0071; Additional folding
+ 1D445; 0072; Additional folding
+ 1D446; 0073; Additional folding
+ 1D447; 0074; Additional folding
+ 1D448; 0075; Additional folding
+ 1D449; 0076; Additional folding
+ 1D44A; 0077; Additional folding
+ 1D44B; 0078; Additional folding
+ 1D44C; 0079; Additional folding
+ 1D44D; 007A; Additional folding
+ 1D468; 0061; Additional folding
+ 1D469; 0062; Additional folding
+ 1D46A; 0063; Additional folding
+ 1D46B; 0064; Additional folding
+ 1D46C; 0065; Additional folding
+ 1D46D; 0066; Additional folding
+ 1D46E; 0067; Additional folding
+ 1D46F; 0068; Additional folding
+ 1D470; 0069; Additional folding
+ 1D471; 006A; Additional folding
+ 1D472; 006B; Additional folding
+ 1D473; 006C; Additional folding
+ 1D474; 006D; Additional folding
+ 1D475; 006E; Additional folding
+ 1D476; 006F; Additional folding
+ 1D477; 0070; Additional folding
+ 1D478; 0071; Additional folding
+ 1D479; 0072; Additional folding
+ 1D47A; 0073; Additional folding
+ 1D47B; 0074; Additional folding
+ 1D47C; 0075; Additional folding
+ 1D47D; 0076; Additional folding
+ 1D47E; 0077; Additional folding
+ 1D47F; 0078; Additional folding
+ 1D480; 0079; Additional folding
+ 1D481; 007A; Additional folding
+ 1D49C; 0061; Additional folding
+ 1D49E; 0063; Additional folding
+ 1D49F; 0064; Additional folding
+ 1D4A2; 0067; Additional folding
+ 1D4A5; 006A; Additional folding
+ 1D4A6; 006B; Additional folding
+ 1D4A9; 006E; Additional folding
+ 1D4AA; 006F; Additional folding
+ 1D4AB; 0070; Additional folding
+ 1D4AC; 0071; Additional folding
+ 1D4AE; 0073; Additional folding
+ 1D4AF; 0074; Additional folding
+ 1D4B0; 0075; Additional folding
+ 1D4B1; 0076; Additional folding
+ 1D4B2; 0077; Additional folding
+ 1D4B3; 0078; Additional folding
+ 1D4B4; 0079; Additional folding
+ 1D4B5; 007A; Additional folding
+ 1D4D0; 0061; Additional folding
+ 1D4D1; 0062; Additional folding
+ 1D4D2; 0063; Additional folding
+ 1D4D3; 0064; Additional folding
+ 1D4D4; 0065; Additional folding
+ 1D4D5; 0066; Additional folding
+ 1D4D6; 0067; Additional folding
+ 1D4D7; 0068; Additional folding
+ 1D4D8; 0069; Additional folding
+ 1D4D9; 006A; Additional folding
+ 1D4DA; 006B; Additional folding
+ 1D4DB; 006C; Additional folding
+ 1D4DC; 006D; Additional folding
+ 1D4DD; 006E; Additional folding
+ 1D4DE; 006F; Additional folding
+ 1D4DF; 0070; Additional folding
+ 1D4E0; 0071; Additional folding
+ 1D4E1; 0072; Additional folding
+ 1D4E2; 0073; Additional folding
+ 1D4E3; 0074; Additional folding
+ 1D4E4; 0075; Additional folding
+ 1D4E5; 0076; Additional folding
+ 1D4E6; 0077; Additional folding
+ 1D4E7; 0078; Additional folding
+ 1D4E8; 0079; Additional folding
+ 1D4E9; 007A; Additional folding
+ 1D504; 0061; Additional folding
+ 1D505; 0062; Additional folding
+ 1D507; 0064; Additional folding
+ 1D508; 0065; Additional folding
+ 1D509; 0066; Additional folding
+ 1D50A; 0067; Additional folding
+ 1D50D; 006A; Additional folding
+ 1D50E; 006B; Additional folding
+ 1D50F; 006C; Additional folding
+ 1D510; 006D; Additional folding
+ 1D511; 006E; Additional folding
+ 1D512; 006F; Additional folding
+ 1D513; 0070; Additional folding
+ 1D514; 0071; Additional folding
+ 1D516; 0073; Additional folding
+ 1D517; 0074; Additional folding
+ 1D518; 0075; Additional folding
+ 1D519; 0076; Additional folding
+ 1D51A; 0077; Additional folding
+ 1D51B; 0078; Additional folding
+ 1D51C; 0079; Additional folding
+ 1D538; 0061; Additional folding
+ 1D539; 0062; Additional folding
+ 1D53B; 0064; Additional folding
+ 1D53C; 0065; Additional folding
+ 1D53D; 0066; Additional folding
+ 1D53E; 0067; Additional folding
+ 1D540; 0069; Additional folding
+ 1D541; 006A; Additional folding
+ 1D542; 006B; Additional folding
+ 1D543; 006C; Additional folding
+ 1D544; 006D; Additional folding
+ 1D546; 006F; Additional folding
+ 1D54A; 0073; Additional folding
+ 1D54B; 0074; Additional folding
+ 1D54C; 0075; Additional folding
+ 1D54D; 0076; Additional folding
+ 1D54E; 0077; Additional folding
+ 1D54F; 0078; Additional folding
+ 1D550; 0079; Additional folding
+ 1D56C; 0061; Additional folding
+ 1D56D; 0062; Additional folding
+ 1D56E; 0063; Additional folding
+ 1D56F; 0064; Additional folding
+ 1D570; 0065; Additional folding
+ 1D571; 0066; Additional folding
+ 1D572; 0067; Additional folding
+ 1D573; 0068; Additional folding
+ 1D574; 0069; Additional folding
+ 1D575; 006A; Additional folding
+ 1D576; 006B; Additional folding
+ 1D577; 006C; Additional folding
+ 1D578; 006D; Additional folding
+ 1D579; 006E; Additional folding
+ 1D57A; 006F; Additional folding
+ 1D57B; 0070; Additional folding
+ 1D57C; 0071; Additional folding
+ 1D57D; 0072; Additional folding
+ 1D57E; 0073; Additional folding
+ 1D57F; 0074; Additional folding
+ 1D580; 0075; Additional folding
+ 1D581; 0076; Additional folding
+ 1D582; 0077; Additional folding
+ 1D583; 0078; Additional folding
+ 1D584; 0079; Additional folding
+ 1D585; 007A; Additional folding
+ 1D5A0; 0061; Additional folding
+ 1D5A1; 0062; Additional folding
+ 1D5A2; 0063; Additional folding
+ 1D5A3; 0064; Additional folding
+ 1D5A4; 0065; Additional folding
+ 1D5A5; 0066; Additional folding
+ 1D5A6; 0067; Additional folding
+ 1D5A7; 0068; Additional folding
+ 1D5A8; 0069; Additional folding
+ 1D5A9; 006A; Additional folding
+ 1D5AA; 006B; Additional folding
+ 1D5AB; 006C; Additional folding
+ 1D5AC; 006D; Additional folding
+ 1D5AD; 006E; Additional folding
+ 1D5AE; 006F; Additional folding
+ 1D5AF; 0070; Additional folding
+ 1D5B0; 0071; Additional folding
+ 1D5B1; 0072; Additional folding
+ 1D5B2; 0073; Additional folding
+ 1D5B3; 0074; Additional folding
+ 1D5B4; 0075; Additional folding
+ 1D5B5; 0076; Additional folding
+ 1D5B6; 0077; Additional folding
+ 1D5B7; 0078; Additional folding
+ 1D5B8; 0079; Additional folding
+ 1D5B9; 007A; Additional folding
+ 1D5D4; 0061; Additional folding
+ 1D5D5; 0062; Additional folding
+ 1D5D6; 0063; Additional folding
+ 1D5D7; 0064; Additional folding
+ 1D5D8; 0065; Additional folding
+ 1D5D9; 0066; Additional folding
+ 1D5DA; 0067; Additional folding
+ 1D5DB; 0068; Additional folding
+ 1D5DC; 0069; Additional folding
+ 1D5DD; 006A; Additional folding
+ 1D5DE; 006B; Additional folding
+ 1D5DF; 006C; Additional folding
+ 1D5E0; 006D; Additional folding
+ 1D5E1; 006E; Additional folding
+ 1D5E2; 006F; Additional folding
+ 1D5E3; 0070; Additional folding
+ 1D5E4; 0071; Additional folding
+ 1D5E5; 0072; Additional folding
+ 1D5E6; 0073; Additional folding
+ 1D5E7; 0074; Additional folding
+ 1D5E8; 0075; Additional folding
+ 1D5E9; 0076; Additional folding
+ 1D5EA; 0077; Additional folding
+ 1D5EB; 0078; Additional folding
+ 1D5EC; 0079; Additional folding
+ 1D5ED; 007A; Additional folding
+ 1D608; 0061; Additional folding
+ 1D609; 0062; Additional folding
+ 1D60A; 0063; Additional folding
+ 1D60B; 0064; Additional folding
+ 1D60C; 0065; Additional folding
+ 1D60D; 0066; Additional folding
+ 1D60E; 0067; Additional folding
+ 1D60F; 0068; Additional folding
+ 1D610; 0069; Additional folding
+ 1D611; 006A; Additional folding
+ 1D612; 006B; Additional folding
+ 1D613; 006C; Additional folding
+ 1D614; 006D; Additional folding
+ 1D615; 006E; Additional folding
+ 1D616; 006F; Additional folding
+ 1D617; 0070; Additional folding
+ 1D618; 0071; Additional folding
+ 1D619; 0072; Additional folding
+ 1D61A; 0073; Additional folding
+ 1D61B; 0074; Additional folding
+ 1D61C; 0075; Additional folding
+ 1D61D; 0076; Additional folding
+ 1D61E; 0077; Additional folding
+ 1D61F; 0078; Additional folding
+ 1D620; 0079; Additional folding
+ 1D621; 007A; Additional folding
+ 1D63C; 0061; Additional folding
+ 1D63D; 0062; Additional folding
+ 1D63E; 0063; Additional folding
+ 1D63F; 0064; Additional folding
+ 1D640; 0065; Additional folding
+ 1D641; 0066; Additional folding
+ 1D642; 0067; Additional folding
+ 1D643; 0068; Additional folding
+ 1D644; 0069; Additional folding
+ 1D645; 006A; Additional folding
+ 1D646; 006B; Additional folding
+ 1D647; 006C; Additional folding
+ 1D648; 006D; Additional folding
+ 1D649; 006E; Additional folding
+ 1D64A; 006F; Additional folding
+ 1D64B; 0070; Additional folding
+ 1D64C; 0071; Additional folding
+ 1D64D; 0072; Additional folding
+ 1D64E; 0073; Additional folding
+ 1D64F; 0074; Additional folding
+ 1D650; 0075; Additional folding
+ 1D651; 0076; Additional folding
+ 1D652; 0077; Additional folding
+ 1D653; 0078; Additional folding
+ 1D654; 0079; Additional folding
+ 1D655; 007A; Additional folding
+ 1D670; 0061; Additional folding
+ 1D671; 0062; Additional folding
+ 1D672; 0063; Additional folding
+ 1D673; 0064; Additional folding
+ 1D674; 0065; Additional folding
+ 1D675; 0066; Additional folding
+ 1D676; 0067; Additional folding
+ 1D677; 0068; Additional folding
+ 1D678; 0069; Additional folding
+ 1D679; 006A; Additional folding
+ 1D67A; 006B; Additional folding
+ 1D67B; 006C; Additional folding
+ 1D67C; 006D; Additional folding
+ 1D67D; 006E; Additional folding
+ 1D67E; 006F; Additional folding
+ 1D67F; 0070; Additional folding
+ 1D680; 0071; Additional folding
+ 1D681; 0072; Additional folding
+ 1D682; 0073; Additional folding
+ 1D683; 0074; Additional folding
+ 1D684; 0075; Additional folding
+ 1D685; 0076; Additional folding
+ 1D686; 0077; Additional folding
+ 1D687; 0078; Additional folding
+ 1D688; 0079; Additional folding
+ 1D689; 007A; Additional folding
+ 1D6A8; 03B1; Additional folding
+ 1D6A9; 03B2; Additional folding
+ 1D6AA; 03B3; Additional folding
+ 1D6AB; 03B4; Additional folding
+ 1D6AC; 03B5; Additional folding
+ 1D6AD; 03B6; Additional folding
+ 1D6AE; 03B7; Additional folding
+ 1D6AF; 03B8; Additional folding
+ 1D6B0; 03B9; Additional folding
+ 1D6B1; 03BA; Additional folding
+ 1D6B2; 03BB; Additional folding
+ 1D6B3; 03BC; Additional folding
+ 1D6B4; 03BD; Additional folding
+ 1D6B5; 03BE; Additional folding
+ 1D6B6; 03BF; Additional folding
+ 1D6B7; 03C0; Additional folding
+ 1D6B8; 03C1; Additional folding
+ 1D6B9; 03B8; Additional folding
+ 1D6BA; 03C3; Additional folding
+ 1D6BB; 03C4; Additional folding
+ 1D6BC; 03C5; Additional folding
+ 1D6BD; 03C6; Additional folding
+ 1D6BE; 03C7; Additional folding
+ 1D6BF; 03C8; Additional folding
+ 1D6C0; 03C9; Additional folding
+ 1D6D3; 03C3; Additional folding
+ 1D6E2; 03B1; Additional folding
+ 1D6E3; 03B2; Additional folding
+ 1D6E4; 03B3; Additional folding
+ 1D6E5; 03B4; Additional folding
+ 1D6E6; 03B5; Additional folding
+ 1D6E7; 03B6; Additional folding
+ 1D6E8; 03B7; Additional folding
+ 1D6E9; 03B8; Additional folding
+ 1D6EA; 03B9; Additional folding
+ 1D6EB; 03BA; Additional folding
+ 1D6EC; 03BB; Additional folding
+ 1D6ED; 03BC; Additional folding
+ 1D6EE; 03BD; Additional folding
+ 1D6EF; 03BE; Additional folding
+ 1D6F0; 03BF; Additional folding
+ 1D6F1; 03C0; Additional folding
+ 1D6F2; 03C1; Additional folding
+ 1D6F3; 03B8; Additional folding
+ 1D6F4; 03C3; Additional folding
+ 1D6F5; 03C4; Additional folding
+ 1D6F6; 03C5; Additional folding
+ 1D6F7; 03C6; Additional folding
+ 1D6F8; 03C7; Additional folding
+ 1D6F9; 03C8; Additional folding
+ 1D6FA; 03C9; Additional folding
+ 1D70D; 03C3; Additional folding
+ 1D71C; 03B1; Additional folding
+ 1D71D; 03B2; Additional folding
+ 1D71E; 03B3; Additional folding
+ 1D71F; 03B4; Additional folding
+ 1D720; 03B5; Additional folding
+ 1D721; 03B6; Additional folding
+ 1D722; 03B7; Additional folding
+ 1D723; 03B8; Additional folding
+ 1D724; 03B9; Additional folding
+ 1D725; 03BA; Additional folding
+ 1D726; 03BB; Additional folding
+ 1D727; 03BC; Additional folding
+ 1D728; 03BD; Additional folding
+ 1D729; 03BE; Additional folding
+ 1D72A; 03BF; Additional folding
+ 1D72B; 03C0; Additional folding
+ 1D72C; 03C1; Additional folding
+ 1D72D; 03B8; Additional folding
+ 1D72E; 03C3; Additional folding
+ 1D72F; 03C4; Additional folding
+ 1D730; 03C5; Additional folding
+ 1D731; 03C6; Additional folding
+ 1D732; 03C7; Additional folding
+ 1D733; 03C8; Additional folding
+ 1D734; 03C9; Additional folding
+ 1D747; 03C3; Additional folding
+ 1D756; 03B1; Additional folding
+ 1D757; 03B2; Additional folding
+ 1D758; 03B3; Additional folding
+ 1D759; 03B4; Additional folding
+ 1D75A; 03B5; Additional folding
+ 1D75B; 03B6; Additional folding
+ 1D75C; 03B7; Additional folding
+ 1D75D; 03B8; Additional folding
+ 1D75E; 03B9; Additional folding
+ 1D75F; 03BA; Additional folding
+ 1D760; 03BB; Additional folding
+ 1D761; 03BC; Additional folding
+ 1D762; 03BD; Additional folding
+ 1D763; 03BE; Additional folding
+ 1D764; 03BF; Additional folding
+ 1D765; 03C0; Additional folding
+ 1D766; 03C1; Additional folding
+ 1D767; 03B8; Additional folding
+ 1D768; 03C3; Additional folding
+ 1D769; 03C4; Additional folding
+ 1D76A; 03C5; Additional folding
+ 1D76B; 03C6; Additional folding
+ 1D76C; 03C7; Additional folding
+ 1D76D; 03C8; Additional folding
+ 1D76E; 03C9; Additional folding
+ 1D781; 03C3; Additional folding
+ 1D790; 03B1; Additional folding
+ 1D791; 03B2; Additional folding
+ 1D792; 03B3; Additional folding
+ 1D793; 03B4; Additional folding
+ 1D794; 03B5; Additional folding
+ 1D795; 03B6; Additional folding
+ 1D796; 03B7; Additional folding
+ 1D797; 03B8; Additional folding
+ 1D798; 03B9; Additional folding
+ 1D799; 03BA; Additional folding
+ 1D79A; 03BB; Additional folding
+ 1D79B; 03BC; Additional folding
+ 1D79C; 03BD; Additional folding
+ 1D79D; 03BE; Additional folding
+ 1D79E; 03BF; Additional folding
+ 1D79F; 03C0; Additional folding
+ 1D7A0; 03C1; Additional folding
+ 1D7A1; 03B8; Additional folding
+ 1D7A2; 03C3; Additional folding
+ 1D7A3; 03C4; Additional folding
+ 1D7A4; 03C5; Additional folding
+ 1D7A5; 03C6; Additional folding
+ 1D7A6; 03C7; Additional folding
+ 1D7A7; 03C8; Additional folding
+ 1D7A8; 03C9; Additional folding
+ 1D7BB; 03C3; Additional folding
+ ----- End Table B.2 -----
+
+ ----- Start Table B.3 -----
+ 0041; 0061; Case map
+ 0042; 0062; Case map
+ 0043; 0063; Case map
+ 0044; 0064; Case map
+ 0045; 0065; Case map
+ 0046; 0066; Case map
+ 0047; 0067; Case map
+ 0048; 0068; Case map
+ 0049; 0069; Case map
+ 004A; 006A; Case map
+ 004B; 006B; Case map
+ 004C; 006C; Case map
+ 004D; 006D; Case map
+ 004E; 006E; Case map
+ 004F; 006F; Case map
+ 0050; 0070; Case map
+ 0051; 0071; Case map
+ 0052; 0072; Case map
+ 0053; 0073; Case map
+ 0054; 0074; Case map
+ 0055; 0075; Case map
+ 0056; 0076; Case map
+ 0057; 0077; Case map
+ 0058; 0078; Case map
+ 0059; 0079; Case map
+ 005A; 007A; Case map
+ 00B5; 03BC; Case map
+ 00C0; 00E0; Case map
+ 00C1; 00E1; Case map
+ 00C2; 00E2; Case map
+ 00C3; 00E3; Case map
+ 00C4; 00E4; Case map
+ 00C5; 00E5; Case map
+ 00C6; 00E6; Case map
+ 00C7; 00E7; Case map
+ 00C8; 00E8; Case map
+ 00C9; 00E9; Case map
+ 00CA; 00EA; Case map
+ 00CB; 00EB; Case map
+ 00CC; 00EC; Case map
+ 00CD; 00ED; Case map
+ 00CE; 00EE; Case map
+ 00CF; 00EF; Case map
+ 00D0; 00F0; Case map
+ 00D1; 00F1; Case map
+ 00D2; 00F2; Case map
+ 00D3; 00F3; Case map
+ 00D4; 00F4; Case map
+ 00D5; 00F5; Case map
+ 00D6; 00F6; Case map
+ 00D8; 00F8; Case map
+ 00D9; 00F9; Case map
+ 00DA; 00FA; Case map
+ 00DB; 00FB; Case map
+ 00DC; 00FC; Case map
+ 00DD; 00FD; Case map
+ 00DE; 00FE; Case map
+ 00DF; 0073 0073; Case map
+ 0100; 0101; Case map
+ 0102; 0103; Case map
+ 0104; 0105; Case map
+ 0106; 0107; Case map
+ 0108; 0109; Case map
+ 010A; 010B; Case map
+ 010C; 010D; Case map
+ 010E; 010F; Case map
+ 0110; 0111; Case map
+ 0112; 0113; Case map
+ 0114; 0115; Case map
+ 0116; 0117; Case map
+ 0118; 0119; Case map
+ 011A; 011B; Case map
+ 011C; 011D; Case map
+ 011E; 011F; Case map
+ 0120; 0121; Case map
+ 0122; 0123; Case map
+ 0124; 0125; Case map
+ 0126; 0127; Case map
+ 0128; 0129; Case map
+ 012A; 012B; Case map
+ 012C; 012D; Case map
+ 012E; 012F; Case map
+ 0130; 0069 0307; Case map
+ 0132; 0133; Case map
+ 0134; 0135; Case map
+ 0136; 0137; Case map
+ 0139; 013A; Case map
+ 013B; 013C; Case map
+ 013D; 013E; Case map
+ 013F; 0140; Case map
+ 0141; 0142; Case map
+ 0143; 0144; Case map
+ 0145; 0146; Case map
+ 0147; 0148; Case map
+ 0149; 02BC 006E; Case map
+ 014A; 014B; Case map
+ 014C; 014D; Case map
+ 014E; 014F; Case map
+ 0150; 0151; Case map
+ 0152; 0153; Case map
+ 0154; 0155; Case map
+ 0156; 0157; Case map
+ 0158; 0159; Case map
+ 015A; 015B; Case map
+ 015C; 015D; Case map
+ 015E; 015F; Case map
+ 0160; 0161; Case map
+ 0162; 0163; Case map
+ 0164; 0165; Case map
+ 0166; 0167; Case map
+ 0168; 0169; Case map
+ 016A; 016B; Case map
+ 016C; 016D; Case map
+ 016E; 016F; Case map
+ 0170; 0171; Case map
+ 0172; 0173; Case map
+ 0174; 0175; Case map
+ 0176; 0177; Case map
+ 0178; 00FF; Case map
+ 0179; 017A; Case map
+ 017B; 017C; Case map
+ 017D; 017E; Case map
+ 017F; 0073; Case map
+ 0181; 0253; Case map
+ 0182; 0183; Case map
+ 0184; 0185; Case map
+ 0186; 0254; Case map
+ 0187; 0188; Case map
+ 0189; 0256; Case map
+ 018A; 0257; Case map
+ 018B; 018C; Case map
+ 018E; 01DD; Case map
+ 018F; 0259; Case map
+ 0190; 025B; Case map
+ 0191; 0192; Case map
+ 0193; 0260; Case map
+ 0194; 0263; Case map
+ 0196; 0269; Case map
+ 0197; 0268; Case map
+ 0198; 0199; Case map
+ 019C; 026F; Case map
+ 019D; 0272; Case map
+ 019F; 0275; Case map
+ 01A0; 01A1; Case map
+ 01A2; 01A3; Case map
+ 01A4; 01A5; Case map
+ 01A6; 0280; Case map
+ 01A7; 01A8; Case map
+ 01A9; 0283; Case map
+ 01AC; 01AD; Case map
+ 01AE; 0288; Case map
+ 01AF; 01B0; Case map
+ 01B1; 028A; Case map
+ 01B2; 028B; Case map
+ 01B3; 01B4; Case map
+ 01B5; 01B6; Case map
+ 01B7; 0292; Case map
+ 01B8; 01B9; Case map
+ 01BC; 01BD; Case map
+ 01C4; 01C6; Case map
+ 01C5; 01C6; Case map
+ 01C7; 01C9; Case map
+ 01C8; 01C9; Case map
+ 01CA; 01CC; Case map
+ 01CB; 01CC; Case map
+ 01CD; 01CE; Case map
+ 01CF; 01D0; Case map
+ 01D1; 01D2; Case map
+ 01D3; 01D4; Case map
+ 01D5; 01D6; Case map
+ 01D7; 01D8; Case map
+ 01D9; 01DA; Case map
+ 01DB; 01DC; Case map
+ 01DE; 01DF; Case map
+ 01E0; 01E1; Case map
+ 01E2; 01E3; Case map
+ 01E4; 01E5; Case map
+ 01E6; 01E7; Case map
+ 01E8; 01E9; Case map
+ 01EA; 01EB; Case map
+ 01EC; 01ED; Case map
+ 01EE; 01EF; Case map
+ 01F0; 006A 030C; Case map
+ 01F1; 01F3; Case map
+ 01F2; 01F3; Case map
+ 01F4; 01F5; Case map
+ 01F6; 0195; Case map
+ 01F7; 01BF; Case map
+ 01F8; 01F9; Case map
+ 01FA; 01FB; Case map
+ 01FC; 01FD; Case map
+ 01FE; 01FF; Case map
+ 0200; 0201; Case map
+ 0202; 0203; Case map
+ 0204; 0205; Case map
+ 0206; 0207; Case map
+ 0208; 0209; Case map
+ 020A; 020B; Case map
+ 020C; 020D; Case map
+ 020E; 020F; Case map
+ 0210; 0211; Case map
+ 0212; 0213; Case map
+ 0214; 0215; Case map
+ 0216; 0217; Case map
+ 0218; 0219; Case map
+ 021A; 021B; Case map
+ 021C; 021D; Case map
+ 021E; 021F; Case map
+ 0220; 019E; Case map
+ 0222; 0223; Case map
+ 0224; 0225; Case map
+ 0226; 0227; Case map
+ 0228; 0229; Case map
+ 022A; 022B; Case map
+ 022C; 022D; Case map
+ 022E; 022F; Case map
+ 0230; 0231; Case map
+ 0232; 0233; Case map
+ 0345; 03B9; Case map
+ 0386; 03AC; Case map
+ 0388; 03AD; Case map
+ 0389; 03AE; Case map
+ 038A; 03AF; Case map
+ 038C; 03CC; Case map
+ 038E; 03CD; Case map
+ 038F; 03CE; Case map
+ 0390; 03B9 0308 0301; Case map
+ 0391; 03B1; Case map
+ 0392; 03B2; Case map
+ 0393; 03B3; Case map
+ 0394; 03B4; Case map
+ 0395; 03B5; Case map
+ 0396; 03B6; Case map
+ 0397; 03B7; Case map
+ 0398; 03B8; Case map
+ 0399; 03B9; Case map
+ 039A; 03BA; Case map
+ 039B; 03BB; Case map
+ 039C; 03BC; Case map
+ 039D; 03BD; Case map
+ 039E; 03BE; Case map
+ 039F; 03BF; Case map
+ 03A0; 03C0; Case map
+ 03A1; 03C1; Case map
+ 03A3; 03C3; Case map
+ 03A4; 03C4; Case map
+ 03A5; 03C5; Case map
+ 03A6; 03C6; Case map
+ 03A7; 03C7; Case map
+ 03A8; 03C8; Case map
+ 03A9; 03C9; Case map
+ 03AA; 03CA; Case map
+ 03AB; 03CB; Case map
+ 03B0; 03C5 0308 0301; Case map
+ 03C2; 03C3; Case map
+ 03D0; 03B2; Case map
+ 03D1; 03B8; Case map
+ 03D5; 03C6; Case map
+ 03D6; 03C0; Case map
+ 03D8; 03D9; Case map
+ 03DA; 03DB; Case map
+ 03DC; 03DD; Case map
+ 03DE; 03DF; Case map
+ 03E0; 03E1; Case map
+ 03E2; 03E3; Case map
+ 03E4; 03E5; Case map
+ 03E6; 03E7; Case map
+ 03E8; 03E9; Case map
+ 03EA; 03EB; Case map
+ 03EC; 03ED; Case map
+ 03EE; 03EF; Case map
+ 03F0; 03BA; Case map
+ 03F1; 03C1; Case map
+ 03F2; 03C3; Case map
+ 03F4; 03B8; Case map
+ 03F5; 03B5; Case map
+ 0400; 0450; Case map
+ 0401; 0451; Case map
+ 0402; 0452; Case map
+ 0403; 0453; Case map
+ 0404; 0454; Case map
+ 0405; 0455; Case map
+ 0406; 0456; Case map
+ 0407; 0457; Case map
+ 0408; 0458; Case map
+ 0409; 0459; Case map
+ 040A; 045A; Case map
+ 040B; 045B; Case map
+ 040C; 045C; Case map
+ 040D; 045D; Case map
+ 040E; 045E; Case map
+ 040F; 045F; Case map
+ 0410; 0430; Case map
+ 0411; 0431; Case map
+ 0412; 0432; Case map
+ 0413; 0433; Case map
+ 0414; 0434; Case map
+ 0415; 0435; Case map
+ 0416; 0436; Case map
+ 0417; 0437; Case map
+ 0418; 0438; Case map
+ 0419; 0439; Case map
+ 041A; 043A; Case map
+ 041B; 043B; Case map
+ 041C; 043C; Case map
+ 041D; 043D; Case map
+ 041E; 043E; Case map
+ 041F; 043F; Case map
+ 0420; 0440; Case map
+ 0421; 0441; Case map
+ 0422; 0442; Case map
+ 0423; 0443; Case map
+ 0424; 0444; Case map
+ 0425; 0445; Case map
+ 0426; 0446; Case map
+ 0427; 0447; Case map
+ 0428; 0448; Case map
+ 0429; 0449; Case map
+ 042A; 044A; Case map
+ 042B; 044B; Case map
+ 042C; 044C; Case map
+ 042D; 044D; Case map
+ 042E; 044E; Case map
+ 042F; 044F; Case map
+ 0460; 0461; Case map
+ 0462; 0463; Case map
+ 0464; 0465; Case map
+ 0466; 0467; Case map
+ 0468; 0469; Case map
+ 046A; 046B; Case map
+ 046C; 046D; Case map
+ 046E; 046F; Case map
+ 0470; 0471; Case map
+ 0472; 0473; Case map
+ 0474; 0475; Case map
+ 0476; 0477; Case map
+ 0478; 0479; Case map
+ 047A; 047B; Case map
+ 047C; 047D; Case map
+ 047E; 047F; Case map
+ 0480; 0481; Case map
+ 048A; 048B; Case map
+ 048C; 048D; Case map
+ 048E; 048F; Case map
+ 0490; 0491; Case map
+ 0492; 0493; Case map
+ 0494; 0495; Case map
+ 0496; 0497; Case map
+ 0498; 0499; Case map
+ 049A; 049B; Case map
+ 049C; 049D; Case map
+ 049E; 049F; Case map
+ 04A0; 04A1; Case map
+ 04A2; 04A3; Case map
+ 04A4; 04A5; Case map
+ 04A6; 04A7; Case map
+ 04A8; 04A9; Case map
+ 04AA; 04AB; Case map
+ 04AC; 04AD; Case map
+ 04AE; 04AF; Case map
+ 04B0; 04B1; Case map
+ 04B2; 04B3; Case map
+ 04B4; 04B5; Case map
+ 04B6; 04B7; Case map
+ 04B8; 04B9; Case map
+ 04BA; 04BB; Case map
+ 04BC; 04BD; Case map
+ 04BE; 04BF; Case map
+ 04C1; 04C2; Case map
+ 04C3; 04C4; Case map
+ 04C5; 04C6; Case map
+ 04C7; 04C8; Case map
+ 04C9; 04CA; Case map
+ 04CB; 04CC; Case map
+ 04CD; 04CE; Case map
+ 04D0; 04D1; Case map
+ 04D2; 04D3; Case map
+ 04D4; 04D5; Case map
+ 04D6; 04D7; Case map
+ 04D8; 04D9; Case map
+ 04DA; 04DB; Case map
+ 04DC; 04DD; Case map
+ 04DE; 04DF; Case map
+ 04E0; 04E1; Case map
+ 04E2; 04E3; Case map
+ 04E4; 04E5; Case map
+ 04E6; 04E7; Case map
+ 04E8; 04E9; Case map
+ 04EA; 04EB; Case map
+ 04EC; 04ED; Case map
+ 04EE; 04EF; Case map
+ 04F0; 04F1; Case map
+ 04F2; 04F3; Case map
+ 04F4; 04F5; Case map
+ 04F8; 04F9; Case map
+ 0500; 0501; Case map
+ 0502; 0503; Case map
+ 0504; 0505; Case map
+ 0506; 0507; Case map
+ 0508; 0509; Case map
+ 050A; 050B; Case map
+ 050C; 050D; Case map
+ 050E; 050F; Case map
+ 0531; 0561; Case map
+ 0532; 0562; Case map
+ 0533; 0563; Case map
+ 0534; 0564; Case map
+ 0535; 0565; Case map
+ 0536; 0566; Case map
+ 0537; 0567; Case map
+ 0538; 0568; Case map
+ 0539; 0569; Case map
+ 053A; 056A; Case map
+ 053B; 056B; Case map
+ 053C; 056C; Case map
+ 053D; 056D; Case map
+ 053E; 056E; Case map
+ 053F; 056F; Case map
+ 0540; 0570; Case map
+ 0541; 0571; Case map
+ 0542; 0572; Case map
+ 0543; 0573; Case map
+ 0544; 0574; Case map
+ 0545; 0575; Case map
+ 0546; 0576; Case map
+ 0547; 0577; Case map
+ 0548; 0578; Case map
+ 0549; 0579; Case map
+ 054A; 057A; Case map
+ 054B; 057B; Case map
+ 054C; 057C; Case map
+ 054D; 057D; Case map
+ 054E; 057E; Case map
+ 054F; 057F; Case map
+ 0550; 0580; Case map
+ 0551; 0581; Case map
+ 0552; 0582; Case map
+ 0553; 0583; Case map
+ 0554; 0584; Case map
+ 0555; 0585; Case map
+ 0556; 0586; Case map
+ 0587; 0565 0582; Case map
+ 1E00; 1E01; Case map
+ 1E02; 1E03; Case map
+ 1E04; 1E05; Case map
+ 1E06; 1E07; Case map
+ 1E08; 1E09; Case map
+ 1E0A; 1E0B; Case map
+ 1E0C; 1E0D; Case map
+ 1E0E; 1E0F; Case map
+ 1E10; 1E11; Case map
+ 1E12; 1E13; Case map
+ 1E14; 1E15; Case map
+ 1E16; 1E17; Case map
+ 1E18; 1E19; Case map
+ 1E1A; 1E1B; Case map
+ 1E1C; 1E1D; Case map
+ 1E1E; 1E1F; Case map
+ 1E20; 1E21; Case map
+ 1E22; 1E23; Case map
+ 1E24; 1E25; Case map
+ 1E26; 1E27; Case map
+ 1E28; 1E29; Case map
+ 1E2A; 1E2B; Case map
+ 1E2C; 1E2D; Case map
+ 1E2E; 1E2F; Case map
+ 1E30; 1E31; Case map
+ 1E32; 1E33; Case map
+ 1E34; 1E35; Case map
+ 1E36; 1E37; Case map
+ 1E38; 1E39; Case map
+ 1E3A; 1E3B; Case map
+ 1E3C; 1E3D; Case map
+ 1E3E; 1E3F; Case map
+ 1E40; 1E41; Case map
+ 1E42; 1E43; Case map
+ 1E44; 1E45; Case map
+ 1E46; 1E47; Case map
+ 1E48; 1E49; Case map
+ 1E4A; 1E4B; Case map
+ 1E4C; 1E4D; Case map
+ 1E4E; 1E4F; Case map
+ 1E50; 1E51; Case map
+ 1E52; 1E53; Case map
+ 1E54; 1E55; Case map
+ 1E56; 1E57; Case map
+ 1E58; 1E59; Case map
+ 1E5A; 1E5B; Case map
+ 1E5C; 1E5D; Case map
+ 1E5E; 1E5F; Case map
+ 1E60; 1E61; Case map
+ 1E62; 1E63; Case map
+ 1E64; 1E65; Case map
+ 1E66; 1E67; Case map
+ 1E68; 1E69; Case map
+ 1E6A; 1E6B; Case map
+ 1E6C; 1E6D; Case map
+ 1E6E; 1E6F; Case map
+ 1E70; 1E71; Case map
+ 1E72; 1E73; Case map
+ 1E74; 1E75; Case map
+ 1E76; 1E77; Case map
+ 1E78; 1E79; Case map
+ 1E7A; 1E7B; Case map
+ 1E7C; 1E7D; Case map
+ 1E7E; 1E7F; Case map
+ 1E80; 1E81; Case map
+ 1E82; 1E83; Case map
+ 1E84; 1E85; Case map
+ 1E86; 1E87; Case map
+ 1E88; 1E89; Case map
+ 1E8A; 1E8B; Case map
+ 1E8C; 1E8D; Case map
+ 1E8E; 1E8F; Case map
+ 1E90; 1E91; Case map
+ 1E92; 1E93; Case map
+ 1E94; 1E95; Case map
+ 1E96; 0068 0331; Case map
+ 1E97; 0074 0308; Case map
+ 1E98; 0077 030A; Case map
+ 1E99; 0079 030A; Case map
+ 1E9A; 0061 02BE; Case map
+ 1E9B; 1E61; Case map
+ 1EA0; 1EA1; Case map
+ 1EA2; 1EA3; Case map
+ 1EA4; 1EA5; Case map
+ 1EA6; 1EA7; Case map
+ 1EA8; 1EA9; Case map
+ 1EAA; 1EAB; Case map
+ 1EAC; 1EAD; Case map
+ 1EAE; 1EAF; Case map
+ 1EB0; 1EB1; Case map
+ 1EB2; 1EB3; Case map
+ 1EB4; 1EB5; Case map
+ 1EB6; 1EB7; Case map
+ 1EB8; 1EB9; Case map
+ 1EBA; 1EBB; Case map
+ 1EBC; 1EBD; Case map
+ 1EBE; 1EBF; Case map
+ 1EC0; 1EC1; Case map
+ 1EC2; 1EC3; Case map
+ 1EC4; 1EC5; Case map
+ 1EC6; 1EC7; Case map
+ 1EC8; 1EC9; Case map
+ 1ECA; 1ECB; Case map
+ 1ECC; 1ECD; Case map
+ 1ECE; 1ECF; Case map
+ 1ED0; 1ED1; Case map
+ 1ED2; 1ED3; Case map
+ 1ED4; 1ED5; Case map
+ 1ED6; 1ED7; Case map
+ 1ED8; 1ED9; Case map
+ 1EDA; 1EDB; Case map
+ 1EDC; 1EDD; Case map
+ 1EDE; 1EDF; Case map
+ 1EE0; 1EE1; Case map
+ 1EE2; 1EE3; Case map
+ 1EE4; 1EE5; Case map
+ 1EE6; 1EE7; Case map
+ 1EE8; 1EE9; Case map
+ 1EEA; 1EEB; Case map
+ 1EEC; 1EED; Case map
+ 1EEE; 1EEF; Case map
+ 1EF0; 1EF1; Case map
+ 1EF2; 1EF3; Case map
+ 1EF4; 1EF5; Case map
+ 1EF6; 1EF7; Case map
+ 1EF8; 1EF9; Case map
+ 1F08; 1F00; Case map
+ 1F09; 1F01; Case map
+ 1F0A; 1F02; Case map
+ 1F0B; 1F03; Case map
+ 1F0C; 1F04; Case map
+ 1F0D; 1F05; Case map
+ 1F0E; 1F06; Case map
+ 1F0F; 1F07; Case map
+ 1F18; 1F10; Case map
+ 1F19; 1F11; Case map
+ 1F1A; 1F12; Case map
+ 1F1B; 1F13; Case map
+ 1F1C; 1F14; Case map
+ 1F1D; 1F15; Case map
+ 1F28; 1F20; Case map
+ 1F29; 1F21; Case map
+ 1F2A; 1F22; Case map
+ 1F2B; 1F23; Case map
+ 1F2C; 1F24; Case map
+ 1F2D; 1F25; Case map
+ 1F2E; 1F26; Case map
+ 1F2F; 1F27; Case map
+ 1F38; 1F30; Case map
+ 1F39; 1F31; Case map
+ 1F3A; 1F32; Case map
+ 1F3B; 1F33; Case map
+ 1F3C; 1F34; Case map
+ 1F3D; 1F35; Case map
+ 1F3E; 1F36; Case map
+ 1F3F; 1F37; Case map
+ 1F48; 1F40; Case map
+ 1F49; 1F41; Case map
+ 1F4A; 1F42; Case map
+ 1F4B; 1F43; Case map
+ 1F4C; 1F44; Case map
+ 1F4D; 1F45; Case map
+ 1F50; 03C5 0313; Case map
+ 1F52; 03C5 0313 0300; Case map
+ 1F54; 03C5 0313 0301; Case map
+ 1F56; 03C5 0313 0342; Case map
+ 1F59; 1F51; Case map
+ 1F5B; 1F53; Case map
+ 1F5D; 1F55; Case map
+ 1F5F; 1F57; Case map
+ 1F68; 1F60; Case map
+ 1F69; 1F61; Case map
+ 1F6A; 1F62; Case map
+ 1F6B; 1F63; Case map
+ 1F6C; 1F64; Case map
+ 1F6D; 1F65; Case map
+ 1F6E; 1F66; Case map
+ 1F6F; 1F67; Case map
+ 1F80; 1F00 03B9; Case map
+ 1F81; 1F01 03B9; Case map
+ 1F82; 1F02 03B9; Case map
+ 1F83; 1F03 03B9; Case map
+ 1F84; 1F04 03B9; Case map
+ 1F85; 1F05 03B9; Case map
+ 1F86; 1F06 03B9; Case map
+ 1F87; 1F07 03B9; Case map
+ 1F88; 1F00 03B9; Case map
+ 1F89; 1F01 03B9; Case map
+ 1F8A; 1F02 03B9; Case map
+ 1F8B; 1F03 03B9; Case map
+ 1F8C; 1F04 03B9; Case map
+ 1F8D; 1F05 03B9; Case map
+ 1F8E; 1F06 03B9; Case map
+ 1F8F; 1F07 03B9; Case map
+ 1F90; 1F20 03B9; Case map
+ 1F91; 1F21 03B9; Case map
+ 1F92; 1F22 03B9; Case map
+ 1F93; 1F23 03B9; Case map
+ 1F94; 1F24 03B9; Case map
+ 1F95; 1F25 03B9; Case map
+ 1F96; 1F26 03B9; Case map
+ 1F97; 1F27 03B9; Case map
+ 1F98; 1F20 03B9; Case map
+ 1F99; 1F21 03B9; Case map
+ 1F9A; 1F22 03B9; Case map
+ 1F9B; 1F23 03B9; Case map
+ 1F9C; 1F24 03B9; Case map
+ 1F9D; 1F25 03B9; Case map
+ 1F9E; 1F26 03B9; Case map
+ 1F9F; 1F27 03B9; Case map
+ 1FA0; 1F60 03B9; Case map
+ 1FA1; 1F61 03B9; Case map
+ 1FA2; 1F62 03B9; Case map
+ 1FA3; 1F63 03B9; Case map
+ 1FA4; 1F64 03B9; Case map
+ 1FA5; 1F65 03B9; Case map
+ 1FA6; 1F66 03B9; Case map
+ 1FA7; 1F67 03B9; Case map
+ 1FA8; 1F60 03B9; Case map
+ 1FA9; 1F61 03B9; Case map
+ 1FAA; 1F62 03B9; Case map
+ 1FAB; 1F63 03B9; Case map
+ 1FAC; 1F64 03B9; Case map
+ 1FAD; 1F65 03B9; Case map
+ 1FAE; 1F66 03B9; Case map
+ 1FAF; 1F67 03B9; Case map
+ 1FB2; 1F70 03B9; Case map
+ 1FB3; 03B1 03B9; Case map
+ 1FB4; 03AC 03B9; Case map
+ 1FB6; 03B1 0342; Case map
+ 1FB7; 03B1 0342 03B9; Case map
+ 1FB8; 1FB0; Case map
+ 1FB9; 1FB1; Case map
+ 1FBA; 1F70; Case map
+ 1FBB; 1F71; Case map
+ 1FBC; 03B1 03B9; Case map
+ 1FBE; 03B9; Case map
+ 1FC2; 1F74 03B9; Case map
+ 1FC3; 03B7 03B9; Case map
+ 1FC4; 03AE 03B9; Case map
+ 1FC6; 03B7 0342; Case map
+ 1FC7; 03B7 0342 03B9; Case map
+ 1FC8; 1F72; Case map
+ 1FC9; 1F73; Case map
+ 1FCA; 1F74; Case map
+ 1FCB; 1F75; Case map
+ 1FCC; 03B7 03B9; Case map
+ 1FD2; 03B9 0308 0300; Case map
+ 1FD3; 03B9 0308 0301; Case map
+ 1FD6; 03B9 0342; Case map
+ 1FD7; 03B9 0308 0342; Case map
+ 1FD8; 1FD0; Case map
+ 1FD9; 1FD1; Case map
+ 1FDA; 1F76; Case map
+ 1FDB; 1F77; Case map
+ 1FE2; 03C5 0308 0300; Case map
+ 1FE3; 03C5 0308 0301; Case map
+ 1FE4; 03C1 0313; Case map
+ 1FE6; 03C5 0342; Case map
+ 1FE7; 03C5 0308 0342; Case map
+ 1FE8; 1FE0; Case map
+ 1FE9; 1FE1; Case map
+ 1FEA; 1F7A; Case map
+ 1FEB; 1F7B; Case map
+ 1FEC; 1FE5; Case map
+ 1FF2; 1F7C 03B9; Case map
+ 1FF3; 03C9 03B9; Case map
+ 1FF4; 03CE 03B9; Case map
+ 1FF6; 03C9 0342; Case map
+ 1FF7; 03C9 0342 03B9; Case map
+ 1FF8; 1F78; Case map
+ 1FF9; 1F79; Case map
+ 1FFA; 1F7C; Case map
+ 1FFB; 1F7D; Case map
+ 1FFC; 03C9 03B9; Case map
+ 2126; 03C9; Case map
+ 212A; 006B; Case map
+ 212B; 00E5; Case map
+ 2160; 2170; Case map
+ 2161; 2171; Case map
+ 2162; 2172; Case map
+ 2163; 2173; Case map
+ 2164; 2174; Case map
+ 2165; 2175; Case map
+ 2166; 2176; Case map
+ 2167; 2177; Case map
+ 2168; 2178; Case map
+ 2169; 2179; Case map
+ 216A; 217A; Case map
+ 216B; 217B; Case map
+ 216C; 217C; Case map
+ 216D; 217D; Case map
+ 216E; 217E; Case map
+ 216F; 217F; Case map
+ 24B6; 24D0; Case map
+ 24B7; 24D1; Case map
+ 24B8; 24D2; Case map
+ 24B9; 24D3; Case map
+ 24BA; 24D4; Case map
+ 24BB; 24D5; Case map
+ 24BC; 24D6; Case map
+ 24BD; 24D7; Case map
+ 24BE; 24D8; Case map
+ 24BF; 24D9; Case map
+ 24C0; 24DA; Case map
+ 24C1; 24DB; Case map
+ 24C2; 24DC; Case map
+ 24C3; 24DD; Case map
+ 24C4; 24DE; Case map
+ 24C5; 24DF; Case map
+ 24C6; 24E0; Case map
+ 24C7; 24E1; Case map
+ 24C8; 24E2; Case map
+ 24C9; 24E3; Case map
+ 24CA; 24E4; Case map
+ 24CB; 24E5; Case map
+ 24CC; 24E6; Case map
+ 24CD; 24E7; Case map
+ 24CE; 24E8; Case map
+ 24CF; 24E9; Case map
+ FB00; 0066 0066; Case map
+ FB01; 0066 0069; Case map
+ FB02; 0066 006C; Case map
+ FB03; 0066 0066 0069; Case map
+ FB04; 0066 0066 006C; Case map
+ FB05; 0073 0074; Case map
+ FB06; 0073 0074; Case map
+ FB13; 0574 0576; Case map
+ FB14; 0574 0565; Case map
+ FB15; 0574 056B; Case map
+ FB16; 057E 0576; Case map
+ FB17; 0574 056D; Case map
+ FF21; FF41; Case map
+ FF22; FF42; Case map
+ FF23; FF43; Case map
+ FF24; FF44; Case map
+ FF25; FF45; Case map
+ FF26; FF46; Case map
+ FF27; FF47; Case map
+ FF28; FF48; Case map
+ FF29; FF49; Case map
+ FF2A; FF4A; Case map
+ FF2B; FF4B; Case map
+ FF2C; FF4C; Case map
+ FF2D; FF4D; Case map
+ FF2E; FF4E; Case map
+ FF2F; FF4F; Case map
+ FF30; FF50; Case map
+ FF31; FF51; Case map
+ FF32; FF52; Case map
+ FF33; FF53; Case map
+ FF34; FF54; Case map
+ FF35; FF55; Case map
+ FF36; FF56; Case map
+ FF37; FF57; Case map
+ FF38; FF58; Case map
+ FF39; FF59; Case map
+ FF3A; FF5A; Case map
+ 10400; 10428; Case map
+ 10401; 10429; Case map
+ 10402; 1042A; Case map
+ 10403; 1042B; Case map
+ 10404; 1042C; Case map
+ 10405; 1042D; Case map
+ 10406; 1042E; Case map
+ 10407; 1042F; Case map
+ 10408; 10430; Case map
+ 10409; 10431; Case map
+ 1040A; 10432; Case map
+ 1040B; 10433; Case map
+ 1040C; 10434; Case map
+ 1040D; 10435; Case map
+ 1040E; 10436; Case map
+ 1040F; 10437; Case map
+ 10410; 10438; Case map
+ 10411; 10439; Case map
+ 10412; 1043A; Case map
+ 10413; 1043B; Case map
+ 10414; 1043C; Case map
+ 10415; 1043D; Case map
+ 10416; 1043E; Case map
+ 10417; 1043F; Case map
+ 10418; 10440; Case map
+ 10419; 10441; Case map
+ 1041A; 10442; Case map
+ 1041B; 10443; Case map
+ 1041C; 10444; Case map
+ 1041D; 10445; Case map
+ 1041E; 10446; Case map
+ 1041F; 10447; Case map
+ 10420; 10448; Case map
+ 10421; 10449; Case map
+ 10422; 1044A; Case map
+ 10423; 1044B; Case map
+ 10424; 1044C; Case map
+ 10425; 1044D; Case map
+ ----- End Table B.3 -----
+
+ ----- Start Table C.1.1 -----
+ 0020; SPACE
+ ----- End Table C.1.1 -----
+
+ ----- Start Table C.1.2 -----
+ 00A0; NO-BREAK SPACE
+ 1680; OGHAM SPACE MARK
+ 2000; EN QUAD
+ 2001; EM QUAD
+ 2002; EN SPACE
+ 2003; EM SPACE
+ 2004; THREE-PER-EM SPACE
+ 2005; FOUR-PER-EM SPACE
+ 2006; SIX-PER-EM SPACE
+ 2007; FIGURE SPACE
+ 2008; PUNCTUATION SPACE
+ 2009; THIN SPACE
+ 200A; HAIR SPACE
+ 200B; ZERO WIDTH SPACE
+ 202F; NARROW NO-BREAK SPACE
+ 205F; MEDIUM MATHEMATICAL SPACE
+ 3000; IDEOGRAPHIC SPACE
+ ----- End Table C.1.2 -----
+
+ ----- Start Table C.2.1 -----
+ 0000-001F; [CONTROL CHARACTERS]
+ 007F; DELETE
+ ----- End Table C.2.1 -----
+
+ ----- Start Table C.2.2 -----
+ 0080-009F; [CONTROL CHARACTERS]
+ 06DD; ARABIC END OF AYAH
+ 070F; SYRIAC ABBREVIATION MARK
+ 180E; MONGOLIAN VOWEL SEPARATOR
+ 200C; ZERO WIDTH NON-JOINER
+ 200D; ZERO WIDTH JOINER
+ 2028; LINE SEPARATOR
+ 2029; PARAGRAPH SEPARATOR
+ 2060; WORD JOINER
+ 2061; FUNCTION APPLICATION
+ 2062; INVISIBLE TIMES
+ 2063; INVISIBLE SEPARATOR
+ 206A-206F; [CONTROL CHARACTERS]
+ FEFF; ZERO WIDTH NO-BREAK SPACE
+ FFF9-FFFC; [CONTROL CHARACTERS]
+ 1D173-1D17A; [MUSICAL CONTROL CHARACTERS]
+ ----- End Table C.2.2 -----
+
+ ----- Start Table C.3 -----
+ E000-F8FF; [PRIVATE USE, PLANE 0]
+ F0000-FFFFD; [PRIVATE USE, PLANE 15]
+ 100000-10FFFD; [PRIVATE USE, PLANE 16]
+ ----- End Table C.3 -----
+
+ ----- Start Table C.4 -----
+ FDD0-FDEF; [NONCHARACTER CODE POINTS]
+ FFFE-FFFF; [NONCHARACTER CODE POINTS]
+ 1FFFE-1FFFF; [NONCHARACTER CODE POINTS]
+ 2FFFE-2FFFF; [NONCHARACTER CODE POINTS]
+ 3FFFE-3FFFF; [NONCHARACTER CODE POINTS]
+ 4FFFE-4FFFF; [NONCHARACTER CODE POINTS]
+ 5FFFE-5FFFF; [NONCHARACTER CODE POINTS]
+ 6FFFE-6FFFF; [NONCHARACTER CODE POINTS]
+ 7FFFE-7FFFF; [NONCHARACTER CODE POINTS]
+ 8FFFE-8FFFF; [NONCHARACTER CODE POINTS]
+ 9FFFE-9FFFF; [NONCHARACTER CODE POINTS]
+ AFFFE-AFFFF; [NONCHARACTER CODE POINTS]
+ BFFFE-BFFFF; [NONCHARACTER CODE POINTS]
+ CFFFE-CFFFF; [NONCHARACTER CODE POINTS]
+ DFFFE-DFFFF; [NONCHARACTER CODE POINTS]
+ EFFFE-EFFFF; [NONCHARACTER CODE POINTS]
+ FFFFE-FFFFF; [NONCHARACTER CODE POINTS]
+ 10FFFE-10FFFF; [NONCHARACTER CODE POINTS]
+ ----- End Table C.4 -----
+
+ ----- Start Table C.5 -----
+ D800-DFFF; [SURROGATE CODES]
+ ----- End Table C.5 -----
+
+ ----- Start Table C.6 -----
+ FFF9; INTERLINEAR ANNOTATION ANCHOR
+ FFFA; INTERLINEAR ANNOTATION SEPARATOR
+ FFFB; INTERLINEAR ANNOTATION TERMINATOR
+ FFFC; OBJECT REPLACEMENT CHARACTER
+ FFFD; REPLACEMENT CHARACTER
+ ----- End Table C.6 -----
+
+ ----- Start Table C.7 -----
+ 2FF0-2FFB; [IDEOGRAPHIC DESCRIPTION CHARACTERS]
+ ----- End Table C.7 -----
+
+ ----- Start Table C.8 -----
+ 0340; COMBINING GRAVE TONE MARK
+ 0341; COMBINING ACUTE TONE MARK
+ 200E; LEFT-TO-RIGHT MARK
+ 200F; RIGHT-TO-LEFT MARK
+ 202A; LEFT-TO-RIGHT EMBEDDING
+ 202B; RIGHT-TO-LEFT EMBEDDING
+ 202C; POP DIRECTIONAL FORMATTING
+ 202D; LEFT-TO-RIGHT OVERRIDE
+ 202E; RIGHT-TO-LEFT OVERRIDE
+ 206A; INHIBIT SYMMETRIC SWAPPING
+ 206B; ACTIVATE SYMMETRIC SWAPPING
+ 206C; INHIBIT ARABIC FORM SHAPING
+ 206D; ACTIVATE ARABIC FORM SHAPING
+ 206E; NATIONAL DIGIT SHAPES
+ 206F; NOMINAL DIGIT SHAPES
+ ----- End Table C.8 -----
+
+ ----- Start Table C.9 -----
+ E0001; LANGUAGE TAG
+ E0020-E007F; [TAGGING CHARACTERS]
+ ----- End Table C.9 -----
+
+ ----- Start Table D.1 -----
+ 05BE
+ 05C0
+ 05C3
+ 05D0-05EA
+ 05F0-05F4
+ 061B
+ 061F
+ 0621-063A
+ 0640-064A
+ 066D-066F
+ 0671-06D5
+ 06DD
+ 06E5-06E6
+ 06FA-06FE
+ 0700-070D
+ 0710
+ 0712-072C
+ 0780-07A5
+ 07B1
+ 200F
+ FB1D
+ FB1F-FB28
+ FB2A-FB36
+ FB38-FB3C
+ FB3E
+ FB40-FB41
+ FB43-FB44
+ FB46-FBB1
+ FBD3-FD3D
+ FD50-FD8F
+ FD92-FDC7
+ FDF0-FDFC
+ FE70-FE74
+ FE76-FEFC
+ ----- End Table D.1 -----
+
+ ----- Start Table D.2 -----
+ 0041-005A
+ 0061-007A
+ 00AA
+ 00B5
+ 00BA
+ 00C0-00D6
+ 00D8-00F6
+ 00F8-0220
+ 0222-0233
+ 0250-02AD
+ 02B0-02B8
+ 02BB-02C1
+ 02D0-02D1
+ 02E0-02E4
+ 02EE
+ 037A
+ 0386
+ 0388-038A
+ 038C
+ 038E-03A1
+ 03A3-03CE
+ 03D0-03F5
+ 0400-0482
+ 048A-04CE
+ 04D0-04F5
+ 04F8-04F9
+ 0500-050F
+ 0531-0556
+ 0559-055F
+ 0561-0587
+ 0589
+ 0903
+ 0905-0939
+ 093D-0940
+ 0949-094C
+ 0950
+ 0958-0961
+ 0964-0970
+ 0982-0983
+ 0985-098C
+ 098F-0990
+ 0993-09A8
+ 09AA-09B0
+ 09B2
+ 09B6-09B9
+ 09BE-09C0
+ 09C7-09C8
+ 09CB-09CC
+ 09D7
+ 09DC-09DD
+ 09DF-09E1
+ 09E6-09F1
+ 09F4-09FA
+ 0A05-0A0A
+ 0A0F-0A10
+ 0A13-0A28
+ 0A2A-0A30
+ 0A32-0A33
+ 0A35-0A36
+ 0A38-0A39
+ 0A3E-0A40
+ 0A59-0A5C
+ 0A5E
+ 0A66-0A6F
+ 0A72-0A74
+ 0A83
+ 0A85-0A8B
+ 0A8D
+ 0A8F-0A91
+ 0A93-0AA8
+ 0AAA-0AB0
+ 0AB2-0AB3
+ 0AB5-0AB9
+ 0ABD-0AC0
+ 0AC9
+ 0ACB-0ACC
+ 0AD0
+ 0AE0
+ 0AE6-0AEF
+ 0B02-0B03
+ 0B05-0B0C
+ 0B0F-0B10
+ 0B13-0B28
+ 0B2A-0B30
+ 0B32-0B33
+ 0B36-0B39
+ 0B3D-0B3E
+ 0B40
+ 0B47-0B48
+ 0B4B-0B4C
+ 0B57
+ 0B5C-0B5D
+ 0B5F-0B61
+ 0B66-0B70
+ 0B83
+ 0B85-0B8A
+ 0B8E-0B90
+ 0B92-0B95
+ 0B99-0B9A
+ 0B9C
+ 0B9E-0B9F
+ 0BA3-0BA4
+ 0BA8-0BAA
+ 0BAE-0BB5
+ 0BB7-0BB9
+ 0BBE-0BBF
+ 0BC1-0BC2
+ 0BC6-0BC8
+ 0BCA-0BCC
+ 0BD7
+ 0BE7-0BF2
+ 0C01-0C03
+ 0C05-0C0C
+ 0C0E-0C10
+ 0C12-0C28
+ 0C2A-0C33
+ 0C35-0C39
+ 0C41-0C44
+ 0C60-0C61
+ 0C66-0C6F
+ 0C82-0C83
+ 0C85-0C8C
+ 0C8E-0C90
+ 0C92-0CA8
+ 0CAA-0CB3
+ 0CB5-0CB9
+ 0CBE
+ 0CC0-0CC4
+ 0CC7-0CC8
+ 0CCA-0CCB
+ 0CD5-0CD6
+ 0CDE
+ 0CE0-0CE1
+ 0CE6-0CEF
+ 0D02-0D03
+ 0D05-0D0C
+ 0D0E-0D10
+ 0D12-0D28
+ 0D2A-0D39
+ 0D3E-0D40
+ 0D46-0D48
+ 0D4A-0D4C
+ 0D57
+ 0D60-0D61
+ 0D66-0D6F
+ 0D82-0D83
+ 0D85-0D96
+ 0D9A-0DB1
+ 0DB3-0DBB
+ 0DBD
+ 0DC0-0DC6
+ 0DCF-0DD1
+ 0DD8-0DDF
+ 0DF2-0DF4
+ 0E01-0E30
+ 0E32-0E33
+ 0E40-0E46
+ 0E4F-0E5B
+ 0E81-0E82
+ 0E84
+ 0E87-0E88
+ 0E8A
+ 0E8D
+ 0E94-0E97
+ 0E99-0E9F
+ 0EA1-0EA3
+ 0EA5
+ 0EA7
+ 0EAA-0EAB
+ 0EAD-0EB0
+ 0EB2-0EB3
+ 0EBD
+ 0EC0-0EC4
+ 0EC6
+ 0ED0-0ED9
+ 0EDC-0EDD
+ 0F00-0F17
+ 0F1A-0F34
+ 0F36
+ 0F38
+ 0F3E-0F47
+ 0F49-0F6A
+ 0F7F
+ 0F85
+ 0F88-0F8B
+ 0FBE-0FC5
+ 0FC7-0FCC
+ 0FCF
+ 1000-1021
+ 1023-1027
+ 1029-102A
+ 102C
+ 1031
+ 1038
+ 1040-1057
+ 10A0-10C5
+ 10D0-10F8
+ 10FB
+ 1100-1159
+ 115F-11A2
+ 11A8-11F9
+ 1200-1206
+ 1208-1246
+ 1248
+ 124A-124D
+ 1250-1256
+ 1258
+ 125A-125D
+ 1260-1286
+ 1288
+ 128A-128D
+ 1290-12AE
+ 12B0
+ 12B2-12B5
+ 12B8-12BE
+ 12C0
+ 12C2-12C5
+ 12C8-12CE
+ 12D0-12D6
+ 12D8-12EE
+ 12F0-130E
+ 1310
+ 1312-1315
+ 1318-131E
+ 1320-1346
+ 1348-135A
+ 1361-137C
+ 13A0-13F4
+ 1401-1676
+ 1681-169A
+ 16A0-16F0
+ 1700-170C
+ 170E-1711
+ 1720-1731
+ 1735-1736
+ 1740-1751
+ 1760-176C
+ 176E-1770
+ 1780-17B6
+ 17BE-17C5
+ 17C7-17C8
+ 17D4-17DA
+ 17DC
+ 17E0-17E9
+ 1810-1819
+ 1820-1877
+ 1880-18A8
+ 1E00-1E9B
+ 1EA0-1EF9
+ 1F00-1F15
+ 1F18-1F1D
+ 1F20-1F45
+ 1F48-1F4D
+ 1F50-1F57
+ 1F59
+ 1F5B
+ 1F5D
+ 1F5F-1F7D
+ 1F80-1FB4
+ 1FB6-1FBC
+ 1FBE
+ 1FC2-1FC4
+ 1FC6-1FCC
+ 1FD0-1FD3
+ 1FD6-1FDB
+ 1FE0-1FEC
+ 1FF2-1FF4
+ 1FF6-1FFC
+ 200E
+ 2071
+ 207F
+ 2102
+ 2107
+ 210A-2113
+ 2115
+ 2119-211D
+ 2124
+ 2126
+ 2128
+ 212A-212D
+ 212F-2131
+ 2133-2139
+ 213D-213F
+ 2145-2149
+ 2160-2183
+ 2336-237A
+ 2395
+ 249C-24E9
+ 3005-3007
+ 3021-3029
+ 3031-3035
+ 3038-303C
+ 3041-3096
+ 309D-309F
+ 30A1-30FA
+ 30FC-30FF
+ 3105-312C
+ 3131-318E
+ 3190-31B7
+ 31F0-321C
+ 3220-3243
+ 3260-327B
+ 327F-32B0
+ 32C0-32CB
+ 32D0-32FE
+ 3300-3376
+ 337B-33DD
+ 33E0-33FE
+ 3400-4DB5
+ 4E00-9FA5
+ A000-A48C
+ AC00-D7A3
+ D800-FA2D
+ FA30-FA6A
+ FB00-FB06
+ FB13-FB17
+ FF21-FF3A
+ FF41-FF5A
+ FF66-FFBE
+ FFC2-FFC7
+ FFCA-FFCF
+ FFD2-FFD7
+ FFDA-FFDC
+ 10300-1031E
+ 10320-10323
+ 10330-1034A
+ 10400-10425
+ 10428-1044D
+ 1D000-1D0F5
+ 1D100-1D126
+ 1D12A-1D166
+ 1D16A-1D172
+ 1D183-1D184
+ 1D18C-1D1A9
+ 1D1AE-1D1DD
+ 1D400-1D454
+ 1D456-1D49C
+ 1D49E-1D49F
+ 1D4A2
+ 1D4A5-1D4A6
+ 1D4A9-1D4AC
+ 1D4AE-1D4B9
+ 1D4BB
+ 1D4BD-1D4C0
+ 1D4C2-1D4C3
+ 1D4C5-1D505
+ 1D507-1D50A
+ 1D50D-1D514
+ 1D516-1D51C
+ 1D51E-1D539
+ 1D53B-1D53E
+ 1D540-1D544
+ 1D546
+ 1D54A-1D550
+ 1D552-1D6A3
+ 1D6A8-1D7C9
+ 20000-2A6D6
+ 2F800-2FA1D
+ F0000-FFFFD
+ 100000-10FFFD
+ ----- End Table D.2 -----
diff --git a/3rdparty/stringprep/stringprep.cpp b/3rdparty/stringprep/stringprep.cpp
new file mode 100644
index 00000000..d7f581ba
--- /dev/null
+++ b/3rdparty/stringprep/stringprep.cpp
@@ -0,0 +1,518 @@
+/* stringprep.c --- Core stringprep implementation.
+ Copyright (C) 2002-2016 Simon Josefsson
+
+ This file is part of GNU Libidn.
+
+ GNU Libidn is free software: you can redistribute it and/or
+ modify it under the terms of either:
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version.
+
+ or
+
+ * 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.
+
+ or both in parallel, as here.
+
+ GNU Libidn 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 copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see . */
+
+#include
+#include
+
+#include
+#include
+
+#include "qstringprep.h"
+
+static int _compare_table_element(const uint32_t *c, const Stringprep_table_element *e)
+{
+ if (*c < e->start)
+ return -1;
+ if (*c > e->end)
+ return 1;
+ return 0;
+}
+
+static std::ptrdiff_t stringprep_find_character_in_table(uint32_t ucs4, const Stringprep_table_element *table,
+ size_t table_size)
+{
+ /* This is where typical uses of Libidn spends very close to all CPU
+ time and causes most cache misses. One could easily do a binary
+ search instead. Before rewriting this, I want hard evidence this
+ slowness is at all relevant in typical applications. (I don't
+ dispute optimization may improve matters significantly, I'm
+ mostly interested in having someone give real-world benchmark on
+ the impact of libidn.)
+ *
+ * Answer (Tim Rühsen rockdaboot@gmx.de):
+ * Testing the fuzz corpora just once via make check takes ~54 billion CPU cycles.
+ * That is almost 20s on my Intel i3 3.1GHz !!!
+ * That even makes fuzzing almost useless, eating up CPU cycles for nothing.
+ *
+ * The bsearch() approach takes ~3 billion CPU cycles.
+ * Almost a factor of 20 faster (but still pretty slow).
+ * There are still ~2 million calls to bsearch() which make ~30% of CPU time used.
+ * Most time is spent in _g_utf8_normalize_wc().
+
+ std::ptrdiff_t i;
+
+ for (i = 0; table[i].start || table[i].end; i++)
+ if (ucs4 >= table[i].start &&
+ ucs4 <= (table[i].end ? table[i].end : table[i].start))
+ return i;
+ */
+
+ const Stringprep_table_element *p = static_cast(
+ bsearch(&ucs4, table, table_size, sizeof(Stringprep_table_element),
+ (int (*)(const void *, const void *))_compare_table_element));
+
+ return p ? (p - table) : -1;
+}
+
+static std::ptrdiff_t stringprep_find_string_in_table(uint *ucs4, size_t len, size_t *tablepos,
+ const Stringprep_table_element *table, size_t table_size)
+{
+ size_t j;
+ std::ptrdiff_t pos;
+
+ for (j = 0; j < len; j++)
+ if ((pos = stringprep_find_character_in_table(ucs4[j], table, table_size)) != -1) {
+ if (tablepos)
+ *tablepos = pos;
+ return j;
+ }
+
+ return -1;
+}
+
+static int stringprep_apply_table_to_string(QVector &ucs4, const Stringprep_table_element *table,
+ size_t table_size)
+{
+ std::ptrdiff_t pos;
+ size_t i, maplen;
+ uint32_t *src = ucs4.data(); /* points to unprocessed data */
+ size_t srclen = ucs4.size(); /* length of unprocessed data */
+
+ while ((pos = stringprep_find_string_in_table(src, srclen, &i, table, table_size)) != -1) {
+ for (maplen = STRINGPREP_MAX_MAP_CHARS; maplen > 0 && table[i].map[maplen - 1] == 0; maplen--)
+ ;
+
+ if (maplen > 1) {
+ ucs4.resize(ucs4.size() + int(maplen) - 1);
+ }
+
+ memmove(src + pos + maplen, src + pos + 1, sizeof(uint32_t) * (srclen - pos - 1));
+ memcpy(src + pos, table[i].map, sizeof(uint32_t) * maplen);
+ src += pos + maplen;
+ srclen -= pos + 1;
+ }
+
+ return STRINGPREP_OK;
+}
+
+#define INVERTED(x) ((x) & ((~0UL) >> 1))
+#define UNAPPLICAPLEFLAGS(flags, profileflags) \
+ ((!INVERTED(profileflags) && !(profileflags & flags) && profileflags) \
+ || (INVERTED(profileflags) && (profileflags & flags)))
+
+/**
+ * stringprep_4i:
+ * @ucs4: input/output array with string to prepare.
+ * @len: on input, length of input array with Unicode code points,
+ * on exit, length of output array with Unicode code points.
+ * @maxucs4len: maximum length of input/output array.
+ * @flags: a #Stringprep_profile_flags value, or 0.
+ * @profile: pointer to #Stringprep_profile to use.
+ *
+ * Prepare the input UCS-4 string according to the stringprep profile,
+ * and write back the result to the input string.
+ *
+ * The input is not required to be zero terminated (@ucs4[@len] = 0).
+ * The output will not be zero terminated unless @ucs4[@len] = 0.
+ * Instead, see stringprep_4zi() if your input is zero terminated or
+ * if you want the output to be.
+ *
+ * Since the stringprep operation can expand the string, @maxucs4len
+ * indicate how large the buffer holding the string is. This function
+ * will not read or write to code points outside that size.
+ *
+ * The @flags are one of #Stringprep_profile_flags values, or 0.
+ *
+ * The @profile contain the #Stringprep_profile instructions to
+ * perform. Your application can define new profiles, possibly
+ * re-using the generic stringprep tables that always will be part of
+ * the library, or use one of the currently supported profiles.
+ *
+ * Return value: Returns %STRINGPREP_OK iff successful, or an
+ * #Stringprep_rc error code.
+ **/
+int stringprep_4i(QString &input, Stringprep_profile_flags flags, const Stringprep_profile *profile)
+{
+ size_t i, j;
+ std::ptrdiff_t k;
+ QVector ucs4vector = input.toUcs4();
+ // size_t ucs4len = ucs4vector.size();
+ ucs4vector.reserve(ucs4vector.size() * 2); // to pass nfkc
+ // uint32_t *ucs4 = ucs4vector.data();
+ int rc;
+
+ for (i = 0; profile[i].operation; i++) {
+ switch (profile[i].operation) {
+ case STRINGPREP_NFKC:
+ if (UNAPPLICAPLEFLAGS(flags, profile[i].flags))
+ break;
+
+ if (flags & STRINGPREP_NO_NFKC && !profile[i].flags)
+ /* Profile requires NFKC, but callee asked for no NFKC. */
+ return STRINGPREP_FLAG_ERROR;
+
+ static_assert(sizeof(char32_t) == sizeof(uint));
+ ucs4vector = QString::fromUcs4(reinterpret_cast(ucs4vector.data()), ucs4vector.length())
+ .normalized(QString::NormalizationForm_KC)
+ .toUcs4();
+ break;
+
+ case STRINGPREP_PROHIBIT_TABLE:
+ k = stringprep_find_string_in_table(ucs4vector.data(), ucs4vector.length(), NULL, profile[i].table,
+ profile[i].table_size);
+ if (k != -1)
+ return STRINGPREP_CONTAINS_PROHIBITED;
+ break;
+
+ case STRINGPREP_UNASSIGNED_TABLE:
+ if (UNAPPLICAPLEFLAGS(flags, profile[i].flags))
+ break;
+ if (flags & STRINGPREP_NO_UNASSIGNED) {
+ k = stringprep_find_string_in_table(ucs4vector.data(), ucs4vector.length(), NULL, profile[i].table,
+ profile[i].table_size);
+ if (k != -1)
+ return STRINGPREP_CONTAINS_UNASSIGNED;
+ }
+ break;
+
+ case STRINGPREP_MAP_TABLE:
+ if (UNAPPLICAPLEFLAGS(flags, profile[i].flags))
+ break;
+ rc = stringprep_apply_table_to_string(ucs4vector, profile[i].table, profile[i].table_size);
+ if (rc != STRINGPREP_OK)
+ return rc;
+ break;
+
+ case STRINGPREP_BIDI_PROHIBIT_TABLE:
+ case STRINGPREP_BIDI_RAL_TABLE:
+ case STRINGPREP_BIDI_L_TABLE:
+ break;
+
+ case STRINGPREP_BIDI: {
+ int done_prohibited = 0;
+ int done_ral = 0;
+ int done_l = 0;
+ size_t contains_ral = SIZE_MAX;
+ size_t contains_l = SIZE_MAX;
+
+ for (j = 0; profile[j].operation; j++)
+ if (profile[j].operation == STRINGPREP_BIDI_PROHIBIT_TABLE) {
+ done_prohibited = 1;
+ k = stringprep_find_string_in_table(ucs4vector.data(), ucs4vector.length(), NULL, profile[j].table,
+ profile[j].table_size);
+ if (k != -1)
+ return STRINGPREP_BIDI_CONTAINS_PROHIBITED;
+ } else if (profile[j].operation == STRINGPREP_BIDI_RAL_TABLE) {
+ done_ral = 1;
+ if (stringprep_find_string_in_table(ucs4vector.data(), ucs4vector.length(), NULL, profile[j].table,
+ profile[j].table_size)
+ != -1)
+ contains_ral = j;
+ } else if (profile[j].operation == STRINGPREP_BIDI_L_TABLE) {
+ done_l = 1;
+ if (stringprep_find_string_in_table(ucs4vector.data(), ucs4vector.length(), NULL, profile[j].table,
+ profile[j].table_size)
+ != -1)
+ contains_l = j;
+ }
+
+ if (!done_prohibited || !done_ral || !done_l)
+ return STRINGPREP_PROFILE_ERROR;
+
+ if (contains_ral != SIZE_MAX && contains_l != SIZE_MAX)
+ return STRINGPREP_BIDI_BOTH_L_AND_RAL;
+
+ if (contains_ral != SIZE_MAX) {
+ if (!(stringprep_find_character_in_table(ucs4vector.first(), profile[contains_ral].table,
+ profile[contains_ral].table_size)
+ != -1
+ && stringprep_find_character_in_table(ucs4vector.last(), profile[contains_ral].table,
+ profile[contains_ral].table_size)
+ != -1))
+ return STRINGPREP_BIDI_LEADTRAIL_NOT_RAL;
+ }
+ } break;
+
+ default:
+ return STRINGPREP_PROFILE_ERROR;
+ break;
+ }
+ }
+
+ static_assert(sizeof(char32_t) == sizeof(uint));
+ input = QString::fromUcs4(reinterpret_cast(ucs4vector.data()), ucs4vector.size());
+
+ return STRINGPREP_OK;
+}
+
+/**
+ * stringprep:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ * @flags: a #Stringprep_profile_flags value, or 0.
+ * @profile: pointer to #Stringprep_profile to use.
+ *
+ * Prepare the input zero terminated UTF-8 string according to the
+ * stringprep profile, and write back the result to the input string.
+ *
+ * Note that you must convert strings entered in the systems locale
+ * into UTF-8 before using this function, see
+ * stringprep_locale_to_utf8().
+ *
+ * Since the stringprep operation can expand the string, @maxlen
+ * indicate how large the buffer holding the string is. This function
+ * will not read or write to characters outside that size.
+ *
+ * The @flags are one of #Stringprep_profile_flags values, or 0.
+ *
+ * The @profile contain the #Stringprep_profile instructions to
+ * perform. Your application can define new profiles, possibly
+ * re-using the generic stringprep tables that always will be part of
+ * the library, or use one of the currently supported profiles.
+ *
+ * Return value: Returns %STRINGPREP_OK iff successful, or an error code.
+ **/
+int stringprep(QString &input, Stringprep_profile_flags flags, const Stringprep_profile *profile)
+{
+ int rc = stringprep_4i(input, flags, profile);
+ if (rc != STRINGPREP_OK) {
+ return rc;
+ }
+
+ return STRINGPREP_OK;
+}
+
+/*! \mainpage GNU Internationalized Domain Name Library
+ *
+ * \section intro Introduction
+ *
+ * GNU Libidn is an implementation of the Stringprep, Punycode and IDNA
+ * specifications defined by the IETF Internationalized Domain Names
+ * (IDN) working group, used for internationalized domain names. The
+ * package is available under the GNU Lesser General Public License.
+ *
+ * The library contains a generic Stringprep implementation that does
+ * Unicode 3.2 NFKC normalization, mapping and prohibitation of
+ * characters, and bidirectional character handling. Profiles for
+ * Nameprep, iSCSI, SASL and XMPP are included. Punycode and ASCII
+ * Compatible Encoding (ACE) via IDNA are supported. A mechanism to
+ * define Top-Level Domain (TLD) specific validation tables, and to
+ * compare strings against those tables, is included. Default tables
+ * for some TLDs are also included.
+ *
+ * The Stringprep API consists of two main functions, one for
+ * converting data from the system's native representation into UTF-8,
+ * and one function to perform the Stringprep processing. Adding a
+ * new Stringprep profile for your application within the API is
+ * straightforward. The Punycode API consists of one encoding
+ * function and one decoding function. The IDNA API consists of the
+ * ToASCII and ToUnicode functions, as well as an high-level interface
+ * for converting entire domain names to and from the ACE encoded
+ * form. The TLD API consists of one set of functions to extract the
+ * TLD name from a domain string, one set of functions to locate the
+ * proper TLD table to use based on the TLD name, and core functions
+ * to validate a string against a TLD table, and some utility wrappers
+ * to perform all the steps in one call.
+ *
+ * The library is used by, e.g., GNU SASL and Shishi to process user
+ * names and passwords. Libidn can be built into GNU Libc to enable a
+ * new system-wide getaddrinfo() flag for IDN processing.
+ *
+ * Libidn is developed for the GNU/Linux system, but runs on over 20 Unix
+ * platforms (including Solaris, IRIX, AIX, and Tru64) and Windows.
+ * Libidn is written in C and (parts of) the API is accessible from C,
+ * C++, Emacs Lisp, Python and Java.
+ *
+ * The project web page:\n
+ * http://www.gnu.org/software/libidn/
+ *
+ * The software archive:\n
+ * ftp://alpha.gnu.org/pub/gnu/libidn/
+ *
+ * For more information see:\n
+ * http://www.ietf.org/html.charters/idn-charter.html\n
+ * http://www.ietf.org/rfc/rfc3454.txt (stringprep specification)\n
+ * http://www.ietf.org/rfc/rfc3490.txt (idna specification)\n
+ * http://www.ietf.org/rfc/rfc3491.txt (nameprep specification)\n
+ * http://www.ietf.org/rfc/rfc3492.txt (punycode specification)\n
+ * http://www.ietf.org/internet-drafts/draft-ietf-ips-iscsi-string-prep-04.txt\n
+ * http://www.ietf.org/internet-drafts/draft-ietf-krb-wg-utf8-profile-01.txt\n
+ * http://www.ietf.org/internet-drafts/draft-ietf-sasl-anon-00.txt\n
+ * http://www.ietf.org/internet-drafts/draft-ietf-sasl-saslprep-00.txt\n
+ * http://www.ietf.org/internet-drafts/draft-ietf-xmpp-nodeprep-01.txt\n
+ * http://www.ietf.org/internet-drafts/draft-ietf-xmpp-resourceprep-01.txt\n
+ *
+ * Further information and paid contract development:\n
+ * Simon Josefsson
+ *
+ * \section examples Examples
+ *
+ * \include example.c
+ * \include example3.c
+ * \include example4.c
+ * \include example5.c
+ */
+
+/**
+ * STRINGPREP_VERSION
+ *
+ * String defined via CPP denoting the header file version number.
+ * Used together with stringprep_check_version() to verify header file
+ * and run-time library consistency.
+ */
+
+/**
+ * STRINGPREP_MAX_MAP_CHARS
+ *
+ * Maximum number of code points that can replace a single code point,
+ * during stringprep mapping.
+ */
+
+/**
+ * Stringprep_rc:
+ * @STRINGPREP_OK: Successful operation. This value is guaranteed to
+ * always be zero, the remaining ones are only guaranteed to hold
+ * non-zero values, for logical comparison purposes.
+ * @STRINGPREP_CONTAINS_UNASSIGNED: String contain unassigned Unicode
+ * code points, which is forbidden by the profile.
+ * @STRINGPREP_CONTAINS_PROHIBITED: String contain code points
+ * prohibited by the profile.
+ * @STRINGPREP_BIDI_BOTH_L_AND_RAL: String contain code points with
+ * conflicting bidirection category.
+ * @STRINGPREP_BIDI_LEADTRAIL_NOT_RAL: Leading and trailing character
+ * in string not of proper bidirectional category.
+ * @STRINGPREP_BIDI_CONTAINS_PROHIBITED: Contains prohibited code
+ * points detected by bidirectional code.
+ * @STRINGPREP_TOO_SMALL_BUFFER: Buffer handed to function was too
+ * small. This usually indicate a problem in the calling
+ * application.
+ * @STRINGPREP_PROFILE_ERROR: The stringprep profile was inconsistent.
+ * This usually indicate an internal error in the library.
+ * @STRINGPREP_FLAG_ERROR: The supplied flag conflicted with profile.
+ * This usually indicate a problem in the calling application.
+ * @STRINGPREP_UNKNOWN_PROFILE: The supplied profile name was not
+ * known to the library.
+ * @STRINGPREP_ICONV_ERROR: Could not convert string in locale encoding.
+ * @STRINGPREP_NFKC_FAILED: The Unicode NFKC operation failed. This
+ * usually indicate an internal error in the library.
+ * @STRINGPREP_MALLOC_ERROR: The malloc() was out of memory. This is
+ * usually a fatal error.
+ *
+ * Enumerated return codes of stringprep(), stringprep_profile()
+ * functions (and macros using those functions). The value 0 is
+ * guaranteed to always correspond to success.
+ */
+
+/**
+ * Stringprep_profile_flags:
+ * @STRINGPREP_NO_NFKC: Disable the NFKC normalization, as well as
+ * selecting the non-NFKC case folding tables. Usually the profile
+ * specifies BIDI and NFKC settings, and applications should not
+ * override it unless in special situations.
+ * @STRINGPREP_NO_BIDI: Disable the BIDI step. Usually the profile
+ * specifies BIDI and NFKC settings, and applications should not
+ * override it unless in special situations.
+ * @STRINGPREP_NO_UNASSIGNED: Make the library return with an error if
+ * string contains unassigned characters according to profile.
+ *
+ * Stringprep profile flags.
+ */
+
+/**
+ * Stringprep_profile_steps:
+ * @STRINGPREP_NFKC: The NFKC step.
+ * @STRINGPREP_BIDI: The BIDI step.
+ * @STRINGPREP_MAP_TABLE: The MAP step.
+ * @STRINGPREP_UNASSIGNED_TABLE: The Unassigned step.
+ * @STRINGPREP_PROHIBIT_TABLE: The Prohibited step.
+ * @STRINGPREP_BIDI_PROHIBIT_TABLE: The BIDI-Prohibited step.
+ * @STRINGPREP_BIDI_RAL_TABLE: The BIDI-RAL step.
+ * @STRINGPREP_BIDI_L_TABLE: The BIDI-L step.
+ *
+ * Various steps in the stringprep algorithm. You really want to
+ * study the source code to understand this one. Only useful if you
+ * want to add another profile.
+ */
+
+/**
+ * stringprep_nameprep:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ *
+ * Prepare the input UTF-8 string according to the nameprep profile.
+ * The AllowUnassigned flag is true, use
+ * stringprep_nameprep_no_unassigned() if you want a false
+ * AllowUnassigned. Returns 0 iff successful, or an error code.
+ **/
+
+/**
+ * stringprep_nameprep_no_unassigned:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ *
+ * Prepare the input UTF-8 string according to the nameprep profile.
+ * The AllowUnassigned flag is false, use stringprep_nameprep() for
+ * true AllowUnassigned. Returns 0 iff successful, or an error code.
+ **/
+
+/**
+ * stringprep_iscsi:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ *
+ * Prepare the input UTF-8 string according to the draft iSCSI
+ * stringprep profile. Returns 0 iff successful, or an error code.
+ **/
+
+/**
+ * stringprep_plain:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ *
+ * Prepare the input UTF-8 string according to the draft SASL
+ * ANONYMOUS profile. Returns 0 iff successful, or an error code.
+ **/
+
+/**
+ * stringprep_xmpp_nodeprep:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ *
+ * Prepare the input UTF-8 string according to the draft XMPP node
+ * identifier profile. Returns 0 iff successful, or an error code.
+ **/
+
+/**
+ * stringprep_xmpp_resourceprep:
+ * @in: input/ouput array with string to prepare.
+ * @maxlen: maximum length of input/output array.
+ *
+ * Prepare the input UTF-8 string according to the draft XMPP resource
+ * identifier profile. Returns 0 iff successful, or an error code.
+ **/
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f716cf4c..1aab0947 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,125 +1,162 @@
+cmake_minimum_required(VERSION 3.10.0)
+
+project(iris
+ DESCRIPTION "XMPP network library"
+ LANGUAGES C CXX
+)
+
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release")
endif()
-project(iris)
-cmake_minimum_required(VERSION 3.1.0)
-
-if(POLICY CMP0071)
- cmake_policy(SET CMP0071 OLD)
-endif()
-if(POLICY CMP0074)
- cmake_policy(SET CMP0074 NEW)
+# Set 'd' prefix for Windows OS debug builds
+if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+ if(WIN32)
+ set(D "d")
+ elseif(APPLE)
+ set(D "_debug")
+ endif()
endif()
-set( IRIS_LIB_VERSION_MAJOR 1 )
-set( IRIS_LIB_VERSION_MINOR 0 )
-set( IRIS_LIB_VERSION_PATCH 0 )
-set( IRIS_LIB_VERSION_STRING
+# Check if Iris is a subproject
+get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)
+
+set(IRIS_LIB_VERSION_MAJOR 1)
+set(IRIS_LIB_VERSION_MINOR 0)
+set(IRIS_LIB_VERSION_PATCH 0)
+set(IRIS_LIB_VERSION_STRING
${IRIS_LIB_VERSION_MAJOR}.${IRIS_LIB_VERSION_MINOR}.${IRIS_LIB_VERSION_PATCH}
- )
+)
-set( CMAKE_MODULE_PATH
- "${CMAKE_MODULE_PATH}"
+list(APPEND CMAKE_MODULE_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
- "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules"
- "${PROJECT_SOURCE_DIR}/cmake/modules"
- "${PROJECT_SOURCE_DIR}/../cmake/modules"
- )
+ "${CMAKE_SOURCE_DIR}/cmake/modules"
+)
-option( USE_QJDNS "Use qjdns/jdns library. Disabled by default for Qt5" OFF )
-option( SEPARATE_QJDNS "Build qjdns with iris library" OFF )
+include(policyRules)
-set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_CXX_STANDARD 11)
+
+# Detect MXE cross-compilation
+set(IRIS_DEFAULT_BUNDLED_USRSCTP OFF)
+if(NOT DEFINED USE_MXE AND (EXISTS "${CMAKE_TOOLCHAIN_FILE}"))
+ option(USE_MXE "Use MXE (cross-compilation build environment for MS Windows)" OFF)
+ string(TOLOWER ${CMAKE_TOOLCHAIN_FILE} TOOLCHAIN_FILE)
+ string(REGEX MATCH "mxe-conf" MXE_DETECTED "${TOOLCHAIN_FILE}")
+ if(MXE_DETECTED)
+ message(STATUS "MXE environment detected")
+ message(STATUS "MXE toolchain: ${CMAKE_TOOLCHAIN_FILE}")
+ message(STATUS "MXE root path: ${CMAKE_PREFIX_PATH}")
+ set(USE_MXE ON)
+ set(IRIS_DEFAULT_BUNDLED_USRSCTP ON)
+ endif()
+endif()
-include_directories(${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
-include_directories(include/iris)
+set(IRIS_DEFAULT_BUNDLED_QCA OFF)
+if(APPLE OR (MSVC OR USE_MXE))
+ set(IRIS_DEFAULT_BUNDLED_QCA ON)
+endif()
-set(CMAKE_AUTOMOC ON)
+option(IRIS_ENABLE_INSTALL "Enable installation" ON)
+option(IRIS_ENABLE_JINGLE_SCTP "Enable SCTP over ICE Jingle transport / data channels" ON)
+option(IRIS_BUNDLED_QCA "Adds: DTLS, Blake2b and other useful for XMPP crypto-stuff" ${IRIS_DEFAULT_BUNDLED_QCA})
+option(IRIS_BUNDLED_USRSCTP "Compile compatible UsrSCTP lib (required for datachannel Jingle transport)" ${IRIS_DEFAULT_BUNDLED_USRSCTP})
+option(IRIS_BUILD_TOOLS "Build tools and examples" OFF)
+option(IRIS_ENABLE_DEBUG "Enable debugging code paths" OFF)
-find_package(Qt5 COMPONENTS Core Gui Xml Network REQUIRED)
-if(USE_QJDNS)
- message(WARNING "USE_QJDNS flag is enabled with Qt5. If you have problems with connection please disable this flag")
+set(IRIS_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR}/xmpp/iris)
+
+set(CMAKE_CXX_STANDARD 17)
+
+if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug" OR ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo"))
+ include(debug-definitions)
endif()
-if(USE_QJDNS)
- add_definitions(-DNEED_JDNS)
+if("${QT_DEFAULT_MAJOR_VERSION}" STREQUAL "")
+ set(QT_DEFAULT_MAJOR_VERSION 5)
endif()
-find_package(Qca REQUIRED)
-set(QCA_INCLUDES ${Qca_INCLUDE_DIR})
-set(qca_LIB ${Qca_LIBRARY})
+if(QT_DEFAULT_MAJOR_VERSION LESS 6)
+ find_package(Qt5 5.10 REQUIRED COMPONENTS Core Gui Xml Network)
+else()
+ find_package(Qt6 REQUIRED COMPONENTS Core Gui Xml Network)
+endif()
+message(STATUS "Qt${QT_DEFAULT_MAJOR_VERSION} found, version ${Qt${QT_DEFAULT_MAJOR_VERSION}Core_VERSION}")
-include_directories(
- ${QCA_INCLUDES}
-)
+# Find QCA package or use bundled if enabled
+include(IrisQCA)
-if(NOT USE_QJDNS AND SEPARATE_QJDNS)
- message(WARNING "SEPARATE_QJDNS flag enabled, but USE_QJDNS flag disabled. Both flags will be disabled")
- set(SEPARATE_QJDNS OFF)
-endif()
+set(STDINT_FOUND OFF)
+find_file(STDINT_INCLUDE stdint.h)
-if(USE_QJDNS AND (NOT SEPARATE_QJDNS))
- add_definitions(-DJDNS_STATIC)
- set(QJDns_LIBRARY qjdns)
- include_directories(
- src/jdns/include/jdns
- )
- set(jdns_SRCS
- src/jdns/src/jdns/jdns.c
- src/jdns/src/jdns/jdns_mdnsd.c
- src/jdns/src/jdns/jdns_packet.c
- src/jdns/src/jdns/jdns_sys.c
- src/jdns/src/jdns/jdns_util.c
- )
- set(jdns_PUBLIC_HEADERS
- src/jdns/include/jdns/jdns.h
- src/jdns/include/jdns/jdns_export.h
- )
- set(jdns_HEADERS
- src/jdns/src/jdns/jdns_packet.h
- src/jdns/src/jdns/jdns_mdnsd.h
- src/jdns/src/jdns/jdns_p.h
- )
- add_library(jdns STATIC ${jdns_SRCS} ${jdns_HEADERS} ${jdns_PUBLIC_HEADERS})
- if(WIN32)
- target_link_libraries(jdns ws2_32 advapi32)
- endif()
- set(qjdns_MOC_HDRS
- src/jdns/include/jdns/qjdns.h
- src/jdns/include/jdns/qjdnsshared.h
- src/jdns/src/qjdns/qjdns_p.h
- src/jdns/src/qjdns/qjdnsshared_p.h
- )
-
- qt_wrap_cpp(qjdns_MOC_SRCS ${qjdns_MOC_HDRS})
-
- set(qjdns_SRCS
- src/jdns/src/qjdns/qjdns.cpp
- src/jdns/src/qjdns/qjdns_sock.cpp
- src/jdns/src/qjdns/qjdnsshared.cpp
- )
-
- set(qjdns_PUBLIC_HEADERS
- src/jdns/include/jdns/qjdns.h
- src/jdns/include/jdns/qjdnsshared.h
- )
- set(qjdns_HEADERS
- src/jdns/src/qjdns/qjdns_sock.h
- )
- add_library(${QJDns_LIBRARY} STATIC ${qjdns_SRCS} ${qjdns_MOC_SRCS} ${qjdns_MOC_HDRS} ${qjdns_PUBLIC_HEADERS})
- target_link_libraries(${QJDns_LIBRARY} Qt5::Core Qt5::Network)
- target_link_libraries(${QJDns_LIBRARY} jdns)
-elseif(USE_QJDNS)
- set(QJDns_SUFFIX -qt5)
- find_package(QJDns REQUIRED)
- set(QJDns_LIBRARY ${QJDns_LIBRARY} PARENT_SCOPE)
- include_directories( ${QJDns_INCLUDE_DIR} )
+if(NOT ${STDINT_INCLUDE} STREQUAL "STDINT_INCLUDE-NOTFOUND")
+ message(STATUS "StdInt include found: ${STDINT_INCLUDE}")
+ set(STDINT_FOUND ON)
endif()
-find_package(IDN REQUIRED)
+# Find SCTP package or use bundled if enabled
+if(IRIS_ENABLE_JINGLE_SCTP)
+ include(IrisSCTP)
+endif()
-add_definitions(-DIRISNET_STATIC)
+if(NOT IRIS_BUNDLED_QCA)
+ find_package(B2 QUIET)
+ if(B2_FOUND)
+ message(STATUS "Found B2: ${B2_LIBRARY}")
+ endif()
+endif()
+add_subdirectory(3rdparty/stringprep)
add_subdirectory(src/irisnet)
add_subdirectory(src/xmpp)
+
+if(IRIS_BUILD_TOOLS)
+ if(NOT IRIS_BUNDLED_QCA)
+ message(FATAL_ERROR "Bundled Qca is needed to build tools")
+ endif()
+ add_subdirectory(tools)
+endif()
+
+if(NOT IS_SUBPROJECT)
+ include(fix-codestyle)
+endif()
+
+if(IRIS_ENABLE_INSTALL)
+ include(CMakePackageConfigHelpers)
+ include(GNUInstallDirs)
+
+ write_basic_package_version_file(
+ ${CMAKE_CURRENT_BINARY_DIR}/IrisConfigVersion.cmake
+ VERSION ${IRIS_LIB_VERSION_STRING}
+ COMPATIBILITY SameMajorVersion
+ )
+ configure_file(
+ iris.pc.in
+ ${CMAKE_CURRENT_BINARY_DIR}/iris.pc
+ @ONLY
+ )
+
+ install(TARGETS iris
+ EXPORT iris
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ )
+ install(EXPORT iris
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Iris
+ NAMESPACE iris::
+ FILE IrisConfig.cmake
+ )
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/IrisConfigVersion.cmake
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Iris
+ )
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/iris.pc
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
+ )
+
+ install(DIRECTORY include/iris
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/xmpp
+ FILES_MATCHING PATTERN "*.h"
+ )
+endif()
diff --git a/COPYING b/COPYING
index 5ab7695a..732811e4 100644
--- a/COPYING
+++ b/COPYING
@@ -500,5 +500,3 @@ necessary. Here is a sample; alter the names:
Ty Coon, President of Vice
That's all there is to it!
-
-
diff --git a/IrisConfigVersion.cmake.in b/IrisConfigVersion.cmake.in
index 2a2c2990..f7ec235a 100644
--- a/IrisConfigVersion.cmake.in
+++ b/IrisConfigVersion.cmake.in
@@ -1,9 +1,9 @@
set(PACKAGE_VERSION "@IRIS_LIB_VERSION_STRING@")
if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION)
set(PACKAGE_VERSION_EXACT TRUE)
-endif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION)
+endif()
if(NOT PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)
set(PACKAGE_VERSION_COMPATIBLE TRUE)
-else(NOT PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)
+else()
set(PACKAGE_VERSION_UNSUITABLE TRUE)
-endif(NOT PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)
+endif()
diff --git a/README.md b/README.md
index 2fc3ed76..fd19227e 100644
--- a/README.md
+++ b/README.md
@@ -31,13 +31,13 @@ Iris depends on Qt and QCA.
* Roster management
* Subscriptions
-* JEP extensions:
+* XEP extensions:
* Version/Time requests
* Service Discovery (disco, browse, and older ‘agents’ modes)
* Account registration
* Password changing
* Agent/Transport registration
- * VCards
+ * vCards
* Basic Groupchat
* OpenPGP capable
* S5B Direct Connections
diff --git a/TODO b/TODO
index 49de0c4d..6d522fd9 100644
--- a/TODO
+++ b/TODO
@@ -43,4 +43,3 @@ questions:
goal:
support xmpp-core for tcp/httpbind
xmpp-core should be "just another protocol"
-
diff --git a/cmake/modules/FindIDN.cmake b/cmake/modules/FindB2.cmake
similarity index 65%
rename from cmake/modules/FindIDN.cmake
rename to cmake/modules/FindB2.cmake
index ea3a9133..d712e9b2 100644
--- a/cmake/modules/FindIDN.cmake
+++ b/cmake/modules/FindB2.cmake
@@ -1,5 +1,5 @@
#=============================================================================
-# Copyright 2016-2017 Psi+ Project, Vitaly Tonkacheyev
+# Copyright (C) 2016-2020 Psi+ Project, Vitaly Tonkacheyev
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -28,53 +28,48 @@
if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND WIN32)
set(D "d")
endif()
-if( IDN_INCLUDE_DIR AND IDN_LIBRARY )
+if( B2_INCLUDE_DIR AND B2_LIBRARY )
# in cache already
- set(IDN_FIND_QUIETLY TRUE)
-endif( IDN_INCLUDE_DIR AND IDN_LIBRARY )
+ set(B2_FIND_QUIETLY TRUE)
+endif()
if( UNIX AND NOT( APPLE OR CYGWIN ) )
find_package( PkgConfig QUIET )
- pkg_check_modules( PC_IDN QUIET libidn )
- if( PC_IDN_FOUND )
- set( IDN_DEFINITIONS ${PC_IDN_CFLAGS} ${PC_IDN_CFLAGS_OTHER} )
- endif( PC_IDN_FOUND )
-endif( UNIX AND NOT( APPLE OR CYGWIN ) )
-
-set( IDN_ROOT "" CACHE STRING "Path to libidn library" )
+ pkg_check_modules( PC_B2 QUIET libb2 )
+ if( PC_B2_FOUND )
+ set( B2_DEFINITIONS ${PC_B2_CFLAGS} ${PC_B2_CFLAGS_OTHER} )
+ endif()
+endif()
find_path(
- IDN_INCLUDE_DIR idna.h
+ B2_INCLUDE_DIR blake2.h
HINTS
- ${IDN_ROOT}/include
- ${PC_IDN_INCLUDEDIR}
- ${PC_IDN_INCLUDE_DIRS}
+ ${B2_ROOT}/include
+ ${PC_B2_INCLUDEDIR}
+ ${PC_B2_INCLUDE_DIRS}
)
-set(IDN_NAMES
- idn${D}
- libidn${D}
- idn-11${D}
- libidn-11${D}
+set(B2_NAMES
+ b2${D}
)
find_library(
- IDN_LIBRARY
- NAMES ${IDN_NAMES}
+ B2_LIBRARY
+ NAMES ${B2_NAMES}
HINTS
- ${PC_IDN_LIBDIR}
- ${PC_IDN_LIBRARY_DIRS}
- ${IDN_ROOT}/lib
- ${IDN_ROOT}/bin
+ ${PC_B2_LIBDIR}
+ ${PC_B2_LIBRARY_DIRS}
+ ${B2_ROOT}/lib
+ ${B2_ROOT}/bin
)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
- IDN
+ B2
DEFAULT_MSG
- IDN_LIBRARY
- IDN_INCLUDE_DIR
+ B2_LIBRARY
+ B2_INCLUDE_DIR
)
-if( IDN_FOUND )
- set( IDN_LIBRARIES ${IDN_LIBRARY} )
- set( IDN_INCLUDE_DIRS ${IDN_INCLUDE_DIR} )
-endif( IDN_FOUND )
+if( B2_FOUND )
+ set( B2_LIBRARIES ${B2_LIBRARY} )
+ set( B2_INCLUDE_DIRS ${B2_INCLUDE_DIR} )
+endif()
-mark_as_advanced( IDN_INCLUDE_DIR IDN_LIBRARY )
+mark_as_advanced( B2_INCLUDE_DIR B2_LIBRARY )
diff --git a/cmake/modules/FindQJDns.cmake b/cmake/modules/FindQJDns.cmake
index 1b2359fd..941e9ece 100644
--- a/cmake/modules/FindQJDns.cmake
+++ b/cmake/modules/FindQJDns.cmake
@@ -1,5 +1,5 @@
#=============================================================================
-# Copyright 2016-2017 Psi+ Project
+# Copyright (C) 2016-2017 Psi+ Project
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -36,13 +36,13 @@ endif ()
if ( UNIX AND NOT( APPLE OR CYGWIN ) )
find_package( PkgConfig QUIET )
pkg_check_modules( PC_QJDns QUIET jdns )
- set ( QJDns_DEFINITIONS
+ set ( QJDns_DEFINITIONS
${PC_QJDns_CFLAGS}
${PC_QJDns_CFLAGS_OTHER}
)
endif ( UNIX AND NOT( APPLE OR CYGWIN ) )
-set ( LIBINCS
+set ( LIBINCS
qjdns.h
)
@@ -69,7 +69,7 @@ set(QJDns_NAMES
find_library(
QJDns_LIBRARY
NAMES ${QJDns_NAMES}
- HINTS
+ HINTS
${PC_QJDns_LIBDIR}
${PC_QJDns_LIBRARY_DIRS}
${QJDNS_DIR}/lib
diff --git a/cmake/modules/FindQca.cmake b/cmake/modules/FindQca.cmake
index a82ada09..55ac4932 100644
--- a/cmake/modules/FindQca.cmake
+++ b/cmake/modules/FindQca.cmake
@@ -1,5 +1,5 @@
#=============================================================================
-# Copyright 2016-2017 Psi+ Project, Vitaly Tonkacheyev
+# Copyright 2016-2020 Psi+ Project, Vitaly Tonkacheyev
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -31,13 +31,14 @@ endif()
if (Qca_INCLUDE_DIR AND Qca_LIBRARY)
# in cache already
set(Qca_FIND_QUIETLY TRUE)
-endif ()
+endif()
set(EXTRA_PATH_SUFFIXES
- qt5/Qca-qt5/QtCrypto
- Qca-qt5/QtCrypto
+ qt5/Qca-qt${QT_DEFAULT_MAJOR_VERSION}/QtCrypto
+ Qca-qt${QT_DEFAULT_MAJOR_VERSION}/QtCrypto
qt5/QtCrypto
- qt/Qca-qt5/QtCrypto
+ qt/Qca-qt${QT_DEFAULT_MAJOR_VERSION}/QtCrypto
+ lib/qca-qt${QT_DEFAULT_MAJOR_VERSION}.framework/Versions/2/Headers
)
find_path(
@@ -51,11 +52,12 @@ find_path(
find_library(
Qca_LIBRARY
- NAMES qca-qt5${D}
- HINTS
+ NAMES qca-qt${QT_DEFAULT_MAJOR_VERSION}${D}
+ HINTS
${QCA_DIR}/lib
${QCA_DIR}/bin
)
+
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
Qca
@@ -63,10 +65,10 @@ find_package_handle_standard_args(
Qca_LIBRARY
Qca_INCLUDE_DIR
)
+
if (Qca_FOUND)
set ( Qca_LIBRARIES ${Qca_LIBRARY} )
set ( Qca_INCLUDE_DIRS ${Qca_INCLUDE_DIR} )
-endif(Qca_FOUND)
+endif()
mark_as_advanced( Qca_INCLUDE_DIR Qca_LIBRARY )
-
diff --git a/cmake/modules/FindUsrSCTP.cmake b/cmake/modules/FindUsrSCTP.cmake
new file mode 100644
index 00000000..efc77ab6
--- /dev/null
+++ b/cmake/modules/FindUsrSCTP.cmake
@@ -0,0 +1,24 @@
+# Simple libnice cmake find
+
+if (NOT TARGET SctpLab::UsrSCTP)
+ #set(USRSCTP_DEFINITIONS INET INET6)
+ find_path(USRSCTP_INCLUDE usrsctp.h HINTS ${USRSCTP_INCLUDE_DIR} PATH_SUFFIXES usrsctp)
+ find_library(USRSCTP_LIBRARY NAMES usrsctp libusrsctp HINTS ${USRSCTP_LIB_DIR})
+
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(UsrSCTP DEFAULT_MSG USRSCTP_LIBRARY USRSCTP_INCLUDE)
+
+ mark_as_advanced(USRSCTP_INCLUDE USRSCTP_LIBRARY)
+
+ set(USRSCTP_LIBRARIES ${USRSCTP_LIBRARY})
+ set(USRSCTP_INCLUDES ${USRSCTP_INCLUDE})
+
+ if (UsrSCTP_FOUND)
+ add_library(SctpLab::UsrSCTP UNKNOWN IMPORTED)
+ set_target_properties(SctpLab::UsrSCTP PROPERTIES
+ IMPORTED_LOCATION "${USRSCTP_LIBRARY}"
+ INTERFACE_COMPILE_DEFINITIONS "${USRSCTP_DEFINITIONS}"
+ INTERFACE_INCLUDE_DIRECTORIES "${USRSCTP_INCLUDES}"
+ IMPORTED_LINK_INTERFACE_LANGUAGES "C")
+ endif ()
+endif ()
diff --git a/cmake/modules/IrisQCA.cmake b/cmake/modules/IrisQCA.cmake
new file mode 100644
index 00000000..e43b80fd
--- /dev/null
+++ b/cmake/modules/IrisQCA.cmake
@@ -0,0 +1,77 @@
+cmake_minimum_required(VERSION 3.10.0)
+
+set(IrisQCAGitRepo "https://github.com/psi-im/qca.git")
+
+if(IRIS_BUNDLED_QCA)
+ message(STATUS "QCA: using bundled")
+ set(QCA_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qca)
+ set(QCA_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/qca)
+ set(QCA_BUILD_DIR ${QCA_PREFIX}/build)
+ set(Qca_INCLUDE_DIR ${QCA_BUILD_DIR})
+ if(NOT EXISTS ${QCA_SOURCE_DIR})
+ list(APPEND Qca_INCLUDE_DIR ${QCA_PREFIX}/src/QcaProject/include/QtCrypto)
+ else()
+ list(APPEND Qca_INCLUDE_DIR ${QCA_SOURCE_DIR}/include/QtCrypto)
+ endif()
+ set(Qca_CORE_LIB ${QCA_BUILD_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}qca-qt${QT_DEFAULT_MAJOR_VERSION}${D}${CMAKE_STATIC_LIBRARY_SUFFIX})
+ set(Qca_OSSL_LIB ${QCA_BUILD_DIR}/lib/qca-qt${QT_DEFAULT_MAJOR_VERSION}/crypto/${CMAKE_STATIC_LIBRARY_PREFIX}qca-ossl${D}${CMAKE_STATIC_LIBRARY_SUFFIX})
+ set(Qca_LIBRARY ${Qca_OSSL_LIB} ${Qca_CORE_LIB})
+ if(APPLE)
+ set(COREFOUNDATION_LIBRARY "-framework CoreFoundation")
+ set(COREFOUNDATION_LIBRARY_SECURITY "-framework Security")
+ set(Qca_LIBRARY ${Qca_LIBRARY} ${COREFOUNDATION_LIBRARY} ${COREFOUNDATION_LIBRARY_SECURITY})
+ endif()
+ if(IS_SUBPROJECT)
+ set(Qca_LIBRARY_EXPORT ${Qca_LIBRARY} PARENT_SCOPE)
+ set(Qca_INCLUDE_DIR_EXPORT ${Qca_INCLUDE_DIR} PARENT_SCOPE)
+ endif()
+
+ if ("${OPENSSL_ROOT_DIR}" STREQUAL "" AND APPLE)
+ set(OPENSSL_ROOT_DIR /usr/local/opt/openssl)
+ endif()
+ find_package(OpenSSL REQUIRED)
+
+ include(ExternalProject)
+ #set CMake options and transfer the environment to an external project
+ set(QCA_BUILD_OPTIONS
+ -DBUILD_SHARED_LIBS=OFF -DBUILD_PLUGINS=ossl -DLOAD_SHARED_PLUGINS=OFF
+ -DBUILD_TESTS=OFF -DBUILD_TOOLS=OFF -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_INSTALL_PREFIX=${QCA_PREFIX} -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
+ -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
+ -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DOSX_FRAMEWORK=OFF)
+ if(QT_DEFAULT_MAJOR_VERSION LESS 6)
+ list(APPEND QCA_BUILD_OPTIONS -DBUILD_WITH_QT6=OFF)
+ else()
+ list(APPEND QCA_BUILD_OPTIONS -DBUILD_WITH_QT6=ON)
+ endif()
+ if (EXISTS ${QCA_SOURCE_DIR})
+ message(STATUS "QCA: found bundled sources")
+ ExternalProject_Add(QcaProject
+ PREFIX ${QCA_PREFIX}
+ BINARY_DIR ${QCA_BUILD_DIR}
+ SOURCE_DIR ${QCA_SOURCE_DIR}
+ CMAKE_ARGS ${QCA_BUILD_OPTIONS}
+ BUILD_BYPRODUCTS ${Qca_LIBRARY}
+ INSTALL_COMMAND ""
+ )
+ else()
+ include(FindGit)
+ find_package(Git)
+ if(NOT Git_FOUND)
+ message(FATAL_ERROR "Git not found! Bundled Qca needs Git utility.\nPlease set GIT_EXECUTABLE variable or add git to PATH")
+ endif()
+ ExternalProject_Add(QcaProject
+ PREFIX ${QCA_PREFIX}
+ BINARY_DIR ${QCA_BUILD_DIR}
+ GIT_REPOSITORY ${IrisQCAGitRepo}
+ CMAKE_ARGS ${QCA_BUILD_OPTIONS}
+ BUILD_BYPRODUCTS ${Qca_LIBRARY}
+ INSTALL_COMMAND ""
+ )
+ endif()
+else()
+ message(WARNING "Disabling IRIS_BUNDLED_QCA option makes impossible to use DTLS and PsiMedia")
+ message(STATUS "QCA: using system")
+ find_package(Qca REQUIRED)
+endif()
diff --git a/cmake/modules/IrisSCTP.cmake b/cmake/modules/IrisSCTP.cmake
new file mode 100644
index 00000000..42226968
--- /dev/null
+++ b/cmake/modules/IrisSCTP.cmake
@@ -0,0 +1,75 @@
+cmake_minimum_required(VERSION 3.10.0)
+
+set(IrisSCTPGitRepo "https://github.com/sctplab/usrsctp.git")
+
+if(USE_MXE AND STDINT_FOUND)
+ # Add SCTP_STDINT_INCLUDE definition to compile irisnet with usrsctp with MinGW
+ add_definitions(
+ -DSCTP_STDINT_INCLUDE="${STDINT_INCLUDE}"
+ )
+endif()
+
+if(NOT IRIS_BUNDLED_USRSCTP)
+ find_package(UsrSCTP)
+ if(NOT UsrSCTP_FOUND)
+ message(FATAL_ERROR "UsrSCTP library not found. Try to install usrsctp library or enable IRIS_BUNDLED_USRSCTP flag")
+ endif()
+else()
+ message(STATUS "USRSCTP: using bundled")
+ set(USRSCTP_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/usrsctp)
+ set(USRSCTP_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/usrsctp)
+ set(USRSCTP_BUILD_DIR ${USRSCTP_PREFIX}/build)
+ if(NOT EXISTS ${USRSCTP_SOURCE_DIR})
+ set(USRSCTP_INCLUDES ${USRSCTP_PREFIX}/src/UsrSCTPProject/usrsctplib)
+ else()
+ set(USRSCTP_INCLUDES ${USRSCTP_SOURCE_DIR}/usrsctplib)
+ endif()
+ set(USRSCTP_LIBRARY ${USRSCTP_BUILD_DIR}/usrsctplib/${CMAKE_STATIC_LIBRARY_PREFIX}usrsctp${CMAKE_STATIC_LIBRARY_SUFFIX})
+ if(WIN32 AND MSVC)
+ add_definitions(-DWIN32_LEAN_AND_MEAN)
+ endif()
+
+ include(ExternalProject)
+ #set CMake options and transfer the environment to an external project
+ set(USRSCTP_BUILD_OPTIONS
+ -DBUILD_SHARED_LIBS=OFF -Dsctp_build_programs=OFF -Dsctp_build_shared_lib=OFF -Dsctp_debug=OFF
+ -Dsctp_inet=OFF -Dsctp_inet6=OFF -DCMAKE_INSTALL_PREFIX=${USRSCTP_PREFIX}
+ -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER})
+ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ list(APPEND USRSCTP_BUILD_OPTIONS -DCMAKE_C_FLAGS="-Wno-maybe-uninitialized")
+ endif()
+ if (EXISTS ${USRSCTP_SOURCE_DIR})
+ message(STATUS "USRSCTP: found bundled sources")
+ ExternalProject_Add(UsrSCTPProject
+ PREFIX ${USRSCTP_PREFIX}
+ BINARY_DIR ${USRSCTP_BUILD_DIR}
+ SOURCE_DIR ${USRSCTP_SOURCE_DIR}
+ CMAKE_ARGS ${USRSCTP_BUILD_OPTIONS}
+ BUILD_BYPRODUCTS ${USRSCTP_LIBRARY}
+ INSTALL_COMMAND ""
+ )
+ else()
+ include(FindGit)
+ find_package(Git)
+ if(NOT Git_FOUND)
+ message(FATAL_ERROR "Git not found! Bundled UsrSCTP needs Git utility.\nPlease set GIT_EXECUTABLE variable or add git to PATH")
+ endif()
+ ExternalProject_Add(UsrSCTPProject
+ PREFIX ${USRSCTP_PREFIX}
+ BINARY_DIR ${USRSCTP_BUILD_DIR}
+ GIT_REPOSITORY ${IrisSCTPGitRepo}
+ GIT_TAG a17109528c75d01f6372d5c30851a639684c6e99
+ CMAKE_ARGS ${USRSCTP_BUILD_OPTIONS}
+ BUILD_BYPRODUCTS ${USRSCTP_LIBRARY}
+ INSTALL_COMMAND ""
+ )
+ endif()
+ add_library(SctpLab::UsrSCTP UNKNOWN IMPORTED)
+ set_target_properties(SctpLab::UsrSCTP PROPERTIES
+ IMPORTED_LOCATION "${USRSCTP_LIBRARY}"
+ INTERFACE_COMPILE_DEFINITIONS "${USRSCTP_DEFINITIONS}"
+ IMPORTED_LINK_INTERFACE_LANGUAGES "C")
+ add_dependencies(SctpLab::UsrSCTP ${USRSCTP_LIBRARY})
+endif()
diff --git a/cmake/modules/debug-definitions.cmake b/cmake/modules/debug-definitions.cmake
new file mode 100644
index 00000000..21061873
--- /dev/null
+++ b/cmake/modules/debug-definitions.cmake
@@ -0,0 +1,41 @@
+cmake_minimum_required(VERSION 3.10.0)
+option(IRIS_NETNAMES_DEBUG "Add -DNETNAMES_DEBUG definition" OFF)
+option(IRIS_PSI_ENABLE_SCTP_DEBUG "Add -DPSI_ENABLE_SCTP_DEBUG definition" OFF)
+option(IRIS_ICE_DEBUG "Add -DICE_DEBUG definition" OFF)
+option(IRIS_PROX_DEBUG "Add -DPROX_DEBUG definition" OFF)
+option(IRIS_BS_DEBUG "Add -DBS_DEBUG definition" OFF)
+option(IRIS_S5B_DEBUG "Add -DS5B_DEBUG definition" OFF)
+option(IRIS_IBB_DEBUG "Add -DIBB_DEBUG definition" OFF)
+option(IRIS_SM_DEBUG "Add -DIRIS_SM_DEBUG definition" OFF)
+option(IRIS_XMPP_DEBUG "Add -DXMPP_DEBUG definition" OFF)
+option(IRIS_TESTDEBUG_H "Add -DTESTDEBUG_H definition" OFF)
+if(IRIS_NETNAMES_DEBUG)
+ add_definitions(-DNETNAMES_DEBUG)
+endif()
+if(IRIS_PSI_ENABLE_SCTP_DEBUG)
+ add_definitions(-DPSI_ENABLE_SCTP_DEBUG)
+endif()
+if(IRIS_ICE_DEBUG)
+ add_definitions(-DICE_DEBUG)
+endif()
+if(IRIS_PROX_DEBUG)
+ add_definitions(-DPROX_DEBUG)
+endif()
+if(IRIS_BS_DEBUG)
+ add_definitions(-DBS_DEBUG)
+endif()
+if(IRIS_S5B_DEBUG)
+ add_definitions(-DS5B_DEBUG)
+endif()
+if(IRIS_IBB_DEBUG)
+ add_definitions(-DIBB_DEBUG)
+endif()
+if(IRIS_SM_DEBUG)
+ add_definitions(-DIRIS_SM_DEBUG)
+endif()
+if(IRIS_XMPP_DEBUG)
+ add_definitions(-DXMPP_DEBUG)
+endif()
+if(IRIS_TESTDEBUG_H)
+ add_definitions(-DTESTDEBUG_H)
+endif()
diff --git a/cmake/modules/fix-codestyle.cmake b/cmake/modules/fix-codestyle.cmake
new file mode 100644
index 00000000..cff163ac
--- /dev/null
+++ b/cmake/modules/fix-codestyle.cmake
@@ -0,0 +1,31 @@
+cmake_minimum_required( VERSION 3.10.0 )
+
+#Find clang-format binary
+find_program(CLF_BIN clang-format DOC "Path to clang-format binary")
+if(CLF_BIN)
+ #Obtain list of source files
+ file(GLOB_RECURSE SRC_LIST
+ *.c
+ *.cc
+ *.cpp
+ *.hpp
+ *.h
+ *.mm
+ qcm/*.qcm
+ )
+ foreach(src_file ${SRC_LIST})
+ #Exclude libpsi
+ if("${src_file}" MATCHES ".*/jdns/.*")
+ list(REMOVE_ITEM SRC_LIST ${src_file})
+ endif()
+ endforeach()
+ add_custom_target(fix-codestyle
+ COMMAND ${CLF_BIN}
+ --verbose
+ -style=file
+ -i ${SRC_LIST}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ COMMENT "Fix codestyle with clang-format"
+ VERBATIM
+ )
+endif()
diff --git a/cmake/modules/policyRules.cmake b/cmake/modules/policyRules.cmake
new file mode 100644
index 00000000..081ab755
--- /dev/null
+++ b/cmake/modules/policyRules.cmake
@@ -0,0 +1,13 @@
+cmake_minimum_required( VERSION 3.10 )
+#Set automoc and autouic policy
+if(NOT POLICY_SET)
+ if(POLICY CMP0071)
+ cmake_policy(SET CMP0071 NEW)
+ message(STATUS "CMP0071 policy set to NEW")
+ endif()
+ if(POLICY CMP0074)
+ cmake_policy(SET CMP0074 NEW)
+ message(STATUS "CMP0074 policy set to NEW")
+ endif()
+ set(POLICY_SET ON)
+endif()
diff --git a/cmake_uninstall.cmake.in b/cmake_uninstall.cmake.in
index be7fbb2e..0585625e 100644
--- a/cmake_uninstall.cmake.in
+++ b/cmake_uninstall.cmake.in
@@ -1,6 +1,6 @@
if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
-endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+endif()
file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
string(REGEX REPLACE "\n" ";" files "${files}")
@@ -14,4 +14,4 @@ foreach(file ${files})
if(NOT "${rm_retval}" STREQUAL 0)
message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
endif(NOT "${rm_retval}" STREQUAL 0)
-endforeach(file)
+endforeach()
diff --git a/common.pri b/common.pri
deleted file mode 100644
index 99da6d0a..00000000
--- a/common.pri
+++ /dev/null
@@ -1,19 +0,0 @@
-# common stuff for iris.pro and iris.pri
-
-CONFIG -= c++11
-CONFIG += c++14
-
-# default build configuration
-!iris_build_pri {
- # build appledns on mac
- mac:CONFIG += appledns
-
- # bundle appledns inside of irisnetcore on mac
- mac:CONFIG += appledns_bundle
-
- # bundle irisnetcore inside of iris
- CONFIG += irisnetcore_bundle
-
- # don't build iris, app will include iris.pri
- #CONFIG += iris_bundle
-}
diff --git a/conf_win.pri.example b/conf_win.pri.example
deleted file mode 100644
index e80c1b35..00000000
--- a/conf_win.pri.example
+++ /dev/null
@@ -1,17 +0,0 @@
-load(winlocal.prf)
-
-# qca
-CONFIG += crypto
-
-# zlib
-INCLUDEPATH += $$WINLOCAL_PREFIX/include
-LIBS += -L$$WINLOCAL_PREFIX/lib
-
-# zlib may have a different lib name depending on how it was compiled
-win32-g++ {
- LIBS += -lz
-}
-else {
- LIBS += -lzlib # static
- #LIBS += -lzdll # dll
-}
diff --git a/confapp.pri b/confapp.pri
deleted file mode 100644
index 9febe572..00000000
--- a/confapp.pri
+++ /dev/null
@@ -1,6 +0,0 @@
-unix:exists(confapp_unix.pri):include(confapp_unix.pri)
-windows:exists(confapp_win.pri):include(confapp_win.pri)
-
-include(common.pri)
-
-mac:QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9
diff --git a/confapp_win.pri.example b/confapp_win.pri.example
deleted file mode 100644
index e80c1b35..00000000
--- a/confapp_win.pri.example
+++ /dev/null
@@ -1,17 +0,0 @@
-load(winlocal.prf)
-
-# qca
-CONFIG += crypto
-
-# zlib
-INCLUDEPATH += $$WINLOCAL_PREFIX/include
-LIBS += -L$$WINLOCAL_PREFIX/lib
-
-# zlib may have a different lib name depending on how it was compiled
-win32-g++ {
- LIBS += -lz
-}
-else {
- LIBS += -lzlib # static
- #LIBS += -lzdll # dll
-}
diff --git a/configure b/configure
deleted file mode 100755
index af0fcd87..00000000
--- a/configure
+++ /dev/null
@@ -1,2595 +0,0 @@
-#!/bin/sh
-#
-# Generated by qconf 2.0 ( http://delta.affinix.com/qconf/ )
-#
-
-show_usage() {
-cat </dev/null`
- if echo $WHICH | grep 'shell built-in command' >/dev/null 2>&1; then
- WHICH=which
- elif [ -z "$WHICH" ]; then
- if which which >/dev/null 2>&1; then
- WHICH=which
- else
- for a in /usr/ucb /usr/bin /bin /usr/local/bin; do
- if [ -x $a/which ]; then
- WHICH=$a/which
- break
- fi
- done
- fi
- fi
-
- RET_CODE=1
- if [ -z "$WHICH" ]; then
- OLD_IFS=$IFS
- IFS=:
- for a in $PATH; do
- if [ -x $a/$1 ]; then
- echo "$a/$1"
- RET_CODE=0
- [ -z "$ALL_MATCHES" ] && break
- fi
- done
- IFS=$OLD_IFS
- export IFS
- else
- a=`"$WHICH" "$ALL_MATCHES" "$1" 2>/dev/null`
- if [ ! -z "$a" -a -x "$a" ]; then
- echo "$a"
- RET_CODE=0
- fi
- fi
- HOME=$OLD_HOME
- export HOME
- return $RET_CODE
-}
-WHICH=which_command
-
-# find a make command
-if [ -z "$MAKE" ]; then
- MAKE=
- for mk in gmake make; do
- if $WHICH $mk >/dev/null 2>&1; then
- MAKE=`$WHICH $mk`
- break
- fi
- done
- if [ -z "$MAKE" ]; then
- echo "You don't seem to have 'make' or 'gmake' in your PATH."
- echo "Cannot proceed."
- exit 1
- fi
-fi
-
-show_qt_info() {
- printf "Be sure you have a proper Qt 4.0+ build environment set up. This means not\n"
- printf "just Qt, but also a C++ compiler, a make tool, and any other packages\n"
- printf "necessary for compiling C++ programs.\n"
- printf "\n"
- printf "If you are certain everything is installed, then it could be that Qt is not\n"
- printf "being recognized or that a different version of Qt is being detected by\n"
- printf "mistake (for example, this could happen if \$QTDIR is pointing to a Qt 3\n"
- printf "installation). At least one of the following conditions must be satisfied:\n"
- printf "\n"
- printf " 1) --qtdir is set to the location of Qt\n"
- printf " 2) \$QTDIR is set to the location of Qt\n"
- printf " 3) QtCore is in the pkg-config database\n"
- printf " 4) qmake is in the \$PATH\n"
- printf "\n"
- printf "This script will use the first one it finds to be true, checked in the above\n"
- printf "order. #3 and #4 are the recommended options. #1 and #2 are mainly for\n"
- printf "overriding the system configuration.\n"
- printf "\n"
-}
-
-while [ $# -gt 0 ]; do
- optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
- case "$1" in
- --qtdir=*)
- EX_QTDIR=$optarg
- shift
- ;;
-
- --static)
- QC_STATIC="Y"
- shift
- ;;
-
- --extraconf=*)
- QC_EXTRACONF=$optarg
- shift
- ;;
-
- --release)
- QC_RELEASE="Y"
- shift
- ;;
-
- --debug)
- QC_DEBUG="Y"
- shift
- ;;
-
- --debug-and-release)
- QC_DEBUG_AND_RELEASE="Y"
- shift
- ;;
-
- --no-separate-debug-info)
- QC_NO_SEPARATE_DEBUG_INFO="Y"
- shift
- ;;
-
- --separate-debug-info)
- QC_SEPARATE_DEBUG_INFO="Y"
- shift
- ;;
-
- --no-framework)
- QC_NO_FRAMEWORK="Y"
- shift
- ;;
-
- --framework)
- QC_FRAMEWORK="Y"
- shift
- ;;
-
- --universal)
- QC_UNIVERSAL="Y"
- shift
- ;;
-
- --mac-sdk=*)
- QC_MAC_SDK=$optarg
- shift
- ;;
-
- --enable-tests)
- QC_ENABLE_TESTS="Y"
- shift
- ;;
-
- --with-idn-inc=*)
- QC_WITH_IDN_INC=$optarg
- shift
- ;;
-
- --with-idn-lib=*)
- QC_WITH_IDN_LIB=$optarg
- shift
- ;;
-
- --with-qca-inc=*)
- QC_WITH_QCA_INC=$optarg
- shift
- ;;
-
- --with-qca-lib=*)
- QC_WITH_QCA_LIB=$optarg
- shift
- ;;
-
- --with-zlib-inc=*)
- QC_WITH_ZLIB_INC=$optarg
- shift
- ;;
-
- --with-zlib-lib=*)
- QC_WITH_ZLIB_LIB=$optarg
- shift
- ;;
-
- --with-qjdns-inc=*)
- QC_WITH_QJDNS_INC=$optarg
- shift
- ;;
-
- --with-qjdns-lib=*)
- QC_WITH_QJDNS_LIB=$optarg
- shift
- ;;
-
- --verbose)
- QC_VERBOSE="Y"
- shift
- ;;
- --qtselect=*)
- QC_QTSELECT="${optarg}"
- shift
- ;;
- --help) show_usage; exit ;;
- *) echo "configure: WARNING: unrecognized options: $1" >&2; shift; ;;
- esac
-done
-
-
-echo "Configuring Iris ..."
-
-if [ "$QC_VERBOSE" = "Y" ]; then
-echo
-echo EX_QTDIR=$EX_QTDIR
-echo QC_STATIC=$QC_STATIC
-echo QC_EXTRACONF=$QC_EXTRACONF
-echo QC_RELEASE=$QC_RELEASE
-echo QC_DEBUG=$QC_DEBUG
-echo QC_DEBUG_AND_RELEASE=$QC_DEBUG_AND_RELEASE
-echo QC_NO_SEPARATE_DEBUG_INFO=$QC_NO_SEPARATE_DEBUG_INFO
-echo QC_SEPARATE_DEBUG_INFO=$QC_SEPARATE_DEBUG_INFO
-echo QC_NO_FRAMEWORK=$QC_NO_FRAMEWORK
-echo QC_FRAMEWORK=$QC_FRAMEWORK
-echo QC_UNIVERSAL=$QC_UNIVERSAL
-echo QC_MAC_SDK=$QC_MAC_SDK
-echo QC_ENABLE_TESTS=$QC_ENABLE_TESTS
-echo QC_WITH_IDN_INC=$QC_WITH_IDN_INC
-echo QC_WITH_IDN_LIB=$QC_WITH_IDN_LIB
-echo QC_WITH_QCA_INC=$QC_WITH_QCA_INC
-echo QC_WITH_QCA_LIB=$QC_WITH_QCA_LIB
-echo QC_WITH_ZLIB_INC=$QC_WITH_ZLIB_INC
-echo QC_WITH_ZLIB_LIB=$QC_WITH_ZLIB_LIB
-echo QC_WITH_QJDNS_INC=$QC_WITH_QJDNS_INC
-echo QC_WITH_QJDNS_LIB=$QC_WITH_QJDNS_LIB
-echo
-fi
-
-printf "Verifying Qt build environment ... "
-
-if [ -z "$QC_QTSELECT" ]; then
- QC_QTSELECT="$(echo $QT_SELECT | tr -d "qt")"
-fi
-
-if [ ! -z "$QC_QTSELECT" ]; then
- QTSEARCHTEXT="$QC_QTSELECT"
-else
- QTSEARCHTEXT="4 or 5"
-fi
-
-# run qmake and check version
-qmake_check() {
- if [ -x "$1" ]; then
- cmd="\"$1\" -query QT_VERSION"
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo "running: $cmd"
- fi
- vout=`/bin/sh -c "$cmd" 2>&1`
- case "${vout}" in
- *.*.*)
- vmaj="${vout%%.*}"
- if [ ! -z "$QC_QTSELECT" ]; then
- if [ "$vmaj" = "$QC_QTSELECT" ]; then
- return 0
- fi
- else
- if [ "$vmaj" = "4" ] || [ "$vmaj" = "5" ]; then
- return 0
- fi
- fi
- ;;
- esac
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo "Warning: $1 not for Qt ${QTSEARCHTEXT}"
- fi
- fi
- return 1
-}
-
-if [ "$QC_VERBOSE" = "Y" ]; then
- echo
-fi
-
-qm=""
-qt4_names="qmake-qt4 qmake4"
-qt5_names="qmake-qt5 qmake5"
-names="qmake"
-if [ -z "$QC_QTSELECT" ]; then
- names="${qt5_names} ${qt4_names} $names"
-else
- if [ "$QC_QTSELECT" = "4" ]; then
- names="${qt4_names} $names"
- elif [ "$QC_QTSELECT" -ge "5" ]; then
- names="${qt5_names} $names"
- fi
-fi
-
-if [ -z "$qm" ] && [ ! -z "$EX_QTDIR" ]; then
- # qt4 check: --qtdir
- for n in $names; do
- qstr=$EX_QTDIR/bin/$n
- if qmake_check "$qstr"; then
- qm=$qstr
- break
- fi
- done
- if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
- echo "Warning: qmake not found via --qtdir"
- fi
-
-elif [ -z "$qm" ] && [ ! -z "$QTDIR" ]; then
- # qt4 check: QTDIR
- for n in $names; do
- qstr=$QTDIR/bin/$n
- if qmake_check "$qstr"; then
- qm=$qstr
- break
- fi
- done
- if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
- echo "Warning: qmake not found via \$QTDIR"
- fi
-
-else
- # Try all other implicit checks
-
- # qtchooser
- if [ -z "$qm" ]; then
- qtchooser=$($WHICH qtchooser 2>/dev/null)
- if [ ! -z "$qtchooser" ]; then
- if [ ! -z "$QC_QTSELECT" ]; then
- versions="$QC_QTSELECT"
- else
- cmd="$qtchooser --list-versions"
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo "running: $cmd"
- fi
- versions=`$cmd`
- fi
- for version in $versions; do
- cmd="$qtchooser -run-tool=qmake -qt=${version} -query QT_INSTALL_BINS"
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo "running: $cmd"
- fi
- qtbins=`$cmd 2>/dev/null`
- if [ ! -z "$qtbins" ] && qmake_check "$qtbins/qmake"; then
- qm="$qtbins/qmake"
- break
- fi
- done
- fi
- fi
- if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
- echo "Warning: qmake not found via qtchooser"
- fi
-
- # qt4: pkg-config
- if [ -z "$qm" ]; then
- cmd="pkg-config QtCore --variable=exec_prefix"
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo "running: $cmd"
- fi
- str=`$cmd 2>/dev/null`
- if [ ! -z "$str" ]; then
- for n in $names; do
- qstr=$str/bin/$n
- if qmake_check "$qstr"; then
- qm=$qstr
- break
- fi
- done
- fi
- fi
- if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
- echo "Warning: qmake not found via pkg-config"
- fi
-
- # qmake in PATH
- if [ -z "$qm" ]; then
- for n in $names; do
- qstr=`$WHICH -a $n 2>/dev/null`
- for q in $qstr; do
- if qmake_check "$q"; then
- qm="$q"
- break
- fi
- done
- if [ ! -z "$qm" ]; then
- break
- fi
- done
- fi
- if [ -z "$qm" ] && [ "$QC_VERBOSE" = "Y" ]; then
- echo "Warning: qmake not found via \$PATH"
- fi
-
- # end of implicit checks
-fi
-
-if [ -z "$qm" ]; then
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo " -> fail"
- else
- echo "fail"
- fi
- printf "\n"
- printf "Reason: Unable to find the 'qmake' tool for Qt ${QTSEARCHTEXT}.\n"
- printf "\n"
- show_qt_info
- exit 1;
-fi
-if [ "$QC_VERBOSE" = "Y" ]; then
- echo qmake found in "$qm"
-fi
-
-# try to determine the active makespec
-defmakespec=$QMAKESPEC
-if [ -z "$defmakespec" ]; then
- if $WHICH readlink >/dev/null 2>&1; then
- READLINK=`$WHICH readlink`
- fi
- if [ ! -z "$READLINK" ]; then
- qt_mkspecsdir=`"$qm" -query QT_INSTALL_DATA`/mkspecs
- if [ -d "$qt_mkspecsdir" ] && [ -h "$qt_mkspecsdir/default" ]; then
- defmakespec=`$READLINK $qt_mkspecsdir/default`
- fi
- fi
-fi
-
-if [ "$QC_VERBOSE" = "Y" ]; then
- echo makespec is $defmakespec
-fi
-
-qm_spec=""
-# if the makespec is macx-xcode, force macx-g++
-if [ "$defmakespec" = "macx-xcode" ]; then
- qm_spec=macx-g++
- QMAKESPEC=$qm_spec
- export QMAKESPEC
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo overriding makespec to $qm_spec
- fi
-fi
-
-gen_files() {
-cat >"$1/modules.cpp" <= 4.2
------END QCMOD-----
-*/
-class qc_qt42 : public ConfObj
-{
-public:
- qc_qt42(Conf *c) : ConfObj(c) {}
- QString name() const { return "Qt >= 4.2"; }
- QString shortname() const { return "qt42"; }
- bool exec()
- {
- conf->debug(QString("QT_VERSION = 0x%1").arg(QString::number(QT_VERSION, 16)));
- if(QT_VERSION >= 0x040200)
- return true;
- else
- return false;
- }
-};
-#line 1 "buildmode.qcm"
-/*
------BEGIN QCMOD-----
-name: buildmode
-section: project
-arg: release,Build with debugging turned off (default).
-arg: debug,Build with debugging turned on.
-arg: debug-and-release,Build two versions, with and without debugging turned on (mac only).
-arg: no-separate-debug-info,Do not store debug information in a separate file (default for mac).
-arg: separate-debug-info,Strip debug information into a separate .debug file (default for non-mac).
-arg: no-framework,Do not build as a Mac framework.
-arg: framework,Build as a Mac framework (default).
------END QCMOD-----
-*/
-
-#define QC_BUILDMODE
-bool qc_buildmode_release = false;
-bool qc_buildmode_debug = false;
-bool qc_buildmode_framework = false;
-bool qc_buildmode_separate_debug_info = false;
-
-class qc_buildmode : public ConfObj
-{
-public:
- qc_buildmode(Conf *c) : ConfObj(c) {}
- QString name() const { return "buildmode"; }
- QString shortname() const { return "buildmode"; }
-
- // no output
- QString checkString() const { return QString(); }
-
- bool exec()
- {
- // first, parse out the options
- bool opt_release = false;
- bool opt_debug = false;
- bool opt_debug_and_release = false;
- bool opt_no_framework = false;
- bool opt_framework = false;
- bool opt_no_separate_debug_info = false;
- bool opt_separate_debug_info = false;
-
- if(conf->getenv("QC_RELEASE") == "Y")
- opt_release = true;
- if(conf->getenv("QC_DEBUG") == "Y")
- opt_debug = true;
- if(conf->getenv("QC_DEBUG_AND_RELEASE") == "Y")
- opt_debug_and_release = true;
- if(conf->getenv("QC_NO_FRAMEWORK") == "Y")
- opt_no_framework = true;
- if(conf->getenv("QC_FRAMEWORK") == "Y")
- opt_framework = true;
- if(conf->getenv("QC_NO_SEPARATE_DEBUG_INFO") == "Y")
- opt_no_separate_debug_info = true;
- if(conf->getenv("QC_SEPARATE_DEBUG_INFO") == "Y")
- opt_separate_debug_info = true;
-
- bool staticmode = false;
- if(conf->getenv("QC_STATIC") == "Y")
- staticmode = true;
-
-#ifndef Q_OS_MAC
- if(opt_debug_and_release)
- {
- printf("\\nError: The --debug-and-release option is for mac only.\\n");
- exit(1);
- }
-
- if(opt_framework)
- {
- printf("\\nError: The --framework option is for mac only.\\n");
- exit(1);
- }
-#endif
-
- if(opt_framework && opt_debug)
- {
- printf("\\nError: Cannot use both --framework and --debug.\\n");
- exit(1);
- }
-
- // sanity check exclusive options
- int x;
-
- // build mode
- x = 0;
- if(opt_release)
- ++x;
- if(opt_debug)
- ++x;
- if(opt_debug_and_release)
- ++x;
- if(x > 1)
- {
- printf("\\nError: Use only one of --release, --debug, or --debug-and-release.\\n");
- exit(1);
- }
-
- // framework
- if(opt_framework && staticmode)
- {
- printf("\\nError: Cannot use both --framework and --static.\\n");
- exit(1);
- }
-
- x = 0;
- if(opt_no_framework)
- ++x;
- if(opt_framework)
- ++x;
- if(x > 1)
- {
- printf("\\nError: Use only one of --framework or --no-framework.\\n");
- exit(1);
- }
-
- // debug info
- x = 0;
- if(opt_no_separate_debug_info)
- ++x;
- if(opt_separate_debug_info)
- ++x;
- if(x > 1)
- {
- printf("\\nError: Use only one of --separate-debug-info or --no-separate-debug-info\\n");
- exit(1);
- }
-
- // now process the options
-
- if(opt_release)
- qc_buildmode_release = true;
- else if(opt_debug)
- qc_buildmode_debug = true;
- else if(opt_debug_and_release)
- {
- qc_buildmode_release = true;
- qc_buildmode_debug = true;
- }
- else // default
- qc_buildmode_release = true;
-
- if(opt_framework)
- qc_buildmode_framework = true;
- else if(opt_no_framework)
- {
- // nothing to do
- }
- else // default
- {
- if(!staticmode && !opt_debug)
- qc_buildmode_framework = true;
- }
-
- if(opt_separate_debug_info)
- qc_buildmode_separate_debug_info = true;
- else if(opt_no_separate_debug_info)
- {
- // nothing to do
- }
- else // default
- {
-#ifndef Q_OS_MAC
- qc_buildmode_separate_debug_info = true;
-#endif
- }
-
- // make the string
- QStringList opts;
- QString other;
-
- if(qc_buildmode_release && qc_buildmode_debug)
- {
- opts += "debug_and_release";
- opts += "build_all";
- }
- else if(qc_buildmode_release)
- opts += "release";
- else // qc_buildmode_debug
- opts += "debug";
-
-#ifdef Q_OS_MAC
- if(qc_buildmode_framework)
- opts += "lib_bundle";
-#endif
-
- if(qc_buildmode_separate_debug_info)
- {
- opts += "separate_debug_info";
- other += "QMAKE_CFLAGS += -g\\n";
- other += "QMAKE_CXXFLAGS += -g\\n";
- }
-
- QString str = QString("CONFIG += ") + opts.join(" ") + '\\n';
- conf->addExtra(str);
-
- if(!other.isEmpty())
- conf->addExtra(other);
-
- return true;
- }
-};
-#line 1 "universal.qcm"
-/*
------BEGIN QCMOD-----
-name: Mac universal binary support
-section: project
-arg: universal,Build with Mac universal binary support.
-arg: mac-sdk=[path],Path to Mac universal SDK (PPC host only).
------END QCMOD-----
-*/
-
-#define QC_UNIVERSAL
-bool qc_universal_enabled = false;
-QString qc_universal_sdk;
-
-//----------------------------------------------------------------------------
-// qc_universal
-//----------------------------------------------------------------------------
-class qc_universal : public ConfObj
-{
-public:
- qc_universal(Conf *c) : ConfObj(c) {}
- QString name() const { return "Mac universal binary support"; }
- QString shortname() const { return "universal"; }
- QString checkString() const { return QString(); }
-
- bool exec()
- {
-#ifdef Q_OS_MAC
- if(qc_getenv("QC_UNIVERSAL") == "Y")
- {
- qc_universal_enabled = true;
-
- QString str =
- "contains(QT_CONFIG,x86):contains(QT_CONFIG,ppc) {\\n"
- " CONFIG += x86 ppc\\n"
- "}\\n";
-
- QString sdk = qc_getenv("QC_MAC_SDK");
- if(!sdk.isEmpty())
- {
- str += QString("QMAKE_MAC_SDK = %1\\n").arg(sdk);
- qc_universal_sdk = sdk;
- }
-
- conf->addExtra(str);
- }
-#endif
- return true;
- }
-};
-#line 1 "idn.qcm"
-/*
------BEGIN QCMOD-----
-name: libidn
-arg: with-idn-inc=[path],Path to libidn include files
-arg: with-idn-lib=[path],Path to libidn library or framework files
------END QCMOD-----
-*/
-
-//----------------------------------------------------------------------------
-// qc_idn
-//----------------------------------------------------------------------------
-class qc_idn : public ConfObj
-{
-public:
- qc_idn(Conf *c) : ConfObj(c) {}
- QString name() const { return "LibIDN"; }
- QString shortname() const { return "libidn"; }
- bool exec()
- {
- QString idn_incdir, idn_libdir;
- idn_incdir = conf->getenv("QC_WITH_IDN_INC");
- idn_libdir = conf->getenv("QC_WITH_IDN_LIB");
-
- if (!idn_incdir.isEmpty() || !idn_libdir.isEmpty()) { // prefer this if given
- if ((!idn_incdir.isEmpty() && conf->checkHeader(idn_incdir, "stringprep.h")) ||
- (idn_incdir.isEmpty() && conf->findHeader("stringprep.h", QStringList(), &idn_incdir))) {
- conf->addIncludePath(idn_incdir);
- } else {
- printf("Headers not found!\\n");
- return false;
- }
-
- if((!idn_libdir.isEmpty() && conf->checkLibrary(idn_libdir, "idn")) ||
- (idn_libdir.isEmpty() && conf->findLibrary("idn", &idn_libdir))) {
- conf->addLib(idn_libdir.isEmpty()? "-lidn" : QString("-L%1 -lidn").arg(idn_libdir));
- } else {
- printf("Libraries not found!\\n");
- return false;
- }
- return true;
- }
-
- QStringList incs;
- QString version, libs, other;
- if(conf->findPkgConfig("libidn", VersionAny, QString::null, &version, &incs, &libs, &other))
- {
- for(int n = 0; n < incs.count(); ++n)
- conf->addIncludePath(incs[n]);
- if(!libs.isEmpty())
- conf->addLib(libs);
- return true;
- }
-
- return false;
- }
-};
-#line 1 "qca.qcm"
-/*
------BEGIN QCMOD-----
-name: QCA >= 2.0
-arg: with-qca-inc=[path],Path to QCA include files
-arg: with-qca-lib=[path],Path to QCA library or framework files
------END QCMOD-----
-*/
-
-// adapted from crypto.prf
-static QString internal_crypto_prf(const QString &incdir, const QString &libdir, const QString &frameworkdir)
-{
- QString out = QString(
-"QCA_INCDIR = %1\\n"
-"QCA_LIBDIR = %2\\n"
-"QMAKE_RPATHDIR = %2\\n"
-"QCA_FRAMEWORKDIR = %3\\n"
-"\\n"
-"CONFIG *= qt\\n"
-"\\n"
-"LINKAGE =\\n"
-"QCA_NAME = qca-qt5\\n"
-"\\n"
-"!isEmpty(QCA_FRAMEWORKDIR): {\\n"
-" framework_dir = \$\$QCA_FRAMEWORKDIR\\n"
-" exists(\$\$framework_dir/\$\${QCA_NAME}.framework) {\\n"
-" #QMAKE_FRAMEWORKPATH *= \$\$framework_dir\\n"
-" LIBS *= -F\$\$framework_dir\\n"
-" INCLUDEPATH += \$\$framework_dir/\$\${QCA_NAME}.framework/Headers\\n"
-" LINKAGE = -framework \$\${QCA_NAME}\\n"
-" }\\n"
-"}\\n"
-"\\n"
-"# else, link normally\\n"
-"isEmpty(LINKAGE) {\\n"
-" !isEmpty(QCA_INCDIR):INCLUDEPATH += \$\$QCA_INCDIR/QtCrypto\\n"
-" !isEmpty(QCA_LIBDIR):LIBS += -L\$\$QCA_LIBDIR\\n"
-" LINKAGE = -l\$\${QCA_NAME}\\n"
-" CONFIG(debug, debug|release) {\\n"
-" windows:LINKAGE = -l\$\${QCA_NAME}d\\n"
-" mac:LINKAGE = -l\$\${QCA_NAME}_debug\\n"
-" }\\n"
-"}\\n"
-"\\n"
-"LIBS += \$\$LINKAGE\\n"
- ).arg(incdir, libdir, frameworkdir);
- return out;
-}
-
-// set either libdir or frameworkdir, but not both
-static bool qca_try(Conf *conf, const QString &incdir, const QString &libdir, const QString &frameworkdir, bool release, bool debug, QString *_prf)
-{
- QString proextra;
- QString prf;
- if (!incdir.isEmpty() || !libdir.isEmpty() || !frameworkdir.isEmpty()) {
- prf = internal_crypto_prf(conf->escapePath(incdir), conf->escapePath(libdir), frameworkdir);
- } else {
- prf = "CONFIG += crypto\\n";
- }
- proextra =
- "CONFIG += qt\\n"
- "CONFIG -= debug_and_release debug release\\n"
- "QT -= gui\\n";
- proextra += prf;
-
- QString str =
- "#include \\n"
- "\\n"
- "int main()\\n"
- "{\\n"
- " unsigned long x = QCA_VERSION;\\n"
- " if(x >= 0x020000 && x < 0x030000) return 0; else return 1;\\n"
- "}\\n";
-
- // test desired versions, potentially both release and debug
-
- if(release)
- {
- int ret;
- if(!conf->doCompileAndLink(str, QStringList(), QString(), proextra + "CONFIG += release\\n", &ret) || ret != 0)
- return false;
- }
-
- if(debug)
- {
- int ret;
- if(!conf->doCompileAndLink(str, QStringList(), QString(), proextra + "CONFIG += debug\\n", &ret) || ret != 0)
- return false;
- }
-
- *_prf = prf;
- return true;
-}
-
-static bool qca_try_lib(Conf *conf, const QString &incdir, const QString &libdir, bool release, bool debug, QString *prf)
-{
- return qca_try(conf, incdir, libdir, QString(), release, debug, prf) ||
- qca_try(conf, incdir + "/Qca-qt5", libdir, QString(), release, debug, prf);
-}
-
-static bool qca_try_framework(Conf *conf, const QString &frameworkdir, bool release, bool debug, QString *prf)
-{
- return qca_try(conf, QString(), QString(), frameworkdir, release, debug, prf);
-}
-
-static bool qca_try_ext_prf(Conf *conf, bool release, bool debug, QString *prf)
-{
- return qca_try(conf, QString(), QString(), QString(), release, debug, prf);
-}
-
-//----------------------------------------------------------------------------
-// qc_qca
-//----------------------------------------------------------------------------
-class qc_qca : public ConfObj
-{
-public:
- qc_qca(Conf *c) : ConfObj(c) {}
- QString name() const { return "QCA >= 2.0"; }
- QString shortname() const { return "qca"; }
- bool exec()
- {
- // get the build mode
-#ifdef QC_BUILDMODE
- bool release = qc_buildmode_release;
- bool debug = qc_buildmode_debug;
-#else
- // else, default to just release mode
- bool release = true;
- bool debug = false;
-#endif
-
- QString qca_incdir, qca_libdir, qca_crypto_prf;
- qca_incdir = conf->getenv("QC_WITH_QCA_INC");
- qca_libdir = conf->getenv("QC_WITH_QCA_LIB");
-
-#if defined(Q_OS_MAC)
- if(!qca_libdir.isEmpty() && qca_try_framework(conf, qca_libdir, release, debug, &qca_crypto_prf))
- {
- conf->addExtra(qca_crypto_prf);
- return true;
- }
-#endif
-
- if(!qca_incdir.isEmpty() && !qca_libdir.isEmpty() && qca_try_lib(conf, qca_incdir, qca_libdir, release, debug, &qca_crypto_prf))
- {
- conf->addExtra(qca_crypto_prf);
- return true;
- }
-
- if (qca_try_ext_prf(conf, release, debug, &qca_crypto_prf))
- {
- conf->addExtra(qca_crypto_prf);
- return true;
- }
-
- QStringList incs;
- QString version, libs, other;
-
- if(conf->findPkgConfig("qca2-qt5", VersionMin, "2.0.0", &version, &incs, &libs, &other))
- {
- for(int n = 0; n < incs.count(); ++n)
- conf->addIncludePath(incs[n]);
- if(!libs.isEmpty())
- conf->addLib(libs);
- return true;
- }
-
- QStringList prefixes;
-#ifndef Q_OS_WIN
- prefixes += "/usr";
- prefixes += "/usr/local";
-#endif
- QString prefix = conf->getenv("PREFIX");
- if (!prefix.isEmpty()) {
- prefixes += prefix;
- }
-
- for(int n = 0; n < prefixes.count(); ++n)
- {
- const QString &prefix = prefixes[n];
- if(qca_try_lib(conf, prefix + "/include", prefix + "/lib", release, debug, &qca_crypto_prf))
- {
- conf->addExtra(qca_crypto_prf);
- return true;
- }
- }
-
- return false;
- }
-};
-#line 1 "zlib.qcm"
-/*
------BEGIN QCMOD-----
-name: zlib
-arg: with-zlib-inc=[path],Path to zlib include files
-arg: with-zlib-lib=[path],Path to zlib library files
------END QCMOD-----
-*/
-
-//----------------------------------------------------------------------------
-// qc_zlib
-//----------------------------------------------------------------------------
-class qc_zlib : public ConfObj
-{
-public:
- qc_zlib(Conf *c) : ConfObj(c) {}
- QString name() const { return "zlib"; }
- QString shortname() const { return "zlib"; }
- bool exec()
- {
- QString inc, lib;
- QString s;
-
- s = conf->getenv("QC_WITH_ZLIB_INC");
- if(!s.isEmpty()) {
- if(!conf->checkHeader(s, "zlib.h"))
- return false;
- inc = s;
- }
- else {
- if(!conf->findHeader("zlib.h", QStringList(), &s))
- return false;
- inc = s;
- }
-
- s = conf->getenv("QC_WITH_ZLIB_LIB");
- if(!s.isEmpty()) {
- if(!conf->checkLibrary(s, "z"))
- return false;
- lib = s;
- }
- else {
- if(!conf->findLibrary("z", &s))
- return false;
- lib = s;
- }
-
- if(!inc.isEmpty())
- conf->addIncludePath(inc);
- if(!lib.isEmpty())
- conf->addLib(QString("-L") + s);
- conf->addLib("-lz");
-
- return true;
- }
-};
-#line 1 "extra.qcm"
-/*
------BEGIN QCMOD-----
-name: extra
-section: project
-arg: enable-tests,Build examples and unittests.
------END QCMOD-----
-*/
-
-class qc_extra : public ConfObj
-{
-public:
- qc_extra(Conf *c) : ConfObj(c) {}
- QString name() const { return "extra"; }
- QString shortname() const { return "extra"; }
-
- // no output
- QString checkString() const { return QString(); }
-
- bool exec()
- {
- QString str;
- QFile f;
-
- if(conf->getenv("QC_ENABLE_TESTS") == "Y")
- str += "CONFIG += iris_tests\\n";
-
- conf->addExtra(str);
-
- bool release = true;
- bool debug = false;
- bool debug_info = false;
- bool universal = false;
- QString sdk;
-
-#ifdef QC_BUILDMODE
- release = qc_buildmode_release;
- debug = qc_buildmode_debug;
- debug_info = qc_buildmode_separate_debug_info;
-#endif
-
-#ifdef QC_UNIVERSAL
- universal = qc_universal_enabled;
- sdk = qc_universal_sdk;
-#endif
-
- // write confapp_unix.pri
- str = QString();
- QString var = conf->getenv("BINDIR");
- if(!var.isEmpty())
- str += QString("BINDIR = %1\\n").arg(var);
- if(debug) // debug or debug-and-release
- str += QString("CONFIG += debug\\n");
- else // release
- str += QString("CONFIG += release\\n");
- if(debug_info)
- {
- str += QString("CONFIG += separate_debug_info\\n");
- str += "QMAKE_CFLAGS += -g\\n";
- str += "QMAKE_CXXFLAGS += -g\\n";
- }
- if(universal)
- {
- str +=
- "contains(QT_CONFIG,x86):contains(QT_CONFIG,ppc) {\\n"
- " CONFIG += x86 ppc\\n"
- "}\\n";
-
- if(!sdk.isEmpty())
- str += QString("QMAKE_MAC_SDK = %1\\n").arg(sdk);
- }
-#ifdef QC_QCA
- if(!qc_qca_procode.isEmpty())
- str += qc_qca_procode;
-#endif
- f.setFileName("confapp_unix.pri");
- if(f.open(QFile::WriteOnly | QFile::Truncate))
- f.write(str.toLatin1());
- f.close();
-
- return true;
- }
-};
-#line 1 "qjdns.qcm"
-/*
------BEGIN QCMOD-----
-name: jdns
-arg: with-qjdns-inc=[path],Path to QJDns include files
-arg: with-qjdns-lib=[path],Path to QJDns library files
------END QCMOD-----
-*/
-
-//----------------------------------------------------------------------------
-// qc_qjdns
-//----------------------------------------------------------------------------
-class qc_qjdns : public ConfObj
-{
-public:
- qc_qjdns(Conf *c) : ConfObj(c) {}
- QString name() const { return "QJDns"; }
- QString shortname() const { return "qjdns"; }
- QString resultString() const
- {
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
- return "Disabled for Qt5 and above";
-#else
- return ConfObj::resultString();
-#endif
- }
- bool exec()
- {
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
- return true; // hack. TODO: figure out how to force jdns
-#endif
- conf->addExtra("CONFIG += need_jdns");
-#if defined Q_OS_WIN || defined Q_OS_MAC
- // HACK: on Windows and Mac OS X, always use psi's bundled qjdns
- conf->addExtra("CONFIG += iris-qjdns");
- return true;
-#else
- QStringList incs;
- QString version, libs, other;
- QString s;
-
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
- bool found = conf->findPkgConfig("qjdns-qt5", VersionMin, "2.0.3", &version, &incs, &libs, &other);
-#else
- bool found = conf->findPkgConfig("qjdns-qt4", VersionMin, "2.0.3", &version, &incs, &libs, &other);
-#endif
- if(!found && !conf->findPkgConfig("qjdns", VersionMin, "2.0.0", &version, &incs, &libs, &other)) {
- s = conf->getenv("QC_WITH_QJDNS_INC");
- if ((!s.isEmpty() && conf->checkHeader(s, "qjdns.h")) ||
- (s.isEmpty() && conf->findHeader("qjdns.h", QStringList(), &s))) {
- incs.append(s);
- }
-
- s = conf->getenv("QC_WITH_QJDNS_LIB");
- if((!s.isEmpty() && conf->checkLibrary(s, "qjdns")) ||
- (s.isEmpty() && conf->findLibrary("qjdns", &s))) {
- libs = s.isEmpty()? "-lqjdns -ljdns" : QString("-L%1 -lqjdns -ljdns").arg(s);
- }
- }
-
- if (!incs.isEmpty() && !libs.isEmpty()) {
- foreach(const QString &inc, incs) {
- conf->addIncludePath(inc);
- }
- conf->addLib(libs);
- conf->addExtra("CONFIG += ext-qjdns");
- }
-
- return true;
-#endif
- }
-};
-
-EOT
-cat >"$1/modules_new.cpp" <required = true;
- o->disabled = false;
- o = new qc_buildmode(conf);
- o->required = true;
- o->disabled = false;
- o = new qc_universal(conf);
- o->required = true;
- o->disabled = false;
- o = new qc_idn(conf);
- o->required = true;
- o->disabled = false;
- o = new qc_qca(conf);
- o->required = true;
- o->disabled = false;
- o = new qc_zlib(conf);
- o->required = true;
- o->disabled = false;
- o = new qc_extra(conf);
- o->required = true;
- o->disabled = false;
- o = new qc_qjdns(conf);
- o->required = true;
- o->disabled = false;
-
-EOT
-cat >"$1/conf4.h" <
-
-class Conf;
-
-enum VersionMode { VersionMin, VersionExact, VersionMax, VersionAny };
-
-// ConfObj
-//
-// Subclass ConfObj to create a new configuration module.
-class ConfObj
-{
-public:
- Conf *conf;
- bool required;
- bool disabled;
- bool success;
-
- ConfObj(Conf *c);
- virtual ~ConfObj();
-
- // long or descriptive name of what is being checked/performed
- // example: "KDE >= 3.3"
- virtual QString name() const = 0;
-
- // short name
- // example: "kde"
- virtual QString shortname() const = 0;
-
- // string to display during check
- // default: "Checking for [name] ..."
- virtual QString checkString() const;
-
- // string to display after check
- // default: "yes" or "no", based on result of exec()
- virtual QString resultString() const;
-
- // this is where the checking code goes
- virtual bool exec() = 0;
-};
-
-// Conf
-//
-// Interact with this class from your ConfObj to perform detection
-// operations and to output configuration parameters.
-class Conf
-{
-public:
- bool debug_enabled;
- QString qmake_path;
- QString qmakespec;
- QString maketool;
-
- QString DEFINES;
- QStringList INCLUDEPATH;
- QStringList LIBS;
- QString extra;
-
- QList list;
- QMap vars;
-
- Conf();
- ~Conf();
-
- QString getenv(const QString &var);
- QString qvar(const QString &s);
- QString normalizePath(const QString &s) const;
- QString escapeQmakeVar(const QString &s) const;
- inline QString escapePath(const QString &s) /* prepare fs path for qmake file */
- { return escapeQmakeVar(normalizePath(s)); }
- QString escapedIncludes() const;
- QString escapedLibs() const;
-
- bool exec();
-
- void debug(const QString &s);
-
- QString expandIncludes(const QString &inc);
- QString expandLibs(const QString &lib);
-
- int doCommand(const QString &s, QByteArray *out = 0);
- int doCommand(const QString &prog, const QStringList &args, QByteArray *out = 0);
-
- bool doCompileAndLink(const QString &filedata, const QStringList &incs, const QString &libs, const QString &proextra, int *retcode = 0);
- bool checkHeader(const QString &path, const QString &h);
- bool findHeader(const QString &h, const QStringList &ext, QString *inc);
- bool checkLibrary(const QString &path, const QString &name);
- bool findLibrary(const QString &name, QString *lib);
- QString findProgram(const QString &prog);
- bool findSimpleLibrary(const QString &incvar, const QString &libvar, const QString &incname, const QString &libname, QString *incpath, QString *libs);
- bool findFooConfig(const QString &path, QString *version, QStringList *incs, QString *libs, QString *otherflags);
- bool findPkgConfig(const QString &name, VersionMode mode, const QString &req_version, QString *version, QStringList *incs, QString *libs, QString *otherflags);
-
- void addDefine(const QString &str);
- void addLib(const QString &str);
- void addIncludePath(const QString &str);
- void addExtra(const QString &str);
-
-private:
- bool first_debug;
-
- friend class ConfObj;
- void added(ConfObj *o);
-};
-
-#endif
-
-EOT
-cat >"$1/conf4.cpp" <
-#include
-#include
-#ifndef PATH_MAX
-# ifdef Q_OS_WIN
-# define PATH_MAX 260
-# endif
-#endif
-
-class MocTestObject : public QObject
-{
- Q_OBJECT
-public:
- MocTestObject() {}
-};
-
-QString qc_getenv(const QString &var)
-{
- char *p = ::getenv(var.toLatin1().data());
- if(!p)
- return QString();
- return QString(p);
-}
-
-QStringList qc_pathlist()
-{
- QStringList list;
- QString path = qc_getenv("PATH");
- if(!path.isEmpty())
- {
-#ifdef Q_OS_WIN
- list = path.split(';', QString::SkipEmptyParts);
-#else
- list = path.split(':', QString::SkipEmptyParts);
-#endif
- }
-#ifdef Q_OS_WIN
- list.prepend(".");
-#endif
- return list;
-}
-
-QString qc_findprogram(const QString &prog)
-{
- QString out;
- QStringList list = qc_pathlist();
- for(int n = 0; n < list.count(); ++n)
- {
- QFileInfo fi(list[n] + '/' + prog);
- if(fi.exists() && fi.isExecutable())
- {
- out = fi.filePath();
- break;
- }
-
-#ifdef Q_OS_WIN
- // on windows, be sure to look for .exe
- if(prog.right(4).toLower() != ".exe")
- {
- fi = QFileInfo(list[n] + '/' + prog + ".exe");
- if(fi.exists() && fi.isExecutable())
- {
- out = fi.filePath();
- break;
- }
- }
-#endif
- }
- return out;
-}
-
-QString qc_findself(const QString &argv0)
-{
-#ifdef Q_OS_WIN
- if(argv0.contains('\\\\'))
-#else
- if(argv0.contains('/'))
-#endif
- return argv0;
- else
- return qc_findprogram(argv0);
-}
-
-int qc_run_program_or_command(const QString &prog, const QStringList &args, const QString &command, QByteArray *out, bool showOutput)
-{
- if(out)
- out->clear();
-
- QProcess process;
- process.setReadChannel(QProcess::StandardOutput);
-
- if(!prog.isEmpty())
- process.start(prog, args);
- else if(!command.isEmpty())
- process.start(command);
- else
- return -1;
-
- if(!process.waitForStarted(-1))
- return -1;
-
- QByteArray buf;
-
- while(process.waitForReadyRead(-1))
- {
- buf = process.readAllStandardOutput();
- if(out)
- out->append(buf);
- if(showOutput)
- fprintf(stdout, "%s", buf.data());
-
- buf = process.readAllStandardError();
- if(showOutput)
- fprintf(stderr, "%s", buf.data());
- }
-
- buf = process.readAllStandardError();
- if(showOutput)
- fprintf(stderr, "%s", buf.data());
-
- // calling waitForReadyRead will cause the process to eventually be
- // marked as finished, so we should not need to separately call
- // waitForFinished. however, we will do it anyway just to be safe.
- // we won't check the return value since false could still mean
- // success (if the process had already been marked as finished).
- process.waitForFinished(-1);
-
- if(process.exitStatus() != QProcess::NormalExit)
- return -1;
-
- return process.exitCode();
-}
-
-int qc_runcommand(const QString &command, QByteArray *out, bool showOutput)
-{
- return qc_run_program_or_command(QString(), QStringList(), command, out, showOutput);
-}
-
-int qc_runprogram(const QString &prog, const QStringList &args, QByteArray *out, bool showOutput)
-{
- return qc_run_program_or_command(prog, args, QString(), out, showOutput);
-}
-
-bool qc_removedir(const QString &dirPath)
-{
- QDir dir(dirPath);
- if(!dir.exists())
- return false;
- QStringList list = dir.entryList();
- foreach(QString s, list)
- {
- if(s == "." || s == "..")
- continue;
- QFileInfo fi(dir.filePath(s));
- if(fi.isDir())
- {
- if(!qc_removedir(fi.filePath()))
- return false;
- }
- else
- {
- if(!dir.remove(s))
- return false;
- }
- }
- QString dirName = dir.dirName();
- if(!dir.cdUp())
- return false;
- if(!dir.rmdir(dirName))
- return false;
- return true;
-}
-
-// simple command line arguemnts splitter able to understand quoted args.
-// the splitter removes quotes and unescapes symbols as well.
-QStringList qc_splitflags(const QString &flags)
-{
- QStringList ret;
- bool searchStart = true;
- bool inQuotes = false;
- bool escaped = false;
- QChar quote, backslash = QLatin1Char('\\\\');
- QString buf;
-#ifdef PATH_MAX
- buf.reserve(PATH_MAX);
-#endif
- for (int i=0; i < flags.length(); i++) {
- if (searchStart && flags[i].isSpace()) {
- continue;
- }
- if (searchStart) {
- searchStart = false;
- buf.clear();
- }
- if (escaped) {
- buf += flags[i];
- escaped = false;
- continue;
- }
- //buf += flags[i];
- if (inQuotes) {
- if (quote == QLatin1Char('\\'')) {
- if (flags[i] == quote) {
- inQuotes = false;
- continue;
- }
- } else { // we are in double quoetes
- if (flags[i] == backslash && i < flags.length() - 1 &&
- (flags[i+1] == QLatin1Char('"') || flags[i+1] == backslash))
- {
- // if next symbol is one of in parentheses ("\\)
- escaped = true;
- continue;
- }
- }
- } else {
- if (flags[i].isSpace()) {
- ret.append(buf);
- searchStart = true;
- buf.clear();
- continue;
-#ifndef Q_OS_WIN /* on windows backslash is just a path separator */
- } else if (flags[i] == backslash) {
- escaped = true;
- continue; // just add next symbol
-#endif
- } else if (flags[i] == QLatin1Char('\\'') || flags[i] == QLatin1Char('"')) {
- inQuotes = true;
- quote = flags[i];
- continue;
- }
- }
- buf += flags[i];
- }
- if (buf.size()) {
- ret.append(buf);
- }
- return ret;
-}
-
-void qc_splitcflags(const QString &cflags, QStringList *incs, QStringList *otherflags)
-{
- incs->clear();
- otherflags->clear();
-
- QStringList cflagsList = qc_splitflags(cflags);
- for(int n = 0; n < cflagsList.count(); ++n)
- {
- QString str = cflagsList[n];
- if(str.startsWith("-I"))
- {
- // we want everything except the leading "-I"
- incs->append(str.remove(0, 2));
- }
- else
- {
- // we want whatever is left
- otherflags->append(str);
- }
- }
-}
-
-QString qc_escapeArg(const QString &str)
-{
- QString out;
- for(int n = 0; n < (int)str.length(); ++n) {
- if(str[n] == '-')
- out += '_';
- else
- out += str[n];
- }
- return out;
-}
-
-
-QString qc_trim_char(const QString &s, const QChar &ch)
-{
- if (s.startsWith(ch) && s.endsWith(ch)) {
- return s.mid(1, s.size() - 2);
- }
- return s;
-}
-
-// removes surrounding quotes, removes trailing slashes, converts to native separators.
-// accepts unescaped but possible quoted path
-QString qc_normalize_path(const QString &str)
-{
- QString path = str.trimmed();
- path = qc_trim_char(path, QLatin1Char('"'));
- path = qc_trim_char(path, QLatin1Char('\\''));
-
- // It's OK to use unix style'/' pathes on windows Qt handles this without any problems.
- // Using Windows-style '\\\\' can leads strange compilation error with MSYS which uses
- // unix style.
- QLatin1Char nativeSep('/');
-#ifdef Q_OS_WIN
- path.replace(QLatin1Char('\\\\'), QLatin1Char('/'));
-#endif
- // trim trailing slashes
- while (path.length() && path[path.length() - 1] == nativeSep) {
- path.resize(path.length() - 1);
- }
- return path;
-}
-
-// escape filesystem path to be added to qmake pro/pri file.
-QString qc_escape_string_var(const QString &str)
-{
- QString path = str;
- path.replace(QLatin1Char('\\\\'), QLatin1String("\\\\\\\\"))
- .replace(QLatin1Char('"'), QLatin1String("\\\\\\""));
- if (path.indexOf(QLatin1Char(' ')) != -1) { // has spaces
- return QLatin1Char('"') + path + QLatin1Char('"');
- }
- return path;
-}
-
-// escapes each path in incs and join into single string suiable for INCLUDEPATH var
-QString qc_prepare_includepath(const QStringList &incs)
-{
- if (incs.empty()) {
- return QString();
- }
- QStringList ret;
- foreach (const QString &path, incs) {
- ret.append(qc_escape_string_var(path));
- }
- return ret.join(QLatin1String(" "));
-}
-
-// escapes each path in libs and to make it suiable for LIBS var
-// notice, entries of libs are every single arg for linker.
-QString qc_prepare_libs(const QStringList &libs)
-{
- if (libs.isEmpty()) {
- return QString();
- }
- QSet pathSet;
- QStringList paths;
- QStringList ordered;
- foreach (const QString &arg, libs) {
- if (arg.startsWith(QLatin1String("-L"))) {
- QString path = qc_escape_string_var(arg.mid(2));
- if (!pathSet.contains(path)) {
- pathSet.insert(path);
- paths.append(path);
- }
- } else if (arg.startsWith(QLatin1String("-l"))) {
- ordered.append(arg);
- } else {
- ordered.append(qc_escape_string_var(arg));
- }
- }
- QString ret;
- if (paths.size()) {
- ret += (QLatin1String(" -L") + paths.join(QLatin1String(" -L")) + QLatin1Char(' '));
- }
- return ret + ordered.join(QLatin1String(" "));
-}
-
-//----------------------------------------------------------------------------
-// ConfObj
-//----------------------------------------------------------------------------
-ConfObj::ConfObj(Conf *c)
-{
- conf = c;
- conf->added(this);
- required = false;
- disabled = false;
- success = false;
-}
-
-ConfObj::~ConfObj()
-{
-}
-
-QString ConfObj::checkString() const
-{
- return QString("Checking for %1 ...").arg(name());
-}
-
-QString ConfObj::resultString() const
-{
- if(success)
- return "yes";
- else
- return "no";
-}
-
-//----------------------------------------------------------------------------
-// qc_internal_pkgconfig
-//----------------------------------------------------------------------------
-class qc_internal_pkgconfig : public ConfObj
-{
-public:
- QString pkgname, desc;
- VersionMode mode;
- QString req_ver;
-
- qc_internal_pkgconfig(Conf *c, const QString &_name, const QString &_desc, VersionMode _mode, const QString &_req_ver) : ConfObj(c)
- {
- pkgname = _name;
- desc = _desc;
- mode = _mode;
- req_ver = _req_ver;
- }
-
- QString name() const { return desc; }
- QString shortname() const { return pkgname; }
-
- bool exec()
- {
- QStringList incs;
- QString version, libs, other;
- if(!conf->findPkgConfig(pkgname, mode, req_ver, &version, &incs, &libs, &other))
- return false;
-
- for(int n = 0; n < incs.count(); ++n)
- conf->addIncludePath(incs[n]);
- if(!libs.isEmpty())
- conf->addLib(libs);
- //if(!other.isEmpty())
- // conf->addExtra(QString("QMAKE_CFLAGS += %1\\n").arg(other));
-
- if(!required)
- conf->addDefine("HAVE_PKG_" + qc_escapeArg(pkgname).toUpper());
-
- return true;
- }
-};
-
-//----------------------------------------------------------------------------
-// Conf
-//----------------------------------------------------------------------------
-Conf::Conf()
-{
- // TODO: no more vars?
- //vars.insert("QMAKE_INCDIR_X11", new QString(X11_INC));
- //vars.insert("QMAKE_LIBDIR_X11", new QString(X11_LIBDIR));
- //vars.insert("QMAKE_LIBS_X11", new QString(X11_LIB));
- //vars.insert("QMAKE_CC", CC);
-
- debug_enabled = false;
-}
-
-Conf::~Conf()
-{
- qDeleteAll(list);
-}
-
-void Conf::added(ConfObj *o)
-{
- list.append(o);
-}
-
-QString Conf::getenv(const QString &var)
-{
- return qc_getenv(var);
-}
-
-void Conf::debug(const QString &s)
-{
- if(debug_enabled)
- {
- if(first_debug)
- printf("\\n");
- first_debug = false;
- printf(" * %s\\n", qPrintable(s));
- }
-}
-
-bool Conf::exec()
-{
- for(int n = 0; n < list.count(); ++n)
- {
- ConfObj *o = list[n];
-
- // if this was a disabled-by-default option, check if it was enabled
- if(o->disabled)
- {
- QString v = QString("QC_ENABLE_") + qc_escapeArg(o->shortname());
- if(getenv(v) != "Y")
- continue;
- }
- // and the opposite?
- else
- {
- QString v = QString("QC_DISABLE_") + qc_escapeArg(o->shortname());
- if(getenv(v) == "Y")
- continue;
- }
-
- bool output = true;
- QString check = o->checkString();
- if(check.isEmpty())
- output = false;
-
- if(output)
- {
- printf("%s", check.toLatin1().data());
- fflush(stdout);
- }
-
- first_debug = true;
- bool ok = o->exec();
- o->success = ok;
-
- if(output)
- {
- QString result = o->resultString();
- if(!first_debug)
- printf(" -> %s\\n", result.toLatin1().data());
- else
- printf(" %s\\n", result.toLatin1().data());
- }
-
- if(!ok && o->required)
- {
- printf("\\nError: need %s!\\n", o->name().toLatin1().data());
- return false;
- }
- }
- return true;
-}
-
-QString Conf::qvar(const QString &s)
-{
- return vars.value(s);
-}
-
-QString Conf::normalizePath(const QString &s) const
-{
- return qc_normalize_path(s);
-}
-
-QString Conf::escapeQmakeVar(const QString &s) const
-{
- return qc_escape_string_var(s);
-}
-
-QString Conf::escapedIncludes() const
-{
- return qc_prepare_includepath(INCLUDEPATH);
-}
-
-QString Conf::escapedLibs() const
-{
- return qc_prepare_libs(LIBS);
-}
-
-QString Conf::expandIncludes(const QString &inc)
-{
- return QLatin1String("-I") + inc;
-}
-
-QString Conf::expandLibs(const QString &lib)
-{
- return QLatin1String("-L") + lib;
-}
-
-int Conf::doCommand(const QString &s, QByteArray *out)
-{
- debug(QString("[%1]").arg(s));
- int r = qc_runcommand(s, out, debug_enabled);
- debug(QString("returned: %1").arg(r));
- return r;
-}
-
-int Conf::doCommand(const QString &prog, const QStringList &args, QByteArray *out)
-{
- QString fullcmd = prog;
- QString argstr = args.join(QLatin1String(" "));
- if(!argstr.isEmpty())
- fullcmd += QString(" ") + argstr;
- debug(QString("[%1]").arg(fullcmd));
- int r = qc_runprogram(prog, args, out, debug_enabled);
- debug(QString("returned: %1").arg(r));
- return r;
-}
-
-bool Conf::doCompileAndLink(const QString &filedata, const QStringList &incs, const QString &libs, const QString &proextra, int *retcode)
-{
-#ifdef Q_OS_WIN
- QDir tmp("qconftemp");
-#else
- QDir tmp(".qconftemp");
-#endif
- QStringList normalizedLibs;
- foreach (const QString &l, qc_splitflags(libs)) {
- normalizedLibs.append(qc_normalize_path(l));
- }
-
- if(!tmp.mkdir("atest"))
- {
- debug(QString("unable to create atest dir: %1").arg(tmp.absoluteFilePath("atest")));
- return false;
- }
- QDir dir(tmp.filePath("atest"));
- if(!dir.exists())
- {
- debug("atest dir does not exist");
- return false;
- }
-
- QString fname = dir.filePath("atest.cpp");
- QString out = "atest";
- QFile f(fname);
- if(!f.open(QFile::WriteOnly | QFile::Truncate))
- {
- debug("unable to open atest.cpp for writing");
- return false;
- }
- if(f.write(filedata.toLatin1()) == -1)
- {
- debug("error writing to atest.cpp");
- return false;
- }
- f.close();
-
- debug(QString("Wrote atest.cpp:\\n%1").arg(filedata));
-
- QString pro = QString(
- "CONFIG += console\\n"
- "CONFIG -= qt app_bundle\\n"
- "DESTDIR = \$\$PWD\\n"
- "SOURCES += atest.cpp\\n");
- QString inc = qc_prepare_includepath(incs);
- if(!inc.isEmpty())
- pro += "INCLUDEPATH += " + inc + '\\n';
- QString escaped_libs = qc_prepare_libs(normalizedLibs);
- if(!escaped_libs.isEmpty())
- pro += "LIBS += " + escaped_libs + '\\n';
- pro += proextra;
-
- fname = dir.filePath("atest.pro");
- f.setFileName(fname);
- if(!f.open(QFile::WriteOnly | QFile::Truncate))
- {
- debug("unable to open atest.pro for writing");
- return false;
- }
- if(f.write(pro.toLatin1()) == -1)
- {
- debug("error writing to atest.pro");
- return false;
- }
- f.close();
-
- debug(QString("Wrote atest.pro:\\n%1").arg(pro));
-
- QString oldpath = QDir::currentPath();
- QDir::setCurrent(dir.path());
-
- bool ok = false;
- int r = doCommand(qmake_path, QStringList() << "atest.pro");
- if(r == 0)
- {
- r = doCommand(maketool, QStringList());
- if(r == 0)
- {
- ok = true;
- if(retcode)
- {
- QString runatest = out;
-#ifdef Q_OS_UNIX
- runatest.prepend("./");
-#endif
- *retcode = doCommand(runatest, QStringList());
- }
- }
- r = doCommand(maketool, QStringList() << "distclean");
- if(r != 0)
- debug("error during atest distclean");
- }
-
- QDir::setCurrent(oldpath);
-
- // cleanup
- //dir.remove("atest.pro");
- //dir.remove("atest.cpp");
- //tmp.rmdir("atest");
-
- // remove whole dir since distclean doesn't always work
- qc_removedir(tmp.filePath("atest"));
-
- if(!ok)
- return false;
- return true;
-}
-
-bool Conf::checkHeader(const QString &path, const QString &h)
-{
- return QDir(path).exists(h);
-}
-
-bool Conf::findHeader(const QString &h, const QStringList &ext, QString *inc)
-{
- if(checkHeader("/usr/include", h))
- {
- *inc = "";
- return true;
- }
- QStringList dirs;
- dirs += "/usr/local/include";
- dirs += ext;
-
- QString prefix = qc_getenv("PREFIX");
- if (!prefix.isEmpty()) {
- prefix += "/include";
- prefix = qc_normalize_path(prefix);
- if (!dirs.contains(prefix))
- dirs << prefix;
- }
-
- for(QStringList::ConstIterator it = dirs.begin(); it != dirs.end(); ++it)
- {
- if(checkHeader(*it, h))
- {
- *inc = *it;
- return true;
- }
- }
- return false;
-}
-
-bool Conf::checkLibrary(const QString &path, const QString &name)
-{
- QString str =
- //"#include \\n"
- "int main()\\n"
- "{\\n"
- //" printf(\\"library checker running\\\\\\\\n\\");\\n"
- " return 0;\\n"
- "}\\n";
-
- QString libs;
- if(!path.isEmpty())
- libs += QString("-L") + path + ' ';
- libs += QString("-l") + name;
- if(!doCompileAndLink(str, QStringList(), libs, QString()))
- return false;
- return true;
-}
-
-bool Conf::findLibrary(const QString &name, QString *lib)
-{
- if(checkLibrary("", name))
- {
- *lib = "";
- return true;
- }
- if(checkLibrary("/usr/local/lib", name))
- {
- *lib = "/usr/local/lib";
- return true;
- }
-
- QString prefix = qc_getenv("PREFIX");
- if (!prefix.isEmpty()) {
- prefix += "/lib";
- prefix = qc_normalize_path(prefix);
- if(checkLibrary(prefix, name))
- {
- *lib = prefix;
- return true;
- }
- }
-
- return false;
-}
-
-QString Conf::findProgram(const QString &prog)
-{
- return qc_findprogram(prog);
-}
-
-bool Conf::findSimpleLibrary(const QString &incvar, const QString &libvar, const QString &incname, const QString &libname, QString *incpath, QString *libs)
-{
- QString inc, lib;
- QString s;
-
- s = getenv(incvar).trimmed();
- if(!s.isEmpty()) {
- if(!checkHeader(s, incname)) {
- if(debug_enabled)
- printf("%s is not found in \\"%s\\"\\n", qPrintable(incname), qPrintable(s));
- return false;
- }
- inc = s;
- }
- else {
- if(!findHeader(incname, QStringList(), &s)) {
- if(debug_enabled)
- printf("%s is not found anywhere\\n", qPrintable(incname));
- return false;
- }
- inc = s;
- }
-
- s = getenv(libvar).trimmed();
- if(!s.isEmpty()) {
- if(!checkLibrary(s, libname)) {
- if(debug_enabled)
- printf("%s is not found in \\"%s\\"\\n", qPrintable(libname), qPrintable(s));
- return false;
- }
- lib = s;
- }
- else {
- if(!findLibrary(libname, &s)) {
- if(debug_enabled)
- printf("%s is not found anywhere\\n", qPrintable(libname));
- return false;
- }
- lib = s;
- }
-
- QString lib_out;
- if(!lib.isEmpty())
- lib_out += QString("-L") + s + " ";
- lib_out += QString("-l") + libname;
-
- *incpath = inc;
- *libs = lib_out;
- return true;
-}
-
-bool Conf::findFooConfig(const QString &path, QString *version, QStringList *incs, QString *libs, QString *otherflags)
-{
- QStringList args;
- QByteArray out;
- int ret;
-
- args += "--version";
- ret = doCommand(path, args, &out);
- if(ret != 0)
- return false;
-
- QString version_out = QString::fromLatin1(out).trimmed();
-
- args.clear();
- args += "--libs";
- ret = doCommand(path, args, &out);
- if(ret != 0)
- return false;
-
- QString libs_out = QString::fromLatin1(out).trimmed();
-
- args.clear();
- args += "--cflags";
- ret = doCommand(path, args, &out);
- if(ret != 0)
- return false;
-
- QString cflags = QString::fromLatin1(out).trimmed();
-
- QStringList incs_out, otherflags_out;
- qc_splitcflags(cflags, &incs_out, &otherflags_out);
-
- *version = version_out;
- *incs = incs_out;
- *libs = libs_out;
- *otherflags = otherflags_out.join(QLatin1String(" "));
- return true;
-}
-
-bool Conf::findPkgConfig(const QString &name, VersionMode mode, const QString &req_version, QString *version, QStringList *incs, QString *libs, QString *otherflags)
-{
- QStringList args;
- QByteArray out;
- int ret;
-
- args += name;
- args += "--exists";
- ret = doCommand("pkg-config", args, &out);
- if(ret != 0)
- return false;
-
- if(mode != VersionAny)
- {
- args.clear();
- args += name;
- if(mode == VersionMin)
- args += QString("--atleast-version=%1").arg(req_version);
- else if(mode == VersionMax)
- args += QString("--max-version=%1").arg(req_version);
- else
- args += QString("--exact-version=%1").arg(req_version);
- ret = doCommand("pkg-config", args, &out);
- if(ret != 0)
- return false;
- }
-
- args.clear();
- args += name;
- args += "--modversion";
- ret = doCommand("pkg-config", args, &out);
- if(ret != 0)
- return false;
-
- QString version_out = QString::fromLatin1(out).trimmed();
-
- args.clear();
- args += name;
- args += "--libs";
- ret = doCommand("pkg-config", args, &out);
- if(ret != 0)
- return false;
-
- QString libs_out = QString::fromLatin1(out).trimmed();
-
- args.clear();
- args += name;
- args += "--cflags";
- ret = doCommand("pkg-config", args, &out);
- if(ret != 0)
- return false;
-
- QString cflags = QString::fromLatin1(out).trimmed();
-
- QStringList incs_out, otherflags_out;
- qc_splitcflags(cflags, &incs_out, &otherflags_out);
-
- *version = version_out;
- *incs = incs_out;
- *libs = libs_out;
- *otherflags = otherflags_out.join(QLatin1String(" "));
- return true;
-}
-
-void Conf::addDefine(const QString &str)
-{
- if(DEFINES.isEmpty())
- DEFINES = str;
- else
- DEFINES += QString(" ") + str;
- debug(QString("DEFINES += %1").arg(str));
-}
-
-void Conf::addLib(const QString &str)
-{
- QStringList libs = qc_splitflags(str);
- foreach (const QString &lib, libs) {
- if (lib.startsWith("-l")) {
- LIBS.append(lib);
- } else {
- LIBS.append(qc_normalize_path(lib)); // we don't care about -L prefix since normalier does not touch it.
- }
- }
- debug(QString("LIBS += %1").arg(str));
-}
-
-void Conf::addIncludePath(const QString &str)
-{
- INCLUDEPATH.append(qc_normalize_path(str));
- debug(QString("INCLUDEPATH += %1").arg(str));
-}
-
-void Conf::addExtra(const QString &str)
-{
- extra += str + '\\n';
- debug(QString("extra += %1").arg(str));
-}
-
-//----------------------------------------------------------------------------
-// main
-//----------------------------------------------------------------------------
-#include "conf4.moc"
-
-#ifdef HAVE_MODULES
-# include"modules.cpp"
-#endif
-
-int main(int argc, char ** argv)
-{
- QCoreApplication app(argc, argv);
- Conf *conf = new Conf;
- ConfObj *o = 0;
- Q_UNUSED(o);
-#ifdef HAVE_MODULES
-# include"modules_new.cpp"
-#endif
-
- conf->debug_enabled = (qc_getenv("QC_VERBOSE") == "Y") ? true: false;
- if(conf->debug_enabled)
- printf(" -> ok\\n");
- else
- printf("ok\\n");
-
- QString confCommand = qc_getenv("QC_COMMAND");
- QString proName = qc_getenv("QC_PROFILE");
- conf->qmake_path = qc_getenv("QC_QMAKE");
- conf->qmakespec = qc_getenv("QC_QMAKESPEC");
- conf->maketool = qc_getenv("QC_MAKETOOL");
-
- if(conf->debug_enabled)
- printf("conf command: [%s]\\n", qPrintable(confCommand));
-
- QString confPath = qc_findself(confCommand);
- if(confPath.isEmpty())
- {
- printf("Error: cannot find myself; rerun with an absolute path\\n");
- return 1;
- }
-
- QString srcdir = QFileInfo(confPath).absolutePath();
- QString builddir = QDir::current().absolutePath();
- QString proPath = QDir(srcdir).filePath(proName);
-
- if(conf->debug_enabled)
- {
- printf("conf path: [%s]\\n", qPrintable(confPath));
- printf("srcdir: [%s]\\n", qPrintable(srcdir));
- printf("builddir: [%s]\\n", qPrintable(builddir));
- printf("profile: [%s]\\n", qPrintable(proPath));
- printf("qmake path: [%s]\\n", qPrintable(conf->qmake_path));
- printf("qmakespec: [%s]\\n", qPrintable(conf->qmakespec));
- printf("make tool: [%s]\\n", qPrintable(conf->maketool));
- printf("\\n");
- }
-
- bool success = false;
- if(conf->exec())
- {
- QFile f("conf.pri");
- if(!f.open(QFile::WriteOnly | QFile::Truncate))
- {
- printf("Error writing %s\\n", qPrintable(f.fileName()));
- return 1;
- }
-
- QString str;
- str += "# qconf\\n\\n";
- str += "greaterThan(QT_MAJOR_VERSION, 4):CONFIG += c++11\\n";
-
- QString var;
- var = qc_normalize_path(qc_getenv("PREFIX"));
- if(!var.isEmpty())
- str += QString("PREFIX = %1\\n").arg(var);
- var = qc_normalize_path(qc_getenv("BINDIR"));
- if(!var.isEmpty())
- str += QString("BINDIR = %1\\n").arg(var);
- var = qc_normalize_path(qc_getenv("INCDIR"));
- if(!var.isEmpty())
- str += QString("INCDIR = %1\\n").arg(var);
- var = qc_normalize_path(qc_getenv("LIBDIR"));
- if(!var.isEmpty())
- str += QString("LIBDIR = %1\\n").arg(var);
- var = qc_normalize_path(qc_getenv("DATADIR"));
- if(!var.isEmpty())
- str += QString("DATADIR = %1\\n").arg(var);
- str += '\\n';
-
- if(qc_getenv("QC_STATIC") == "Y")
- str += "CONFIG += staticlib\\n";
-
- // TODO: don't need this?
- //str += "QT_PATH_PLUGINS = " + QString(qInstallPathPlugins()) + '\\n';
-
- if(!conf->DEFINES.isEmpty())
- str += "DEFINES += " + conf->DEFINES + '\\n';
- if(!conf->INCLUDEPATH.isEmpty())
- str += "INCLUDEPATH += " + qc_prepare_includepath(conf->INCLUDEPATH) + '\\n';
- if(!conf->LIBS.isEmpty())
- str += "LIBS += " + qc_prepare_libs(conf->LIBS) + '\\n';
- if(!conf->extra.isEmpty())
- str += conf->extra;
- str += '\\n';
-
- var = qc_getenv("QC_EXTRACONF");
- if (!var.isEmpty())
- str += ("\\n# Extra conf from command line\\n" + var + "\\n");
-
- QByteArray cs = str.toLatin1();
- f.write(cs);
- f.close();
- success = true;
- }
- QString qmake_path = conf->qmake_path;
- QString qmakespec = conf->qmakespec;
- delete conf;
-
- if(!success)
- return 1;
-
- // run qmake on the project file
- QStringList args;
- if(!qmakespec.isEmpty())
- {
- args += "-spec";
- args += qmakespec;
- }
- args += proPath;
- int ret = qc_runprogram(qmake_path, args, 0, true);
- if(ret != 0)
- return 1;
-
- return 0;
-}
-
-EOT
-cat >"$1/conf4.pro" </dev/null
- else
- "$qm" conf4.pro >/dev/null
- fi
- $MAKE clean >/dev/null 2>&1
- $MAKE >../conf.log 2>&1
-)
-
-if [ "$?" != "0" ]; then
- rm -rf ".qconftemp"
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo " -> fail"
- else
- echo "fail"
- fi
- printf "\n"
- printf "Reason: There was an error compiling 'conf'. See conf.log for details.\n"
- printf "\n"
- show_qt_info
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo "conf.log:"
- cat conf.log
- fi
- exit 1;
-fi
-
-QC_COMMAND=$0
-export QC_COMMAND
-QC_PROFILE=iris.pro
-export QC_PROFILE
-QC_QMAKE="$qm"
-export QC_QMAKE
-QC_QMAKESPEC=$qm_spec
-export QC_QMAKESPEC
-QC_MAKETOOL=$MAKE
-export QC_MAKETOOL
-".qconftemp/conf"
-ret="$?"
-if [ "$ret" = "1" ]; then
- rm -rf ".qconftemp"
- echo
- exit 1;
-else
- if [ "$ret" != "0" ]; then
- rm -rf ".qconftemp"
- if [ "$QC_VERBOSE" = "Y" ]; then
- echo " -> fail"
- else
- echo "fail"
- fi
- echo
- echo "Reason: Unexpected error launching 'conf'"
- echo
- exit 1;
- fi
-fi
-rm -rf ".qconftemp"
-
-echo
-echo "Good, your configure finished. Now run $MAKE."
-echo
diff --git a/configure.exe b/configure.exe
deleted file mode 100644
index 139fbc1c..00000000
Binary files a/configure.exe and /dev/null differ
diff --git a/include/iris/addressresolver.h b/include/iris/addressresolver.h
index 4e7e4455..6d771ec4 100644
--- a/include/iris/addressresolver.h
+++ b/include/iris/addressresolver.h
@@ -1 +1 @@
-#include "../../src/irisnet/corelib/addressresolver.h"
+#include "irisnet/corelib/addressresolver.h"
diff --git a/include/iris/bsocket.h b/include/iris/bsocket.h
index 5c7c906d..dc480185 100644
--- a/include/iris/bsocket.h
+++ b/include/iris/bsocket.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/cutestuff/bsocket.h"
+#include "irisnet/noncore/cutestuff/bsocket.h"
diff --git a/include/iris/bytestream.h b/include/iris/bytestream.h
index cae0e2e9..5d276979 100644
--- a/include/iris/bytestream.h
+++ b/include/iris/bytestream.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/cutestuff/bytestream.h"
+#include "irisnet/noncore/cutestuff/bytestream.h"
diff --git a/include/iris/dtls.h b/include/iris/dtls.h
new file mode 100644
index 00000000..7bfafddc
--- /dev/null
+++ b/include/iris/dtls.h
@@ -0,0 +1 @@
+#include "irisnet/noncore/dtls.h"
diff --git a/include/iris/filetransfer.h b/include/iris/filetransfer.h
index e17e8ab0..c9e5d59d 100644
--- a/include/iris/filetransfer.h
+++ b/include/iris/filetransfer.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/filetransfer.h"
+#include "xmpp/xmpp-im/filetransfer.h"
diff --git a/include/iris/httpconnect.h b/include/iris/httpconnect.h
index 91306af6..b0840552 100644
--- a/include/iris/httpconnect.h
+++ b/include/iris/httpconnect.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/cutestuff/httpconnect.h"
+#include "irisnet/noncore/cutestuff/httpconnect.h"
diff --git a/include/iris/httpfileupload.h b/include/iris/httpfileupload.h
index 381b857d..efe0bb11 100644
--- a/include/iris/httpfileupload.h
+++ b/include/iris/httpfileupload.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/httpfileupload.h"
+#include "xmpp/xmpp-im/httpfileupload.h"
diff --git a/include/iris/httppoll.h b/include/iris/httppoll.h
index 5ac52eb5..162d67c0 100644
--- a/include/iris/httppoll.h
+++ b/include/iris/httppoll.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/cutestuff/httppoll.h"
+#include "irisnet/noncore/cutestuff/httppoll.h"
diff --git a/include/iris/ice176.h b/include/iris/ice176.h
index 5a6360a5..adc42e8c 100644
--- a/include/iris/ice176.h
+++ b/include/iris/ice176.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/ice176.h"
+#include "irisnet/noncore/ice176.h"
diff --git a/include/iris/iceabstractstundisco.h b/include/iris/iceabstractstundisco.h
new file mode 100644
index 00000000..9f3f6a8a
--- /dev/null
+++ b/include/iris/iceabstractstundisco.h
@@ -0,0 +1 @@
+#include "irisnet/noncore/iceabstractstundisco.h"
diff --git a/include/iris/iceagent.h b/include/iris/iceagent.h
new file mode 100644
index 00000000..c8739eda
--- /dev/null
+++ b/include/iris/iceagent.h
@@ -0,0 +1 @@
+#include "irisnet/noncore/iceagent.h"
diff --git a/include/iris/im.h b/include/iris/im.h
index beb8c104..ee83ff9a 100644
--- a/include/iris/im.h
+++ b/include/iris/im.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/im.h"
+#include "xmpp/xmpp-im/im.h"
diff --git a/include/iris/irisnetexport.h b/include/iris/irisnetexport.h
index d169d1ed..9cb9d147 100644
--- a/include/iris/irisnetexport.h
+++ b/include/iris/irisnetexport.h
@@ -1 +1 @@
-#include "../../src/irisnet/corelib/irisnetexport.h"
+#include "irisnet/corelib/irisnetexport.h"
diff --git a/include/iris/irisnetglobal.h b/include/iris/irisnetglobal.h
index 28a55c73..552439d9 100644
--- a/include/iris/irisnetglobal.h
+++ b/include/iris/irisnetglobal.h
@@ -1 +1 @@
-#include "../../src/irisnet/corelib/irisnetglobal.h"
+#include "irisnet/corelib/irisnetglobal.h"
diff --git a/include/iris/irisnetplugin.h b/include/iris/irisnetplugin.h
index 2d4b0a3a..86d21917 100644
--- a/include/iris/irisnetplugin.h
+++ b/include/iris/irisnetplugin.h
@@ -1 +1 @@
-#include "../../src/irisnet/corelib/irisnetplugin.h"
+#include "irisnet/corelib/irisnetplugin.h"
diff --git a/include/iris/jingle-application.h b/include/iris/jingle-application.h
new file mode 100644
index 00000000..754225c1
--- /dev/null
+++ b/include/iris/jingle-application.h
@@ -0,0 +1 @@
+#include "xmpp/xmpp-im/jingle-application.h"
diff --git a/include/iris/jingle-ft.h b/include/iris/jingle-ft.h
index a9880b3f..7caced0e 100644
--- a/include/iris/jingle-ft.h
+++ b/include/iris/jingle-ft.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/jingle-ft.h"
+#include "xmpp/xmpp-im/jingle-ft.h"
diff --git a/include/iris/jingle-ice.h b/include/iris/jingle-ice.h
new file mode 100644
index 00000000..6dd3e033
--- /dev/null
+++ b/include/iris/jingle-ice.h
@@ -0,0 +1 @@
+#include "xmpp/xmpp-im/jingle-ice.h"
diff --git a/include/iris/jingle-nstransportslist.h b/include/iris/jingle-nstransportslist.h
new file mode 100644
index 00000000..a1f36859
--- /dev/null
+++ b/include/iris/jingle-nstransportslist.h
@@ -0,0 +1 @@
+#include "xmpp/xmpp-im/jingle-nstransportslist.h"
diff --git a/include/iris/jingle-s5b.h b/include/iris/jingle-s5b.h
index 725e0a05..b34fceea 100644
--- a/include/iris/jingle-s5b.h
+++ b/include/iris/jingle-s5b.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/jingle-s5b.h"
+#include "xmpp/xmpp-im/jingle-s5b.h"
diff --git a/include/iris/jingle-session.h b/include/iris/jingle-session.h
new file mode 100644
index 00000000..d8c14eea
--- /dev/null
+++ b/include/iris/jingle-session.h
@@ -0,0 +1 @@
+#include "xmpp/xmpp-im/jingle-session.h"
diff --git a/include/iris/jingle-transport.h b/include/iris/jingle-transport.h
new file mode 100644
index 00000000..6898bd68
--- /dev/null
+++ b/include/iris/jingle-transport.h
@@ -0,0 +1 @@
+#include "xmpp/xmpp-im/jingle-transport.h"
diff --git a/include/iris/jingle.h b/include/iris/jingle.h
index 73551781..c4d32a97 100644
--- a/include/iris/jingle.h
+++ b/include/iris/jingle.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/jingle.h"
+#include "xmpp/xmpp-im/jingle.h"
diff --git a/include/iris/ndns.h b/include/iris/ndns.h
index ea5c8b5f..9c270bba 100644
--- a/include/iris/ndns.h
+++ b/include/iris/ndns.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/legacy/ndns.h"
+#include "irisnet/noncore/legacy/ndns.h"
diff --git a/include/iris/netavailability.h b/include/iris/netavailability.h
index 11ef9114..8079c5f6 100644
--- a/include/iris/netavailability.h
+++ b/include/iris/netavailability.h
@@ -1 +1 @@
-#include "../../src/irisnet/corelib/netavailability.h"
+#include "irisnet/corelib/netavailability.h"
diff --git a/include/iris/netinterface.h b/include/iris/netinterface.h
index 6e0e2333..4d95300d 100644
--- a/include/iris/netinterface.h
+++ b/include/iris/netinterface.h
@@ -1 +1 @@
-#include "../../src/irisnet/corelib/netinterface.h"
+#include "irisnet/corelib/netinterface.h"
diff --git a/include/iris/netnames.h b/include/iris/netnames.h
index 5ac6a1ee..804950ca 100644
--- a/include/iris/netnames.h
+++ b/include/iris/netnames.h
@@ -1 +1 @@
-#include "../../src/irisnet/corelib/netnames.h"
+#include "irisnet/corelib/netnames.h"
diff --git a/include/iris/objectsession.h b/include/iris/objectsession.h
index 31bb9009..e98bef86 100644
--- a/include/iris/objectsession.h
+++ b/include/iris/objectsession.h
@@ -1 +1 @@
-#include "../../src/irisnet/corelib/objectsession.h"
+#include "irisnet/corelib/objectsession.h"
diff --git a/include/iris/processquit.h b/include/iris/processquit.h
index 0f39f170..c92f192f 100644
--- a/include/iris/processquit.h
+++ b/include/iris/processquit.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/processquit.h"
+#include "irisnet/noncore/processquit.h"
diff --git a/include/iris/s5b.h b/include/iris/s5b.h
index 6658c494..d868c241 100644
--- a/include/iris/s5b.h
+++ b/include/iris/s5b.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/s5b.h"
+#include "xmpp/xmpp-im/s5b.h"
diff --git a/include/iris/socks.h b/include/iris/socks.h
index ff5108ab..08cdb678 100644
--- a/include/iris/socks.h
+++ b/include/iris/socks.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/cutestuff/socks.h"
+#include "irisnet/noncore/cutestuff/socks.h"
diff --git a/include/iris/srvresolver.h b/include/iris/srvresolver.h
index 7ece1aba..13ea4671 100644
--- a/include/iris/srvresolver.h
+++ b/include/iris/srvresolver.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/legacy/srvresolver.h"
+#include "irisnet/noncore/legacy/srvresolver.h"
diff --git a/include/iris/stunallocate.h b/include/iris/stunallocate.h
index a1c9a746..4b5d7aa6 100644
--- a/include/iris/stunallocate.h
+++ b/include/iris/stunallocate.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/stunallocate.h"
+#include "irisnet/noncore/stunallocate.h"
diff --git a/include/iris/stunbinding.h b/include/iris/stunbinding.h
index 86f92df1..5370cc52 100644
--- a/include/iris/stunbinding.h
+++ b/include/iris/stunbinding.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/stunbinding.h"
+#include "irisnet/noncore/stunbinding.h"
diff --git a/include/iris/stunmessage.h b/include/iris/stunmessage.h
index 6025e7b8..40ac0d7c 100644
--- a/include/iris/stunmessage.h
+++ b/include/iris/stunmessage.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/stunmessage.h"
+#include "irisnet/noncore/stunmessage.h"
diff --git a/include/iris/stuntransaction.h b/include/iris/stuntransaction.h
index 05d65576..fef1831c 100644
--- a/include/iris/stuntransaction.h
+++ b/include/iris/stuntransaction.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/stuntransaction.h"
+#include "irisnet/noncore/stuntransaction.h"
diff --git a/include/iris/tcpportreserver.h b/include/iris/tcpportreserver.h
new file mode 100644
index 00000000..5fa38181
--- /dev/null
+++ b/include/iris/tcpportreserver.h
@@ -0,0 +1 @@
+#include "irisnet/noncore/tcpportreserver.h"
diff --git a/include/iris/turnclient.h b/include/iris/turnclient.h
index 07de0434..1edf8d39 100644
--- a/include/iris/turnclient.h
+++ b/include/iris/turnclient.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/turnclient.h"
+#include "irisnet/noncore/turnclient.h"
diff --git a/include/iris/udpportreserver.h b/include/iris/udpportreserver.h
index d7e93233..50101a1e 100644
--- a/include/iris/udpportreserver.h
+++ b/include/iris/udpportreserver.h
@@ -1 +1 @@
-#include "../../src/irisnet/noncore/udpportreserver.h"
+#include "irisnet/noncore/udpportreserver.h"
diff --git a/include/iris/xmpp.h b/include/iris/xmpp.h
index cbeb4bab..1ced3d12 100644
--- a/include/iris/xmpp.h
+++ b/include/iris/xmpp.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-core/xmpp.h"
+#include "xmpp/xmpp-core/xmpp.h"
diff --git a/include/iris/xmpp_address.h b/include/iris/xmpp_address.h
index a6b8a669..2d87c6db 100644
--- a/include/iris/xmpp_address.h
+++ b/include/iris/xmpp_address.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_address.h"
+#include "xmpp/xmpp-im/xmpp_address.h"
diff --git a/include/iris/xmpp_agentitem.h b/include/iris/xmpp_agentitem.h
index 4ac1d4ee..fd477af0 100644
--- a/include/iris/xmpp_agentitem.h
+++ b/include/iris/xmpp_agentitem.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_agentitem.h"
+#include "xmpp/xmpp-im/xmpp_agentitem.h"
diff --git a/include/iris/xmpp_bitsofbinary.h b/include/iris/xmpp_bitsofbinary.h
index 01b1bf8d..011ebf4a 100644
--- a/include/iris/xmpp_bitsofbinary.h
+++ b/include/iris/xmpp_bitsofbinary.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_bitsofbinary.h"
+#include "xmpp/xmpp-im/xmpp_bitsofbinary.h"
diff --git a/include/iris/xmpp_bytestream.h b/include/iris/xmpp_bytestream.h
new file mode 100644
index 00000000..3afd0e3a
--- /dev/null
+++ b/include/iris/xmpp_bytestream.h
@@ -0,0 +1 @@
+#include "xmpp/xmpp-im/xmpp_bytestream.h"
diff --git a/include/iris/xmpp_caps.h b/include/iris/xmpp_caps.h
index 4dde12ab..7b758b41 100644
--- a/include/iris/xmpp_caps.h
+++ b/include/iris/xmpp_caps.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_caps.h"
+#include "xmpp/xmpp-im/xmpp_caps.h"
diff --git a/include/iris/xmpp_captcha.h b/include/iris/xmpp_captcha.h
index 466b4315..1a00797f 100644
--- a/include/iris/xmpp_captcha.h
+++ b/include/iris/xmpp_captcha.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_captcha.h"
+#include "xmpp/xmpp-im/xmpp_captcha.h"
diff --git a/include/iris/xmpp_chatstate.h b/include/iris/xmpp_chatstate.h
index a09c9cc6..a4c29fa2 100644
--- a/include/iris/xmpp_chatstate.h
+++ b/include/iris/xmpp_chatstate.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_chatstate.h"
+#include "xmpp/xmpp-im/xmpp_chatstate.h"
diff --git a/include/iris/xmpp_client.h b/include/iris/xmpp_client.h
index 8d7b1ac7..44c3397f 100644
--- a/include/iris/xmpp_client.h
+++ b/include/iris/xmpp_client.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_client.h"
+#include "xmpp/xmpp-im/xmpp_client.h"
diff --git a/include/iris/xmpp_clientstream.h b/include/iris/xmpp_clientstream.h
index 090f8548..6f2054ba 100644
--- a/include/iris/xmpp_clientstream.h
+++ b/include/iris/xmpp_clientstream.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-core/xmpp_clientstream.h"
+#include "xmpp/xmpp-core/xmpp_clientstream.h"
diff --git a/include/iris/xmpp_discoinfotask.h b/include/iris/xmpp_discoinfotask.h
index 2e06c7be..38410b48 100644
--- a/include/iris/xmpp_discoinfotask.h
+++ b/include/iris/xmpp_discoinfotask.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_discoinfotask.h"
+#include "xmpp/xmpp-im/xmpp_discoinfotask.h"
diff --git a/include/iris/xmpp_discoitem.h b/include/iris/xmpp_discoitem.h
index 76c777f2..4e7a1fa1 100644
--- a/include/iris/xmpp_discoitem.h
+++ b/include/iris/xmpp_discoitem.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_discoitem.h"
+#include "xmpp/xmpp-im/xmpp_discoitem.h"
diff --git a/include/iris/xmpp_encryption.h b/include/iris/xmpp_encryption.h
new file mode 100644
index 00000000..895f43b1
--- /dev/null
+++ b/include/iris/xmpp_encryption.h
@@ -0,0 +1 @@
+#include "xmpp/xmpp-im/xmpp_encryption.h"
diff --git a/include/iris/xmpp_encryptionhandler.h b/include/iris/xmpp_encryptionhandler.h
index 26e56549..3c7aecd9 100644
--- a/include/iris/xmpp_encryptionhandler.h
+++ b/include/iris/xmpp_encryptionhandler.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_encryptionhandler.h"
+#include "xmpp/xmpp-im/xmpp_encryptionhandler.h"
diff --git a/include/iris/xmpp_features.h b/include/iris/xmpp_features.h
index caf6865d..2a06625a 100644
--- a/include/iris/xmpp_features.h
+++ b/include/iris/xmpp_features.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_features.h"
+#include "xmpp/xmpp-im/xmpp_features.h"
diff --git a/include/iris/xmpp_form.h b/include/iris/xmpp_form.h
new file mode 100644
index 00000000..cd320c78
--- /dev/null
+++ b/include/iris/xmpp_form.h
@@ -0,0 +1 @@
+#include "xmpp/xmpp-im/xmpp_form.h"
diff --git a/include/iris/xmpp_hash.h b/include/iris/xmpp_hash.h
index b27bbbd1..dc081bed 100644
--- a/include/iris/xmpp_hash.h
+++ b/include/iris/xmpp_hash.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_hash.h"
+#include "xmpp/xmpp-im/xmpp_hash.h"
diff --git a/include/iris/xmpp_htmlelement.h b/include/iris/xmpp_htmlelement.h
index 95bab250..fdf91719 100644
--- a/include/iris/xmpp_htmlelement.h
+++ b/include/iris/xmpp_htmlelement.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_htmlelement.h"
+#include "xmpp/xmpp-im/xmpp_htmlelement.h"
diff --git a/include/iris/xmpp_httpauthrequest.h b/include/iris/xmpp_httpauthrequest.h
index bec230e9..63646a1e 100644
--- a/include/iris/xmpp_httpauthrequest.h
+++ b/include/iris/xmpp_httpauthrequest.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_httpauthrequest.h"
+#include "xmpp/xmpp-im/xmpp_httpauthrequest.h"
diff --git a/include/iris/xmpp_jid.h b/include/iris/xmpp_jid.h
index bdb862da..94dc48d7 100644
--- a/include/iris/xmpp_jid.h
+++ b/include/iris/xmpp_jid.h
@@ -1 +1 @@
-#include "../../src/xmpp/jid/jid.h"
+#include "xmpp/jid/jid.h"
diff --git a/include/iris/xmpp_liveroster.h b/include/iris/xmpp_liveroster.h
index ab67fcbc..bab57092 100644
--- a/include/iris/xmpp_liveroster.h
+++ b/include/iris/xmpp_liveroster.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_liveroster.h"
+#include "xmpp/xmpp-im/xmpp_liveroster.h"
diff --git a/include/iris/xmpp_liverosteritem.h b/include/iris/xmpp_liverosteritem.h
index db5c2488..1a2efc15 100644
--- a/include/iris/xmpp_liverosteritem.h
+++ b/include/iris/xmpp_liverosteritem.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_liverosteritem.h"
+#include "xmpp/xmpp-im/xmpp_liverosteritem.h"
diff --git a/include/iris/xmpp_message.h b/include/iris/xmpp_message.h
index a75e34fa..29428d99 100644
--- a/include/iris/xmpp_message.h
+++ b/include/iris/xmpp_message.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_message.h"
+#include "xmpp/xmpp-im/xmpp_message.h"
diff --git a/include/iris/xmpp_muc.h b/include/iris/xmpp_muc.h
index 6f6fe741..6f0ae4d4 100644
--- a/include/iris/xmpp_muc.h
+++ b/include/iris/xmpp_muc.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_muc.h"
+#include "xmpp/xmpp-im/xmpp_muc.h"
diff --git a/include/iris/xmpp_pubsubitem.h b/include/iris/xmpp_pubsubitem.h
index 59f19b3b..780bff84 100644
--- a/include/iris/xmpp_pubsubitem.h
+++ b/include/iris/xmpp_pubsubitem.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_pubsubitem.h"
+#include "xmpp/xmpp-im/xmpp_pubsubitem.h"
diff --git a/include/iris/xmpp_pubsubretraction.h b/include/iris/xmpp_pubsubretraction.h
index d89799d4..49151f85 100644
--- a/include/iris/xmpp_pubsubretraction.h
+++ b/include/iris/xmpp_pubsubretraction.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_pubsubretraction.h"
+#include "xmpp/xmpp-im/xmpp_pubsubretraction.h"
diff --git a/include/iris/xmpp_reference.h b/include/iris/xmpp_reference.h
new file mode 100644
index 00000000..fa00c922
--- /dev/null
+++ b/include/iris/xmpp_reference.h
@@ -0,0 +1 @@
+#include "xmpp/xmpp-im/xmpp_reference.h"
diff --git a/include/iris/xmpp_resource.h b/include/iris/xmpp_resource.h
index 2f5a9979..b0867cf5 100644
--- a/include/iris/xmpp_resource.h
+++ b/include/iris/xmpp_resource.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_resource.h"
+#include "xmpp/xmpp-im/xmpp_resource.h"
diff --git a/include/iris/xmpp_resourcelist.h b/include/iris/xmpp_resourcelist.h
index 5771cdd1..27f5d3ad 100644
--- a/include/iris/xmpp_resourcelist.h
+++ b/include/iris/xmpp_resourcelist.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_resourcelist.h"
+#include "xmpp/xmpp-im/xmpp_resourcelist.h"
diff --git a/include/iris/xmpp_roster.h b/include/iris/xmpp_roster.h
index 646f2970..27c9b32c 100644
--- a/include/iris/xmpp_roster.h
+++ b/include/iris/xmpp_roster.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_roster.h"
+#include "xmpp/xmpp-im/xmpp_roster.h"
diff --git a/include/iris/xmpp_rosteritem.h b/include/iris/xmpp_rosteritem.h
index f4d4cf7b..94c9d809 100644
--- a/include/iris/xmpp_rosteritem.h
+++ b/include/iris/xmpp_rosteritem.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_rosteritem.h"
+#include "xmpp/xmpp-im/xmpp_rosteritem.h"
diff --git a/include/iris/xmpp_rosterx.h b/include/iris/xmpp_rosterx.h
index 325b56a6..2d7a9728 100644
--- a/include/iris/xmpp_rosterx.h
+++ b/include/iris/xmpp_rosterx.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_rosterx.h"
+#include "xmpp/xmpp-im/xmpp_rosterx.h"
diff --git a/include/iris/xmpp_serverinfomanager.h b/include/iris/xmpp_serverinfomanager.h
index dd79d801..8c5d7f86 100644
--- a/include/iris/xmpp_serverinfomanager.h
+++ b/include/iris/xmpp_serverinfomanager.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_serverinfomanager.h"
+#include "xmpp/xmpp-im/xmpp_serverinfomanager.h"
diff --git a/include/iris/xmpp_stanza.h b/include/iris/xmpp_stanza.h
index 4f0b024d..e8cb64f7 100644
--- a/include/iris/xmpp_stanza.h
+++ b/include/iris/xmpp_stanza.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-core/xmpp_stanza.h"
+#include "xmpp/xmpp-core/xmpp_stanza.h"
diff --git a/include/iris/xmpp_status.h b/include/iris/xmpp_status.h
index 69511013..2c923b42 100644
--- a/include/iris/xmpp_status.h
+++ b/include/iris/xmpp_status.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_status.h"
+#include "xmpp/xmpp-im/xmpp_status.h"
diff --git a/include/iris/xmpp_stream.h b/include/iris/xmpp_stream.h
index 5c996666..5ce83e84 100644
--- a/include/iris/xmpp_stream.h
+++ b/include/iris/xmpp_stream.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-core/xmpp_stream.h"
+#include "xmpp/xmpp-core/xmpp_stream.h"
diff --git a/include/iris/xmpp_subsets.h b/include/iris/xmpp_subsets.h
index be99daa2..5b54bed1 100644
--- a/include/iris/xmpp_subsets.h
+++ b/include/iris/xmpp_subsets.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_subsets.h"
+#include "xmpp/xmpp-im/xmpp_subsets.h"
diff --git a/include/iris/xmpp_task.h b/include/iris/xmpp_task.h
index 0f8f4667..ac65e099 100644
--- a/include/iris/xmpp_task.h
+++ b/include/iris/xmpp_task.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_task.h"
+#include "xmpp/xmpp-im/xmpp_task.h"
diff --git a/include/iris/xmpp_tasks.h b/include/iris/xmpp_tasks.h
index 6cb81815..0dc03e84 100644
--- a/include/iris/xmpp_tasks.h
+++ b/include/iris/xmpp_tasks.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_tasks.h"
+#include "xmpp/xmpp-im/xmpp_tasks.h"
diff --git a/include/iris/xmpp_thumbs.h b/include/iris/xmpp_thumbs.h
index b24861a0..7715981f 100644
--- a/include/iris/xmpp_thumbs.h
+++ b/include/iris/xmpp_thumbs.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_thumbs.h"
+#include "xmpp/xmpp-im/xmpp_thumbs.h"
diff --git a/include/iris/xmpp_url.h b/include/iris/xmpp_url.h
index 16b3ac6a..674eb76d 100644
--- a/include/iris/xmpp_url.h
+++ b/include/iris/xmpp_url.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_url.h"
+#include "xmpp/xmpp-im/xmpp_url.h"
diff --git a/include/iris/xmpp_vcard.h b/include/iris/xmpp_vcard.h
index 285e6b5c..1210fdb3 100644
--- a/include/iris/xmpp_vcard.h
+++ b/include/iris/xmpp_vcard.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_vcard.h"
+#include "xmpp/xmpp-im/xmpp_vcard.h"
diff --git a/include/iris/xmpp_xdata.h b/include/iris/xmpp_xdata.h
index 417e71f7..8316f4c9 100644
--- a/include/iris/xmpp_xdata.h
+++ b/include/iris/xmpp_xdata.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_xdata.h"
+#include "xmpp/xmpp-im/xmpp_xdata.h"
diff --git a/include/iris/xmpp_xmlcommon.h b/include/iris/xmpp_xmlcommon.h
index 779b4b59..2c0d42c0 100644
--- a/include/iris/xmpp_xmlcommon.h
+++ b/include/iris/xmpp_xmlcommon.h
@@ -1 +1 @@
-#include "../../src/xmpp/xmpp-im/xmpp_xmlcommon.h"
+#include "xmpp/xmpp-im/xmpp_xmlcommon.h"
diff --git a/iris.pc.in b/iris.pc.in
index 676104d0..68f1faaa 100644
--- a/iris.pc.in
+++ b/iris.pc.in
@@ -1,10 +1,10 @@
-prefix=@CMAKE_INSTALL_PREFIX@
-exec_prefix=${prefix}
-libdir=@LIB_INSTALL_DIR@
-includedir=@INCLUDE_INSTALL_DIR@/iris
+prefix="@CMAKE_INSTALL_PREFIX@"
+exec_prefix="${prefix}"
+libdir="${prefix}/@CMAKE_INSTALL_LIBDIR@"
+includedir="${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/xmpp"
Name: iris
Description: Iris is a comprehensive library for working with the XMPP protocol
-Version: @IRIS_LIB_MAJOR_VERSION@.@IRIS_LIB_MINOR_VERSION@.@IRIS_LIB_PATCH_VERSION@
+Version: @IRIS_LIB_VERSION_STRING@
Libs: -L${libdir} -liris
Cflags: -I${includedir}
diff --git a/iris.pri b/iris.pri
deleted file mode 100644
index bbdba3b3..00000000
--- a/iris.pri
+++ /dev/null
@@ -1,48 +0,0 @@
-IRIS_BASE = $$PWD
-include(common.pri)
-
-CONFIG *= link_prl # doesn't seems to work but at least it's documented unlike dependp_prl
-unix { # most of devs are on Linux anyway
- PRE_TARGETDEPS += $$top_iris_builddir/lib/libiris.a
- PRE_TARGETDEPS += $$top_iris_builddir/lib/libirisnet.a
-}
-
-INCLUDEPATH += $$IRIS_BASE/include $$IRIS_BASE/include/iris $$IRIS_BASE/src
-
-iris_bundle:{
- include(src/xmpp/xmpp.pri)
-}
-else {
- isEmpty(top_iris_builddir):top_iris_builddir = $$PWD
- LIBS += -L$$top_iris_builddir/lib -liris
-}
-
-# force on all windows, plus qca ordering workaround
-windows {
- DEFINES += IRISNET_STATIC # from irisnet
- LIBS += -L$$top_iris_builddir/lib -lirisnet # from iris
- LIBS += -lWs2_32 -lAdvapi32 # from jdns
- contains(LIBS, -lqca) {
- LIBS -= -lqca
- LIBS += -lqca
- }
- contains(LIBS, -lqcad) {
- LIBS -= -lqcad
- LIBS += -lqcad
- }
-
- contains(LIBS, -lidn) {
- LIBS -= -lidn
- LIBS += -lidn
- }
-
- contains(LIBS, -lz) {
- LIBS -= -lz
- LIBS += -lz
- }
-
- contains(LIBS, -lzlib) {
- LIBS -= -lzlib
- LIBS += -lzlib
- }
-}
diff --git a/iris.pro b/iris.pro
deleted file mode 100644
index f8ba8ae5..00000000
--- a/iris.pro
+++ /dev/null
@@ -1,20 +0,0 @@
-TEMPLATE = subdirs
-
-IRIS_BASE = $$PWD
-isEmpty(top_iris_builddir):top_iris_builddir = .
-include($$top_iris_builddir/conf.pri)
-
-include(common.pri)
-
-# do we have a reason to enter the src dir?
-appledns:!appledns_bundle:CONFIG *= build_src
-!irisnetcore_bundle:CONFIG *= build_src
-!iris_bundle:CONFIG *= build_src
-
-sub_src.subdir = src
-sub_tools.subdir = tools
-sub_tools.depends = sub_src
-
-build_src:SUBDIRS += sub_src
-
-iris_tests:SUBDIRS += sub_tools
diff --git a/iris.qc b/iris.qc
deleted file mode 100644
index dee09baf..00000000
--- a/iris.qc
+++ /dev/null
@@ -1,31 +0,0 @@
-
- Iris
- iris.pro
-
-
- qcm
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/qcm/README b/qcm/README
deleted file mode 100644
index 4ca5ce2a..00000000
--- a/qcm/README
+++ /dev/null
@@ -1,5 +0,0 @@
-qt42, buildmode, and universal modules are all copied from qca.
-do not modify them here.
-
-the qca module is copied from qca, but modified here. we should consider
-pushing the changes back.
diff --git a/qcm/buildmode.qcm b/qcm/buildmode.qcm
deleted file mode 100644
index 74da89bc..00000000
--- a/qcm/buildmode.qcm
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
------BEGIN QCMOD-----
-name: buildmode
-section: project
-arg: release,Build with debugging turned off (default).
-arg: debug,Build with debugging turned on.
-arg: debug-and-release,Build two versions, with and without debugging turned on (mac only).
-arg: no-separate-debug-info,Do not store debug information in a separate file (default for mac).
-arg: separate-debug-info,Strip debug information into a separate .debug file (default for non-mac).
-arg: no-framework,Do not build as a Mac framework.
-arg: framework,Build as a Mac framework (default).
------END QCMOD-----
-*/
-
-#define QC_BUILDMODE
-bool qc_buildmode_release = false;
-bool qc_buildmode_debug = false;
-bool qc_buildmode_framework = false;
-bool qc_buildmode_separate_debug_info = false;
-
-class qc_buildmode : public ConfObj
-{
-public:
- qc_buildmode(Conf *c) : ConfObj(c) {}
- QString name() const { return "buildmode"; }
- QString shortname() const { return "buildmode"; }
-
- // no output
- QString checkString() const { return QString(); }
-
- bool exec()
- {
- // first, parse out the options
- bool opt_release = false;
- bool opt_debug = false;
- bool opt_debug_and_release = false;
- bool opt_no_framework = false;
- bool opt_framework = false;
- bool opt_no_separate_debug_info = false;
- bool opt_separate_debug_info = false;
-
- if(conf->getenv("QC_RELEASE") == "Y")
- opt_release = true;
- if(conf->getenv("QC_DEBUG") == "Y")
- opt_debug = true;
- if(conf->getenv("QC_DEBUG_AND_RELEASE") == "Y")
- opt_debug_and_release = true;
- if(conf->getenv("QC_NO_FRAMEWORK") == "Y")
- opt_no_framework = true;
- if(conf->getenv("QC_FRAMEWORK") == "Y")
- opt_framework = true;
- if(conf->getenv("QC_NO_SEPARATE_DEBUG_INFO") == "Y")
- opt_no_separate_debug_info = true;
- if(conf->getenv("QC_SEPARATE_DEBUG_INFO") == "Y")
- opt_separate_debug_info = true;
-
- bool staticmode = false;
- if(conf->getenv("QC_STATIC") == "Y")
- staticmode = true;
-
-#ifndef Q_OS_MAC
- if(opt_debug_and_release)
- {
- printf("\nError: The --debug-and-release option is for mac only.\n");
- exit(1);
- }
-
- if(opt_framework)
- {
- printf("\nError: The --framework option is for mac only.\n");
- exit(1);
- }
-#endif
-
- if(opt_framework && opt_debug)
- {
- printf("\nError: Cannot use both --framework and --debug.\n");
- exit(1);
- }
-
- // sanity check exclusive options
- int x;
-
- // build mode
- x = 0;
- if(opt_release)
- ++x;
- if(opt_debug)
- ++x;
- if(opt_debug_and_release)
- ++x;
- if(x > 1)
- {
- printf("\nError: Use only one of --release, --debug, or --debug-and-release.\n");
- exit(1);
- }
-
- // framework
- if(opt_framework && staticmode)
- {
- printf("\nError: Cannot use both --framework and --static.\n");
- exit(1);
- }
-
- x = 0;
- if(opt_no_framework)
- ++x;
- if(opt_framework)
- ++x;
- if(x > 1)
- {
- printf("\nError: Use only one of --framework or --no-framework.\n");
- exit(1);
- }
-
- // debug info
- x = 0;
- if(opt_no_separate_debug_info)
- ++x;
- if(opt_separate_debug_info)
- ++x;
- if(x > 1)
- {
- printf("\nError: Use only one of --separate-debug-info or --no-separate-debug-info\n");
- exit(1);
- }
-
- // now process the options
-
- if(opt_release)
- qc_buildmode_release = true;
- else if(opt_debug)
- qc_buildmode_debug = true;
- else if(opt_debug_and_release)
- {
- qc_buildmode_release = true;
- qc_buildmode_debug = true;
- }
- else // default
- qc_buildmode_release = true;
-
- if(opt_framework)
- qc_buildmode_framework = true;
- else if(opt_no_framework)
- {
- // nothing to do
- }
- else // default
- {
- if(!staticmode && !opt_debug)
- qc_buildmode_framework = true;
- }
-
- if(opt_separate_debug_info)
- qc_buildmode_separate_debug_info = true;
- else if(opt_no_separate_debug_info)
- {
- // nothing to do
- }
- else // default
- {
-#ifndef Q_OS_MAC
- qc_buildmode_separate_debug_info = true;
-#endif
- }
-
- // make the string
- QStringList opts;
- QString other;
-
- if(qc_buildmode_release && qc_buildmode_debug)
- {
- opts += "debug_and_release";
- opts += "build_all";
- }
- else if(qc_buildmode_release)
- opts += "release";
- else // qc_buildmode_debug
- opts += "debug";
-
-#ifdef Q_OS_MAC
- if(qc_buildmode_framework)
- opts += "lib_bundle";
-#endif
-
- if(qc_buildmode_separate_debug_info)
- {
- opts += "separate_debug_info";
- other += "QMAKE_CFLAGS += -g\n";
- other += "QMAKE_CXXFLAGS += -g\n";
- }
-
- QString str = QString("CONFIG += ") + opts.join(" ") + '\n';
- conf->addExtra(str);
-
- if(!other.isEmpty())
- conf->addExtra(other);
-
- return true;
- }
-};
diff --git a/qcm/extra.qcm b/qcm/extra.qcm
deleted file mode 100644
index 8d7b803b..00000000
--- a/qcm/extra.qcm
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
------BEGIN QCMOD-----
-name: extra
-section: project
-arg: enable-tests,Build examples and unittests.
------END QCMOD-----
-*/
-
-class qc_extra : public ConfObj
-{
-public:
- qc_extra(Conf *c) : ConfObj(c) {}
- QString name() const { return "extra"; }
- QString shortname() const { return "extra"; }
-
- // no output
- QString checkString() const { return QString(); }
-
- bool exec()
- {
- QString str;
- QFile f;
-
- if(conf->getenv("QC_ENABLE_TESTS") == "Y")
- str += "CONFIG += iris_tests\n";
-
- conf->addExtra(str);
-
- bool release = true;
- bool debug = false;
- bool debug_info = false;
- bool universal = false;
- QString sdk;
-
-#ifdef QC_BUILDMODE
- release = qc_buildmode_release;
- debug = qc_buildmode_debug;
- debug_info = qc_buildmode_separate_debug_info;
-#endif
-
-#ifdef QC_UNIVERSAL
- universal = qc_universal_enabled;
- sdk = qc_universal_sdk;
-#endif
-
- // write confapp_unix.pri
- str = QString();
- QString var = conf->getenv("BINDIR");
- if(!var.isEmpty())
- str += QString("BINDIR = %1\n").arg(var);
- if(debug) // debug or debug-and-release
- str += QString("CONFIG += debug\n");
- else // release
- str += QString("CONFIG += release\n");
- if(debug_info)
- {
- str += QString("CONFIG += separate_debug_info\n");
- str += "QMAKE_CFLAGS += -g\n";
- str += "QMAKE_CXXFLAGS += -g\n";
- }
- if(universal)
- {
- str +=
- "contains(QT_CONFIG,x86):contains(QT_CONFIG,ppc) {\n"
- " CONFIG += x86 ppc\n"
- "}\n";
-
- if(!sdk.isEmpty())
- str += QString("QMAKE_MAC_SDK = %1\n").arg(sdk);
- }
-#ifdef QC_QCA
- if(!qc_qca_procode.isEmpty())
- str += qc_qca_procode;
-#endif
- f.setFileName("confapp_unix.pri");
- if(f.open(QFile::WriteOnly | QFile::Truncate))
- f.write(str.toLatin1());
- f.close();
-
- return true;
- }
-};
diff --git a/qcm/idn.qcm b/qcm/idn.qcm
deleted file mode 100644
index 28151246..00000000
--- a/qcm/idn.qcm
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
------BEGIN QCMOD-----
-name: libidn
-arg: with-idn-inc=[path],Path to libidn include files
-arg: with-idn-lib=[path],Path to libidn library or framework files
------END QCMOD-----
-*/
-
-//----------------------------------------------------------------------------
-// qc_idn
-//----------------------------------------------------------------------------
-class qc_idn : public ConfObj
-{
-public:
- qc_idn(Conf *c) : ConfObj(c) {}
- QString name() const { return "LibIDN"; }
- QString shortname() const { return "libidn"; }
- bool exec()
- {
- QString idn_incdir, idn_libdir;
- idn_incdir = conf->getenv("QC_WITH_IDN_INC");
- idn_libdir = conf->getenv("QC_WITH_IDN_LIB");
-
- if (!idn_incdir.isEmpty() || !idn_libdir.isEmpty()) { // prefer this if given
- if ((!idn_incdir.isEmpty() && conf->checkHeader(idn_incdir, "stringprep.h")) ||
- (idn_incdir.isEmpty() && conf->findHeader("stringprep.h", QStringList(), &idn_incdir))) {
- conf->addIncludePath(idn_incdir);
- } else {
- printf("Headers not found!\n");
- return false;
- }
-
- if((!idn_libdir.isEmpty() && conf->checkLibrary(idn_libdir, "idn")) ||
- (idn_libdir.isEmpty() && conf->findLibrary("idn", &idn_libdir))) {
- conf->addLib(idn_libdir.isEmpty()? "-lidn" : QString("-L%1 -lidn").arg(idn_libdir));
- } else {
- printf("Libraries not found!\n");
- return false;
- }
- return true;
- }
-
- QStringList incs;
- QString version, libs, other;
- if(conf->findPkgConfig("libidn", VersionAny, QString::null, &version, &incs, &libs, &other))
- {
- for(int n = 0; n < incs.count(); ++n)
- conf->addIncludePath(incs[n]);
- if(!libs.isEmpty())
- conf->addLib(libs);
- return true;
- }
-
- return false;
- }
-};
diff --git a/qcm/qca.qcm b/qcm/qca.qcm
deleted file mode 100644
index 25ede5dd..00000000
--- a/qcm/qca.qcm
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
------BEGIN QCMOD-----
-name: QCA >= 2.0
-arg: with-qca-inc=[path],Path to QCA include files
-arg: with-qca-lib=[path],Path to QCA library or framework files
------END QCMOD-----
-*/
-
-// adapted from crypto.prf
-static QString internal_crypto_prf(const QString &incdir, const QString &libdir, const QString &frameworkdir)
-{
- QString out = QString(
-"QCA_INCDIR = %1\n"
-"QCA_LIBDIR = %2\n"
-"QMAKE_RPATHDIR = %2\n"
-"QCA_FRAMEWORKDIR = %3\n"
-"\n"
-"CONFIG *= qt\n"
-"\n"
-"LINKAGE =\n"
-"QCA_NAME = qca-qt5\n"
-"\n"
-"!isEmpty(QCA_FRAMEWORKDIR): {\n"
-" framework_dir = $$QCA_FRAMEWORKDIR\n"
-" exists($$framework_dir/$${QCA_NAME}.framework) {\n"
-" #QMAKE_FRAMEWORKPATH *= $$framework_dir\n"
-" LIBS *= -F$$framework_dir\n"
-" INCLUDEPATH += $$framework_dir/$${QCA_NAME}.framework/Headers\n"
-" LINKAGE = -framework $${QCA_NAME}\n"
-" }\n"
-"}\n"
-"\n"
-"# else, link normally\n"
-"isEmpty(LINKAGE) {\n"
-" !isEmpty(QCA_INCDIR):INCLUDEPATH += $$QCA_INCDIR/QtCrypto\n"
-" !isEmpty(QCA_LIBDIR):LIBS += -L$$QCA_LIBDIR\n"
-" LINKAGE = -l$${QCA_NAME}\n"
-" CONFIG(debug, debug|release) {\n"
-" windows:LINKAGE = -l$${QCA_NAME}d\n"
-" mac:LINKAGE = -l$${QCA_NAME}_debug\n"
-" }\n"
-"}\n"
-"\n"
-"LIBS += $$LINKAGE\n"
- ).arg(incdir, libdir, frameworkdir);
- return out;
-}
-
-// set either libdir or frameworkdir, but not both
-static bool qca_try(Conf *conf, const QString &incdir, const QString &libdir, const QString &frameworkdir, bool release, bool debug, QString *_prf)
-{
- QString proextra;
- QString prf;
- if (!incdir.isEmpty() || !libdir.isEmpty() || !frameworkdir.isEmpty()) {
- prf = internal_crypto_prf(conf->escapePath(incdir), conf->escapePath(libdir), frameworkdir);
- } else {
- prf = "CONFIG += crypto\n";
- }
- proextra =
- "CONFIG += qt\n"
- "CONFIG -= debug_and_release debug release\n"
- "QT -= gui\n";
- proextra += prf;
-
- QString str =
- "#include \n"
- "\n"
- "int main()\n"
- "{\n"
- " unsigned long x = QCA_VERSION;\n"
- " if(x >= 0x020000 && x < 0x030000) return 0; else return 1;\n"
- "}\n";
-
- // test desired versions, potentially both release and debug
-
- if(release)
- {
- int ret;
- if(!conf->doCompileAndLink(str, QStringList(), QString(), proextra + "CONFIG += release\n", &ret) || ret != 0)
- return false;
- }
-
- if(debug)
- {
- int ret;
- if(!conf->doCompileAndLink(str, QStringList(), QString(), proextra + "CONFIG += debug\n", &ret) || ret != 0)
- return false;
- }
-
- *_prf = prf;
- return true;
-}
-
-static bool qca_try_lib(Conf *conf, const QString &incdir, const QString &libdir, bool release, bool debug, QString *prf)
-{
- return qca_try(conf, incdir, libdir, QString(), release, debug, prf) ||
- qca_try(conf, incdir + "/Qca-qt5", libdir, QString(), release, debug, prf);
-}
-
-static bool qca_try_framework(Conf *conf, const QString &frameworkdir, bool release, bool debug, QString *prf)
-{
- return qca_try(conf, QString(), QString(), frameworkdir, release, debug, prf);
-}
-
-static bool qca_try_ext_prf(Conf *conf, bool release, bool debug, QString *prf)
-{
- return qca_try(conf, QString(), QString(), QString(), release, debug, prf);
-}
-
-//----------------------------------------------------------------------------
-// qc_qca
-//----------------------------------------------------------------------------
-class qc_qca : public ConfObj
-{
-public:
- qc_qca(Conf *c) : ConfObj(c) {}
- QString name() const { return "QCA >= 2.0"; }
- QString shortname() const { return "qca"; }
- bool exec()
- {
- // get the build mode
-#ifdef QC_BUILDMODE
- bool release = qc_buildmode_release;
- bool debug = qc_buildmode_debug;
-#else
- // else, default to just release mode
- bool release = true;
- bool debug = false;
-#endif
-
- QString qca_incdir, qca_libdir, qca_crypto_prf;
- qca_incdir = conf->getenv("QC_WITH_QCA_INC");
- qca_libdir = conf->getenv("QC_WITH_QCA_LIB");
-
-#if defined(Q_OS_MAC)
- if(!qca_libdir.isEmpty() && qca_try_framework(conf, qca_libdir, release, debug, &qca_crypto_prf))
- {
- conf->addExtra(qca_crypto_prf);
- return true;
- }
-#endif
-
- if(!qca_incdir.isEmpty() && !qca_libdir.isEmpty() && qca_try_lib(conf, qca_incdir, qca_libdir, release, debug, &qca_crypto_prf))
- {
- conf->addExtra(qca_crypto_prf);
- return true;
- }
-
- if (qca_try_ext_prf(conf, release, debug, &qca_crypto_prf))
- {
- conf->addExtra(qca_crypto_prf);
- return true;
- }
-
- QStringList incs;
- QString version, libs, other;
-
- if(conf->findPkgConfig("qca2-qt5", VersionMin, "2.0.0", &version, &incs, &libs, &other))
- {
- for(int n = 0; n < incs.count(); ++n)
- conf->addIncludePath(incs[n]);
- if(!libs.isEmpty())
- conf->addLib(libs);
- return true;
- }
-
- QStringList prefixes;
-#ifndef Q_OS_WIN
- prefixes += "/usr";
- prefixes += "/usr/local";
-#endif
- QString prefix = conf->getenv("PREFIX");
- if (!prefix.isEmpty()) {
- prefixes += prefix;
- }
-
- for(int n = 0; n < prefixes.count(); ++n)
- {
- const QString &prefix = prefixes[n];
- if(qca_try_lib(conf, prefix + "/include", prefix + "/lib", release, debug, &qca_crypto_prf))
- {
- conf->addExtra(qca_crypto_prf);
- return true;
- }
- }
-
- return false;
- }
-};
diff --git a/qcm/qjdns.qcm b/qcm/qjdns.qcm
deleted file mode 100644
index 10c9a96d..00000000
--- a/qcm/qjdns.qcm
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
------BEGIN QCMOD-----
-name: jdns
-arg: with-qjdns-inc=[path],Path to QJDns include files
-arg: with-qjdns-lib=[path],Path to QJDns library files
------END QCMOD-----
-*/
-
-//----------------------------------------------------------------------------
-// qc_qjdns
-//----------------------------------------------------------------------------
-class qc_qjdns : public ConfObj
-{
-public:
- qc_qjdns(Conf *c) : ConfObj(c) {}
- QString name() const { return "QJDns"; }
- QString shortname() const { return "qjdns"; }
- QString resultString() const
- {
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
- return "Disabled for Qt5 and above";
-#else
- return ConfObj::resultString();
-#endif
- }
- bool exec()
- {
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
- return true; // hack. TODO: figure out how to force jdns
-#endif
- conf->addExtra("CONFIG += need_jdns");
-#if defined Q_OS_WIN || defined Q_OS_MAC
- // HACK: on Windows and Mac OS X, always use psi's bundled qjdns
- conf->addExtra("CONFIG += iris-qjdns");
- return true;
-#else
- QStringList incs;
- QString version, libs, other;
- QString s;
-
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
- bool found = conf->findPkgConfig("qjdns-qt5", VersionMin, "2.0.3", &version, &incs, &libs, &other);
-#else
- bool found = conf->findPkgConfig("qjdns-qt4", VersionMin, "2.0.3", &version, &incs, &libs, &other);
-#endif
- if(!found && !conf->findPkgConfig("qjdns", VersionMin, "2.0.0", &version, &incs, &libs, &other)) {
- s = conf->getenv("QC_WITH_QJDNS_INC");
- if ((!s.isEmpty() && conf->checkHeader(s, "qjdns.h")) ||
- (s.isEmpty() && conf->findHeader("qjdns.h", QStringList(), &s))) {
- incs.append(s);
- }
-
- s = conf->getenv("QC_WITH_QJDNS_LIB");
- if((!s.isEmpty() && conf->checkLibrary(s, "qjdns")) ||
- (s.isEmpty() && conf->findLibrary("qjdns", &s))) {
- libs = s.isEmpty()? "-lqjdns -ljdns" : QString("-L%1 -lqjdns -ljdns").arg(s);
- }
- }
-
- if (!incs.isEmpty() && !libs.isEmpty()) {
- foreach(const QString &inc, incs) {
- conf->addIncludePath(inc);
- }
- conf->addLib(libs);
- conf->addExtra("CONFIG += ext-qjdns");
- }
-
- return true;
-#endif
- }
-};
diff --git a/qcm/qt42.qcm b/qcm/qt42.qcm
deleted file mode 100644
index 753de7cf..00000000
--- a/qcm/qt42.qcm
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
------BEGIN QCMOD-----
-name: Qt >= 4.2
------END QCMOD-----
-*/
-class qc_qt42 : public ConfObj
-{
-public:
- qc_qt42(Conf *c) : ConfObj(c) {}
- QString name() const { return "Qt >= 4.2"; }
- QString shortname() const { return "qt42"; }
- bool exec()
- {
- conf->debug(QString("QT_VERSION = 0x%1").arg(QString::number(QT_VERSION, 16)));
- if(QT_VERSION >= 0x040200)
- return true;
- else
- return false;
- }
-};
diff --git a/qcm/universal.qcm b/qcm/universal.qcm
deleted file mode 100644
index 5b6f7c4d..00000000
--- a/qcm/universal.qcm
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
------BEGIN QCMOD-----
-name: Mac universal binary support
-section: project
-arg: universal,Build with Mac universal binary support.
-arg: mac-sdk=[path],Path to Mac universal SDK (PPC host only).
------END QCMOD-----
-*/
-
-#define QC_UNIVERSAL
-bool qc_universal_enabled = false;
-QString qc_universal_sdk;
-
-//----------------------------------------------------------------------------
-// qc_universal
-//----------------------------------------------------------------------------
-class qc_universal : public ConfObj
-{
-public:
- qc_universal(Conf *c) : ConfObj(c) {}
- QString name() const { return "Mac universal binary support"; }
- QString shortname() const { return "universal"; }
- QString checkString() const { return QString(); }
-
- bool exec()
- {
-#ifdef Q_OS_MAC
- if(qc_getenv("QC_UNIVERSAL") == "Y")
- {
- qc_universal_enabled = true;
-
- QString str =
- "contains(QT_CONFIG,x86):contains(QT_CONFIG,ppc) {\n"
- " CONFIG += x86 ppc\n"
- "}\n";
-
- QString sdk = qc_getenv("QC_MAC_SDK");
- if(!sdk.isEmpty())
- {
- str += QString("QMAKE_MAC_SDK = %1\n").arg(sdk);
- qc_universal_sdk = sdk;
- }
-
- conf->addExtra(str);
- }
-#endif
- return true;
- }
-};
diff --git a/qcm/zlib.qcm b/qcm/zlib.qcm
deleted file mode 100644
index 15b4a5f5..00000000
--- a/qcm/zlib.qcm
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
------BEGIN QCMOD-----
-name: zlib
-arg: with-zlib-inc=[path],Path to zlib include files
-arg: with-zlib-lib=[path],Path to zlib library files
------END QCMOD-----
-*/
-
-//----------------------------------------------------------------------------
-// qc_zlib
-//----------------------------------------------------------------------------
-class qc_zlib : public ConfObj
-{
-public:
- qc_zlib(Conf *c) : ConfObj(c) {}
- QString name() const { return "zlib"; }
- QString shortname() const { return "zlib"; }
- bool exec()
- {
- QString inc, lib;
- QString s;
-
- s = conf->getenv("QC_WITH_ZLIB_INC");
- if(!s.isEmpty()) {
- if(!conf->checkHeader(s, "zlib.h"))
- return false;
- inc = s;
- }
- else {
- if(!conf->findHeader("zlib.h", QStringList(), &s))
- return false;
- inc = s;
- }
-
- s = conf->getenv("QC_WITH_ZLIB_LIB");
- if(!s.isEmpty()) {
- if(!conf->checkLibrary(s, "z"))
- return false;
- lib = s;
- }
- else {
- if(!conf->findLibrary("z", &s))
- return false;
- lib = s;
- }
-
- if(!inc.isEmpty())
- conf->addIncludePath(inc);
- if(!lib.isEmpty())
- conf->addLib(QString("-L") + s);
- conf->addLib("-lz");
-
- return true;
- }
-};
diff --git a/src/irisnet/CMakeLists.txt b/src/irisnet/CMakeLists.txt
index 662c8541..f1efe7eb 100644
--- a/src/irisnet/CMakeLists.txt
+++ b/src/irisnet/CMakeLists.txt
@@ -1,20 +1,47 @@
-cmake_minimum_required(VERSION 3.1.0)
-include_directories(
- ${CMAKE_CURRENT_BINARY_DIR}
- corelib
- noncore
- noncore/cutestuff
- noncore/legacy
- ${QCA_INCLUDES}
-)
+cmake_minimum_required(VERSION 3.10.0)
-set( CMAKE_MODULE_PATH
- "${CMAKE_MODULE_PATH}"
+list(APPEND CMAKE_MODULE_PATH
+ "${CMAKE_SOURCE_DIR}/cmake/modules"
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
- "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules"
)
-set(SOURCES
+add_library(irisnet STATIC)
+
+set(IRISNET_CORELIB_HEADERS
+ corelib/addressresolver.h
+ corelib/irisnetexport.h
+ corelib/irisnetglobal.h
+ corelib/irisnetplugin.h
+ corelib/netavailability.h
+ corelib/netinterface.h
+ corelib/netnames.h
+ corelib/objectsession.h
+)
+set(IRISNET_NONCORE_HEADERS
+ noncore/cutestuff/bsocket.h
+ noncore/cutestuff/bytestream.h
+ noncore/cutestuff/httpconnect.h
+ noncore/cutestuff/httppoll.h
+ noncore/cutestuff/socks.h
+ noncore/dtls.h
+ noncore/ice176.h
+ noncore/iceabstractstundisco.h
+ noncore/iceagent.h
+ noncore/legacy/ndns.h
+ noncore/legacy/srvresolver.h
+ noncore/processquit.h
+ noncore/stunallocate.h
+ noncore/stunbinding.h
+ noncore/stunmessage.h
+ noncore/stuntransaction.h
+ noncore/tcpportreserver.h
+ noncore/turnclient.h
+ noncore/udpportreserver.h
+)
+
+target_sources(irisnet PRIVATE
+ ${IRISNET_CORELIB_HEADERS}
+ ${IRISNET_NONCORE_HEADERS}
corelib/irisnetglobal.cpp
corelib/irisnetplugin.cpp
@@ -34,10 +61,12 @@ set(SOURCES
corelib/addressresolver.cpp
corelib/netavailability.cpp
corelib/netinterface.cpp
- corelib/netinterface_qtnet.cpp
corelib/netnames.cpp
corelib/objectsession.cpp
+ corelib/netinterface_qtname.cpp
+ corelib/netinterface_qtnet.cpp
+ noncore/iceagent.cpp
noncore/ice176.cpp
noncore/icecomponent.cpp
noncore/icelocaltransport.cpp
@@ -48,67 +77,70 @@ set(SOURCES
noncore/stuntransaction.cpp
noncore/turnclient.cpp
noncore/udpportreserver.cpp
+ noncore/tcpportreserver.cpp
+ noncore/dtls.cpp
noncore/cutestuff/bsocket.cpp
)
if(UNIX)
- list(APPEND SOURCES corelib/netinterface_unix.cpp)
+ target_sources(irisnet PRIVATE
+ corelib/netinterface_unix.cpp
+ )
endif()
-if(NOT USE_QJDNS)
- list(APPEND SOURCES corelib/netinterface_qtname.cpp)
-else()
- list(APPEND SOURCES corelib/netnames_jdns.cpp)
+if(IRIS_ENABLE_JINGLE_SCTP)
+ target_sources(irisnet PRIVATE
+ noncore/sctp/SctpAssociation.cpp
+ noncore/sctp/DepUsrSCTP.cpp
+ )
endif()
-set(HEADERS
- corelib/irisnetexport.h
- corelib/irisnetglobal.h
- corelib/irisnetglobal_p.h
-
- noncore/stunmessage.h
- noncore/stuntypes.h
- noncore/stunutil.h
-
- corelib/addressresolver.h
- corelib/irisnetplugin.h
- corelib/netavailability.h
- corelib/netinterface.h
- corelib/netnames.h
- corelib/objectsession.h
-
- noncore/ice176.h
- noncore/icecomponent.h
- noncore/icelocaltransport.h
- noncore/icetransport.h
- noncore/iceturntransport.h
- noncore/processquit.h
- noncore/stunallocate.h
- noncore/stunbinding.h
- noncore/stuntransaction.h
- noncore/turnclient.h
- noncore/udpportreserver.h
+if(IRIS_BUNDLED_QCA)
+ add_dependencies(irisnet QcaProject)
+endif()
- noncore/cutestuff/bsocket.h
- noncore/cutestuff/bytestream.h
- noncore/cutestuff/httpconnect.h
- noncore/cutestuff/httppoll.h
- noncore/cutestuff/socks.h
+if(IRIS_ENABLE_JINGLE_SCTP AND IRIS_BUNDLED_USRSCTP)
+ add_dependencies(irisnet UsrSCTPProject)
+endif()
- noncore/legacy/ndns.h
- noncore/legacy/srvresolver.h
+target_include_directories(irisnet
+ PRIVATE
+ ${iris_SOURCE_DIR}/include/iris
+ ${iris_SOURCE_DIR}/src
+ ${Qca_INCLUDE_DIR}
+ PUBLIC
+ ${USRSCTP_INCLUDES}
)
-add_library(irisnet STATIC ${SOURCES} ${HEADERS} )
+target_compile_definitions(irisnet PRIVATE IRISNET_STATIC HAVE_QTNET)
-if(WIN32 AND (SEPARATE_QJDNS OR (NOT USE_QJDNS)))
- set(EXTRA_LDFLAGS ws2_32)
+if(WIN32)
+ set(EXTRA_LDFLAGS ws2_32 iphlpapi)
endif()
-if(NOT USE_QJDNS)
- set(QJDns_LIBRARY "")
+# UsrSCTP requires pthread
+if(NOT WIN32)
+ find_package(Threads)
+ target_link_libraries(irisnet PUBLIC Threads::Threads)
endif()
-target_link_libraries(irisnet ${QJDns_LIBRARY} ${EXTRA_LDFLAGS})
-target_link_libraries(irisnet Qt5::Core Qt5::Network Qt5::Xml ${qca_LIB})
+target_link_libraries(irisnet PUBLIC
+ ${Qca_LIBRARY} ${USRSCTP_LIBRARY}
+)
+
+if(QT_DEFAULT_MAJOR_VERSION LESS 6)
+ target_link_libraries(irisnet PUBLIC Qt5::Core Qt5::Network Qt5::Xml)
+else()
+ target_link_libraries(irisnet PUBLIC Qt6::Core Qt6::Network Qt6::Xml)
+endif()
+target_link_libraries(irisnet PUBLIC ${EXTRA_LDFLAGS})
+
+if(IRIS_ENABLE_INSTALL)
+ install(FILES ${IRISNET_CORELIB_HEADERS}
+ DESTINATION ${IRIS_INSTALL_INCLUDEDIR}/irisnet/corelib
+ )
+ install(FILES ${IRISNET_NONCORE_HEADERS}
+ DESTINATION ${IRIS_INSTALL_INCLUDEDIR}/irisnet/noncore
+ )
+endif()
diff --git a/src/irisnet/appledns/appledns.cpp b/src/irisnet/appledns/appledns.cpp
index f0f054ba..80c3cbc0 100644
--- a/src/irisnet/appledns/appledns.cpp
+++ b/src/irisnet/appledns/appledns.cpp
@@ -17,26 +17,23 @@
*/
#include "irisnetplugin.h"
+#include "qdnssd.h"
#include
#include
-#include "qdnssd.h"
-
-// for ntohl
-#ifdef Q_OS_WIN
-# include
+#ifdef Q_OS_WIN // for ntohl
+#include
#else
-# include
+#include
#endif
static QByteArray nameToDottedString(const QByteArray &in)
{
QByteArray out;
- int at = 0;
- while(at < in.size())
- {
+ int at = 0;
+ while (at < in.size()) {
int len = in[at++];
- if(len > 0)
+ if (len > 0)
out += in.mid(at, len);
out += '.';
at += len;
@@ -44,21 +41,17 @@ static QByteArray nameToDottedString(const QByteArray &in)
return out;
}
-static QMap textsToAttribs(const QList &texts)
+static QMap textsToAttribs(const QList &texts)
{
- QMap out;
- foreach(const QByteArray &a, texts)
- {
- QString key;
+ QMap out;
+ for (const QByteArray &a : texts) {
+ QString key;
QByteArray value;
- int x = a.indexOf('=');
- if(x != -1)
- {
- key = QString::fromLatin1(a.mid(0, x));
+ int x = a.indexOf('=');
+ if (x != -1) {
+ key = QString::fromLatin1(a.mid(0, x));
value = a.mid(x + 1);
- }
- else
- {
+ } else {
key = QString::fromLatin1(a);
}
@@ -67,12 +60,11 @@ static QMap textsToAttribs(const QList &texts)
return out;
}
-static QByteArray attribsToTxtRecord(const QMap &attribs)
+static QByteArray attribsToTxtRecord(const QMap &attribs)
{
- QList texts;
- QMapIterator it(attribs);
- while(it.hasNext())
- {
+ QList texts;
+ QMapIterator it(attribs);
+ while (it.hasNext()) {
it.next();
QByteArray line = it.key().toLatin1() + '=' + it.value();
texts += line;
@@ -84,14 +76,14 @@ static QByteArray attribsToTxtRecord(const QMap &attribs)
static QList nameToInstanceParts(const QByteArray &name)
{
// FIXME: improve this parsing... (what about escaping??)
- int at = name.indexOf('.');
+ int at = name.indexOf('.');
QByteArray sname = name.mid(0, at);
++at;
int next = name.indexOf('.', at);
++next;
- next = name.indexOf('.', next);
- QByteArray stype = name.mid(at, next - at);
- at = next + 1;
+ next = name.indexOf('.', next);
+ QByteArray stype = name.mid(at, next - at);
+ at = next + 1;
QByteArray sdomain = name.mid(at);
QList out;
@@ -104,46 +96,40 @@ static QList nameToInstanceParts(const QByteArray &name)
static XMPP::NameRecord importQDnsSdRecord(const QDnsSd::Record &in)
{
XMPP::NameRecord out;
- switch(in.rrtype)
+ switch (in.rrtype) {
+ case 1: // A
{
- case 1: // A
- {
- quint32 *p = (quint32 *)in.rdata.data();
- out.setAddress(QHostAddress(ntohl(*p)));
- }
- break;
+ quint32 *p = (quint32 *)in.rdata.data();
+ out.setAddress(QHostAddress(ntohl(*p)));
+ } break;
- case 28: // AAAA
- {
- out.setAddress(QHostAddress((quint8 *)in.rdata.data()));
- }
- break;
-
- case 12: // PTR
- {
- out.setPtr(nameToDottedString(in.rdata));
- }
- break;
+ case 28: // AAAA
+ {
+ out.setAddress(QHostAddress((quint8 *)in.rdata.data()));
+ } break;
- case 10: // NULL
- {
- out.setNull(in.rdata);
- }
- break;
+ case 12: // PTR
+ {
+ out.setPtr(nameToDottedString(in.rdata));
+ } break;
- case 16: // TXT
- {
- QList txtEntries = QDnsSd::parseTxtRecord(in.rdata);
- if(txtEntries.isEmpty())
- return out;
- out.setTxt(txtEntries);
- }
- break;
+ case 10: // NULL
+ {
+ out.setNull(in.rdata);
+ } break;
- default: // unsupported
- {
+ case 16: // TXT
+ {
+ QList txtEntries = QDnsSd::parseTxtRecord(in.rdata);
+ if (txtEntries.isEmpty())
return out;
- }
+ out.setTxt(txtEntries);
+ } break;
+
+ default: // unsupported
+ {
+ return out;
+ }
}
out.setOwner(in.name);
@@ -152,13 +138,9 @@ static XMPP::NameRecord importQDnsSdRecord(const QDnsSd::Record &in)
}
namespace {
-
-class QDnsSdDelegate
-{
+class QDnsSdDelegate {
public:
- virtual ~QDnsSdDelegate()
- {
- }
+ virtual ~QDnsSdDelegate() { }
virtual void dns_queryResult(int id, const QDnsSd::QueryResult &result)
{
@@ -185,32 +167,26 @@ class QDnsSdDelegate
}
};
-class IdManager
-{
+class IdManager {
private:
QSet set;
- int at;
+ int at;
inline void bump_at()
{
- if(at == 0x7fffffff)
+ if (at == 0x7fffffff)
at = 0;
else
++at;
}
public:
- IdManager() :
- at(0)
- {
- }
+ IdManager() : at(0) { }
int reserveId()
{
- while(1)
- {
- if(!set.contains(at))
- {
+ while (1) {
+ if (!set.contains(at)) {
int id = at;
set.insert(id);
bump_at();
@@ -221,62 +197,62 @@ class IdManager
}
}
- void releaseId(int id)
- {
- set.remove(id);
- }
+ void releaseId(int id) { set.remove(id); }
};
-}
+} // namespace
//----------------------------------------------------------------------------
// AppleProvider
//----------------------------------------------------------------------------
-class AppleProvider : public XMPP::IrisNetProvider
-{
+class AppleProvider : public XMPP::IrisNetProvider {
Q_OBJECT
Q_INTERFACES(XMPP::IrisNetProvider);
+
public:
- QDnsSd dns;
- QHash delegateById;
+ QDnsSd dns;
+ QHash delegateById;
- AppleProvider() :
- dns(this)
+ AppleProvider() : dns(this)
{
- connect(&dns, SIGNAL(queryResult(int,QDnsSd::QueryResult)), SLOT(dns_queryResult(int,QDnsSd::QueryResult)));
- connect(&dns, SIGNAL(browseResult(int,QDnsSd::BrowseResult)), SLOT(dns_browseResult(int,QDnsSd::BrowseResult)));
- connect(&dns, SIGNAL(resolveResult(int,QDnsSd::ResolveResult)), SLOT(dns_resolveResult(int,QDnsSd::ResolveResult)));
- connect(&dns, SIGNAL(regResult(int,QDnsSd::RegResult)), SLOT(dns_regResult(int,QDnsSd::RegResult)));
+ connect(&dns, SIGNAL(queryResult(int, QDnsSd::QueryResult)), SLOT(dns_queryResult(int, QDnsSd::QueryResult)));
+ connect(&dns, SIGNAL(browseResult(int, QDnsSd::BrowseResult)),
+ SLOT(dns_browseResult(int, QDnsSd::BrowseResult)));
+ connect(&dns, SIGNAL(resolveResult(int, QDnsSd::ResolveResult)),
+ SLOT(dns_resolveResult(int, QDnsSd::ResolveResult)));
+ connect(&dns, SIGNAL(regResult(int, QDnsSd::RegResult)), SLOT(dns_regResult(int, QDnsSd::RegResult)));
}
- virtual XMPP::NameProvider *createNameProviderInternet();
- virtual XMPP::NameProvider *createNameProviderLocal();
+ virtual XMPP::NameProvider *createNameProviderInternet();
+ virtual XMPP::NameProvider *createNameProviderLocal();
virtual XMPP::ServiceProvider *createServiceProvider();
int query(QDnsSdDelegate *p, const QByteArray &name, int qType)
{
- int id = dns.query(name, qType);
+ int id = dns.query(name, qType);
delegateById[id] = p;
return id;
}
int browse(QDnsSdDelegate *p, const QByteArray &serviceType, const QByteArray &domain)
{
- int id = dns.browse(serviceType, domain);
+ int id = dns.browse(serviceType, domain);
delegateById[id] = p;
return id;
}
- int resolve(QDnsSdDelegate *p, const QByteArray &serviceName, const QByteArray &serviceType, const QByteArray &domain)
+ int resolve(QDnsSdDelegate *p, const QByteArray &serviceName, const QByteArray &serviceType,
+ const QByteArray &domain)
{
- int id = dns.resolve(serviceName, serviceType, domain);
+ int id = dns.resolve(serviceName, serviceType, domain);
delegateById[id] = p;
return id;
}
- int reg(QDnsSdDelegate *p, const QByteArray &serviceName, const QByteArray &serviceType, const QByteArray &domain, int port, const QByteArray &txtRecord)
+ int reg(QDnsSdDelegate *p, const QByteArray &serviceName, const QByteArray &serviceType, const QByteArray &domain,
+ int port, const QByteArray &txtRecord)
{
- int id = dns.reg(serviceName, serviceType, domain, port, txtRecord);
+ int id = dns.reg(serviceName, serviceType, domain, port, txtRecord);
delegateById[id] = p;
return id;
}
@@ -289,23 +265,19 @@ class AppleProvider : public XMPP::IrisNetProvider
void stop_all(QDnsSdDelegate *p)
{
- QList ids;
- QHashIterator it(delegateById);
- while(it.hasNext())
- {
+ QList ids;
+ QHashIterator it(delegateById);
+ while (it.hasNext()) {
it.next();
- if(it.value() == p)
+ if (it.value() == p)
ids += it.key();
}
- foreach(int id, ids)
+ for (int id : ids)
stop(id);
}
private slots:
- void dns_queryResult(int id, const QDnsSd::QueryResult &result)
- {
- delegateById[id]->dns_queryResult(id, result);
- }
+ void dns_queryResult(int id, const QDnsSd::QueryResult &result) { delegateById[id]->dns_queryResult(id, result); }
void dns_browseResult(int id, const QDnsSd::BrowseResult &result)
{
@@ -317,10 +289,7 @@ private slots:
delegateById[id]->dns_resolveResult(id, result);
}
- void dns_regResult(int id, const QDnsSd::RegResult &result)
- {
- delegateById[id]->dns_regResult(id, result);
- }
+ void dns_regResult(int id, const QDnsSd::RegResult &result) { delegateById[id]->dns_regResult(id, result); }
};
//----------------------------------------------------------------------------
@@ -328,27 +297,20 @@ private slots:
//----------------------------------------------------------------------------
// only use this class for a single browse. if you want to browse again,
// create a new object.
-class AppleBrowse : public QObject, public QDnsSdDelegate
-{
+class AppleBrowse : public QObject, public QDnsSdDelegate {
Q_OBJECT
public:
- AppleProvider *global;
- int browse_id;
+ AppleProvider *global;
+ int browse_id;
QList instances;
- QHash pendingByQueryId; // waiting for TXT
+ QHash pendingByQueryId; // waiting for TXT
- AppleBrowse(AppleProvider *_global, QObject *parent = 0) :
- QObject(parent),
- global(_global),
- browse_id(-1)
+ AppleBrowse(AppleProvider *_global, QObject *parent = 0) : QObject(parent), global(_global), browse_id(-1)
{
connect(this, SIGNAL(unavailable_p(XMPP::ServiceInstance)), SIGNAL(unavailable(XMPP::ServiceInstance)));
}
- ~AppleBrowse()
- {
- global->stop_all(this);
- }
+ ~AppleBrowse() { global->stop_all(this); }
void browse(const QString &type, const QString &domain)
{
@@ -368,30 +330,24 @@ class AppleBrowse : public QObject, public QDnsSdDelegate
{
Q_UNUSED(id);
- if(!result.success)
- {
+ if (!result.success) {
emit error();
return;
}
- foreach(const QDnsSd::BrowseEntry &e, result.entries)
- {
- XMPP::ServiceInstance si(e.serviceName, e.serviceType, e.replyDomain, QMap());
+ for (const QDnsSd::BrowseEntry &e : result.entries) {
+ XMPP::ServiceInstance si(e.serviceName, e.serviceType, e.replyDomain, QMap());
- if(e.added)
- {
- int query_id = global->query(this, si.name(), 16); // 16 == TXT
+ if (e.added) {
+ int query_id = global->query(this, si.name(), 16); // 16 == TXT
pendingByQueryId[query_id] = si.name();
- }
- else // removed
+ } else // removed
{
// emit these queued for SS. no worry of SR since
// the browse operation is not cancellable.
- for(int n = 0; n < instances.count(); ++n)
- {
+ for (int n = 0; n < instances.count(); ++n) {
const XMPP::ServiceInstance &i = instances[n];
- if(i.name() == si.name())
- {
+ if (i.name() == si.name()) {
emit unavailable_p(i);
instances.removeAt(n);
--n; // adjust position
@@ -403,8 +359,7 @@ class AppleBrowse : public QObject, public QDnsSdDelegate
virtual void dns_queryResult(int id, const QDnsSd::QueryResult &result)
{
- if(!result.success)
- {
+ if (!result.success) {
// if we get here, then it means we received a browse
// entry, but could not fetch its TXT record. if
// that happens, cancel the query and drop the
@@ -418,14 +373,13 @@ class AppleBrowse : public QObject, public QDnsSdDelegate
Q_ASSERT(!result.records.isEmpty());
// only the first entry matters, and it must be an added TXT
- if(!result.records[0].added || result.records[0].rrtype != 16)
+ if (!result.records[0].added || result.records[0].rrtype != 16)
return;
// we only care about one answer
- QByteArray name = pendingByQueryId[id];
+ QByteArray name = pendingByQueryId[id];
QList parts = nameToInstanceParts(name);
- if(parts.isEmpty())
- {
+ if (parts.isEmpty()) {
// TODO: error
Q_ASSERT(0);
}
@@ -436,19 +390,18 @@ class AppleBrowse : public QObject, public QDnsSdDelegate
XMPP::NameRecord rec = importQDnsSdRecord(result.records[0]);
// bad answer?
- if(rec.isNull())
+ if (rec.isNull())
return;
- QMap attribs = textsToAttribs(rec.texts());
+ QMap attribs = textsToAttribs(rec.texts());
// FIXME: conversion/escaping?
- XMPP::ServiceInstance si(QString::fromUtf8(parts[0]), QString::fromUtf8(parts[1]), QString::fromUtf8(parts[2]), attribs);
+ XMPP::ServiceInstance si(QString::fromUtf8(parts[0]), QString::fromUtf8(parts[1]), QString::fromUtf8(parts[2]),
+ attribs);
// does qdnssd guarantee we won't receive dups?
bool found = false;
- foreach(const XMPP::ServiceInstance &i, instances)
- {
- if(i.name() == si.name())
- {
+ for (const XMPP::ServiceInstance &i : instances) {
+ if (i.name() == si.name()) {
found = true;
break;
}
@@ -465,50 +418,39 @@ class AppleBrowse : public QObject, public QDnsSdDelegate
//----------------------------------------------------------------------------
// only use this class for a single lookup. if you want to lookup again,
// create a new object.
-class AppleBrowseLookup : public QObject, public QDnsSdDelegate
-{
+class AppleBrowseLookup : public QObject, public QDnsSdDelegate {
Q_OBJECT
public:
- AppleProvider *global;
- int resolve_id;
+ AppleProvider *global;
+ int resolve_id;
XMPP::NameResolver nameResolverAaaa;
XMPP::NameResolver nameResolverA;
- bool activeAaaa;
- bool activeA;
- QTimer waitTimer;
- QByteArray host;
- QHostAddress addr4;
- QHostAddress addr6;
- int port;
+ bool activeAaaa;
+ bool activeA;
+ QTimer waitTimer;
+ QByteArray host;
+ QHostAddress addr4;
+ QHostAddress addr6;
+ int port;
AppleBrowseLookup(AppleProvider *_global, QObject *parent = 0) :
- QObject(parent),
- global(_global),
- resolve_id(-1),
- nameResolverAaaa(this),
- nameResolverA(this),
- activeAaaa(false),
- activeA(false),
- waitTimer(this)
+ QObject(parent), global(_global), resolve_id(-1), nameResolverAaaa(this), nameResolverA(this),
+ activeAaaa(false), activeA(false), waitTimer(this)
{
connect(&nameResolverAaaa, SIGNAL(resultsReady(QList)),
- SLOT(nameAaaa_resultsReady(QList)));
+ SLOT(nameAaaa_resultsReady(QList)));
connect(&nameResolverAaaa, SIGNAL(error(XMPP::NameResolver::Error)),
- SLOT(nameAaaa_error(XMPP::NameResolver::Error)));
+ SLOT(nameAaaa_error(XMPP::NameResolver::Error)));
connect(&nameResolverA, SIGNAL(resultsReady(QList)),
- SLOT(nameA_resultsReady(QList)));
- connect(&nameResolverA, SIGNAL(error(XMPP::NameResolver::Error)),
- SLOT(nameA_error(XMPP::NameResolver::Error)));
+ SLOT(nameA_resultsReady(QList)));
+ connect(&nameResolverA, SIGNAL(error(XMPP::NameResolver::Error)), SLOT(nameA_error(XMPP::NameResolver::Error)));
connect(&waitTimer, SIGNAL(timeout()), SLOT(waitTimer_timeout()));
waitTimer.setSingleShot(true);
}
- ~AppleBrowseLookup()
- {
- global->stop_all(this);
- }
+ ~AppleBrowseLookup() { global->stop_all(this); }
void resolve(const QByteArray &instance, const QByteArray &type, const QByteArray &domain)
{
@@ -526,8 +468,7 @@ class AppleBrowseLookup : public QObject, public QDnsSdDelegate
// there is only one response, so deregister
global->stop(id);
- if(!result.success)
- {
+ if (!result.success) {
emit error();
return;
}
@@ -536,7 +477,7 @@ class AppleBrowseLookup : public QObject, public QDnsSdDelegate
port = result.port;
activeAaaa = true;
- activeA = true;
+ activeA = true;
nameResolverAaaa.start(host, XMPP::NameRecord::Aaaa);
nameResolverA.start(host, XMPP::NameRecord::A);
waitTimer.start(500); // 500ms cut-off time, take what we have and run
@@ -547,7 +488,7 @@ private slots:
{
// nameresolver guarantees at least one result, and we only
// care about the first
- addr6 = results[0].address();
+ addr6 = results[0].address();
activeAaaa = false;
tryDone();
}
@@ -563,7 +504,7 @@ private slots:
{
// nameresolver guarantees at least one result, and we only
// care about the first
- addr4 = results[0].address();
+ addr4 = results[0].address();
activeA = false;
tryDone();
}
@@ -575,10 +516,7 @@ private slots:
tryDone();
}
- void waitTimer_timeout()
- {
- tryDone();
- }
+ void waitTimer_timeout() { tryDone(); }
private:
void tryDone()
@@ -587,8 +525,7 @@ private slots:
// results, or if the wait timer ends and we have at least
// one result
- if(!activeAaaa && !activeA && addr6.isNull() && addr4.isNull())
- {
+ if (!activeAaaa && !activeA && addr6.isNull() && addr4.isNull()) {
nameResolverAaaa.stop();
nameResolverA.stop();
waitTimer.stop();
@@ -597,15 +534,14 @@ private slots:
return;
}
- if(!waitTimer.isActive() && (!addr6.isNull() || !addr4.isNull()))
- {
+ if (!waitTimer.isActive() && (!addr6.isNull() || !addr4.isNull())) {
nameResolverAaaa.stop();
nameResolverA.stop();
QList out;
- if(!addr4.isNull())
+ if (!addr4.isNull())
out += addr4;
- if(!addr6.isNull())
+ if (!addr6.isNull())
out += addr6;
emit finished(out, port);
}
@@ -615,27 +551,16 @@ private slots:
//----------------------------------------------------------------------------
// AppleNameProvider
//----------------------------------------------------------------------------
-class AppleNameProvider : public XMPP::NameProvider, public QDnsSdDelegate
-{
+class AppleNameProvider : public XMPP::NameProvider, public QDnsSdDelegate {
Q_OBJECT
public:
AppleProvider *global;
- AppleNameProvider(AppleProvider *parent) :
- NameProvider(parent),
- global(parent)
- {
- }
+ AppleNameProvider(AppleProvider *parent) : NameProvider(parent), global(parent) { }
- ~AppleNameProvider()
- {
- global->stop_all(this);
- }
+ ~AppleNameProvider() { global->stop_all(this); }
- virtual bool supportsLongLived() const
- {
- return true;
- }
+ virtual bool supportsLongLived() const { return true; }
virtual bool supportsRecordType(int type) const
{
@@ -650,31 +575,26 @@ class AppleNameProvider : public XMPP::NameProvider, public QDnsSdDelegate
return global->query(this, name, qType);
}
- virtual void resolve_stop(int id)
- {
- global->stop(id);
- }
+ virtual void resolve_stop(int id) { global->stop(id); }
protected:
virtual void dns_queryResult(int id, const QDnsSd::QueryResult &result)
{
- if(!result.success)
- {
+ if (!result.success) {
emit resolve_error(id, XMPP::NameResolver::ErrorGeneric);
return;
}
QList results;
- foreach(const QDnsSd::Record &rec, result.records)
- {
+ for (const QDnsSd::Record &rec : result.records) {
XMPP::NameRecord nr = importQDnsSdRecord(rec);
// unsupported type
- if(nr.isNull())
+ if (nr.isNull())
continue;
// if removed, ensure ttl is 0
- if(!rec.added)
+ if (!rec.added)
nr.setTtl(0);
results += nr;
@@ -687,23 +607,16 @@ class AppleNameProvider : public XMPP::NameProvider, public QDnsSdDelegate
//----------------------------------------------------------------------------
// AppleServiceProvider
//----------------------------------------------------------------------------
-class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
-{
+class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate {
Q_OBJECT
public:
- class Browse
- {
+ class Browse {
public:
AppleServiceProvider *parent;
- int id;
- AppleBrowse *browse;
+ int id;
+ AppleBrowse *browse;
- Browse(AppleServiceProvider *_parent) :
- parent(_parent),
- id(-1),
- browse(0)
- {
- }
+ Browse(AppleServiceProvider *_parent) : parent(_parent), id(-1), browse(0) { }
~Browse()
{
@@ -712,19 +625,13 @@ class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
}
};
- class Resolve
- {
+ class Resolve {
public:
AppleServiceProvider *parent;
- int id;
- AppleBrowseLookup *resolve;
+ int id;
+ AppleBrowseLookup *resolve;
- Resolve(AppleServiceProvider *_parent) :
- parent(_parent),
- id(-1),
- resolve(0)
- {
- }
+ Resolve(AppleServiceProvider *_parent) : parent(_parent), id(-1), resolve(0) { }
~Resolve()
{
@@ -733,16 +640,12 @@ class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
}
};
- AppleProvider *global;
- QList browseList;
- QList resolveList;
- IdManager idManager;
+ AppleProvider *global;
+ QList browseList;
+ QList resolveList;
+ IdManager idManager;
- AppleServiceProvider(AppleProvider *parent) :
- ServiceProvider(parent),
- global(parent)
- {
- }
+ AppleServiceProvider(AppleProvider *parent) : ServiceProvider(parent), global(parent) { }
~AppleServiceProvider()
{
@@ -753,9 +656,8 @@ class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
int indexOfBrowseByBrowse(AppleBrowse *browse) const
{
- for(int n = 0; n < browseList.count(); ++n)
- {
- if(browseList[n]->browse == browse)
+ for (int n = 0; n < browseList.count(); ++n) {
+ if (browseList[n]->browse == browse)
return n;
}
return -1;
@@ -763,9 +665,8 @@ class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
int indexOfBrowseById(int id) const
{
- for(int n = 0; n < browseList.count(); ++n)
- {
- if(browseList[n]->id == id)
+ for (int n = 0; n < browseList.count(); ++n) {
+ if (browseList[n]->id == id)
return n;
}
return -1;
@@ -773,9 +674,8 @@ class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
int indexOfResolveByResolve(AppleBrowseLookup *resolve) const
{
- for(int n = 0; n < resolveList.count(); ++n)
- {
- if(resolveList[n]->resolve == resolve)
+ for (int n = 0; n < resolveList.count(); ++n) {
+ if (resolveList[n]->resolve == resolve)
return n;
}
return -1;
@@ -783,9 +683,8 @@ class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
int indexOfResolveById(int id) const
{
- for(int n = 0; n < resolveList.count(); ++n)
- {
- if(resolveList[n]->id == id)
+ for (int n = 0; n < resolveList.count(); ++n) {
+ if (resolveList[n]->id == id)
return n;
}
return -1;
@@ -794,7 +693,7 @@ class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
virtual int browse_start(const QString &type, const QString &domain)
{
Browse *b = new Browse(this);
- b->id = idManager.reserveId();
+ b->id = idManager.reserveId();
b->browse = new AppleBrowse(global, this);
connect(b->browse, SIGNAL(available(XMPP::ServiceInstance)), SLOT(browse_available(XMPP::ServiceInstance)));
connect(b->browse, SIGNAL(unavailable(XMPP::ServiceInstance)), SLOT(browse_unavailable(XMPP::ServiceInstance)));
@@ -807,7 +706,7 @@ class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
virtual void browse_stop(int id)
{
int at = indexOfBrowseById(id);
- if(at == -1)
+ if (at == -1)
return;
Browse *b = browseList[at];
@@ -818,14 +717,13 @@ class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
virtual int resolve_start(const QByteArray &name)
{
QList parts = nameToInstanceParts(name);
- if(parts.isEmpty())
- {
+ if (parts.isEmpty()) {
// TODO: signal error rather than die
Q_ASSERT(0);
}
Resolve *r = new Resolve(this);
- r->id = idManager.reserveId();
+ r->id = idManager.reserveId();
r->resolve = new AppleBrowseLookup(global, this);
connect(r->resolve, SIGNAL(finished(QList)), SLOT(resolve_finished(QList)));
connect(r->resolve, SIGNAL(error()), SLOT(resolve_error()));
@@ -837,7 +735,7 @@ class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
virtual void resolve_stop(int id)
{
int at = indexOfResolveById(id);
- if(at == -1)
+ if (at == -1)
return;
Resolve *r = resolveList[at];
@@ -845,11 +743,11 @@ class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
delete r;
}
- virtual int publish_start(const QString &instance, const QString &type, int port, const QMap &attributes)
+ virtual int publish_start(const QString &instance, const QString &type, int port,
+ const QMap &attributes)
{
QByteArray txtRecord = attribsToTxtRecord(attributes);
- if(txtRecord.isEmpty())
- {
+ if (txtRecord.isEmpty()) {
// TODO: signal error rather than die
Q_ASSERT(0);
}
@@ -860,37 +758,30 @@ class AppleServiceProvider : public XMPP::ServiceProvider, public QDnsSdDelegate
return global->reg(this, instance.toUtf8(), type.toUtf8(), domain.toUtf8(), port, txtRecord);
}
- virtual void publish_update(int id, const QMap &attributes)
+ virtual void publish_update(int id, const QMap &attributes)
{
// TODO: verify 'id' is valid. if not valid, then assert/return (don't do anything or signal error)
QByteArray txtRecord = attribsToTxtRecord(attributes);
- if(txtRecord.isEmpty())
- {
+ if (txtRecord.isEmpty()) {
// TODO: signal error rather than die
Q_ASSERT(0);
}
- if(global->dns.recordUpdateTxt(id, txtRecord, 4500))
- {
+ if (global->dns.recordUpdateTxt(id, txtRecord, 4500)) {
// FIXME: SR
QMetaObject::invokeMethod(this, "publish_published", Qt::QueuedConnection, Q_ARG(int, id));
- }
- else
- {
+ } else {
// TODO: unpublish
// FIXME: register meta type, SR
- QMetaObject::invokeMethod(this, "publish_error", Qt::QueuedConnection,
- Q_ARG(int, id),
+ QMetaObject::invokeMethod(
+ this, "publish_error", Qt::QueuedConnection, Q_ARG(int, id),
Q_ARG(XMPP::ServiceLocalPublisher::Error, XMPP::ServiceLocalPublisher::ErrorGeneric));
}
}
- virtual void publish_stop(int id)
- {
- global->stop(id);
- }
+ virtual void publish_stop(int id) { global->stop(id); }
virtual int publish_extra_start(int pub_id, const XMPP::NameRecord &name)
{
@@ -965,11 +856,10 @@ private slots:
delete r;
QList results;
- foreach(const QHostAddress &addr, addrs)
- {
+ for (const QHostAddress &addr : addrs) {
ResolveResult r;
r.address = addr;
- r.port = port;
+ r.port = port;
results += r;
}
@@ -993,26 +883,14 @@ private slots:
};
// AppleProvider
-XMPP::NameProvider *AppleProvider::createNameProviderInternet()
-{
- return new AppleNameProvider(this);
-}
+XMPP::NameProvider *AppleProvider::createNameProviderInternet() { return new AppleNameProvider(this); }
-XMPP::NameProvider *AppleProvider::createNameProviderLocal()
-{
- return new AppleNameProvider(this);
-}
+XMPP::NameProvider *AppleProvider::createNameProviderLocal() { return new AppleNameProvider(this); }
-XMPP::ServiceProvider *AppleProvider::createServiceProvider()
-{
- return new AppleServiceProvider(this);
-}
+XMPP::ServiceProvider *AppleProvider::createServiceProvider() { return new AppleServiceProvider(this); }
#ifdef APPLEDNS_STATIC
-XMPP::IrisNetProvider *irisnet_createAppleProvider()
-{
- return new AppleProvider;
-}
+XMPP::IrisNetProvider *irisnet_createAppleProvider() { return new AppleProvider; }
#else
Q_EXPORT_PLUGIN2(appledns, AppleProvider)
#endif
diff --git a/src/irisnet/appledns/appledns.pri b/src/irisnet/appledns/appledns.pri
deleted file mode 100644
index ff4c190f..00000000
--- a/src/irisnet/appledns/appledns.pri
+++ /dev/null
@@ -1,6 +0,0 @@
-QT *= network
-
-HEADERS += $$PWD/qdnssd.h
-SOURCES += $$PWD/qdnssd.cpp $$PWD/appledns.cpp
-
-!mac:LIBS += -ldns_sd
diff --git a/src/irisnet/appledns/appledns.pro b/src/irisnet/appledns/appledns.pro
deleted file mode 100644
index ff2bcf57..00000000
--- a/src/irisnet/appledns/appledns.pro
+++ /dev/null
@@ -1,14 +0,0 @@
-IRIS_BASE = ../../..
-include(../../libbase.pri)
-
-TEMPLATE = lib
-CONFIG += plugin
-QT -= gui
-DESTDIR = $$IRIS_BASE/plugins
-
-VERSION = 1.0.0
-
-INCLUDEPATH *= $$PWD/../corelib
-LIBS += -L$$IRIS_BASE/lib -lirisnetcore
-
-include(appledns.pri)
diff --git a/src/irisnet/appledns/qdnssd.cpp b/src/irisnet/appledns/qdnssd.cpp
index 9be138e2..abbb4e28 100644
--- a/src/irisnet/appledns/qdnssd.cpp
+++ b/src/irisnet/appledns/qdnssd.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007,2008 Justin Karneges
+ * Copyright (C) 2007-2008 Justin Karneges
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -18,22 +18,18 @@
#include "qdnssd.h"
+#include "dns_sd.h"
+
#include
#include
-
-// for ntohs
-#ifdef Q_OS_WIN
-# include
+#ifdef Q_OS_WIN // for ntohs
+#include
#else
-# include
+#include
#endif
-#include "dns_sd.h"
-
namespace {
-
// safeobj stuff, from qca
-
void releaseAndDeleteLater(QObject *owner, QObject *obj)
{
obj->disconnect(owner);
@@ -41,33 +37,28 @@ void releaseAndDeleteLater(QObject *owner, QObject *obj)
obj->deleteLater();
}
-class SafeTimer : public QObject
-{
+class SafeTimer : public QObject {
Q_OBJECT
public:
- SafeTimer(QObject *parent = 0) :
- QObject(parent)
+ SafeTimer(QObject *parent = 0) : QObject(parent)
{
t = new QTimer(this);
connect(t, SIGNAL(timeout()), SIGNAL(timeout()));
}
- ~SafeTimer()
- {
- releaseAndDeleteLater(this, t);
- }
+ ~SafeTimer() { releaseAndDeleteLater(this, t); }
- int interval() const { return t->interval(); }
- bool isActive() const { return t->isActive(); }
- bool isSingleShot() const { return t->isSingleShot(); }
- void setInterval(int msec) { t->setInterval(msec); }
+ int interval() const { return t->interval(); }
+ bool isActive() const { return t->isActive(); }
+ bool isSingleShot() const { return t->isSingleShot(); }
+ void setInterval(int msec) { t->setInterval(msec); }
void setSingleShot(bool singleShot) { t->setSingleShot(singleShot); }
- int timerId() const { return t->timerId(); }
+ int timerId() const { return t->timerId(); }
public slots:
- void start(int msec) { t->start(msec); }
- void start() { t->start(); }
- void stop() { t->stop(); }
+ void start(int msec) { t->start(msec); }
+ void start() { t->start(); }
+ void stop() { t->stop(); }
signals:
void timeout();
@@ -76,13 +67,10 @@ public slots:
QTimer *t;
};
-class SafeSocketNotifier : public QObject
-{
+class SafeSocketNotifier : public QObject {
Q_OBJECT
public:
- SafeSocketNotifier(int socket, QSocketNotifier::Type type,
- QObject *parent = 0) :
- QObject(parent)
+ SafeSocketNotifier(int socket, QSocketNotifier::Type type, QObject *parent = 0) : QObject(parent)
{
sn = new QSocketNotifier(socket, type, this);
connect(sn, SIGNAL(activated(int)), SIGNAL(activated(int)));
@@ -94,12 +82,12 @@ class SafeSocketNotifier : public QObject
releaseAndDeleteLater(this, sn);
}
- bool isEnabled() const { return sn->isEnabled(); }
- int socket() const { return sn->socket(); }
+ bool isEnabled() const { return sn->isEnabled(); }
+ int socket() const { return sn->socket(); }
QSocketNotifier::Type type() const { return sn->type(); }
public slots:
- void setEnabled(bool enable) { sn->setEnabled(enable); }
+ void setEnabled(bool enable) { sn->setEnabled(enable); }
signals:
void activated(int socket);
@@ -115,85 +103,58 @@ public slots:
// to maintain a pointer which /can/ be copied. Also, we'll keep
// a flag to indicate whether the allocated DNSServiceRef has been
// initialized yet.
-class ServiceRef
-{
+class ServiceRef {
private:
DNSServiceRef *_p;
- bool _initialized;
+ bool _initialized;
public:
- ServiceRef() :
- _initialized(false)
- {
- _p = (DNSServiceRef *)malloc(sizeof(DNSServiceRef));
- }
+ ServiceRef() : _initialized(false) { _p = (DNSServiceRef *)malloc(sizeof(DNSServiceRef)); }
~ServiceRef()
{
- if(_initialized)
+ if (_initialized)
DNSServiceRefDeallocate(*_p);
free(_p);
}
- DNSServiceRef *data()
- {
- return _p;
- }
+ DNSServiceRef *data() { return _p; }
- void setInitialized()
- {
- _initialized = true;
- }
+ void setInitialized() { _initialized = true; }
};
-class RecordRef
-{
+class RecordRef {
private:
DNSRecordRef *_p;
public:
- RecordRef()
- {
- _p = (DNSRecordRef *)malloc(sizeof(DNSRecordRef));
- }
+ RecordRef() { _p = (DNSRecordRef *)malloc(sizeof(DNSRecordRef)); }
- ~RecordRef()
- {
- free(_p);
- }
+ ~RecordRef() { free(_p); }
- DNSRecordRef *data()
- {
- return _p;
- }
+ DNSRecordRef *data() { return _p; }
};
-class IdManager
-{
+class IdManager {
private:
QSet set;
- int at;
+ int at;
inline void bump_at()
{
- if(at == 0x7fffffff)
+ if (at == 0x7fffffff)
at = 0;
else
++at;
}
public:
- IdManager() :
- at(0)
- {
- }
+ IdManager() : at(0) { }
int reserveId()
{
- while(1)
- {
- if(!set.contains(at))
- {
+ while (1) {
+ if (!set.contains(at)) {
int id = at;
set.insert(id);
bump_at();
@@ -204,37 +165,27 @@ class IdManager
}
}
- void releaseId(int id)
- {
- set.remove(id);
- }
+ void releaseId(int id) { set.remove(id); }
};
-}
+} // namespace
//----------------------------------------------------------------------------
// QDnsSd
//----------------------------------------------------------------------------
-class QDnsSd::Private : public QObject
-{
+class QDnsSd::Private : public QObject {
Q_OBJECT
public:
- QDnsSd *q;
+ QDnsSd *q;
IdManager idManager;
- class SubRecord
- {
+ class SubRecord {
public:
- Private *_self;
- int _id;
+ Private *_self;
+ int _id;
RecordRef *_sdref;
- SubRecord(Private *self) :
- _self(self),
- _id(-1),
- _sdref(0)
- {
- }
+ SubRecord(Private *self) : _self(self), _id(-1), _sdref(0) { }
~SubRecord()
{
@@ -243,46 +194,33 @@ class QDnsSd::Private : public QObject
}
};
- class Request
- {
+ class Request {
public:
- enum Type
- {
- Query,
- Browse,
- Resolve,
- Reg
- };
-
- Private *_self;
- int _type;
- int _id;
- ServiceRef *_sdref;
- int _sockfd;
+ enum Type { Query, Browse, Resolve, Reg };
+
+ Private *_self;
+ int _type;
+ int _id;
+ ServiceRef *_sdref;
+ int _sockfd;
SafeSocketNotifier *_sn_read;
- SafeTimer *_errorTrigger;
+ SafeTimer *_errorTrigger;
- bool _doSignal;
- LowLevelError _lowLevelError;
- QList _queryRecords;
+ bool _doSignal;
+ LowLevelError _lowLevelError;
+ QList _queryRecords;
QList _browseEntries;
- QByteArray _resolveFullName;
- QByteArray _resolveHost;
- int _resolvePort;
- QByteArray _resolveTxtRecord;
- QByteArray _regDomain;
- bool _regConflict;
+ QByteArray _resolveFullName;
+ QByteArray _resolveHost;
+ int _resolvePort;
+ QByteArray _resolveTxtRecord;
+ QByteArray _regDomain;
+ bool _regConflict;
- QList _subRecords;
+ QList _subRecords;
Request(Private *self) :
- _self(self),
- _id(-1),
- _sdref(0),
- _sockfd(-1),
- _sn_read(0),
- _errorTrigger(0),
- _doSignal(false)
+ _self(self), _id(-1), _sdref(0), _sockfd(-1), _sn_read(0), _errorTrigger(0), _doSignal(false)
{
}
@@ -298,30 +236,22 @@ class QDnsSd::Private : public QObject
int subRecordIndexById(int rec_id) const
{
- for(int n = 0; n < _subRecords.count(); ++n)
- {
- if(_subRecords[n]->_id == rec_id)
+ for (int n = 0; n < _subRecords.count(); ++n) {
+ if (_subRecords[n]->_id == rec_id)
return n;
}
return -1;
}
};
- QHash _requestsById;
- QHash _requestsBySocket;
- QHash _requestsByTimer;
- QHash _requestsByRecId;
+ QHash _requestsById;
+ QHash _requestsBySocket;
+ QHash _requestsByTimer;
+ QHash _requestsByRecId;
- Private(QDnsSd *_q) :
- QObject(_q),
- q(_q)
- {
- }
+ Private(QDnsSd *_q) : QObject(_q), q(_q) { }
- ~Private()
- {
- qDeleteAll(_requestsById);
- }
+ ~Private() { qDeleteAll(_requestsById); }
void setDelayedError(Request *req, const LowLevelError &lowLevelError)
{
@@ -341,11 +271,11 @@ class QDnsSd::Private : public QObject
void removeRequest(Request *req)
{
- foreach(const SubRecord *srec, req->_subRecords)
+ for (const SubRecord *srec : req->_subRecords)
_requestsByRecId.remove(srec->_id);
- if(req->_errorTrigger)
+ if (req->_errorTrigger)
_requestsByTimer.remove(req->_errorTrigger);
- if(req->_sn_read)
+ if (req->_sn_read)
_requestsBySocket.remove(req->_sn_read);
_requestsById.remove(req->_id);
delete req;
@@ -354,7 +284,7 @@ class QDnsSd::Private : public QObject
int regIdForRecId(int rec_id) const
{
Request *req = _requestsByRecId.value(rec_id);
- if(req)
+ if (req)
return req->_id;
return -1;
}
@@ -364,32 +294,27 @@ class QDnsSd::Private : public QObject
int id = idManager.reserveId();
Request *req = new Request(this);
- req->_type = Request::Query;
- req->_id = id;
- req->_sdref = new ServiceRef;
-
- DNSServiceErrorType err = DNSServiceQueryRecord(
- req->_sdref->data(), kDNSServiceFlagsLongLivedQuery,
- 0, name.constData(), qType, kDNSServiceClass_IN,
- cb_queryRecordReply, req);
- if(err != kDNSServiceErr_NoError)
- {
- setDelayedError(req, LowLevelError(
- "DNSServiceQueryRecord", err));
+ req->_type = Request::Query;
+ req->_id = id;
+ req->_sdref = new ServiceRef;
+
+ DNSServiceErrorType err
+ = DNSServiceQueryRecord(req->_sdref->data(), kDNSServiceFlagsLongLivedQuery, 0, name.constData(), qType,
+ kDNSServiceClass_IN, cb_queryRecordReply, req);
+ if (err != kDNSServiceErr_NoError) {
+ setDelayedError(req, LowLevelError("DNSServiceQueryRecord", err));
return id;
}
req->_sdref->setInitialized();
int sockfd = DNSServiceRefSockFD(*(req->_sdref->data()));
- if(sockfd == -1)
- {
- setDelayedError(req, LowLevelError(
- "DNSServiceRefSockFD", -1));
+ if (sockfd == -1) {
+ setDelayedError(req, LowLevelError("DNSServiceRefSockFD", -1));
return id;
}
- req->_sockfd = sockfd;
+ req->_sockfd = sockfd;
req->_sn_read = new SafeSocketNotifier(sockfd, QSocketNotifier::Read, this);
connect(req->_sn_read, SIGNAL(activated(int)), SLOT(sn_activated()));
_requestsById.insert(id, req);
@@ -403,32 +328,26 @@ class QDnsSd::Private : public QObject
int id = idManager.reserveId();
Request *req = new Request(this);
- req->_type = Request::Browse;
- req->_id = id;
- req->_sdref = new ServiceRef;
-
- DNSServiceErrorType err = DNSServiceBrowse(
- req->_sdref->data(), 0, 0, serviceType.constData(),
- !domain.isEmpty() ? domain.constData() : NULL,
- cb_browseReply, req);
- if(err != kDNSServiceErr_NoError)
- {
- setDelayedError(req, LowLevelError(
- "DNSServiceBrowse", err));
+ req->_type = Request::Browse;
+ req->_id = id;
+ req->_sdref = new ServiceRef;
+
+ DNSServiceErrorType err = DNSServiceBrowse(req->_sdref->data(), 0, 0, serviceType.constData(),
+ !domain.isEmpty() ? domain.constData() : NULL, cb_browseReply, req);
+ if (err != kDNSServiceErr_NoError) {
+ setDelayedError(req, LowLevelError("DNSServiceBrowse", err));
return id;
}
req->_sdref->setInitialized();
int sockfd = DNSServiceRefSockFD(*(req->_sdref->data()));
- if(sockfd == -1)
- {
- setDelayedError(req, LowLevelError(
- "DNSServiceRefSockFD", -1));
+ if (sockfd == -1) {
+ setDelayedError(req, LowLevelError("DNSServiceRefSockFD", -1));
return id;
}
- req->_sockfd = sockfd;
+ req->_sockfd = sockfd;
req->_sn_read = new SafeSocketNotifier(sockfd, QSocketNotifier::Read, this);
connect(req->_sn_read, SIGNAL(activated(int)), SLOT(sn_activated()));
_requestsById.insert(id, req);
@@ -442,32 +361,27 @@ class QDnsSd::Private : public QObject
int id = idManager.reserveId();
Request *req = new Request(this);
- req->_type = Request::Resolve;
- req->_id = id;
- req->_sdref = new ServiceRef;
-
- DNSServiceErrorType err = DNSServiceResolve(
- req->_sdref->data(), 0, 0, serviceName.constData(),
- serviceType.constData(), domain.constData(),
- (DNSServiceResolveReply)cb_resolveReply, req);
- if(err != kDNSServiceErr_NoError)
- {
- setDelayedError(req, LowLevelError(
- "DNSServiceResolve", err));
+ req->_type = Request::Resolve;
+ req->_id = id;
+ req->_sdref = new ServiceRef;
+
+ DNSServiceErrorType err
+ = DNSServiceResolve(req->_sdref->data(), 0, 0, serviceName.constData(), serviceType.constData(),
+ domain.constData(), (DNSServiceResolveReply)cb_resolveReply, req);
+ if (err != kDNSServiceErr_NoError) {
+ setDelayedError(req, LowLevelError("DNSServiceResolve", err));
return id;
}
req->_sdref->setInitialized();
int sockfd = DNSServiceRefSockFD(*(req->_sdref->data()));
- if(sockfd == -1)
- {
- setDelayedError(req, LowLevelError(
- "DNSServiceRefSockFD", -1));
+ if (sockfd == -1) {
+ setDelayedError(req, LowLevelError("DNSServiceRefSockFD", -1));
return id;
}
- req->_sockfd = sockfd;
+ req->_sockfd = sockfd;
req->_sn_read = new SafeSocketNotifier(sockfd, QSocketNotifier::Read, this);
connect(req->_sn_read, SIGNAL(activated(int)), SLOT(sn_activated()));
_requestsById.insert(id, req);
@@ -476,48 +390,42 @@ class QDnsSd::Private : public QObject
return id;
}
- int reg(const QByteArray &serviceName, const QByteArray &serviceType, const QByteArray &domain, int port, const QByteArray &txtRecord)
+ int reg(const QByteArray &serviceName, const QByteArray &serviceType, const QByteArray &domain, int port,
+ const QByteArray &txtRecord)
{
int id = idManager.reserveId();
Request *req = new Request(this);
- req->_type = Request::Reg;
- req->_id = id;
+ req->_type = Request::Reg;
+ req->_id = id;
- if(port < 1 || port > 0xffff)
- {
+ if (port < 1 || port > 0xffff) {
setDelayedError(req, LowLevelError());
return id;
}
uint16_t sport = port;
- sport = htons(sport);
+ sport = htons(sport);
req->_sdref = new ServiceRef;
DNSServiceErrorType err = DNSServiceRegister(
- req->_sdref->data(), kDNSServiceFlagsNoAutoRename, 0,
- serviceName.constData(), serviceType.constData(),
- domain.constData(), NULL, sport, txtRecord.size(),
- txtRecord.data(), cb_regReply, req);
- if(err != kDNSServiceErr_NoError)
- {
- setDelayedError(req, LowLevelError(
- "DNSServiceRegister", err));
+ req->_sdref->data(), kDNSServiceFlagsNoAutoRename, 0, serviceName.constData(), serviceType.constData(),
+ domain.constData(), NULL, sport, txtRecord.size(), txtRecord.data(), cb_regReply, req);
+ if (err != kDNSServiceErr_NoError) {
+ setDelayedError(req, LowLevelError("DNSServiceRegister", err));
return id;
}
req->_sdref->setInitialized();
int sockfd = DNSServiceRefSockFD(*(req->_sdref->data()));
- if(sockfd == -1)
- {
- setDelayedError(req, LowLevelError(
- "DNSServiceRefSockFD", -1));
+ if (sockfd == -1) {
+ setDelayedError(req, LowLevelError("DNSServiceRefSockFD", -1));
return id;
}
- req->_sockfd = sockfd;
+ req->_sockfd = sockfd;
req->_sn_read = new SafeSocketNotifier(sockfd, QSocketNotifier::Read, this);
connect(req->_sn_read, SIGNAL(activated(int)), SLOT(sn_activated()));
_requestsById.insert(id, req);
@@ -529,31 +437,27 @@ class QDnsSd::Private : public QObject
int recordAdd(int reg_id, const Record &rec, LowLevelError *lowLevelError)
{
Request *req = _requestsById.value(reg_id);
- if(!req)
- {
- if(lowLevelError)
+ if (!req) {
+ if (lowLevelError)
*lowLevelError = LowLevelError();
return -1;
}
RecordRef *recordRef = new RecordRef;
- DNSServiceErrorType err = DNSServiceAddRecord(
- *(req->_sdref->data()), recordRef->data(), 0,
- rec.rrtype, rec.rdata.size(), rec.rdata.data(),
- rec.ttl);
- if(err != kDNSServiceErr_NoError)
- {
- if(lowLevelError)
+ DNSServiceErrorType err = DNSServiceAddRecord(*(req->_sdref->data()), recordRef->data(), 0, rec.rrtype,
+ rec.rdata.size(), rec.rdata.data(), rec.ttl);
+ if (err != kDNSServiceErr_NoError) {
+ if (lowLevelError)
*lowLevelError = LowLevelError("DNSServiceAddRecord", err);
delete recordRef;
return -1;
}
- int id = idManager.reserveId();
+ int id = idManager.reserveId();
SubRecord *srec = new SubRecord(this);
- srec->_id = id;
- srec->_sdref = recordRef;
+ srec->_id = id;
+ srec->_sdref = recordRef;
req->_subRecords += srec;
_requestsByRecId.insert(id, req);
@@ -563,33 +467,27 @@ class QDnsSd::Private : public QObject
bool recordUpdate(int reg_id, int rec_id, const Record &rec, LowLevelError *lowLevelError)
{
Request *req = _requestsById.value(reg_id);
- if(!req)
- {
- if(lowLevelError)
+ if (!req) {
+ if (lowLevelError)
*lowLevelError = LowLevelError();
return false;
}
SubRecord *srec = 0;
- if(rec_id != -1)
- {
+ if (rec_id != -1) {
int at = req->subRecordIndexById(rec_id);
- if(at == -1)
- {
- if(lowLevelError)
+ if (at == -1) {
+ if (lowLevelError)
*lowLevelError = LowLevelError();
return false;
}
srec = req->_subRecords[at];
}
- DNSServiceErrorType err = DNSServiceUpdateRecord(
- *(req->_sdref->data()),
- srec ? *(srec->_sdref->data()) : NULL, 0,
- rec.rdata.size(), rec.rdata.data(), rec.ttl);
- if(err != kDNSServiceErr_NoError)
- {
- if(lowLevelError)
+ DNSServiceErrorType err = DNSServiceUpdateRecord(*(req->_sdref->data()), srec ? *(srec->_sdref->data()) : NULL,
+ 0, rec.rdata.size(), rec.rdata.data(), rec.ttl);
+ if (err != kDNSServiceErr_NoError) {
+ if (lowLevelError)
*lowLevelError = LowLevelError("DNSServiceUpdateRecord", err);
return false;
}
@@ -600,7 +498,7 @@ class QDnsSd::Private : public QObject
void recordRemove(int rec_id)
{
Request *req = _requestsByRecId.value(rec_id);
- if(!req)
+ if (!req)
return;
// this can't fail
@@ -616,7 +514,7 @@ class QDnsSd::Private : public QObject
void stop(int id)
{
Request *req = _requestsById.value(id);
- if(req)
+ if (req)
removeRequest(req);
}
@@ -624,8 +522,8 @@ private slots:
void sn_activated()
{
SafeSocketNotifier *sn_read = static_cast(sender());
- Request *req = _requestsBySocket.value(sn_read);
- if(!req)
+ Request *req = _requestsBySocket.value(sn_read);
+ if (!req)
return;
int id = req->_id;
@@ -634,47 +532,40 @@ private slots:
// do error if the above function returns an error, or if we
// collected an error during a callback
- if(err != kDNSServiceErr_NoError || !req->_lowLevelError.func.isEmpty())
- {
+ if (err != kDNSServiceErr_NoError || !req->_lowLevelError.func.isEmpty()) {
LowLevelError lowLevelError;
- if(err != kDNSServiceErr_NoError)
+ if (err != kDNSServiceErr_NoError)
lowLevelError = LowLevelError("DNSServiceProcessResult", err);
else
lowLevelError = req->_lowLevelError;
// reg conflict indicated via callback
bool regConflict = false;
- if(req->_type == Request::Reg && !req->_lowLevelError.func.isEmpty())
+ if (req->_type == Request::Reg && !req->_lowLevelError.func.isEmpty())
regConflict = req->_regConflict;
removeRequest(req);
- if(req->_type == Request::Query)
- {
+ if (req->_type == Request::Query) {
QDnsSd::QueryResult r;
- r.success = false;
+ r.success = false;
r.lowLevelError = lowLevelError;
emit q->queryResult(id, r);
- }
- else if(req->_type == Request::Browse)
- {
+ } else if (req->_type == Request::Browse) {
QDnsSd::BrowseResult r;
- r.success = false;
+ r.success = false;
r.lowLevelError = lowLevelError;
emit q->browseResult(id, r);
- }
- else if(req->_type == Request::Resolve)
- {
+ } else if (req->_type == Request::Resolve) {
QDnsSd::ResolveResult r;
- r.success = false;
+ r.success = false;
r.lowLevelError = lowLevelError;
emit q->resolveResult(id, r);
- }
- else // Reg
+ } else // Reg
{
QDnsSd::RegResult r;
r.success = false;
- if(regConflict)
+ if (regConflict)
r.errorCode = QDnsSd::RegResult::ErrorConflict;
else
r.errorCode = QDnsSd::RegResult::ErrorGeneric;
@@ -687,10 +578,8 @@ private slots:
// handle success
- if(req->_type == Request::Query)
- {
- if(req->_doSignal)
- {
+ if (req->_type == Request::Query) {
+ if (req->_doSignal) {
QDnsSd::QueryResult r;
r.success = true;
r.records = req->_queryRecords;
@@ -698,11 +587,8 @@ private slots:
req->_doSignal = false;
emit q->queryResult(id, r);
}
- }
- else if(req->_type == Request::Browse)
- {
- if(req->_doSignal)
- {
+ } else if (req->_type == Request::Browse) {
+ if (req->_doSignal) {
QDnsSd::BrowseResult r;
r.success = true;
r.entries = req->_browseEntries;
@@ -710,17 +596,14 @@ private slots:
req->_doSignal = false;
emit q->browseResult(id, r);
}
- }
- else if(req->_type == Request::Resolve)
- {
- if(req->_doSignal)
- {
+ } else if (req->_type == Request::Resolve) {
+ if (req->_doSignal) {
QDnsSd::ResolveResult r;
- r.success = true;
- r.fullName = req->_resolveFullName;
- r.hostTarget = req->_resolveHost;
- r.port = req->_resolvePort;
- r.txtRecord = req->_resolveTxtRecord;
+ r.success = true;
+ r.fullName = req->_resolveFullName;
+ r.hostTarget = req->_resolveHost;
+ r.port = req->_resolvePort;
+ r.txtRecord = req->_resolveTxtRecord;
req->_doSignal = false;
// there is only one response
@@ -728,14 +611,12 @@ private slots:
emit q->resolveResult(id, r);
}
- }
- else // Reg
+ } else // Reg
{
- if(req->_doSignal)
- {
+ if (req->_doSignal) {
QDnsSd::RegResult r;
- r.success = true;
- r.domain = req->_regDomain;
+ r.success = true;
+ r.domain = req->_regDomain;
req->_doSignal = false;
emit q->regResult(id, r);
@@ -745,180 +626,155 @@ private slots:
void doError()
{
- SafeTimer *t = static_cast(sender());
- Request *req = _requestsByTimer.value(t);
- if(!req)
+ SafeTimer *t = static_cast(sender());
+ Request *req = _requestsByTimer.value(t);
+ if (!req)
return;
- int id = req->_id;
+ int id = req->_id;
int type = req->_type;
removeRequest(req);
- if(type == Request::Query)
- {
+ if (type == Request::Query) {
QDnsSd::QueryResult r;
- r.success = false;
+ r.success = false;
r.lowLevelError = req->_lowLevelError;
emit q->queryResult(id, r);
- }
- else if(type == Request::Browse)
- {
+ } else if (type == Request::Browse) {
QDnsSd::BrowseResult r;
- r.success = false;
+ r.success = false;
r.lowLevelError = req->_lowLevelError;
emit q->browseResult(id, r);
- }
- else if(type == Request::Resolve)
- {
+ } else if (type == Request::Resolve) {
QDnsSd::ResolveResult r;
- r.success = false;
+ r.success = false;
r.lowLevelError = req->_lowLevelError;
emit q->resolveResult(id, r);
- }
- else // Reg
+ } else // Reg
{
QDnsSd::RegResult r;
- r.success = false;
- r.errorCode = QDnsSd::RegResult::ErrorGeneric;
+ r.success = false;
+ r.errorCode = QDnsSd::RegResult::ErrorGeneric;
r.lowLevelError = req->_lowLevelError;
emit q->regResult(id, r);
}
}
private:
- static void cb_queryRecordReply(DNSServiceRef ref,
- DNSServiceFlags flags, uint32_t interfaceIndex,
- DNSServiceErrorType errorCode, const char *fullname,
- uint16_t rrtype, uint16_t rrclass, uint16_t rdlen,
- const void *rdata, uint32_t ttl, void *context)
+ static void cb_queryRecordReply(DNSServiceRef ref, DNSServiceFlags flags, uint32_t interfaceIndex,
+ DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype,
+ uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context)
{
Q_UNUSED(ref);
Q_UNUSED(interfaceIndex);
Q_UNUSED(rrclass);
Request *req = static_cast(context);
- req->_self->handle_queryRecordReply(req, flags, errorCode,
- fullname, rrtype, rdlen, (const char *)rdata, ttl);
+ req->_self->handle_queryRecordReply(req, flags, errorCode, fullname, rrtype, rdlen, (const char *)rdata, ttl);
}
- static void cb_browseReply(DNSServiceRef ref,
- DNSServiceFlags flags, uint32_t interfaceIndex,
- DNSServiceErrorType errorCode, const char *serviceName,
- const char *regtype, const char *replyDomain, void *context)
+ static void cb_browseReply(DNSServiceRef ref, DNSServiceFlags flags, uint32_t interfaceIndex,
+ DNSServiceErrorType errorCode, const char *serviceName, const char *regtype,
+ const char *replyDomain, void *context)
{
Q_UNUSED(ref);
Q_UNUSED(interfaceIndex);
Request *req = static_cast(context);
- req->_self->handle_browseReply(req, flags, errorCode,
- serviceName, regtype, replyDomain);
+ req->_self->handle_browseReply(req, flags, errorCode, serviceName, regtype, replyDomain);
}
- static void cb_resolveReply(DNSServiceRef ref,
- DNSServiceFlags flags, uint32_t interfaceIndex,
- DNSServiceErrorType errorCode, const char *fullname,
- const char *hosttarget, uint16_t port, uint16_t txtLen,
- const unsigned char *txtRecord, void *context)
+ static void cb_resolveReply(DNSServiceRef ref, DNSServiceFlags flags, uint32_t interfaceIndex,
+ DNSServiceErrorType errorCode, const char *fullname, const char *hosttarget,
+ uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, void *context)
{
Q_UNUSED(ref);
Q_UNUSED(flags);
Q_UNUSED(interfaceIndex);
Request *req = static_cast(context);
- req->_self->handle_resolveReply(req, errorCode, fullname,
- hosttarget, port, txtLen, txtRecord);
+ req->_self->handle_resolveReply(req, errorCode, fullname, hosttarget, port, txtLen, txtRecord);
}
- static void cb_regReply(DNSServiceRef ref,
- DNSServiceFlags flags, DNSServiceErrorType errorCode,
- const char *name, const char *regtype, const char *domain,
- void *context)
+ static void cb_regReply(DNSServiceRef ref, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *name,
+ const char *regtype, const char *domain, void *context)
{
Q_UNUSED(ref);
Q_UNUSED(flags);
Request *req = static_cast(context);
- req->_self->handle_regReply(req, errorCode, name, regtype,
- domain);
+ req->_self->handle_regReply(req, errorCode, name, regtype, domain);
}
- void handle_queryRecordReply(Request *req, DNSServiceFlags flags,
- DNSServiceErrorType errorCode, const char *fullname,
- uint16_t rrtype, uint16_t rdlen, const char *rdata,
- uint16_t ttl)
+ void handle_queryRecordReply(Request *req, DNSServiceFlags flags, DNSServiceErrorType errorCode,
+ const char *fullname, uint16_t rrtype, uint16_t rdlen, const char *rdata, uint16_t ttl)
{
- if(errorCode != kDNSServiceErr_NoError)
- {
- req->_doSignal = true;
+ if (errorCode != kDNSServiceErr_NoError) {
+ req->_doSignal = true;
req->_lowLevelError = LowLevelError("DNSServiceQueryRecordReply", errorCode);
return;
}
QDnsSd::Record rec;
- rec.added = (flags & kDNSServiceFlagsAdd) ? true: false;
- rec.name = QByteArray(fullname);
+ rec.added = (flags & kDNSServiceFlagsAdd) ? true : false;
+ rec.name = QByteArray(fullname);
rec.rrtype = rrtype;
- rec.rdata = QByteArray(rdata, rdlen);
- rec.ttl = ttl;
+ rec.rdata = QByteArray(rdata, rdlen);
+ rec.ttl = ttl;
req->_queryRecords += rec;
- if(!(flags & kDNSServiceFlagsMoreComing))
+ if (!(flags & kDNSServiceFlagsMoreComing))
req->_doSignal = true;
}
- void handle_browseReply(Request *req, DNSServiceFlags flags,
- DNSServiceErrorType errorCode, const char *serviceName,
- const char *regtype, const char *replyDomain)
+ void handle_browseReply(Request *req, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *serviceName,
+ const char *regtype, const char *replyDomain)
{
- if(errorCode != kDNSServiceErr_NoError)
- {
- req->_doSignal = true;
+ if (errorCode != kDNSServiceErr_NoError) {
+ req->_doSignal = true;
req->_lowLevelError = LowLevelError("DNSServiceBrowseReply", errorCode);
return;
}
QDnsSd::BrowseEntry e;
- e.added = (flags & kDNSServiceFlagsAdd) ? true: false;
+ e.added = (flags & kDNSServiceFlagsAdd) ? true : false;
e.serviceName = QByteArray(serviceName);
e.serviceType = QByteArray(regtype);
e.replyDomain = QByteArray(replyDomain);
req->_browseEntries += e;
- if(!(flags & kDNSServiceFlagsMoreComing))
+ if (!(flags & kDNSServiceFlagsMoreComing))
req->_doSignal = true;
}
- void handle_resolveReply(Request *req, DNSServiceErrorType errorCode,
- const char *fullname, const char *hosttarget, uint16_t port,
- uint16_t txtLen, const unsigned char *txtRecord)
+ void handle_resolveReply(Request *req, DNSServiceErrorType errorCode, const char *fullname, const char *hosttarget,
+ uint16_t port, uint16_t txtLen, const unsigned char *txtRecord)
{
- if(errorCode != kDNSServiceErr_NoError)
- {
- req->_doSignal = true;
+ if (errorCode != kDNSServiceErr_NoError) {
+ req->_doSignal = true;
req->_lowLevelError = LowLevelError("DNSServiceResolveReply", errorCode);
return;
}
- req->_resolveFullName = QByteArray(fullname);
- req->_resolveHost = QByteArray(hosttarget);
- req->_resolvePort = ntohs(port);
+ req->_resolveFullName = QByteArray(fullname);
+ req->_resolveHost = QByteArray(hosttarget);
+ req->_resolvePort = ntohs(port);
req->_resolveTxtRecord = QByteArray((const char *)txtRecord, txtLen);
req->_doSignal = true;
}
- void handle_regReply(Request *req, DNSServiceErrorType errorCode,
- const char *name, const char *regtype, const char *domain)
+ void handle_regReply(Request *req, DNSServiceErrorType errorCode, const char *name, const char *regtype,
+ const char *domain)
{
Q_UNUSED(name);
Q_UNUSED(regtype);
- if(errorCode != kDNSServiceErr_NoError)
- {
- req->_doSignal = true;
+ if (errorCode != kDNSServiceErr_NoError) {
+ req->_doSignal = true;
req->_lowLevelError = LowLevelError("DNSServiceRegisterReply", errorCode);
- if(errorCode == kDNSServiceErr_NameConflict)
+ if (errorCode == kDNSServiceErr_NameConflict)
req->_regConflict = true;
else
req->_regConflict = false;
@@ -926,37 +782,25 @@ private slots:
}
req->_regDomain = QByteArray(domain);
- req->_doSignal = true;
+ req->_doSignal = true;
}
};
-QDnsSd::QDnsSd(QObject *parent) :
- QObject(parent)
-{
- d = new Private(this);
-}
+QDnsSd::QDnsSd(QObject *parent) : QObject(parent) { d = new Private(this); }
-QDnsSd::~QDnsSd()
-{
- delete d;
-}
+QDnsSd::~QDnsSd() { delete d; }
-int QDnsSd::query(const QByteArray &name, int qType)
-{
- return d->query(name, qType);
-}
+int QDnsSd::query(const QByteArray &name, int qType) { return d->query(name, qType); }
-int QDnsSd::browse(const QByteArray &serviceType, const QByteArray &domain)
-{
- return d->browse(serviceType, domain);
-}
+int QDnsSd::browse(const QByteArray &serviceType, const QByteArray &domain) { return d->browse(serviceType, domain); }
int QDnsSd::resolve(const QByteArray &serviceName, const QByteArray &serviceType, const QByteArray &domain)
{
return d->resolve(serviceName, serviceType, domain);
}
-int QDnsSd::reg(const QByteArray &serviceName, const QByteArray &serviceType, const QByteArray &domain, int port, const QByteArray &txtRecord)
+int QDnsSd::reg(const QByteArray &serviceName, const QByteArray &serviceType, const QByteArray &domain, int port,
+ const QByteArray &txtRecord)
{
return d->reg(serviceName, serviceType, domain, port, txtRecord);
}
@@ -969,7 +813,7 @@ int QDnsSd::recordAdd(int reg_id, const Record &rec, LowLevelError *lowLevelErro
bool QDnsSd::recordUpdate(int rec_id, const Record &rec, LowLevelError *lowLevelError)
{
int reg_id = d->regIdForRecId(rec_id);
- if(reg_id == -1)
+ if (reg_id == -1)
return false;
return d->recordUpdate(reg_id, rec_id, rec, lowLevelError);
@@ -979,43 +823,33 @@ bool QDnsSd::recordUpdateTxt(int reg_id, const QByteArray &txtRecord, quint32 tt
{
Record rec;
rec.rrtype = kDNSServiceType_TXT;
- rec.rdata = txtRecord;
- rec.ttl = ttl;
+ rec.rdata = txtRecord;
+ rec.ttl = ttl;
return d->recordUpdate(reg_id, -1, rec, lowLevelError);
}
-void QDnsSd::recordRemove(int rec_id)
-{
- d->recordRemove(rec_id);
-}
+void QDnsSd::recordRemove(int rec_id) { d->recordRemove(rec_id); }
-void QDnsSd::stop(int id)
-{
- d->stop(id);
-}
+void QDnsSd::stop(int id) { d->stop(id); }
QByteArray QDnsSd::createTxtRecord(const QList &strings)
{
// split into var/val and validate
QList vars;
QList vals; // null = no value, empty = empty value
- foreach(const QByteArray &i, strings)
- {
+ for (const QByteArray &i : strings) {
QByteArray var;
QByteArray val;
- int n = i.indexOf('=');
- if(n != -1)
- {
+ int n = i.indexOf('=');
+ if (n != -1) {
var = i.mid(0, n);
val = i.mid(n + 1);
- }
- else
+ } else
var = i;
- for(int n = 0; n < var.size(); ++n)
- {
+ for (int n = 0; n < var.size(); ++n) {
unsigned char c = var[n];
- if(c < 0x20 || c > 0x7e)
+ if (c < 0x20 || c > 0x7e)
return QByteArray();
}
@@ -1024,21 +858,18 @@ QByteArray QDnsSd::createTxtRecord(const QList &strings)
}
TXTRecordRef ref;
- QByteArray buf(256, 0);
+ QByteArray buf(256, 0);
TXTRecordCreate(&ref, buf.size(), buf.data());
- for(int n = 0; n < vars.count(); ++n)
- {
- int valueSize = vals[n].size();
+ for (int n = 0; n < vars.count(); ++n) {
+ int valueSize = vals[n].size();
char *value;
- if(!vals[n].isNull())
+ if (!vals[n].isNull())
value = vals[n].data();
else
value = 0;
- DNSServiceErrorType err = TXTRecordSetValue(&ref,
- vars[n].data(), valueSize, value);
- if(err != kDNSServiceErr_NoError)
- {
+ DNSServiceErrorType err = TXTRecordSetValue(&ref, vars[n].data(), valueSize, value);
+ if (err != kDNSServiceErr_NoError) {
TXTRecordDeallocate(&ref);
return QByteArray();
}
@@ -1051,23 +882,20 @@ QByteArray QDnsSd::createTxtRecord(const QList &strings)
QList QDnsSd::parseTxtRecord(const QByteArray &txtRecord)
{
QList out;
- int count = TXTRecordGetCount(txtRecord.size(), txtRecord.data());
- for(int n = 0; n < count; ++n)
- {
- QByteArray keyBuf(256, 0);
- uint8_t valueLen;
- const void *value;
- DNSServiceErrorType err = TXTRecordGetItemAtIndex(
- txtRecord.size(), txtRecord.data(), n, keyBuf.size(),
- keyBuf.data(), &valueLen, &value);
- if(err != kDNSServiceErr_NoError)
+ int count = TXTRecordGetCount(txtRecord.size(), txtRecord.data());
+ for (int n = 0; n < count; ++n) {
+ QByteArray keyBuf(256, 0);
+ uint8_t valueLen;
+ const void *value;
+ DNSServiceErrorType err = TXTRecordGetItemAtIndex(txtRecord.size(), txtRecord.data(), n, keyBuf.size(),
+ keyBuf.data(), &valueLen, &value);
+ if (err != kDNSServiceErr_NoError)
return QList();
keyBuf.resize(qstrlen(keyBuf.data()));
QByteArray entry = keyBuf;
- if(value)
- {
+ if (value) {
entry += '=';
entry += QByteArray((const char *)value, valueLen);
}
diff --git a/src/irisnet/appledns/qdnssd.h b/src/irisnet/appledns/qdnssd.h
index 6edb3bd6..2bfba78c 100644
--- a/src/irisnet/appledns/qdnssd.h
+++ b/src/irisnet/appledns/qdnssd.h
@@ -19,48 +19,37 @@
#ifndef QDNSSD_H
#define QDNSSD_H
-#include
#include
#include
+#include
// DOR-compliant
-class QDnsSd : public QObject
-{
+class QDnsSd : public QObject {
Q_OBJECT
public:
- class LowLevelError
- {
+ class LowLevelError {
public:
QString func;
- int code;
-
- LowLevelError() :
- code(0)
- {
- }
-
- LowLevelError(const QString &_func, int _code) :
- func(_func),
- code(_code)
- {
- }
+ int code;
+
+ LowLevelError() : code(0) { }
+
+ LowLevelError(const QString &_func, int _code) : func(_func), code(_code) { }
};
- class Record
- {
+ class Record {
public:
bool added; // only used by QueryResult
QByteArray name;
- int rrtype;
+ int rrtype;
QByteArray rdata;
- quint32 ttl;
+ quint32 ttl;
};
- class BrowseEntry
- {
+ class BrowseEntry {
public:
- bool added;
+ bool added;
QByteArray serviceName;
// these may be different from request, see dns_sd docs
@@ -68,47 +57,39 @@ class QDnsSd : public QObject
QByteArray replyDomain;
};
- class QueryResult
- {
+ class QueryResult {
public:
- bool success;
+ bool success;
LowLevelError lowLevelError;
QList records;
};
- class BrowseResult
- {
+ class BrowseResult {
public:
- bool success;
+ bool success;
LowLevelError lowLevelError;
QList entries;
};
- class ResolveResult
- {
+ class ResolveResult {
public:
- bool success;
+ bool success;
LowLevelError lowLevelError;
QByteArray fullName;
QByteArray hostTarget;
- int port; // host byte-order
+ int port; // host byte-order
QByteArray txtRecord;
};
- class RegResult
- {
+ class RegResult {
public:
- enum Error
- {
- ErrorGeneric,
- ErrorConflict
- };
-
- bool success;
- Error errorCode;
+ enum Error { ErrorGeneric, ErrorConflict };
+
+ bool success;
+ Error errorCode;
LowLevelError lowLevelError;
QByteArray domain;
@@ -125,7 +106,8 @@ class QDnsSd : public QObject
int resolve(const QByteArray &serviceName, const QByteArray &serviceType, const QByteArray &domain);
// domain may be empty
- int reg(const QByteArray &serviceName, const QByteArray &serviceType, const QByteArray &domain, int port, const QByteArray &txtRecord);
+ int reg(const QByteArray &serviceName, const QByteArray &serviceType, const QByteArray &domain, int port,
+ const QByteArray &txtRecord);
// return -1 on error, else a record id
int recordAdd(int reg_id, const Record &rec, LowLevelError *lowLevelError = 0);
@@ -156,4 +138,4 @@ class QDnsSd : public QObject
Private *d;
};
-#endif
+#endif // QDNSSD_H
diff --git a/src/irisnet/appledns/sdtest.cpp b/src/irisnet/appledns/sdtest.cpp
index 5a69fe02..058c49f9 100644
--- a/src/irisnet/appledns/sdtest.cpp
+++ b/src/irisnet/appledns/sdtest.cpp
@@ -16,55 +16,42 @@
*
*/
-#include
-#include
#include "qdnssd.h"
-// for ntohl
-#ifdef Q_OS_WIN
-# include
+#include
+#include
+#ifdef Q_OS_WIN // for ntohl
+#include
#else
-# include
+#include
#endif
-class Command
-{
+class Command {
public:
- enum Type
- {
- Query,
- Browse,
- Resolve,
- Reg
- };
+ enum Type { Query, Browse, Resolve, Reg };
Type type;
- QString name; // query, resolve, reg
- int rtype; // query
- QString stype; // browse, resolve, reg
- QString domain; // browse, resolve, reg
- int port; // reg
+ QString name; // query, resolve, reg
+ int rtype; // query
+ QString stype; // browse, resolve, reg
+ QString domain; // browse, resolve, reg
+ int port; // reg
QByteArray txtRecord; // reg
- int id;
- int dnsId;
+ int id;
+ int dnsId;
bool error;
bool done; // for resolve
- Command() :
- error(false),
- done(false)
- {
- }
+ Command() : error(false), done(false) { }
};
static QString nameToString(const QByteArray &in)
{
QStringList parts;
- int at = 0;
- while(at < in.size())
- {
+ int at = 0;
+ while (at < in.size()) {
int len = in[at++];
parts += QString::fromUtf8(in.mid(at, len));
at += len;
@@ -76,20 +63,17 @@ static QString recordToDesc(const QDnsSd::Record &rec)
{
QString desc;
- if(rec.rrtype == 1) // A
+ if (rec.rrtype == 1) // A
{
quint32 *p = (quint32 *)rec.rdata.data();
- desc = QHostAddress(ntohl(*p)).toString();
- }
- else if(rec.rrtype == 28) // AAAA
+ desc = QHostAddress(ntohl(*p)).toString();
+ } else if (rec.rrtype == 28) // AAAA
{
desc = QHostAddress((quint8 *)rec.rdata.data()).toString();
- }
- else if(rec.rrtype == 12) // PTR
+ } else if (rec.rrtype == 12) // PTR
{
desc = QString("[%1]").arg(nameToString(rec.rdata));
- }
- else
+ } else
desc = QString("%1 bytes").arg(rec.rdata.size());
return desc;
@@ -98,11 +82,11 @@ static QString recordToDesc(const QDnsSd::Record &rec)
static QStringList txtRecordToStringList(const QByteArray &rdata)
{
QList txtEntries = QDnsSd::parseTxtRecord(rdata);
- if(txtEntries.isEmpty())
+ if (txtEntries.isEmpty())
return QStringList();
QStringList out;
- foreach(const QByteArray &entry, txtEntries)
+ foreach (const QByteArray &entry, txtEntries)
out += QString::fromUtf8(entry);
return out;
}
@@ -110,64 +94,56 @@ static QStringList txtRecordToStringList(const QByteArray &rdata)
static void printIndentedTxt(const QByteArray &txtRecord)
{
QStringList list = txtRecordToStringList(txtRecord);
- if(!list.isEmpty())
- {
- foreach(const QString &s, list)
+ if (!list.isEmpty()) {
+ foreach (const QString &s, list)
printf(" %s\n", qPrintable(s));
- }
- else
+ } else
printf(" (TXT parsing error)\n");
}
-class App : public QObject
-{
+class App : public QObject {
Q_OBJECT
public:
QList commands;
- QDnsSd *dns;
+ QDnsSd *dns;
App()
{
dns = new QDnsSd(this);
- connect(dns, SIGNAL(queryResult(int,QDnsSd::QueryResult)), SLOT(dns_queryResult(int,QDnsSd::QueryResult)));
- connect(dns, SIGNAL(browseResult(int,QDnsSd::BrowseResult)), SLOT(dns_browseResult(int,QDnsSd::BrowseResult)));
- connect(dns, SIGNAL(resolveResult(int,QDnsSd::ResolveResult)), SLOT(dns_resolveResult(int,QDnsSd::ResolveResult)));
- connect(dns, SIGNAL(regResult(int,QDnsSd::RegResult)), SLOT(dns_regResult(int,QDnsSd::RegResult)));
+ connect(dns, SIGNAL(queryResult(int, QDnsSd::QueryResult)), SLOT(dns_queryResult(int, QDnsSd::QueryResult)));
+ connect(dns, SIGNAL(browseResult(int, QDnsSd::BrowseResult)),
+ SLOT(dns_browseResult(int, QDnsSd::BrowseResult)));
+ connect(dns, SIGNAL(resolveResult(int, QDnsSd::ResolveResult)),
+ SLOT(dns_resolveResult(int, QDnsSd::ResolveResult)));
+ connect(dns, SIGNAL(regResult(int, QDnsSd::RegResult)), SLOT(dns_regResult(int, QDnsSd::RegResult)));
}
public slots:
void start()
{
- for(int n = 0; n < commands.count(); ++n)
- {
+ for (int n = 0; n < commands.count(); ++n) {
Command &c = commands[n];
c.id = n;
- if(c.type == Command::Query)
- {
+ if (c.type == Command::Query) {
printf("%2d: Query name=[%s], type=%d ...\n", c.id, qPrintable(c.name), c.rtype);
c.dnsId = dns->query(c.name.toUtf8(), c.rtype);
- }
- else if(c.type == Command::Browse)
- {
+ } else if (c.type == Command::Browse) {
printf("%2d: Browse type=[%s]", c.id, qPrintable(c.stype));
- if(!c.domain.isEmpty())
+ if (!c.domain.isEmpty())
printf(", domain=[%s]", qPrintable(c.domain));
printf(" ...\n");
c.dnsId = dns->browse(c.stype.toUtf8(), c.domain.toUtf8());
- }
- else if(c.type == Command::Resolve)
- {
- printf("%2d: Resolve name=[%s], type=[%s], domain=[%s] ...\n", c.id, qPrintable(c.name), qPrintable(c.stype), qPrintable(c.domain));
+ } else if (c.type == Command::Resolve) {
+ printf("%2d: Resolve name=[%s], type=[%s], domain=[%s] ...\n", c.id, qPrintable(c.name),
+ qPrintable(c.stype), qPrintable(c.domain));
c.dnsId = dns->resolve(c.name.toUtf8(), c.stype.toUtf8(), c.domain.toUtf8());
- }
- else if(c.type == Command::Reg)
- {
+ } else if (c.type == Command::Reg) {
printf("%2d: Register name=[%s], type=[%s]", c.id, qPrintable(c.name), qPrintable(c.stype));
- if(!c.domain.isEmpty())
+ if (!c.domain.isEmpty())
printf(", domain=[%s]", qPrintable(c.domain));
printf(", port=%d ...\n", c.port);
- if(!c.txtRecord.isEmpty())
+ if (!c.txtRecord.isEmpty())
printIndentedTxt(c.txtRecord);
c.dnsId = dns->reg(c.name.toUtf8(), c.stype.toUtf8(), c.domain.toUtf8(), c.port, c.txtRecord);
@@ -181,10 +157,9 @@ public slots:
private:
int cmdIdToCmdIndex(int cmdId)
{
- for(int n = 0; n < commands.count(); ++n)
- {
+ for (int n = 0; n < commands.count(); ++n) {
const Command &c = commands[n];
- if(c.id == cmdId)
+ if (c.id == cmdId)
return n;
}
return -1;
@@ -192,10 +167,9 @@ public slots:
int dnsIdToCmdIndex(int dnsId)
{
- for(int n = 0; n < commands.count(); ++n)
- {
+ for (int n = 0; n < commands.count(); ++n) {
const Command &c = commands[n];
- if(c.dnsId == dnsId)
+ if (c.dnsId == dnsId)
return n;
}
return -1;
@@ -205,29 +179,27 @@ public slots:
{
// quit if there are nothing but errors or completed resolves
bool doQuit = true;
- foreach(const Command &c, commands)
- {
- if(c.error || (c.type == Command::Resolve && c.done))
+ foreach (const Command &c, commands) {
+ if (c.error || (c.type == Command::Resolve && c.done))
continue;
doQuit = false;
break;
}
- if(doQuit)
+ if (doQuit)
emit quit();
}
private slots:
void dns_queryResult(int id, const QDnsSd::QueryResult &result)
{
- int at = dnsIdToCmdIndex(id);
- Command &c = commands[at];
+ int at = dnsIdToCmdIndex(id);
+ Command &c = commands[at];
- if(!result.success)
- {
+ if (!result.success) {
printf("%2d: Error.", c.id);
- if(!result.lowLevelError.func.isEmpty())
+ if (!result.lowLevelError.func.isEmpty())
printf(" (%s, %d)", qPrintable(result.lowLevelError.func), result.lowLevelError.code);
printf("\n");
c.error = true;
@@ -235,28 +207,24 @@ private slots:
return;
}
- foreach(const QDnsSd::Record &rec, result.records)
- {
- if(rec.added)
- {
+ foreach (const QDnsSd::Record &rec, result.records) {
+ if (rec.added) {
printf("%2d: Added: %s, ttl=%u\n", c.id, qPrintable(recordToDesc(rec)), rec.ttl);
- if(rec.rrtype == 16)
+ if (rec.rrtype == 16)
printIndentedTxt(rec.rdata);
- }
- else
+ } else
printf("%2d: Removed: %s, ttl=%u\n", c.id, qPrintable(recordToDesc(rec)), rec.ttl);
}
}
void dns_browseResult(int id, const QDnsSd::BrowseResult &result)
{
- int at = dnsIdToCmdIndex(id);
- Command &c = commands[at];
+ int at = dnsIdToCmdIndex(id);
+ Command &c = commands[at];
- if(!result.success)
- {
+ if (!result.success) {
printf("%2d: Error.", c.id);
- if(!result.lowLevelError.func.isEmpty())
+ if (!result.lowLevelError.func.isEmpty())
printf(" (%s, %d)", qPrintable(result.lowLevelError.func), result.lowLevelError.code);
printf("\n");
c.error = true;
@@ -264,10 +232,10 @@ private slots:
return;
}
- foreach(const QDnsSd::BrowseEntry &e, result.entries)
- {
- if(e.added)
- printf("%2d: Added: [%s] [%s] [%s]\n", c.id, qPrintable(QString::fromUtf8(e.serviceName)), qPrintable(QString::fromUtf8(e.serviceType)), qPrintable(QString::fromUtf8(e.replyDomain)));
+ foreach (const QDnsSd::BrowseEntry &e, result.entries) {
+ if (e.added)
+ printf("%2d: Added: [%s] [%s] [%s]\n", c.id, qPrintable(QString::fromUtf8(e.serviceName)),
+ qPrintable(QString::fromUtf8(e.serviceType)), qPrintable(QString::fromUtf8(e.replyDomain)));
else
printf("%2d: Removed: [%s]\n", c.id, qPrintable(QString::fromUtf8(e.serviceName)));
}
@@ -275,13 +243,12 @@ private slots:
void dns_resolveResult(int id, const QDnsSd::ResolveResult &result)
{
- int at = dnsIdToCmdIndex(id);
- Command &c = commands[at];
+ int at = dnsIdToCmdIndex(id);
+ Command &c = commands[at];
- if(!result.success)
- {
+ if (!result.success) {
printf("%2d: Error.", c.id);
- if(!result.lowLevelError.func.isEmpty())
+ if (!result.lowLevelError.func.isEmpty())
printf(" (%s, %d)", qPrintable(result.lowLevelError.func), result.lowLevelError.code);
printf("\n");
c.error = true;
@@ -290,7 +257,7 @@ private slots:
}
printf("%2d: Result: host=[%s] port=%d\n", c.id, qPrintable(QString::fromUtf8(result.hostTarget)), result.port);
- if(!result.txtRecord.isEmpty())
+ if (!result.txtRecord.isEmpty())
printIndentedTxt(result.txtRecord);
c.done = true;
@@ -299,18 +266,17 @@ private slots:
void dns_regResult(int id, const QDnsSd::RegResult &result)
{
- int at = dnsIdToCmdIndex(id);
- Command &c = commands[at];
+ int at = dnsIdToCmdIndex(id);
+ Command &c = commands[at];
- if(!result.success)
- {
+ if (!result.success) {
QString errstr;
- if(result.errorCode == QDnsSd::RegResult::ErrorConflict)
+ if (result.errorCode == QDnsSd::RegResult::ErrorConflict)
errstr = "Conflict";
else
errstr = "Generic";
printf("%2d: Error (%s).", c.id, qPrintable(errstr));
- if(!result.lowLevelError.func.isEmpty())
+ if (!result.lowLevelError.func.isEmpty())
printf(" (%s, %d)", qPrintable(result.lowLevelError.func), result.lowLevelError.code);
printf("\n");
c.error = true;
@@ -343,8 +309,7 @@ int main(int argc, char **argv)
QStringList args = qapp.arguments();
args.removeFirst();
- if(args.count() < 1)
- {
+ if (args.count() < 1) {
usage();
return 1;
}
@@ -352,35 +317,28 @@ int main(int argc, char **argv)
// options
QStringList txt;
- for(int n = 0; n < args.count(); ++n)
- {
+ for (int n = 0; n < args.count(); ++n) {
QString s = args[n];
- if(!s.startsWith("--"))
+ if (!s.startsWith("--"))
continue;
QString var;
QString val;
- int x = s.indexOf('=');
- if(x != -1)
- {
+ int x = s.indexOf('=');
+ if (x != -1) {
var = s.mid(2, x - 2);
val = s.mid(x + 1);
- }
- else
- {
+ } else {
var = s.mid(2);
}
bool known = true;
- if(var == "txt")
- {
+ if (var == "txt") {
txt = val.split(',');
- }
- else
+ } else
known = false;
- if(known)
- {
+ if (known) {
args.removeAt(n);
--n; // adjust position
}
@@ -389,89 +347,74 @@ int main(int argc, char **argv)
// commands
QList commands;
- for(int n = 0; n < args.count(); ++n)
- {
+ for (int n = 0; n < args.count(); ++n) {
QString str = args[n];
- int n = str.indexOf('=');
- if(n == -1)
- {
+ int n = str.indexOf('=');
+ if (n == -1) {
printf("Error: bad format of command.\n");
return 1;
}
- QString type = str.mid(0, n);
- QString rest = str.mid(n + 1);
+ QString type = str.mid(0, n);
+ QString rest = str.mid(n + 1);
QStringList parts = rest.split(',');
- if(type == "q")
- {
- if(parts.count() < 2)
- {
+ if (type == "q") {
+ if (parts.count() < 2) {
usage();
return 1;
}
Command c;
- c.type = Command::Query;
- c.name = parts[0];
+ c.type = Command::Query;
+ c.name = parts[0];
c.rtype = parts[1].toInt();
commands += c;
- }
- else if(type == "b")
- {
- if(parts.count() < 1)
- {
+ } else if (type == "b") {
+ if (parts.count() < 1) {
usage();
return 1;
}
Command c;
- c.type = Command::Browse;
+ c.type = Command::Browse;
c.stype = parts[0];
- if(parts.count() >= 2)
+ if (parts.count() >= 2)
c.domain = parts[1];
commands += c;
- }
- else if(type == "r")
- {
- if(parts.count() < 3)
- {
+ } else if (type == "r") {
+ if (parts.count() < 3) {
usage();
return 1;
}
Command c;
- c.type = Command::Resolve;
- c.name = parts[0];
- c.stype = parts[1];
+ c.type = Command::Resolve;
+ c.name = parts[0];
+ c.stype = parts[1];
c.domain = parts[2];
commands += c;
- }
- else if(type == "e")
- {
- if(parts.count() < 3)
- {
+ } else if (type == "e") {
+ if (parts.count() < 3) {
usage();
return 1;
}
Command c;
- c.type = Command::Reg;
- c.name = parts[0];
+ c.type = Command::Reg;
+ c.name = parts[0];
c.stype = parts[1];
- c.port = parts[2].toInt();
- if(parts.count() >= 4)
+ c.port = parts[2].toInt();
+ if (parts.count() >= 4)
c.domain = parts[3];
- if(!txt.isEmpty())
- {
+ if (!txt.isEmpty()) {
QList strings;
- foreach(const QString &str, txt)
+ foreach (const QString &str, txt)
strings += str.toUtf8();
QByteArray txtRecord = QDnsSd::createTxtRecord(strings);
- if(txtRecord.isEmpty())
- {
+ if (txtRecord.isEmpty()) {
printf("Error: failed to create TXT record, input too large or invalid\n");
return 1;
}
@@ -480,9 +423,7 @@ int main(int argc, char **argv)
}
commands += c;
- }
- else
- {
+ } else {
printf("Error: unknown command type '%s'.\n", qPrintable(type));
return 1;
}
diff --git a/src/irisnet/appledns/sdtest.pro b/src/irisnet/appledns/sdtest.pro
deleted file mode 100644
index 0f914347..00000000
--- a/src/irisnet/appledns/sdtest.pro
+++ /dev/null
@@ -1,9 +0,0 @@
-CONFIG += console
-CONFIG -= app_bundle
-QT -= gui
-QT += network
-
-HEADERS += qdnssd.h
-SOURCES += qdnssd.cpp sdtest.cpp
-
-!mac:LIBS += -ldns_sd
diff --git a/src/irisnet/corelib/addressresolver.cpp b/src/irisnet/corelib/addressresolver.cpp
index 33a54578..98c4e961 100644
--- a/src/irisnet/corelib/addressresolver.cpp
+++ b/src/irisnet/corelib/addressresolver.cpp
@@ -18,39 +18,28 @@
#include "addressresolver.h"
-#include "objectsession.h"
#include "netnames.h"
+#include "objectsession.h"
namespace XMPP {
-
-class AddressResolver::Private : public QObject
-{
+class AddressResolver::Private : public QObject {
Q_OBJECT
public:
- enum State
- {
- AddressWait,
- AddressFirstCome
- };
-
- AddressResolver *q;
- ObjectSession sess;
- State state;
- NameResolver req6;
- NameResolver req4;
- bool done6;
- bool done4;
+ enum State { AddressWait, AddressFirstCome };
+
+ AddressResolver *q;
+ ObjectSession sess;
+ State state;
+ NameResolver req6;
+ NameResolver req4;
+ bool done6;
+ bool done4;
QList addrs6;
QList addrs4;
- QTimer *opTimer;
-
- Private(AddressResolver *_q) :
- QObject(_q),
- q(_q),
- sess(this),
- req6(this),
- req4(this)
+ QTimer *opTimer;
+
+ Private(AddressResolver *_q) : QObject(_q), q(_q), sess(this), req6(this), req4(this)
{
connect(&req6, SIGNAL(resultsReady(QList)), SLOT(req6_resultsReady(QList)));
connect(&req6, SIGNAL(error(XMPP::NameResolver::Error)), SLOT(req6_error(XMPP::NameResolver::Error)));
@@ -66,7 +55,7 @@ class AddressResolver::Private : public QObject
~Private()
{
opTimer->disconnect(this);
- opTimer->setParent(0);
+ opTimer->setParent(nullptr);
opTimer->deleteLater();
}
@@ -76,12 +65,11 @@ class AddressResolver::Private : public QObject
// was an IP address used as input?
QHostAddress addr;
- if(addr.setAddress(QString::fromLatin1(hostName)))
- {
+ if (addr.setAddress(QString::fromLatin1(hostName))) {
// use this as the result, no need to perform dns query
done6 = true;
done4 = true;
- if(addr.protocol() == QAbstractSocket::IPv6Protocol)
+ if (addr.protocol() == QAbstractSocket::IPv6Protocol)
addrs6 += addr;
else
addrs4 += addr;
@@ -101,10 +89,7 @@ class AddressResolver::Private : public QObject
req4.start(hostName, NameRecord::A);
}
- void stop()
- {
- cleanup();
- }
+ void stop() { cleanup(); }
private:
void cleanup()
@@ -121,12 +106,11 @@ class AddressResolver::Private : public QObject
bool tryDone()
{
- if((done6 && done4) || (state == AddressFirstCome && (done6 || done4)))
- {
+ if ((done6 && done4) || (state == AddressFirstCome && (done6 || done4))) {
QList results = addrs6 + addrs4;
cleanup();
- if(!results.isEmpty())
+ if (!results.isEmpty())
emit q->resultsReady(results);
else
emit q->error(ErrorGeneric);
@@ -140,7 +124,7 @@ class AddressResolver::Private : public QObject
private slots:
void req6_resultsReady(const QList &results)
{
- foreach(const NameRecord &rec, results)
+ for (const NameRecord &rec : results)
addrs6 += rec.address();
done6 = true;
@@ -157,7 +141,7 @@ private slots:
void req4_resultsReady(const QList &results)
{
- foreach(const NameRecord &rec, results)
+ for (const NameRecord &rec : results)
addrs4 += rec.address();
done4 = true;
@@ -176,37 +160,21 @@ private slots:
{
state = AddressFirstCome;
- if(done6 || done4)
+ if (done6 || done4)
tryDone();
}
- void ipAddress_input()
- {
- tryDone();
- }
+ void ipAddress_input() { tryDone(); }
};
-AddressResolver::AddressResolver(QObject *parent) :
- QObject(parent)
-{
- d = new Private(this);
-}
+AddressResolver::AddressResolver(QObject *parent) : QObject(parent) { d = new Private(this); }
-AddressResolver::~AddressResolver()
-{
- delete d;
-}
+AddressResolver::~AddressResolver() { delete d; }
-void AddressResolver::start(const QByteArray &hostName)
-{
- d->start(hostName);
-}
+void AddressResolver::start(const QByteArray &hostName) { d->start(hostName); }
-void AddressResolver::stop()
-{
- d->stop();
-}
+void AddressResolver::stop() { d->stop(); }
-}
+} // namespace XMPP
#include "addressresolver.moc"
diff --git a/src/irisnet/corelib/addressresolver.h b/src/irisnet/corelib/addressresolver.h
index c4186b79..417574af 100644
--- a/src/irisnet/corelib/addressresolver.h
+++ b/src/irisnet/corelib/addressresolver.h
@@ -19,23 +19,18 @@
#ifndef ADDRESSRESOLVER_H
#define ADDRESSRESOLVER_H
-#include
#include
+#include
namespace XMPP {
-
// resolve both AAAA and A for a hostname
-class AddressResolver : public QObject
-{
+class AddressResolver : public QObject {
Q_OBJECT
public:
- enum Error
- {
- ErrorGeneric
- };
+ enum Error { ErrorGeneric };
- AddressResolver(QObject *parent = 0);
+ AddressResolver(QObject *parent = nullptr);
~AddressResolver();
void start(const QByteArray &hostName);
@@ -50,7 +45,6 @@ class AddressResolver : public QObject
friend class Private;
Private *d;
};
+} // namespace XMPP
-}
-
-#endif
+#endif // ADDRESSRESOLVER_H
diff --git a/src/irisnet/corelib/corelib.pri b/src/irisnet/corelib/corelib.pri
deleted file mode 100644
index 60a2ef44..00000000
--- a/src/irisnet/corelib/corelib.pri
+++ /dev/null
@@ -1,48 +0,0 @@
-QT *= network
-
-HEADERS += \
- $$PWD/objectsession.h \
- $$PWD/irisnetexport.h \
- $$PWD/irisnetplugin.h \
- $$PWD/irisnetglobal.h \
- $$PWD/irisnetglobal_p.h \
- $$PWD/netinterface.h \
- $$PWD/netavailability.h \
- $$PWD/netnames.h \
- $$PWD/addressresolver.h
-
-SOURCES += \
- $$PWD/objectsession.cpp \
- $$PWD/irisnetplugin.cpp \
- $$PWD/irisnetglobal.cpp \
- $$PWD/netinterface.cpp \
- $$PWD/netinterface_qtnet.cpp \
- $$PWD/netavailability.cpp \
- $$PWD/netnames.cpp \
- $$PWD/addressresolver.cpp
-
-unix {
- SOURCES += \
- $$PWD/netinterface_unix.cpp
-}
-
-need_jdns|lessThan(QT_MAJOR_VERSION, 5) {
- !ext-qjdns {
- include(../../jdns/jdns.pri)
- INCLUDEPATH += $$PWD/../../jdns
- }
-
- SOURCES += \
- $$PWD/netnames_jdns.cpp
-
- DEFINES += NEED_JDNS
-} else {
- SOURCES += $$PWD/netinterface_qtname.cpp \
-}
-
-#include(legacy/legacy.pri)
-
-appledns:appledns_bundle {
- DEFINES += APPLEDNS_STATIC
- include(../appledns/appledns.pri)
-}
diff --git a/src/irisnet/corelib/corelib.pro b/src/irisnet/corelib/corelib.pro
deleted file mode 100644
index 1df24aaa..00000000
--- a/src/irisnet/corelib/corelib.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-IRIS_BASE = ../../..
-
-TEMPLATE = lib
-QT -= gui
-TARGET = irisnetcore
-DESTDIR = $$IRIS_BASE/lib
-windows:DLLDESTDIR = $$IRIS_BASE/bin
-
-VERSION = 1.0.0
-
-include(../../libbase.pri)
-include(corelib.pri)
-
-# fixme: irisnetcore builds as dll or bundled, never static?
-CONFIG += create_prl
-windows:!staticlib:DEFINES += IRISNET_MAKEDLL
-staticlib:PRL_EXPORT_DEFINES += IRISNET_STATIC
diff --git a/src/irisnet/corelib/irisnetexport.h b/src/irisnet/corelib/irisnetexport.h
index 55f2226b..0e07278b 100644
--- a/src/irisnet/corelib/irisnetexport.h
+++ b/src/irisnet/corelib/irisnetexport.h
@@ -22,13 +22,13 @@
#include
#ifdef IRISNET_STATIC
-# define IRISNET_EXPORT
+#define IRISNET_EXPORT
#else
-# ifdef IRISNET_MAKEDLL
-# define IRISNET_EXPORT Q_DECL_EXPORT
-# else
-# define IRISNET_EXPORT Q_DECL_IMPORT
-# endif
+#ifdef IRISNET_MAKEDLL
+#define IRISNET_EXPORT Q_DECL_EXPORT
+#else
+#define IRISNET_EXPORT Q_DECL_IMPORT
#endif
-
#endif
+
+#endif // IRISNETEXPORT_H
diff --git a/src/irisnet/corelib/irisnetglobal.cpp b/src/irisnet/corelib/irisnetglobal.cpp
index baee4c95..91ebf346 100644
--- a/src/irisnet/corelib/irisnetglobal.cpp
+++ b/src/irisnet/corelib/irisnetglobal.cpp
@@ -16,14 +16,14 @@
*
*/
-#include "irisnetglobal_p.h"
-
+#include "corelib/irisnetglobal_p.h"
#include "irisnetplugin.h"
namespace XMPP {
-
// built-in providers
+#ifdef HAVE_QTNET
extern IrisNetProvider *irisnet_createQtNetProvider();
+#endif
#ifdef Q_OS_UNIX
extern IrisNetProvider *irisnet_createUnixNetProvider();
#endif
@@ -39,65 +39,59 @@ extern IrisNetProvider *irisnet_createAppleProvider();
//----------------------------------------------------------------------------
// internal
//----------------------------------------------------------------------------
-class PluginInstance
-{
+class PluginInstance {
private:
- QPluginLoader *_loader;
- QObject *_instance;
- bool _ownInstance;
+ QPluginLoader *_loader = nullptr;
+ QObject *_instance = nullptr;
+ bool _ownInstance = false;
- PluginInstance()
- {
- }
+ PluginInstance() { }
public:
static PluginInstance *fromFile(const QString &fname)
{
QPluginLoader *loader = new QPluginLoader(fname);
- if(!loader->load())
- {
+ if (!loader->load()) {
delete loader;
- return 0;
+ return nullptr;
}
QObject *obj = loader->instance();
- if(!obj)
- {
+ if (!obj) {
loader->unload();
delete loader;
- return 0;
+ return nullptr;
}
PluginInstance *i = new PluginInstance;
- i->_loader = loader;
- i->_instance = obj;
- i->_ownInstance = true;
+ i->_loader = loader;
+ i->_instance = obj;
+ i->_ownInstance = true;
return i;
}
static PluginInstance *fromStatic(QObject *obj)
{
PluginInstance *i = new PluginInstance;
- i->_loader = 0;
- i->_instance = obj;
- i->_ownInstance = false;
+ i->_loader = nullptr;
+ i->_instance = obj;
+ i->_ownInstance = false;
return i;
}
static PluginInstance *fromInstance(QObject *obj)
{
PluginInstance *i = new PluginInstance;
- i->_loader = 0;
- i->_instance = obj;
- i->_ownInstance = true;
+ i->_loader = nullptr;
+ i->_instance = obj;
+ i->_ownInstance = true;
return i;
}
~PluginInstance()
{
- if(_ownInstance)
+ if (_ownInstance)
delete _instance;
- if(_loader)
- {
+ if (_loader) {
_loader->unload();
delete _loader;
}
@@ -105,64 +99,50 @@ class PluginInstance
void claim()
{
- if(_loader)
+ if (_loader)
_loader->moveToThread(0);
- if(_ownInstance)
- _instance->moveToThread(0);
+ if (_ownInstance)
+ _instance->moveToThread(nullptr);
}
- QObject *instance()
- {
- return _instance;
- }
+ QObject *instance() { return _instance; }
bool sameType(const PluginInstance *other)
{
- if(!_instance || !other->_instance)
- return false;
-
- if(qstrcmp(_instance->metaObject()->className(), other->_instance->metaObject()->className()) != 0)
+ if (!_instance || !other->_instance)
return false;
- return true;
+ return qstrcmp(_instance->metaObject()->className(), other->_instance->metaObject()->className()) == 0;
}
};
-class PluginManager
-{
+class PluginManager {
public:
- bool builtin_done;
- QStringList paths;
- QList plugins;
- QList providers;
+ bool builtin_done;
+ QStringList paths;
+ QList plugins;
+ QList providers;
- PluginManager()
- {
- builtin_done = false;
- }
+ PluginManager() { builtin_done = false; }
- ~PluginManager()
- {
- unload();
- }
+ ~PluginManager() { unload(); }
bool tryAdd(PluginInstance *i, bool lowPriority = false)
{
// is it the right kind of plugin?
- IrisNetProvider *p = qobject_cast(i->instance());
- if(!p)
+ IrisNetProvider *p = qobject_cast(i->instance());
+ if (!p)
return false;
// make sure we don't have it already
- for(int n = 0; n < plugins.count(); ++n)
- {
- if(i->sameType(plugins[n]))
+ for (int n = 0; n < plugins.count(); ++n) {
+ if (i->sameType(plugins[n]))
return false;
}
i->claim();
plugins += i;
- if(lowPriority)
+ if (lowPriority)
providers.append(p);
else
providers.prepend(p);
@@ -172,15 +152,16 @@ class PluginManager
void addBuiltIn(IrisNetProvider *p)
{
PluginInstance *i = PluginInstance::fromInstance(p);
- if(!tryAdd(i, true))
+ if (!tryAdd(i, true))
delete i;
}
void scan()
{
- if(!builtin_done)
- {
+ if (!builtin_done) {
+#ifdef HAVE_QTNET
addBuiltIn(irisnet_createQtNetProvider()); // interfaces. crossplatform. no need to reimplement
+#endif
#ifdef Q_OS_UNIX
addBuiltIn(irisnet_createUnixNetProvider()); // gateways
#endif
@@ -193,30 +174,27 @@ class PluginManager
}
QObjectList list = QPluginLoader::staticInstances();
- for(int n = 0; n < list.count(); ++n)
- {
+ for (int n = 0; n < list.count(); ++n) {
PluginInstance *i = PluginInstance::fromStatic(list[n]);
- if(!tryAdd(i))
+ if (!tryAdd(i))
delete i;
}
- for(int n = 0; n < paths.count(); ++n)
- {
+ for (int n = 0; n < paths.count(); ++n) {
QDir dir(paths[n]);
- if(!dir.exists())
+ if (!dir.exists())
continue;
QStringList entries = dir.entryList();
- for(int k = 0; k < entries.count(); ++k)
- {
+ for (int k = 0; k < entries.count(); ++k) {
QFileInfo fi(dir.filePath(entries[k]));
- if(!fi.exists())
+ if (!fi.exists())
continue;
- QString fname = fi.filePath();
- PluginInstance *i = PluginInstance::fromFile(fname);
- if(!i)
+ QString fname = fi.filePath();
+ PluginInstance *i = PluginInstance::fromFile(fname);
+ if (!i)
continue;
- if(!tryAdd(i))
+ if (!tryAdd(i))
delete i;
}
}
@@ -225,8 +203,8 @@ class PluginManager
void unload()
{
// unload in reverse order
- QList revlist;
- for(int n = 0; n < plugins.count(); ++n)
+ QList revlist;
+ for (int n = 0; n < plugins.count(); ++n)
revlist.prepend(plugins[n]);
qDeleteAll(revlist);
@@ -235,39 +213,39 @@ class PluginManager
}
};
-class IrisNetGlobal
-{
+class IrisNetGlobal {
public:
- QMutex m;
- PluginManager pluginManager;
+ QMutex m;
+ PluginManager pluginManager;
QList cleanupList;
};
Q_GLOBAL_STATIC(QMutex, global_mutex)
-static IrisNetGlobal *global = 0;
+static IrisNetGlobal *global = nullptr;
static void deinit();
static void init()
{
QMutexLocker locker(global_mutex());
- if(global)
+ if (global)
return;
+ qRegisterMetaType("QHostAddress");
global = new IrisNetGlobal;
qAddPostRoutine(deinit);
}
void deinit()
{
- if(!global)
+ if (!global)
return;
- while(!global->cleanupList.isEmpty())
+ while (!global->cleanupList.isEmpty())
(global->cleanupList.takeFirst())();
delete global;
- global = 0;
+ global = nullptr;
}
//----------------------------------------------------------------------------
@@ -295,7 +273,7 @@ void irisNetAddPostRoutine(IrisNetCleanUpFunction func)
global->cleanupList.prepend(func);
}
-QList irisNetProviders()
+QList irisNetProviders()
{
init();
@@ -304,4 +282,4 @@ QList irisNetProviders()
return global->pluginManager.providers;
}
-}
+} // namespace XMPP
diff --git a/src/irisnet/corelib/irisnetglobal.h b/src/irisnet/corelib/irisnetglobal.h
index 9aae0198..8d62337e 100644
--- a/src/irisnet/corelib/irisnetglobal.h
+++ b/src/irisnet/corelib/irisnetglobal.h
@@ -19,19 +19,17 @@
#ifndef IRISNETGLOBAL_H
#define IRISNETGLOBAL_H
+#include "irisnetexport.h"
+
#include
#include
-#include "irisnetexport.h"
namespace XMPP {
-
// set the directories for plugins. call before doing anything else.
IRISNET_EXPORT void irisNetSetPluginPaths(const QStringList &paths);
-
// free any shared data and plugins.
// note: this is automatically called when qapp shuts down.
IRISNET_EXPORT void irisNetCleanup();
+} // namespace XMPP
-}
-
-#endif
+#endif // IRISNETGLOBAL_H
diff --git a/src/irisnet/corelib/irisnetglobal_p.h b/src/irisnet/corelib/irisnetglobal_p.h
index 4b9d070e..0ff31856 100644
--- a/src/irisnet/corelib/irisnetglobal_p.h
+++ b/src/irisnet/corelib/irisnetglobal_p.h
@@ -23,12 +23,10 @@
#include "irisnetplugin.h"
namespace XMPP {
-
typedef void (*IrisNetCleanUpFunction)();
IRISNET_EXPORT void irisNetAddPostRoutine(IrisNetCleanUpFunction func);
-IRISNET_EXPORT QList irisNetProviders();
-
-}
+IRISNET_EXPORT QList irisNetProviders();
+} // namespace XMPP
-#endif
+#endif // IRISNETGLOBAL_P_H
diff --git a/src/irisnet/corelib/irisnetplugin.cpp b/src/irisnet/corelib/irisnetplugin.cpp
index fb7b8754..a2d24fe7 100644
--- a/src/irisnet/corelib/irisnetplugin.cpp
+++ b/src/irisnet/corelib/irisnetplugin.cpp
@@ -19,52 +19,27 @@
#include "irisnetplugin.h"
namespace XMPP {
-
//----------------------------------------------------------------------------
// IrisNetProvider
//----------------------------------------------------------------------------
-NetInterfaceProvider *IrisNetProvider::createNetInterfaceProvider()
-{
- return 0;
-}
+NetInterfaceProvider *IrisNetProvider::createNetInterfaceProvider() { return nullptr; }
-NetGatewayProvider *IrisNetProvider::createNetGatewayProvider()
-{
- return 0;
-}
+NetGatewayProvider *IrisNetProvider::createNetGatewayProvider() { return nullptr; }
-NetAvailabilityProvider *IrisNetProvider::createNetAvailabilityProvider()
-{
- return 0;
-}
+NetAvailabilityProvider *IrisNetProvider::createNetAvailabilityProvider() { return nullptr; }
-NameProvider *IrisNetProvider::createNameProviderInternet()
-{
- return 0;
-}
+NameProvider *IrisNetProvider::createNameProviderInternet() { return nullptr; }
-NameProvider *IrisNetProvider::createNameProviderLocal()
-{
- return 0;
-}
+NameProvider *IrisNetProvider::createNameProviderLocal() { return nullptr; }
-ServiceProvider *IrisNetProvider::createServiceProvider()
-{
- return 0;
-}
+ServiceProvider *IrisNetProvider::createServiceProvider() { return nullptr; }
//----------------------------------------------------------------------------
// NameProvider
//----------------------------------------------------------------------------
-bool NameProvider::supportsSingle() const
-{
- return false;
-}
+bool NameProvider::supportsSingle() const { return false; }
-bool NameProvider::supportsLongLived() const
-{
- return false;
-}
+bool NameProvider::supportsLongLived() const { return false; }
bool NameProvider::supportsRecordType(int type) const
{
@@ -84,4 +59,4 @@ void NameProvider::resolve_localError(int id, XMPP::NameResolver::Error e)
Q_UNUSED(e);
}
-}
+} // namespace XMPP
diff --git a/src/irisnet/corelib/irisnetplugin.h b/src/irisnet/corelib/irisnetplugin.h
index 88fad7f1..67941a47 100644
--- a/src/irisnet/corelib/irisnetplugin.h
+++ b/src/irisnet/corelib/irisnetplugin.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006,2008 Justin Karneges
+ * Copyright (C) 2006-2008 Justin Karneges
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,119 +20,99 @@
#define IRISNETPLUGIN_H
#include "irisnetglobal.h"
-#include "netinterface.h"
#include "netavailability.h"
+#include "netinterface.h"
#include "netnames.h"
namespace XMPP {
-
-class NetInterfaceProvider;
-class NetGatewayProvider;
-class NetAvailabilityProvider;
class NameProvider;
+class NetAvailabilityProvider;
+class NetGatewayProvider;
+class NetInterfaceProvider;
class ServiceProvider;
-class IRISNET_EXPORT IrisNetProvider : public QObject
-{
+class IRISNET_EXPORT IrisNetProvider : public QObject {
Q_OBJECT
public:
- virtual NetInterfaceProvider *createNetInterfaceProvider();
- virtual NetGatewayProvider *createNetGatewayProvider();
+ virtual NetInterfaceProvider *createNetInterfaceProvider();
+ virtual NetGatewayProvider *createNetGatewayProvider();
virtual NetAvailabilityProvider *createNetAvailabilityProvider();
- virtual NameProvider *createNameProviderInternet();
- virtual NameProvider *createNameProviderLocal();
- virtual ServiceProvider *createServiceProvider();
+ virtual NameProvider *createNameProviderInternet();
+ virtual NameProvider *createNameProviderLocal();
+ virtual ServiceProvider *createServiceProvider();
};
-class IRISNET_EXPORT NetInterfaceProvider : public QObject
-{
+class IRISNET_EXPORT NetInterfaceProvider : public QObject {
Q_OBJECT
public:
- class Info
- {
+ class Info {
public:
- QString id, name;
- bool isLoopback;
+ QString id, name;
+ bool isLoopback;
QList addresses;
};
- NetInterfaceProvider(QObject *parent = 0) :
- QObject(parent)
- {
- }
+ NetInterfaceProvider(QObject *parent = nullptr) : QObject(parent) { }
// calling start should populate an initial list that can be
// immediately fetched. do not signal updated() for this.
- virtual void start() = 0;
+ virtual void start() = 0;
virtual QList interfaces() const = 0;
signals:
void updated();
};
-class IRISNET_EXPORT NetGatewayProvider : public QObject
-{
+class IRISNET_EXPORT NetGatewayProvider : public QObject {
Q_OBJECT
public:
- class Info
- {
+ class Info {
public:
- QString ifaceId;
+ QString ifaceId;
QHostAddress gateway;
};
- NetGatewayProvider(QObject *parent = 0) :
- QObject(parent)
- {
- }
+ NetGatewayProvider(QObject *parent = nullptr) : QObject(parent) { }
// calling start should populate an initial list that can be
// immediately fetched. do not signal updated() for this.
- virtual void start() = 0;
+ virtual void start() = 0;
virtual QList gateways() const = 0;
signals:
void updated();
};
-class IRISNET_EXPORT NetAvailabilityProvider : public QObject
-{
+class IRISNET_EXPORT NetAvailabilityProvider : public QObject {
Q_OBJECT
public:
- NetAvailabilityProvider(QObject *parent = 0) :
- QObject(parent)
- {
- }
+ NetAvailabilityProvider(QObject *parent = nullptr) : QObject(parent) { }
// calling start should populate an initial value that can be
// immediately fetched. do not signal updated() for this.
- virtual void start() = 0;
+ virtual void start() = 0;
virtual bool isAvailable() const = 0;
signals:
void updated();
};
-class IRISNET_EXPORT NameProvider : public QObject
-{
+class IRISNET_EXPORT NameProvider : public QObject {
Q_OBJECT
public:
- NameProvider(QObject *parent = 0) :
- QObject(parent)
- {
- }
+ NameProvider(QObject *parent = nullptr) : QObject(parent) { }
virtual bool supportsSingle() const;
virtual bool supportsLongLived() const;
virtual bool supportsRecordType(int type) const;
- virtual int resolve_start(const QByteArray &name, int qType, bool longLived) = 0;
- virtual void resolve_stop(int id) = 0;
+ virtual int resolve_start(const QByteArray &name, int qType, bool longLived) = 0;
+ virtual void resolve_stop(int id) = 0;
// transfer from local back to internet
virtual void resolve_localResultsReady(int id, const QList &results);
@@ -146,35 +126,32 @@ class IRISNET_EXPORT NameProvider : public QObject
void resolve_useLocal(int id, const QByteArray &name);
};
-class IRISNET_EXPORT ServiceProvider : public QObject
-{
+class IRISNET_EXPORT ServiceProvider : public QObject {
Q_OBJECT
public:
- class ResolveResult
- {
+ class ResolveResult {
public:
- QMap attributes;
- QHostAddress address;
- int port;
- QByteArray hostName; // optional
+ QMap attributes;
+ QHostAddress address;
+ int port;
+ QString hostName; // optional
};
- ServiceProvider(QObject *parent = 0) :
- QObject(parent)
- {
- }
-
- virtual int browse_start(const QString &type, const QString &domain) = 0;
- virtual void browse_stop(int id) = 0;
- virtual int resolve_start(const QByteArray &name) = 0;
- virtual void resolve_stop(int id) = 0;
- virtual int publish_start(const QString &instance, const QString &type, int port, const QMap &attributes) = 0;
- virtual void publish_update(int id, const QMap &attributes) = 0;
- virtual void publish_stop(int id) = 0;
- virtual int publish_extra_start(int pub_id, const NameRecord &name) = 0;
- virtual void publish_extra_update(int id, const NameRecord &name) = 0;
- virtual void publish_extra_stop(int id) = 0;
+ ServiceProvider(QObject *parent = nullptr) : QObject(parent) { }
+
+ virtual int browse_start(const QString &type, const QString &domain) = 0;
+ virtual void browse_stop(int id) = 0;
+ virtual int resolve_start(const QByteArray &name) = 0;
+ virtual void resolve_stop(int id) = 0;
+ virtual int publish_start(const QString &instance, const QString &type, int port,
+ const QMap &attributes)
+ = 0;
+ virtual void publish_update(int id, const QMap &attributes) = 0;
+ virtual void publish_stop(int id) = 0;
+ virtual int publish_extra_start(int pub_id, const NameRecord &name) = 0;
+ virtual void publish_extra_update(int id, const NameRecord &name) = 0;
+ virtual void publish_extra_stop(int id) = 0;
signals:
void browse_instanceAvailable(int id, const XMPP::ServiceInstance &instance);
@@ -191,13 +168,12 @@ class IRISNET_EXPORT ServiceProvider : public QObject
void publish_extra_published(int id);
void publish_extra_error(int id, XMPP::ServiceLocalPublisher::Error e);
};
+} // namespace XMPP
-}
-
-Q_DECLARE_INTERFACE(XMPP::NetGatewayProvider, "com.affinix.irisnet.IrisGatewayProvider/1.0")
-Q_DECLARE_INTERFACE(XMPP::IrisNetProvider, "com.affinix.irisnet.IrisNetProvider/1.0")
+Q_DECLARE_INTERFACE(XMPP::NetGatewayProvider, "com.affinix.irisnet.IrisGatewayProvider/1.0")
+Q_DECLARE_INTERFACE(XMPP::IrisNetProvider, "com.affinix.irisnet.IrisNetProvider/1.0")
Q_DECLARE_INTERFACE(XMPP::NetInterfaceProvider, "com.affinix.irisnet.NetInterfaceProvider/2.0")
-Q_DECLARE_INTERFACE(XMPP::NameProvider, "com.affinix.irisnet.NameProvider/1.0")
-Q_DECLARE_INTERFACE(XMPP::ServiceProvider, "com.affinix.irisnet.ServiceProvider/1.0")
+Q_DECLARE_INTERFACE(XMPP::NameProvider, "com.affinix.irisnet.NameProvider/1.0")
+Q_DECLARE_INTERFACE(XMPP::ServiceProvider, "com.affinix.irisnet.ServiceProvider/1.0")
-#endif
+#endif // IRISNETPLUGIN_H
diff --git a/src/irisnet/corelib/netavailability.cpp b/src/irisnet/corelib/netavailability.cpp
index 7c5db6ed..6ec68361 100644
--- a/src/irisnet/corelib/netavailability.cpp
+++ b/src/irisnet/corelib/netavailability.cpp
@@ -19,31 +19,18 @@
#include "netavailability.h"
namespace XMPP {
-
-class NetAvailability::Private : public QObject
-{
+class NetAvailability::Private : public QObject {
Q_OBJECT
public:
NetAvailability *q;
- Private(NetAvailability *_q) :
- QObject(_q),
- q(_q)
- {
- }
+ Private(NetAvailability *_q) : QObject(_q), q(_q) { }
};
-NetAvailability::NetAvailability(QObject *parent) :
- QObject(parent)
-{
- d = new Private(this);
-}
+NetAvailability::NetAvailability(QObject *parent) : QObject(parent) { d = new Private(this); }
-NetAvailability::~NetAvailability()
-{
- delete d;
-}
+NetAvailability::~NetAvailability() { delete d; }
bool NetAvailability::isAvailable() const
{
@@ -51,6 +38,6 @@ bool NetAvailability::isAvailable() const
return true;
}
-}
+} // namespace XMPP
#include "netavailability.moc"
diff --git a/src/irisnet/corelib/netavailability.h b/src/irisnet/corelib/netavailability.h
index a53c45bf..aa9da916 100644
--- a/src/irisnet/corelib/netavailability.h
+++ b/src/irisnet/corelib/netavailability.h
@@ -22,13 +22,11 @@
#include "irisnetglobal.h"
namespace XMPP {
-
-class NetAvailability : public QObject
-{
+class NetAvailability : public QObject {
Q_OBJECT
public:
- NetAvailability(QObject *parent = 0);
+ NetAvailability(QObject *parent = nullptr);
~NetAvailability();
bool isAvailable() const;
@@ -41,7 +39,6 @@ class NetAvailability : public QObject
friend class Private;
Private *d;
};
+} // namespace XMPP
-}
-
-#endif
+#endif // NETAVAILABILITY_H
diff --git a/src/irisnet/corelib/netinterface.cpp b/src/irisnet/corelib/netinterface.cpp
index a4459c50..0ceea7ed 100644
--- a/src/irisnet/corelib/netinterface.cpp
+++ b/src/irisnet/corelib/netinterface.cpp
@@ -18,34 +18,36 @@
#include "netinterface.h"
+#include "corelib/irisnetglobal_p.h"
#include "irisnetplugin.h"
-#include "irisnetglobal_p.h"
-#include
-#include
#include
+#include
+#include
namespace XMPP {
-
//----------------------------------------------------------------------------
// NetTracker
//----------------------------------------------------------------------------
class NetTracker : public QObject {
Q_OBJECT
public:
- QList getInterfaces() {
+ QList getInterfaces()
+ {
QMutexLocker locker(&m);
return info;
}
- NetTracker() {
- QList list = irisNetProviders();
+ NetTracker()
+ {
+ QList list = irisNetProviders();
- c = 0;
- foreach(IrisNetProvider* p, list) {
+ c = nullptr;
+ for (IrisNetProvider *p : list) {
c = p->createNetInterfaceProvider();
- if(c) break;
+ if (c)
+ break;
}
Q_ASSERT(c); // we have built-in support, so this should never fail
connect(c, SIGNAL(updated()), SLOT(c_updated()));
@@ -54,28 +56,29 @@ class NetTracker : public QObject {
info = filterList(c->interfaces());
}
- ~NetTracker() {
+ ~NetTracker()
+ {
QMutexLocker locker(&m);
delete c;
}
-
signals:
void updated();
-private:
-
- static QList filterList(const QList &in) {
+private:
+ static QList filterList(const QList &in)
+ {
QList out;
- for(int n = 0; n < in.count(); ++n)
- {
- if(!in[n].isLoopback) out += in[n];
+ for (int n = 0; n < in.count(); ++n) {
+ if (!in[n].isLoopback)
+ out += in[n];
}
return out;
}
private slots:
- void c_updated() {
+ void c_updated()
+ {
{
QMutexLocker locker(&m);
info = filterList(c->interfaces());
@@ -83,16 +86,13 @@ private slots:
emit updated();
}
-
private:
// this are all protected by m
- NetInterfaceProvider *c;
- QMutex m;
+ NetInterfaceProvider *c;
+ QMutex m;
QList info;
-
};
-
// Global because static getRef needs this too.
Q_GLOBAL_STATIC(QMutex, nettracker_mutex)
@@ -102,7 +102,8 @@ class NetTrackerThread : public QThread {
/** Get a reference to the NetTracker singleton.
Calls to getInterfaces will immediately give valid results
*/
- static NetTrackerThread* getRef() {
+ static NetTrackerThread *getRef()
+ {
QMutexLocker locker(nettracker_mutex());
if (!self) {
@@ -114,7 +115,8 @@ class NetTrackerThread : public QThread {
/** Release reference.
*/
- void releaseRef() {
+ void releaseRef()
+ {
QMutexLocker locker(nettracker_mutex());
Q_ASSERT(refs > 0);
@@ -123,24 +125,23 @@ class NetTrackerThread : public QThread {
exit(0);
wait();
delete this;
- self = 0;
+ self = nullptr;
}
}
- QList getInterfaces() {
- return nettracker->getInterfaces();
- }
-
+ QList getInterfaces() { return nettracker->getInterfaces(); }
- ~NetTrackerThread() {
+ ~NetTrackerThread()
+ {
// locked from caller
}
-
signals:
void updated();
+
private:
- NetTrackerThread() {
+ NetTrackerThread()
+ {
// locked from caller
refs = 0;
moveToThread(QCoreApplication::instance()->thread());
@@ -151,10 +152,11 @@ class NetTrackerThread : public QThread {
startCond.wait(startMutex); // wait for thread startup finished
}
delete startMutex;
- startMutex = 0;
+ startMutex = nullptr;
}
- void run() {
+ void run()
+ {
{
QMutexLocker locker(startMutex);
@@ -165,26 +167,24 @@ class NetTrackerThread : public QThread {
}
exec();
delete nettracker;
- nettracker = 0;
+ nettracker = nullptr;
}
private:
QWaitCondition startCond;
- QMutex *startMutex;
+ QMutex *startMutex = nullptr;
// these are all protected by global nettracker_mutex.
- int refs;
+ int refs = 0;
static NetTrackerThread *self;
- NetTracker *nettracker;
+ NetTracker *nettracker = nullptr;
};
-NetTrackerThread *NetTrackerThread::self = 0;
-
+NetTrackerThread *NetTrackerThread::self = nullptr;
//----------------------------------------------------------------------------
// NetInterface
//----------------------------------------------------------------------------
-class NetInterfacePrivate : public QObject
-{
+class NetInterfacePrivate : public QObject {
Q_OBJECT
public:
friend class NetInterfaceManagerPrivate;
@@ -192,36 +192,34 @@ class NetInterfacePrivate : public QObject
NetInterface *q;
QPointer man;
- bool valid;
- QString id, name;
- QList addrs;
+ bool valid;
+ QString id, name;
+ QList addrs;
- NetInterfacePrivate(NetInterface *_q) : QObject(_q), q(_q)
- {
- valid = false;
- }
+ NetInterfacePrivate(NetInterface *_q) : QObject(_q), q(_q) { valid = false; }
void doUnavailable()
{
- if (!valid) return;
+ if (!valid)
+ return;
valid = false;
- if (man.isNull()) return;
+ if (man.isNull())
+ return;
man->unreg(q);
emit q->unavailable();
}
};
-NetInterface::NetInterface(const QString &id, NetInterfaceManager *manager)
- : QObject(manager)
+NetInterface::NetInterface(const QString &id, NetInterfaceManager *manager) : QObject(manager)
{
- d = new NetInterfacePrivate(this);
+ d = new NetInterfacePrivate(this);
d->man = manager;
NetInterfaceProvider::Info *info = (NetInterfaceProvider::Info *)d->man->reg(id, this);
if (info) {
d->valid = true;
- d->id = info->id;
- d->name = info->name;
+ d->id = info->id;
+ d->name = info->name;
d->addrs = info->addresses;
delete info;
}
@@ -229,42 +227,30 @@ NetInterface::NetInterface(const QString &id, NetInterfaceManager *manager)
NetInterface::~NetInterface()
{
- if (d->valid && !d->man.isNull()) d->man->unreg(this);
+ if (d->valid && !d->man.isNull())
+ d->man->unreg(this);
delete d;
}
-bool NetInterface::isValid() const
-{
- return d->valid && !d->man.isNull();
-}
+bool NetInterface::isValid() const { return d->valid && !d->man.isNull(); }
-QString NetInterface::id() const
-{
- return d->id;
-}
+QString NetInterface::id() const { return d->id; }
-QString NetInterface::name() const
-{
- return d->name;
-}
+QString NetInterface::name() const { return d->name; }
-QList NetInterface::addresses() const
-{
- return d->addrs;
-}
+QList NetInterface::addresses() const { return d->addrs; }
//----------------------------------------------------------------------------
// NetInterfaceManager
//----------------------------------------------------------------------------
-class NetInterfaceManagerPrivate : public QObject
-{
+class NetInterfaceManagerPrivate : public QObject {
Q_OBJECT
public:
NetInterfaceManager *q;
QList info;
- QList listeners;
- NetTrackerThread *tracker;
+ QList listeners;
+ NetTrackerThread *tracker;
bool pending;
@@ -275,15 +261,17 @@ class NetInterfaceManagerPrivate : public QObject
connect(tracker, SIGNAL(updated()), SLOT(tracker_updated()));
}
- ~NetInterfaceManagerPrivate() {
+ ~NetInterfaceManagerPrivate()
+ {
tracker->releaseRef();
- tracker = 0;
+ tracker = nullptr;
}
static int lookup(const QList &list, const QString &id)
{
- for(int n = 0; n < list.count(); ++n) {
- if(list[n].id == id) return n;
+ for (int n = 0; n < list.count(); ++n) {
+ if (list[n].id == id)
+ return n;
}
return -1;
}
@@ -302,13 +290,12 @@ class NetInterfaceManagerPrivate : public QObject
QStringList here_ids, gone_ids;
// removed / changed
- for(int n = 0; n < info.count(); ++n)
- {
+ for (int n = 0; n < info.count(); ++n) {
int i = lookup(newinfo, info[n].id);
// id is still here
- if(i != -1) {
+ if (i != -1) {
// content changed?
- if(!sameContent(info[n], newinfo[i])) {
+ if (!sameContent(info[n], newinfo[i])) {
gone_ids += info[n].id;
here_ids += info[n].id;
}
@@ -318,29 +305,29 @@ class NetInterfaceManagerPrivate : public QObject
}
// added
- for(int n = 0; n < newinfo.count(); ++n) {
+ for (int n = 0; n < newinfo.count(); ++n) {
int i = lookup(info, newinfo[n].id);
- if(i == -1)
+ if (i == -1)
here_ids += newinfo[n].id;
}
info = newinfo;
// announce gone
- for(int n = 0; n < gone_ids.count(); ++n) {
+ for (int n = 0; n < gone_ids.count(); ++n) {
// work on a copy, just in case the list changes.
// it is important to make the copy here, and not
// outside the outer loop, in case the items
// get deleted
- QList list = listeners;
- for(int i = 0; i < list.count(); ++i) {
- if(list[i]->d->id == gone_ids[n]) {
+ QList list = listeners;
+ for (int i = 0; i < list.count(); ++i) {
+ if (list[i]->d->id == gone_ids[n]) {
list[i]->d->doUnavailable();
}
}
}
// announce here
- for(int n = 0; n < here_ids.count(); ++n)
+ for (int n = 0; n < here_ids.count(); ++n)
emit q->interfaceAvailable(here_ids[n]);
}
@@ -348,7 +335,7 @@ public slots:
void tracker_updated()
{
// collapse multiple updates by queuing up an update if there isn't any queued yet.
- if(!pending) {
+ if (!pending) {
QMetaObject::invokeMethod(this, "update", Qt::QueuedConnection);
pending = true;
}
@@ -361,22 +348,18 @@ public slots:
}
};
-NetInterfaceManager::NetInterfaceManager(QObject *parent)
- :QObject(parent)
+NetInterfaceManager::NetInterfaceManager(QObject *parent) : QObject(parent)
{
d = new NetInterfaceManagerPrivate(this);
}
-NetInterfaceManager::~NetInterfaceManager()
-{
- delete d;
-}
+NetInterfaceManager::~NetInterfaceManager() { delete d; }
QStringList NetInterfaceManager::interfaces() const
{
d->info = d->tracker->getInterfaces();
QStringList out;
- for(int n = 0; n < d->info.count(); ++n) {
+ for (int n = 0; n < d->info.count(); ++n) {
out += d->info[n].id;
}
return out;
@@ -385,30 +368,27 @@ QStringList NetInterfaceManager::interfaces() const
QString NetInterfaceManager::interfaceForAddress(const QHostAddress &a)
{
NetInterfaceManager netman;
- QStringList list = netman.interfaces();
- for(int n = 0; n < list.count(); ++n) {
+ QStringList list = netman.interfaces();
+ for (int n = 0; n < list.count(); ++n) {
NetInterface iface(list[n], &netman);
- if(iface.addresses().contains(a)) return list[n];
+ if (iface.addresses().contains(a))
+ return list[n];
}
return QString();
}
void *NetInterfaceManager::reg(const QString &id, NetInterface *i)
{
- for(int n = 0; n < d->info.count(); ++n) {
- if(d->info[n].id == id) {
+ for (int n = 0; n < d->info.count(); ++n) {
+ if (d->info[n].id == id) {
d->listeners += i;
return new NetInterfaceProvider::Info(d->info[n]);
}
}
- return 0;
-}
-
-void NetInterfaceManager::unreg(NetInterface *i)
-{
- d->listeners.removeAll(i);
+ return nullptr;
}
-}
+void NetInterfaceManager::unreg(NetInterface *i) { d->listeners.removeAll(i); }
+} // namespace XMPP
#include "netinterface.moc"
diff --git a/src/irisnet/corelib/netinterface.h b/src/irisnet/corelib/netinterface.h
index a384c2dc..9bdd939f 100644
--- a/src/irisnet/corelib/netinterface.h
+++ b/src/irisnet/corelib/netinterface.h
@@ -22,17 +22,18 @@
#include "irisnetglobal.h"
namespace XMPP {
-
class NetInterfaceManager;
-class NetInterfacePrivate;
class NetInterfaceManagerPrivate;
+class NetInterfacePrivate;
/**
\brief Provides information about a network interface
- NetInterface provides information about a particular network interface. Construct it by passing the interface id of interest (e.g. "eth0") and a NetInterfaceManager parent object. Interface ids can be obtained from NetInterfaceManager.
+ NetInterface provides information about a particular network interface. Construct it by passing the interface id of
+interest (e.g. "eth0") and a NetInterfaceManager parent object. Interface ids can be obtained from NetInterfaceManager.
- To test if a NetInterface is valid, call isValid(). Use name() to return a display-friendly name of the interface. The addresses() function returns a list of IP addresses for this interface.
+ To test if a NetInterface is valid, call isValid(). Use name() to return a display-friendly name of the interface.
+The addresses() function returns a list of IP addresses for this interface.
Here's an example of how to print the IP addresses of eth0:
\code
@@ -49,14 +50,15 @@ if(iface.isValid())
\sa NetInterfaceManager
*/
-class IRISNET_EXPORT NetInterface : public QObject
-{
+class IRISNET_EXPORT NetInterface : public QObject {
Q_OBJECT
public:
/**
\brief Constructs a new interface object with the given \a id and \a manager
- If \a id is not a valid interface id, then the object will not be valid (isValid() will return false). Normally it is not necessary to check for validity, since interface ids obtained from NetInterfaceManager are guaranteed to be valid until the event loop resumes.
+ If \a id is not a valid interface id, then the object will not be valid (isValid() will return false). Normally
+ it is not necessary to check for validity, since interface ids obtained from NetInterfaceManager are guaranteed
+ to be valid until the event loop resumes.
\sa isValid
*/
@@ -93,7 +95,8 @@ class IRISNET_EXPORT NetInterface : public QObject
/**
\brief Returns the addresses of this interface
- There will always be at least one address. In some cases there might be multiple, such as on Unix where it is possible for the same interface to have both an IPv4 and an IPv6 address.
+ There will always be at least one address. In some cases there might be multiple, such as on Unix where it is
+ possible for the same interface to have both an IPv4 and an IPv6 address.
*/
QList addresses() const;
@@ -101,7 +104,8 @@ class IRISNET_EXPORT NetInterface : public QObject
/**
\brief Notifies when the interface becomes unavailable
- Once this signal is emitted, the NetInterface object becomes invalid and is no longer very useful. A new NetInterface object must be created if a valid object with current information is desired.
+ Once this signal is emitted, the NetInterface object becomes invalid and is no longer very useful. A new
+ NetInterface object must be created if a valid object with current information is desired.
\note If the interface information changes, the interface is considered to have become unavailable.
@@ -123,7 +127,8 @@ class IRISNET_EXPORT NetInterface : public QObject
An interface is considered available if it exists, is "Up", has at least one IP address, and is non-Loopback.
- The interfaces() function returns a list of available interface ids. These ids can be used with NetInterface to get information about the interfaces. For example, here is how you could print the names of the available interfaces:
+ The interfaces() function returns a list of available interface ids. These ids can be used with NetInterface to get
+information about the interfaces. For example, here is how you could print the names of the available interfaces:
\code
NetInterfaceManager netman;
@@ -135,20 +140,22 @@ for(int n = 0; n < id_list.count(); ++n)
}
\endcode
- When a new network interface is available, the interfaceAvailable() signal will be emitted. Note that interface unavailability is not notified by NetInterfaceManager. Instead, use NetInterface to monitor a specific network interface for unavailability.
+ When a new network interface is available, the interfaceAvailable() signal will be emitted. Note that interface
+unavailability is not notified by NetInterfaceManager. Instead, use NetInterface to monitor a specific network
+interface for unavailability.
- Interface ids obtained through NetInterfaceManager are guaranteed to be valid until the event loop resumes, or until the next call to interfaces() or interfaceForAddress().
+ Interface ids obtained through NetInterfaceManager are guaranteed to be valid until the event loop resumes, or until
+the next call to interfaces() or interfaceForAddress().
\sa NetInterface
*/
-class IRISNET_EXPORT NetInterfaceManager : public QObject
-{
+class IRISNET_EXPORT NetInterfaceManager : public QObject {
Q_OBJECT
public:
/**
\brief Constructs a new manager object with the given \a parent
*/
- NetInterfaceManager(QObject *parent = 0);
+ NetInterfaceManager(QObject *parent = nullptr);
/**
\brief Destroys the manager object
@@ -166,7 +173,8 @@ class IRISNET_EXPORT NetInterfaceManager : public QObject
/**
\brief Looks up an interface id by IP address
- This function looks for an interface that has the address \a a. If there is no such interface, a null string is returned.
+ This function looks for an interface that has the address \a a. If there is no such interface, a null string is
+returned.
This is useful for determing the network interface associated with an outgoing QTcpSocket:
@@ -194,9 +202,8 @@ QString iface = NetInterfaceManager::interfaceForAddress(tcpSocket->localAddress
friend class NetInterfacePrivate;
void *reg(const QString &id, NetInterface *i);
- void unreg(NetInterface *i);
+ void unreg(NetInterface *i);
};
+} // namespace XMPP
-}
-
-#endif
+#endif // NETINTERFACE_H
diff --git a/src/irisnet/corelib/netinterface_qtname.cpp b/src/irisnet/corelib/netinterface_qtname.cpp
index e9a57a99..2e9d3cc1 100644
--- a/src/irisnet/corelib/netinterface_qtname.cpp
+++ b/src/irisnet/corelib/netinterface_qtname.cpp
@@ -21,50 +21,40 @@
#include
namespace XMPP {
-
-class IrisQtName : public NameProvider
-{
+class IrisQtName : public NameProvider {
Q_OBJECT
Q_INTERFACES(XMPP::NameProvider)
struct Query {
- bool isHostInfo;
+ bool isHostInfo;
quintptr handle;
};
- int currentId;
- QHash lookups;
- QHash hostInfo; // we need all these tricks with double mapping because we still support Qt 5.5.1. (5.12 is way better)
+ int currentId;
+ QHash lookups;
+ QHash hostInfo; // we need all these tricks with double mapping because we still support Qt 5.5.1. (5.12
+ // is way better)
public:
- IrisQtName(QObject *parent = 0) :
- NameProvider(parent),
- currentId(0)
- {
-
- }
+ IrisQtName(QObject *parent = nullptr) : NameProvider(parent), currentId(0) { }
~IrisQtName()
{
- for (auto const &l: lookups) {
+ for (auto const &l : std::as_const(lookups)) {
if (!l.isHostInfo) {
- delete reinterpret_cast(l.handle);
+ delete reinterpret_cast(l.handle);
}
}
}
- bool supportsSingle() const
- {
- return true;
- }
+ bool supportsSingle() const { return true; }
bool supportsRecordType(int type) const
{
// yes the types matched to ones from jdns, so it's fine.
- static QVector types = {
- QDnsLookup::A, QDnsLookup::AAAA, QDnsLookup::ANY,
- QDnsLookup::CNAME, QDnsLookup::MX, QDnsLookup::NS,
- QDnsLookup::PTR, QDnsLookup::SRV, QDnsLookup::TXT};
+ static QVector types
+ = { QDnsLookup::A, QDnsLookup::AAAA, QDnsLookup::ANY, QDnsLookup::CNAME, QDnsLookup::MX,
+ QDnsLookup::NS, QDnsLookup::PTR, QDnsLookup::SRV, QDnsLookup::TXT };
return types.contains(type);
}
@@ -77,22 +67,22 @@ class IrisQtName : public NameProvider
QHostAddress addr(QString::fromLatin1(name));
if (!addr.isNull()) {
QList results;
- XMPP::NameRecord r;
+ XMPP::NameRecord r;
r.setAddress(addr);
results.append(r);
- QMetaObject::invokeMethod(this, "resolve_resultsReady", Qt::QueuedConnection,
- Q_ARG(int, id), Q_ARG(QList, results));
+ QMetaObject::invokeMethod(this, "resolve_resultsReady", Qt::QueuedConnection, Q_ARG(int, id),
+ Q_ARG(QList, results));
} else {
if (qType == QDnsLookup::A || qType == QDnsLookup::AAAA) {
// QDnsLookup doesn't support A and AAAA according to docs (see corresponding note)
int hiid = QHostInfo::lookupHost(QString::fromLatin1(name), this, SLOT(hostInfoFinished(QHostInfo)));
hostInfo.insert(hiid, id);
- lookups.insert(id, Query{true, quintptr(hiid)});
+ lookups.insert(id, Query { true, quintptr(hiid) });
} else {
QDnsLookup *lookup = new QDnsLookup((QDnsLookup::Type)qType, QString::fromLatin1(name), this);
connect(lookup, SIGNAL(finished()), this, SLOT(handleLookup()));
lookup->setProperty("iid", id);
- lookups.insert(id, Query{false, quintptr(lookup)});
+ lookups.insert(id, Query { false, quintptr(lookup) });
QMetaObject::invokeMethod(lookup, "lookup", Qt::QueuedConnection);
}
}
@@ -110,14 +100,15 @@ class IrisQtName : public NameProvider
hostInfo.remove(hiid);
lookups.erase(it);
} else {
- auto lookup = reinterpret_cast(q.handle);
+ auto lookup = reinterpret_cast(q.handle);
lookup->abort(); // handleLookup will catch it and delete
}
}
}
private slots:
- void hostInfoFinished(const QHostInfo &info) {
+ void hostInfoFinished(const QHostInfo &info)
+ {
auto hiid = info.lookupId();
auto idIt = hostInfo.find(hiid);
if (idIt == hostInfo.end()) { // removed already?
@@ -136,7 +127,8 @@ private slots:
return;
}
QList results;
- for (const auto &a: info.addresses()) {
+ const auto &addresses = info.addresses();
+ for (const auto &a : addresses) {
XMPP::NameRecord ir(info.hostName().toLatin1(), 5 * 60); // ttl = 5 mins
ir.setAddress(a);
results += ir;
@@ -147,25 +139,25 @@ private slots:
void handleLookup()
{
QDnsLookup *lookup = static_cast(sender());
- int id = lookup->property("iid").toInt();
+ int id = lookup->property("iid").toInt();
lookups.remove(id);
if (lookup->error() != QDnsLookup::NoError) {
XMPP::NameResolver::Error e;
switch (lookup->error()) {
- case QDnsLookup::InvalidReplyError:
- e = XMPP::NameResolver::ErrorTimeout;
- break;
- case QDnsLookup::NotFoundError:
- e = XMPP::NameResolver::ErrorNoName;
- break;
- case QDnsLookup::ResolverError:
- case QDnsLookup::OperationCancelledError:
- case QDnsLookup::InvalidRequestError:
- case QDnsLookup::ServerFailureError:
- case QDnsLookup::ServerRefusedError:
- default:
- e = XMPP::NameResolver::ErrorGeneric;
- break;
+ case QDnsLookup::InvalidReplyError:
+ e = XMPP::NameResolver::ErrorTimeout;
+ break;
+ case QDnsLookup::NotFoundError:
+ e = XMPP::NameResolver::ErrorNoName;
+ break;
+ case QDnsLookup::ResolverError:
+ case QDnsLookup::OperationCancelledError:
+ case QDnsLookup::InvalidRequestError:
+ case QDnsLookup::ServerFailureError:
+ case QDnsLookup::ServerRefusedError:
+ default:
+ e = XMPP::NameResolver::ErrorGeneric;
+ break;
}
if (lookup->error() != QDnsLookup::OperationCancelledError) { // don't report after resolve_stop()
emit resolve_error(id, e);
@@ -175,38 +167,38 @@ private slots:
}
QList results;
- for (auto &qtr: lookup->hostAddressRecords()) {
- XMPP::NameRecord ir(qtr.name().toLatin1(), qtr.timeToLive());
+ for (auto &qtr : lookup->hostAddressRecords()) {
+ XMPP::NameRecord ir(qtr.name(), qtr.timeToLive());
ir.setAddress(qtr.value());
results += ir;
}
- for (auto &qtr: lookup->mailExchangeRecords()) {
- XMPP::NameRecord ir(qtr.name().toLatin1(), qtr.timeToLive());
+ for (auto &qtr : lookup->mailExchangeRecords()) {
+ XMPP::NameRecord ir(qtr.name(), qtr.timeToLive());
ir.setMx(qtr.exchange().toLatin1(), qtr.preference());
results += ir;
}
- for (auto &qtr: lookup->nameServerRecords()) {
- XMPP::NameRecord ir(qtr.name().toLatin1(), qtr.timeToLive());
+ for (auto &qtr : lookup->nameServerRecords()) {
+ XMPP::NameRecord ir(qtr.name(), qtr.timeToLive());
ir.setNs(qtr.value().toLatin1());
results += ir;
}
- for (auto &qtr: lookup->pointerRecords()) {
- XMPP::NameRecord ir(qtr.name().toLatin1(), qtr.timeToLive());
+ for (auto &qtr : lookup->pointerRecords()) {
+ XMPP::NameRecord ir(qtr.name(), qtr.timeToLive());
ir.setPtr(qtr.value().toLatin1());
results += ir;
}
- for (auto &qtr: lookup->canonicalNameRecords()) {
- XMPP::NameRecord ir(qtr.name().toLatin1(), qtr.timeToLive());
+ for (auto &qtr : lookup->canonicalNameRecords()) {
+ XMPP::NameRecord ir(qtr.name(), qtr.timeToLive());
ir.setCname(qtr.value().toLatin1());
results += ir;
}
- for (auto &qtr: lookup->serviceRecords()) {
- XMPP::NameRecord ir(qtr.name().toLatin1(), qtr.timeToLive());
- ir.setSrv(qtr.target().toLatin1(),qtr.port(),qtr.priority(),qtr.weight());
+ for (auto &qtr : lookup->serviceRecords()) {
+ XMPP::NameRecord ir(qtr.name(), qtr.timeToLive());
+ ir.setSrv(qtr.target().toLatin1(), qtr.port(), qtr.priority(), qtr.weight());
results += ir;
}
- for (auto &qtr: lookup->textRecords()) {
- XMPP::NameRecord ir(qtr.name().toLatin1(), qtr.timeToLive());
+ for (auto &qtr : lookup->textRecords()) {
+ XMPP::NameRecord ir(qtr.name(), qtr.timeToLive());
ir.setTxt(qtr.values());
results += ir;
}
@@ -215,23 +207,14 @@ private slots:
}
};
-class IrisQtNameProvider : public IrisNetProvider
-{
+class IrisQtNameProvider : public IrisNetProvider {
Q_OBJECT
Q_INTERFACES(XMPP::IrisNetProvider)
public:
-
- NameProvider *createNameProviderInternet()
- {
- return new IrisQtName;
- }
+ NameProvider *createNameProviderInternet() { return new IrisQtName; }
};
-IrisNetProvider *irisnet_createQtNameProvider()
-{
- return new IrisQtNameProvider;
-}
-
-}
+IrisNetProvider *irisnet_createQtNameProvider() { return new IrisQtNameProvider; }
+} // namespace XMPP
#include "netinterface_qtname.moc"
diff --git a/src/irisnet/corelib/netinterface_qtnet.cpp b/src/irisnet/corelib/netinterface_qtnet.cpp
index dc3730da..2a303ad8 100644
--- a/src/irisnet/corelib/netinterface_qtnet.cpp
+++ b/src/irisnet/corelib/netinterface_qtnet.cpp
@@ -20,43 +20,111 @@
#include
-namespace XMPP {
+#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
+#ifdef Q_OS_LINUX
+#include
+#include
+#include
+#include
+#include
-class IrisQtNet : public NetInterfaceProvider
-{
+class InterfaceMonitor : public QObject {
Q_OBJECT
- Q_INTERFACES(XMPP::NetInterfaceProvider)
public:
- QList info;
- QNetworkConfigurationManager ncm;
-
- IrisQtNet()
+ InterfaceMonitor()
{
- connect(&ncm, SIGNAL(configurationAdded(QNetworkConfiguration)), SLOT(check()));
- connect(&ncm, SIGNAL(configurationChanged(QNetworkConfiguration)), SLOT(check()));
- connect(&ncm, SIGNAL(configurationRemoved(QNetworkConfiguration)), SLOT(check()));
+ struct sockaddr_nl sa;
+
+ memset(&sa, 0, sizeof(sa));
+ sa.nl_family = AF_NETLINK;
+ sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR;
+
+ netlinkFd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
+ if (netlinkFd == -1) {
+ return;
+ }
+ if (bind(netlinkFd, (struct sockaddr *)&sa, sizeof(sa)) == -1) {
+ close(netlinkFd);
+ netlinkFd = -1;
+ return;
+ }
+ notifier = new QSocketNotifier(netlinkFd, QSocketNotifier::Read, this);
+
+ connect(notifier, &QSocketNotifier::activated, this,
+ [=](QSocketDescriptor, QSocketNotifier::Type) { emit changed(); });
}
- void start()
+ ~InterfaceMonitor()
{
- poll();
+ if (notifier) {
+ delete notifier;
+ close(netlinkFd);
+ }
}
- QList interfaces() const
+signals:
+ void changed();
+
+private:
+ QSocketNotifier *notifier = nullptr;
+ int netlinkFd = -1;
+};
+
+#else
+// not linux version. polling? TODO. probably with Qt6 we can use QNetworkStatusMonitor
+class InterfaceMonitor : public QObject {
+ Q_OBJECT
+public:
+ InterfaceMonitor() { }
+
+signals:
+ void changed();
+};
+#endif
+#else // old Qt < 5.15
+class InterfaceMonitor : public QObject {
+ Q_OBJECT
+public:
+ InterfaceMonitor()
{
- return info;
+ connect(&ncm, SIGNAL(configurationAdded(QNetworkConfiguration)), SIGNAL(changed()));
+ connect(&ncm, SIGNAL(configurationChanged(QNetworkConfiguration)), SIGNAL(changed()));
+ connect(&ncm, SIGNAL(configurationRemoved(QNetworkConfiguration)), SIGNAL(changed()));
}
+signals:
+ void changed();
+
+private:
+ QNetworkConfigurationManager ncm;
+};
+#endif
+
+namespace XMPP {
+class IrisQtNet : public NetInterfaceProvider {
+ Q_OBJECT
+ Q_INTERFACES(XMPP::NetInterfaceProvider)
+public:
+ QList info;
+ InterfaceMonitor monitor;
+
+ IrisQtNet() { connect(&monitor, &InterfaceMonitor::changed, this, &IrisQtNet::check); }
+
+ void start() { poll(); }
+
+ QList interfaces() const { return info; }
+
void poll()
{
QList ifaces;
- for (auto &iface: QNetworkInterface::allInterfaces()) {
+ auto const interfaces = QNetworkInterface::allInterfaces();
+ for (auto &iface : interfaces) {
Info i;
- i.id = iface.name();
- i.name = iface.humanReadableName();
- i.isLoopback = (iface.flags() & QNetworkInterface::IsLoopBack);
- for (auto &ae: iface.addressEntries()) {
+ i.id = iface.name();
+ i.name = iface.humanReadableName();
+ i.isLoopback = bool(iface.flags() & QNetworkInterface::IsLoopBack);
+ for (auto &ae : iface.addressEntries()) {
i.addresses.append(ae.ip());
}
ifaces << i;
@@ -73,22 +141,14 @@ public slots:
}
};
-class IrisQtNetProvider : public IrisNetProvider
-{
+class IrisQtNetProvider : public IrisNetProvider {
Q_OBJECT
Q_INTERFACES(XMPP::IrisNetProvider)
public:
- NetInterfaceProvider *createNetInterfaceProvider()
- {
- return new IrisQtNet;
- }
+ NetInterfaceProvider *createNetInterfaceProvider() { return new IrisQtNet; }
};
-IrisNetProvider *irisnet_createQtNetProvider()
-{
- return new IrisQtNetProvider;
-}
-
-}
+IrisNetProvider *irisnet_createQtNetProvider() { return new IrisQtNetProvider; }
+} // namespace XMPP
#include "netinterface_qtnet.moc"
diff --git a/src/irisnet/corelib/netinterface_unix.cpp b/src/irisnet/corelib/netinterface_unix.cpp
index 3459d152..7d5b4d99 100644
--- a/src/irisnet/corelib/netinterface_unix.cpp
+++ b/src/irisnet/corelib/netinterface_unix.cpp
@@ -24,19 +24,17 @@
#include "irisnetplugin.h"
-#include
-#include
-#include
+#include
#include
#include
#include
-#include
-#include
-
-// for solaris
-#ifndef SIOCGIFCONF
-# include
+#include
+#include
+#ifndef SIOCGIFCONF // for solaris
+#include
#endif
+#include
+#include
#ifdef Q_OS_LINUX
static QStringList read_proc_as_lines(const char *procfile)
@@ -44,16 +42,15 @@ static QStringList read_proc_as_lines(const char *procfile)
QStringList out;
FILE *f = fopen(procfile, "r");
- if(!f)
+ if (!f)
return out;
QByteArray buf;
- while(!feof(f))
- {
+ while (!feof(f)) {
// max read on a proc is 4K
QByteArray block(4096, 0);
- int ret = fread(block.data(), 1, block.size(), f);
- if(ret <= 0)
+ int ret = int(fread(block.data(), 1, size_t(block.size()), f));
+ if (ret <= 0)
break;
block.resize(ret);
buf += block;
@@ -61,21 +58,24 @@ static QStringList read_proc_as_lines(const char *procfile)
fclose(f);
QString str = QString::fromLocal8Bit(buf);
+#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
+ out = str.split('\n', Qt::SkipEmptyParts);
+#else
out = str.split('\n', QString::SkipEmptyParts);
+#endif
return out;
}
static QHostAddress linux_ipv6_to_qaddr(const QString &in)
{
QHostAddress out;
- if(in.length() != 32)
+ if (in.length() != 32)
return out;
quint8 raw[16];
- for(int n = 0; n < 16; ++n)
- {
+ for (int n = 0; n < 16; ++n) {
bool ok;
- int x = in.mid(n * 2, 2).toInt(&ok, 16);
- if(!ok)
+ int x = QStringView { in }.mid(n * 2, 2).toInt(&ok, 16);
+ if (!ok)
return out;
raw[n] = (quint8)x;
}
@@ -86,17 +86,16 @@ static QHostAddress linux_ipv6_to_qaddr(const QString &in)
static QHostAddress linux_ipv4_to_qaddr(const QString &in)
{
QHostAddress out;
- if(in.length() != 8)
+ if (in.length() != 8)
return out;
- quint32 raw;
+ quint32 raw;
unsigned char *rawp = (unsigned char *)&raw;
- for(int n = 0; n < 4; ++n)
- {
+ for (int n = 0; n < 4; ++n) {
bool ok;
- int x = in.mid(n * 2, 2).toInt(&ok, 16);
- if(!ok)
+ int x = QStringView { in }.mid(n * 2, 2).toInt(&ok, 16);
+ if (!ok)
return out;
- rawp[n] = (unsigned char )x;
+ rawp[n] = (unsigned char)x;
}
out.setAddress(raw);
return out;
@@ -108,22 +107,25 @@ static QList