summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/Qt5CoreConfigExtras.cmake.in24
-rw-r--r--src/corelib/Qt5CoreMacros.cmake177
-rw-r--r--src/corelib/animation/qabstractanimation.cpp8
-rw-r--r--src/corelib/animation/qanimationgroup.cpp13
-rw-r--r--src/corelib/animation/qpropertyanimation.cpp8
-rw-r--r--src/corelib/animation/qsequentialanimationgroup.cpp6
-rw-r--r--src/corelib/animation/qvariantanimation.cpp6
-rw-r--r--src/corelib/codecs/qicucodec.cpp16
-rw-r--r--src/corelib/codecs/qisciicodec.cpp2
-rw-r--r--src/corelib/codecs/qsimplecodec.cpp66
-rw-r--r--src/corelib/configure.json20
-rw-r--r--src/corelib/corelib.pro1
-rw-r--r--src/corelib/doc/snippets/code/doc_src_properties.cpp1
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp1
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp10
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_statemachine_qstatemachine.cpp2
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_thread_qfuturewatcher.cpp2
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp13
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp16
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp4
-rw-r--r--src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp13
-rw-r--r--src/corelib/doc/snippets/qsignalmapper/buttonwidget.h4
-rw-r--r--src/corelib/doc/snippets/resource-system/mainwindow.cpp36
-rw-r--r--src/corelib/doc/snippets/statemachine/main.cpp13
-rw-r--r--src/corelib/doc/snippets/statemachine/main2.cpp15
-rw-r--r--src/corelib/doc/snippets/statemachine/main3.cpp2
-rw-r--r--src/corelib/doc/snippets/statemachine/main5.cpp14
-rw-r--r--src/corelib/doc/snippets/timers/analogclock.cpp2
-rw-r--r--src/corelib/doc/snippets/timers/timers.cpp6
-rw-r--r--src/corelib/doc/src/animation.qdoc4
-rw-r--r--src/corelib/doc/src/objectmodel/properties.qdoc6
-rw-r--r--src/corelib/doc/src/statemachine.qdoc4
-rw-r--r--src/corelib/global/qcompilerdetection.h1
-rw-r--r--src/corelib/global/qconfig-bootstrapped.h3
-rw-r--r--src/corelib/global/qflags.h7
-rw-r--r--src/corelib/global/qfloat16.cpp8
-rw-r--r--src/corelib/global/qfloat16.h13
-rw-r--r--src/corelib/global/qglobal.cpp36
-rw-r--r--src/corelib/global/qglobal.h6
-rw-r--r--src/corelib/global/qlibraryinfo.cpp17
-rw-r--r--src/corelib/global/qlogging.cpp2
-rw-r--r--src/corelib/global/qnamespace.h29
-rw-r--r--src/corelib/global/qnamespace.qdoc92
-rw-r--r--src/corelib/io/io.pri5
-rw-r--r--src/corelib/io/qabstractfileengine.cpp2
-rw-r--r--src/corelib/io/qbuffer.cpp2
-rw-r--r--src/corelib/io/qdiriterator.cpp2
-rw-r--r--src/corelib/io/qfile.cpp4
-rw-r--r--src/corelib/io/qfiledevice.cpp2
-rw-r--r--src/corelib/io/qfileinfo.cpp21
-rw-r--r--src/corelib/io/qfileinfo.h1
-rw-r--r--src/corelib/io/qfilesystemengine_mac.mm79
-rw-r--r--src/corelib/io/qfilesystemengine_p.h3
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp197
-rw-r--r--src/corelib/io/qfilesystemengine_win.cpp295
-rw-r--r--src/corelib/io/qfilesystemmetadata_p.h21
-rw-r--r--src/corelib/io/qfilesystemwatcher.cpp2
-rw-r--r--src/corelib/io/qfilesystemwatcher_inotify.cpp2
-rw-r--r--src/corelib/io/qfsfileengine.cpp116
-rw-r--r--src/corelib/io/qfsfileengine_unix.cpp77
-rw-r--r--src/corelib/io/qfsfileengine_win.cpp74
-rw-r--r--src/corelib/io/qiodevice.cpp4
-rw-r--r--src/corelib/io/qnoncontiguousbytedevice.cpp20
-rw-r--r--src/corelib/io/qprocess.cpp26
-rw-r--r--src/corelib/io/qprocess_unix.cpp37
-rw-r--r--src/corelib/io/qprocess_win.cpp15
-rw-r--r--src/corelib/io/qresource.cpp224
-rw-r--r--src/corelib/io/qresource.h5
-rw-r--r--src/corelib/io/qsavefile.cpp2
-rw-r--r--src/corelib/io/qsettings.cpp61
-rw-r--r--src/corelib/io/qsettings_p.h13
-rw-r--r--src/corelib/io/qsettings_wasm.cpp259
-rw-r--r--src/corelib/io/qurl.cpp2
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.cpp94
-rw-r--r--src/corelib/itemmodels/qabstractproxymodel.cpp2
-rw-r--r--src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp2
-rw-r--r--src/corelib/itemmodels/qidentityproxymodel.cpp24
-rw-r--r--src/corelib/itemmodels/qidentityproxymodel.h2
-rw-r--r--src/corelib/itemmodels/qitemselectionmodel.cpp2
-rw-r--r--src/corelib/itemmodels/qitemselectionmodel.h8
-rw-r--r--src/corelib/itemmodels/qstringlistmodel.cpp23
-rw-r--r--src/corelib/kernel/qabstracteventdispatcher.cpp2
-rw-r--r--src/corelib/kernel/qbasictimer.cpp10
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp157
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h10
-rw-r--r--src/corelib/kernel/qcoreapplication_win.cpp2
-rw-r--r--src/corelib/kernel/qcoreevent.cpp2
-rw-r--r--src/corelib/kernel/qeventdispatcher_glib.cpp40
-rw-r--r--src/corelib/kernel/qeventdispatcher_unix.cpp6
-rw-r--r--src/corelib/kernel/qeventdispatcher_win.cpp38
-rw-r--r--src/corelib/kernel/qeventloop.cpp43
-rw-r--r--src/corelib/kernel/qmetaobject.cpp111
-rw-r--r--src/corelib/kernel/qmetaobject.h1
-rw-r--r--src/corelib/kernel/qmetaobject_p.h3
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp32
-rw-r--r--src/corelib/kernel/qmetatype.cpp52
-rw-r--r--src/corelib/kernel/qmetatype.h24
-rw-r--r--src/corelib/kernel/qmimedata.cpp74
-rw-r--r--src/corelib/kernel/qobject.cpp192
-rw-r--r--src/corelib/kernel/qobject_p.h7
-rw-r--r--src/corelib/kernel/qobjectcleanuphandler.cpp2
-rw-r--r--src/corelib/kernel/qsharedmemory.cpp2
-rw-r--r--src/corelib/kernel/qsharedmemory_systemv.cpp6
-rw-r--r--src/corelib/kernel/qsharedmemory_unix.cpp2
-rw-r--r--src/corelib/kernel/qsignalmapper.cpp115
-rw-r--r--src/corelib/kernel/qsignalmapper.h10
-rw-r--r--src/corelib/kernel/qsocketnotifier.cpp15
-rw-r--r--src/corelib/kernel/qtestsupport_core.cpp2
-rw-r--r--src/corelib/kernel/qtimer.cpp6
-rw-r--r--src/corelib/kernel/qtimerinfo_unix.cpp20
-rw-r--r--src/corelib/kernel/qtranslator.cpp38
-rw-r--r--src/corelib/kernel/qvariant.cpp524
-rw-r--r--src/corelib/kernel/qvariant.h27
-rw-r--r--src/corelib/kernel/qvariant_p.h4
-rw-r--r--src/corelib/kernel/qwineventnotifier.cpp6
-rw-r--r--src/corelib/mimetypes/mime/generate.bat73
-rw-r--r--src/corelib/mimetypes/mime/generate.pl113
-rw-r--r--src/corelib/mimetypes/mime/hexdump.ps143
-rw-r--r--src/corelib/mimetypes/mimetypes.pri29
-rw-r--r--src/corelib/mimetypes/qmimedatabase.cpp13
-rw-r--r--src/corelib/mimetypes/qmimeprovider.cpp99
-rw-r--r--src/corelib/mimetypes/qmimeprovider_p.h11
-rw-r--r--src/corelib/plugin/qfactoryloader.cpp8
-rw-r--r--src/corelib/plugin/qlibrary.cpp34
-rw-r--r--src/corelib/plugin/qlibrary_p.h2
-rw-r--r--src/corelib/plugin/qlibrary_unix.cpp2
-rw-r--r--src/corelib/plugin/qpluginloader.cpp8
-rw-r--r--src/corelib/serialization/qbinaryjson.cpp415
-rw-r--r--src/corelib/serialization/qbinaryjson_p.h617
-rw-r--r--src/corelib/serialization/qbinaryjsonarray.cpp137
-rw-r--r--src/corelib/serialization/qbinaryjsonarray_p.h98
-rw-r--r--src/corelib/serialization/qbinaryjsonobject.cpp149
-rw-r--r--src/corelib/serialization/qbinaryjsonobject_p.h97
-rw-r--r--src/corelib/serialization/qbinaryjsonvalue.cpp155
-rw-r--r--src/corelib/serialization/qbinaryjsonvalue_p.h134
-rw-r--r--src/corelib/serialization/qcborcommon.cpp328
-rw-r--r--src/corelib/serialization/qcborcommon.h2
-rw-r--r--src/corelib/serialization/qcborcommon_p.h84
-rw-r--r--src/corelib/serialization/qcborstream.h224
-rw-r--r--src/corelib/serialization/qcborstreamreader.cpp (renamed from src/corelib/serialization/qcborstream.cpp)1254
-rw-r--r--src/corelib/serialization/qcborstreamreader.h210
-rw-r--r--src/corelib/serialization/qcborstreamwriter.cpp868
-rw-r--r--src/corelib/serialization/qcborstreamwriter.h130
-rw-r--r--src/corelib/serialization/qcborvalue.cpp149
-rw-r--r--src/corelib/serialization/qcborvalue.h16
-rw-r--r--src/corelib/serialization/qdatastream.cpp1
-rw-r--r--src/corelib/serialization/qdatastream.h20
-rw-r--r--src/corelib/serialization/qjson.cpp451
-rw-r--r--src/corelib/serialization/qjson_p.h789
-rw-r--r--src/corelib/serialization/qjsonarray.cpp235
-rw-r--r--src/corelib/serialization/qjsonarray.h26
-rw-r--r--src/corelib/serialization/qjsoncbor.cpp180
-rw-r--r--src/corelib/serialization/qjsondocument.cpp367
-rw-r--r--src/corelib/serialization/qjsondocument.h33
-rw-r--r--src/corelib/serialization/qjsonobject.cpp421
-rw-r--r--src/corelib/serialization/qjsonobject.h51
-rw-r--r--src/corelib/serialization/qjsonparser.cpp453
-rw-r--r--src/corelib/serialization/qjsonparser_p.h51
-rw-r--r--src/corelib/serialization/qjsonvalue.cpp329
-rw-r--r--src/corelib/serialization/qjsonvalue.h54
-rw-r--r--src/corelib/serialization/qjsonwriter.cpp75
-rw-r--r--src/corelib/serialization/qjsonwriter_p.h4
-rw-r--r--src/corelib/serialization/qtextstream.cpp54
-rw-r--r--src/corelib/serialization/qtextstream.h42
-rw-r--r--src/corelib/serialization/serialization.pri36
-rw-r--r--src/corelib/statemachine/qabstractstate.cpp6
-rw-r--r--src/corelib/statemachine/qabstracttransition.cpp4
-rw-r--r--src/corelib/statemachine/qeventtransition.cpp2
-rw-r--r--src/corelib/statemachine/qhistorystate.cpp2
-rw-r--r--src/corelib/statemachine/qsignaltransition.cpp2
-rw-r--r--src/corelib/statemachine/qstate.cpp20
-rw-r--r--src/corelib/statemachine/qstatemachine.cpp106
-rw-r--r--src/corelib/text/qbytearray.cpp312
-rw-r--r--src/corelib/text/qbytearray.h60
-rw-r--r--src/corelib/text/qchar.cpp258
-rw-r--r--src/corelib/text/qchar.h20
-rw-r--r--src/corelib/text/qlocale.cpp42
-rw-r--r--src/corelib/text/qlocale.h8
-rw-r--r--src/corelib/text/qlocale_tools.cpp2
-rw-r--r--src/corelib/text/qlocale_tools_p.h16
-rw-r--r--src/corelib/text/qlocale_unix.cpp16
-rw-r--r--src/corelib/text/qregexp.cpp8
-rw-r--r--src/corelib/text/qregularexpression.cpp64
-rw-r--r--src/corelib/text/qregularexpression.h20
-rw-r--r--src/corelib/text/qstring.cpp29
-rw-r--r--src/corelib/text/qstring.h2
-rw-r--r--src/corelib/text/qstringalgorithms.h1
-rw-r--r--src/corelib/text/qstringlist.cpp10
-rw-r--r--src/corelib/text/qstringview.cpp15
-rw-r--r--src/corelib/text/qstringview.h2
-rw-r--r--src/corelib/text/qt_attribution.json2
-rw-r--r--src/corelib/text/qtextboundaryfinder.cpp16
-rw-r--r--src/corelib/text/qunicodetables.cpp15190
-rw-r--r--src/corelib/text/qunicodetables_p.h15
-rw-r--r--src/corelib/text/qunicodetools.cpp47
-rw-r--r--src/corelib/thread/qbasicatomic.h6
-rw-r--r--src/corelib/thread/qexception.cpp2
-rw-r--r--src/corelib/thread/qfutureinterface.cpp2
-rw-r--r--src/corelib/thread/qmutex.cpp8
-rw-r--r--src/corelib/thread/qmutex_linux.cpp4
-rw-r--r--src/corelib/thread/qorderedmutexlocker_p.h2
-rw-r--r--src/corelib/thread/qreadwritelock.cpp10
-rw-r--r--src/corelib/thread/qresultstore.cpp2
-rw-r--r--src/corelib/thread/qrunnable.cpp27
-rw-r--r--src/corelib/thread/qrunnable.h2
-rw-r--r--src/corelib/thread/qsemaphore.h7
-rw-r--r--src/corelib/thread/qthread.cpp42
-rw-r--r--src/corelib/thread/qthread.h8
-rw-r--r--src/corelib/thread/qthread_unix.cpp28
-rw-r--r--src/corelib/thread/qthread_win.cpp8
-rw-r--r--src/corelib/thread/qthreadpool.cpp34
-rw-r--r--src/corelib/thread/qthreadpool.h5
-rw-r--r--src/corelib/thread/qthreadstorage.cpp12
-rw-r--r--src/corelib/thread/qwaitcondition.h34
-rw-r--r--src/corelib/thread/qwaitcondition.qdoc32
-rw-r--r--src/corelib/thread/qwaitcondition_p.h153
-rw-r--r--src/corelib/thread/qwaitcondition_unix.cpp2
-rw-r--r--src/corelib/thread/thread.pri1
-rw-r--r--src/corelib/time/qcalendar.cpp11
-rw-r--r--src/corelib/time/qdatetime.cpp263
-rw-r--r--src/corelib/time/qdatetime.h16
-rw-r--r--src/corelib/time/qdatetimeparser.cpp30
-rw-r--r--src/corelib/time/qdatetimeparser_p.h6
-rw-r--r--src/corelib/time/qtimezone.cpp25
-rw-r--r--src/corelib/time/qtimezoneprivate.cpp48
-rw-r--r--src/corelib/time/qtimezoneprivate_icu.cpp12
-rw-r--r--src/corelib/time/qtimezoneprivate_p.h3
-rw-r--r--src/corelib/time/qtimezoneprivate_tz.cpp2
-rw-r--r--src/corelib/tools/qarraydata.cpp4
-rw-r--r--src/corelib/tools/qduplicatetracker_p.h94
-rw-r--r--src/corelib/tools/qeasingcurve.cpp18
-rw-r--r--src/corelib/tools/qhash.cpp112
-rw-r--r--src/corelib/tools/qhash.h481
-rw-r--r--src/corelib/tools/qlist.cpp7
-rw-r--r--src/corelib/tools/qlist.h18
-rw-r--r--src/corelib/tools/qmap.cpp114
-rw-r--r--src/corelib/tools/qmap.h375
-rw-r--r--src/corelib/tools/qscopedvaluerollback.h6
-rw-r--r--src/corelib/tools/qscopeguard.h32
-rw-r--r--src/corelib/tools/qscopeguard.qdoc41
-rw-r--r--src/corelib/tools/qset.h70
-rw-r--r--src/corelib/tools/qset.qdoc8
-rw-r--r--src/corelib/tools/qsimd.cpp133
-rw-r--r--src/corelib/tools/tools.pri1
244 files changed, 18192 insertions, 13684 deletions
diff --git a/src/corelib/Qt5CoreConfigExtras.cmake.in b/src/corelib/Qt5CoreConfigExtras.cmake.in
index 9b672327ef..4c1c3a612b 100644
--- a/src/corelib/Qt5CoreConfigExtras.cmake.in
+++ b/src/corelib/Qt5CoreConfigExtras.cmake.in
@@ -1,3 +1,6 @@
+if(NOT DEFINED QT_DEFAULT_MAJOR_VERSION)
+ set(QT_DEFAULT_MAJOR_VERSION 5)
+endif()
if (NOT TARGET Qt5::qmake)
add_executable(Qt5::qmake IMPORTED)
@@ -177,3 +180,24 @@ if (ANDROID_PLATFORM)
endif()
_qt5_Core_check_file_exists(${_Qt5CTestMacros})
+
+# Create versionless tool targets.
+foreach(__qt_tool qmake moc rcc)
+ if(NOT \"${QT_NO_CREATE_VERSIONLESS_TARGETS}\" AND NOT TARGET Qt::${__qt_tool}
+ AND TARGET Qt5::${__qt_tool})
+ add_executable(Qt::${__qt_tool} IMPORTED)
+ get_target_property(__qt_imported_location Qt5::${__qt_tool} IMPORTED_LOCATION)
+ set_target_properties(Qt::${__qt_tool}
+ PROPERTIES IMPORTED_LOCATION \"${__qt_imported_location}\")
+ endif()
+endforeach()
+
+!!IF !isEmpty(CMAKE_WINDOWS_BUILD)
+# Add a versionless target for WinMain.
+if(NOT \"${QT_NO_CREATE_VERSIONLESS_TARGETS}\" AND NOT TARGET Qt::WinMain)
+ add_library(Qt::WinMain INTERFACE IMPORTED)
+ set_target_properties(Qt::WinMain PROPERTIES
+ INTERFACE_LINK_LIBRARIES \"Qt5::WinMain\"
+ )
+endif()
+!!ENDIF
diff --git a/src/corelib/Qt5CoreMacros.cmake b/src/corelib/Qt5CoreMacros.cmake
index 02f49a4b1e..f666c67ed9 100644
--- a/src/corelib/Qt5CoreMacros.cmake
+++ b/src/corelib/Qt5CoreMacros.cmake
@@ -39,7 +39,7 @@
include(CMakeParseArguments)
# macro used to create the names of output files preserving relative dirs
-macro(QT5_MAKE_OUTPUT_FILE infile prefix ext outfile )
+macro(qt5_make_output_file infile prefix ext outfile )
string(LENGTH ${CMAKE_CURRENT_BINARY_DIR} _binlength)
string(LENGTH ${infile} _infileLength)
set(_checkinfile ${CMAKE_CURRENT_SOURCE_DIR})
@@ -72,7 +72,7 @@ macro(QT5_MAKE_OUTPUT_FILE infile prefix ext outfile )
endmacro()
-macro(QT5_GET_MOC_FLAGS _moc_flags)
+macro(qt5_get_moc_flags _moc_flags)
set(${_moc_flags})
get_directory_property(_inc_DIRS INCLUDE_DIRECTORIES)
@@ -104,7 +104,7 @@ endmacro()
# helper macro to set up a moc rule
-function(QT5_CREATE_MOC_COMMAND infile outfile moc_flags moc_options moc_target moc_depends)
+function(qt5_create_moc_command infile outfile moc_flags moc_options moc_target moc_depends)
# Pass the parameters in a file. Set the working directory to
# be that containing the parameters file and reference it by
# just the file name. This is necessary because the moc tool on
@@ -150,7 +150,7 @@ function(QT5_CREATE_MOC_COMMAND infile outfile moc_flags moc_options moc_target
endfunction()
-function(QT5_GENERATE_MOC infile outfile )
+function(qt5_generate_moc infile outfile )
# get include dirs and flags
qt5_get_moc_flags(moc_flags)
get_filename_component(abs_infile ${infile} ABSOLUTE)
@@ -164,10 +164,20 @@ function(QT5_GENERATE_MOC infile outfile )
qt5_create_moc_command(${abs_infile} ${_outfile} "${moc_flags}" "" "${moc_target}" "")
endfunction()
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_generate_moc)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_generate_moc(${ARGV})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_generate_moc(${ARGV})
+ endif()
+ endfunction()
+endif()
+
# qt5_wrap_cpp(outfiles inputfile ... )
-function(QT5_WRAP_CPP outfiles )
+function(qt5_wrap_cpp outfiles )
# get include dirs
qt5_get_moc_flags(moc_flags)
@@ -191,12 +201,23 @@ function(QT5_WRAP_CPP outfiles )
set(${outfiles} ${${outfiles}} PARENT_SCOPE)
endfunction()
+# This will override the CMake upstream command, because that one is for Qt 3.
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_wrap_cpp outfiles)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_wrap_cpp("${outfiles}" ${ARGN})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_wrap_cpp("${outfiles}" ${ARGN})
+ endif()
+ set("${outfiles}" "${${outfiles}}" PARENT_SCOPE)
+ endfunction()
+endif()
# _qt5_parse_qrc_file(infile _out_depends _rc_depends)
# internal
-function(_QT5_PARSE_QRC_FILE infile _out_depends _rc_depends)
+function(_qt5_parse_qrc_file infile _out_depends _rc_depends)
get_filename_component(rc_path ${infile} PATH)
if(EXISTS "${infile}")
@@ -229,7 +250,7 @@ endfunction()
# qt5_add_binary_resources(target inputfiles ... )
-function(QT5_ADD_BINARY_RESOURCES target )
+function(qt5_add_binary_resources target )
set(options)
set(oneValueArgs DESTINATION)
@@ -248,7 +269,7 @@ function(QT5_ADD_BINARY_RESOURCES target )
foreach(it ${rcc_files})
get_filename_component(infile ${it} ABSOLUTE)
- _QT5_PARSE_QRC_FILE(${infile} _out_depends _rc_depends)
+ _qt5_parse_qrc_file(${infile} _out_depends _rc_depends)
set_source_files_properties(${infile} PROPERTIES SKIP_AUTORCC ON)
set(infiles ${infiles} ${infile})
set(out_depends ${out_depends} ${_out_depends})
@@ -262,10 +283,20 @@ function(QT5_ADD_BINARY_RESOURCES target )
add_custom_target(${target} ALL DEPENDS ${rcc_destination})
endfunction()
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_add_binary_resources)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_add_binary_resources(${ARGV})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_add_binary_resources(${ARGV})
+ endif()
+ endfunction()
+endif()
+
# qt5_add_resources(outfiles inputfile ... )
-function(QT5_ADD_RESOURCES outfiles )
+function(qt5_add_resources outfiles )
set(options)
set(oneValueArgs)
@@ -285,7 +316,7 @@ function(QT5_ADD_RESOURCES outfiles )
get_filename_component(infile ${it} ABSOLUTE)
set(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.cpp)
- _QT5_PARSE_QRC_FILE(${infile} _out_depends _rc_depends)
+ _qt5_parse_qrc_file(${infile} _out_depends _rc_depends)
set_source_files_properties(${infile} PROPERTIES SKIP_AUTORCC ON)
add_custom_command(OUTPUT ${outfile}
@@ -300,9 +331,21 @@ function(QT5_ADD_RESOURCES outfiles )
set(${outfiles} ${${outfiles}} PARENT_SCOPE)
endfunction()
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_add_resources outfiles)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_add_resources("${outfiles}" ${ARGN})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_add_resources("${outfiles}" ${ARGN})
+ endif()
+ set("${outfiles}" "${${outfiles}}" PARENT_SCOPE)
+ endfunction()
+endif()
+
+
# qt5_add_big_resources(outfiles inputfile ... )
-function(QT5_ADD_BIG_RESOURCES outfiles )
+function(qt5_add_big_resources outfiles )
if (CMAKE_VERSION VERSION_LESS 3.9)
message(FATAL_ERROR, "qt5_add_big_resources requires CMake 3.9 or newer")
endif()
@@ -326,7 +369,7 @@ function(QT5_ADD_BIG_RESOURCES outfiles )
set(tmpoutfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}tmp.cpp)
set(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.o)
- _QT5_PARSE_QRC_FILE(${infile} _out_depends _rc_depends)
+ _qt5_parse_qrc_file(${infile} _out_depends _rc_depends)
set_source_files_properties(${infile} PROPERTIES SKIP_AUTORCC ON)
add_custom_command(OUTPUT ${tmpoutfile}
COMMAND ${Qt5Core_RCC_EXECUTABLE} ${rcc_options} --name ${outfilename} --pass 1 --output ${tmpoutfile} ${infile}
@@ -348,60 +391,67 @@ function(QT5_ADD_BIG_RESOURCES outfiles )
set(${outfiles} ${${outfiles}} PARENT_SCOPE)
endfunction()
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_add_big_resources outfiles)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_add_big_resources(${outfiles} ${ARGN})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_add_big_resources(${outfiles} ${ARGN})
+ endif()
+ set("${outfiles}" "${${outfiles}}" PARENT_SCOPE)
+ endfunction()
+endif()
+
+
set(_Qt5_COMPONENT_PATH "${CMAKE_CURRENT_LIST_DIR}/..")
-if (NOT CMAKE_VERSION VERSION_LESS 2.8.9)
- macro(qt5_use_modules _target _link_type)
- if(NOT CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.11)
- if(CMAKE_WARN_DEPRECATED)
- set(messageType WARNING)
- endif()
- if(CMAKE_ERROR_DEPRECATED)
- set(messageType FATAL_ERROR)
- endif()
- if(messageType)
- message(${messageType} "The qt5_use_modules macro is obsolete. Use target_link_libraries with IMPORTED targets instead.")
- endif()
- endif()
+macro(qt5_use_modules _target _link_type)
+ if(CMAKE_WARN_DEPRECATED)
+ set(messageType WARNING)
+ endif()
+ if(CMAKE_ERROR_DEPRECATED)
+ set(messageType FATAL_ERROR)
+ endif()
+ if(messageType)
+ message(${messageType} "The qt5_use_modules macro is obsolete. Use target_link_libraries with IMPORTED targets instead.")
+ endif()
- if (NOT TARGET ${_target})
- message(FATAL_ERROR "The first argument to qt5_use_modules must be an existing target.")
- endif()
- if ("${_link_type}" STREQUAL "LINK_PUBLIC" OR "${_link_type}" STREQUAL "LINK_PRIVATE" )
- set(_qt5_modules ${ARGN})
- set(_qt5_link_type ${_link_type})
- else()
- set(_qt5_modules ${_link_type} ${ARGN})
- endif()
+ if (NOT TARGET ${_target})
+ message(FATAL_ERROR "The first argument to qt5_use_modules must be an existing target.")
+ endif()
+ if ("${_link_type}" STREQUAL "LINK_PUBLIC" OR "${_link_type}" STREQUAL "LINK_PRIVATE" )
+ set(_qt5_modules ${ARGN})
+ set(_qt5_link_type ${_link_type})
+ else()
+ set(_qt5_modules ${_link_type} ${ARGN})
+ endif()
- if ("${_qt5_modules}" STREQUAL "")
- message(FATAL_ERROR "qt5_use_modules requires at least one Qt module to use.")
- endif()
+ if ("${_qt5_modules}" STREQUAL "")
+ message(FATAL_ERROR "qt5_use_modules requires at least one Qt module to use.")
+ endif()
- foreach(_module ${_qt5_modules})
+ foreach(_module ${_qt5_modules})
+ if (NOT Qt5${_module}_FOUND)
+ find_package(Qt5${_module} PATHS "${_Qt5_COMPONENT_PATH}" NO_DEFAULT_PATH)
if (NOT Qt5${_module}_FOUND)
- find_package(Qt5${_module} PATHS "${_Qt5_COMPONENT_PATH}" NO_DEFAULT_PATH)
- if (NOT Qt5${_module}_FOUND)
- message(FATAL_ERROR "Cannot use \"${_module}\" module which has not yet been found.")
- endif()
+ message(FATAL_ERROR "Cannot use \"${_module}\" module which has not yet been found.")
endif()
- target_link_libraries(${_target} ${_qt5_link_type} ${Qt5${_module}_LIBRARIES})
- set_property(TARGET ${_target} APPEND PROPERTY INCLUDE_DIRECTORIES ${Qt5${_module}_INCLUDE_DIRS})
- set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS ${Qt5${_module}_COMPILE_DEFINITIONS})
- set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS_RELEASE QT_NO_DEBUG)
- set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS_RELWITHDEBINFO QT_NO_DEBUG)
- set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS_MINSIZEREL QT_NO_DEBUG)
- if (Qt5_POSITION_INDEPENDENT_CODE
- AND (CMAKE_VERSION VERSION_GREATER_EQUAL 2.8.12
- AND (NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU"
- OR CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)))
- set_property(TARGET ${_target} PROPERTY POSITION_INDEPENDENT_CODE ${Qt5_POSITION_INDEPENDENT_CODE})
- endif()
- endforeach()
- endmacro()
-endif()
+ endif()
+ target_link_libraries(${_target} ${_qt5_link_type} ${Qt5${_module}_LIBRARIES})
+ set_property(TARGET ${_target} APPEND PROPERTY INCLUDE_DIRECTORIES ${Qt5${_module}_INCLUDE_DIRS})
+ set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS ${Qt5${_module}_COMPILE_DEFINITIONS})
+ set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS_RELEASE QT_NO_DEBUG)
+ set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS_RELWITHDEBINFO QT_NO_DEBUG)
+ set_property(TARGET ${_target} APPEND PROPERTY COMPILE_DEFINITIONS_MINSIZEREL QT_NO_DEBUG)
+ if (Qt5_POSITION_INDEPENDENT_CODE
+ AND (NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU"
+ OR CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0))
+ set_property(TARGET ${_target} PROPERTY POSITION_INDEPENDENT_CODE ${Qt5_POSITION_INDEPENDENT_CODE})
+ endif()
+ endforeach()
+endmacro()
-function(QT5_IMPORT_PLUGINS TARGET_NAME)
+function(qt5_import_plugins TARGET_NAME)
set(_doing "")
foreach(_arg ${ARGN})
if(_arg STREQUAL "INCLUDE")
@@ -425,10 +475,19 @@ function(QT5_IMPORT_PLUGINS TARGET_NAME)
elseif(_doing STREQUAL "EXCLUDE_BY_TYPE")
string(REGEX REPLACE "[-/]" "_" _plugin_type "${_arg}")
set_property(TARGET ${TARGET_NAME} PROPERTY "QT_PLUGINS_${_plugin_type}" -)
- set(_doing "")
else()
message(FATAL_ERROR "Unexpected extra argument: \"${_arg}\"")
endif()
endif()
endforeach()
endfunction()
+
+if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
+ function(qt_import_plugins)
+ if(QT_DEFAULT_MAJOR_VERSION EQUAL 5)
+ qt5_import_plugins(${ARGV})
+ elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
+ qt6_import_plugins(${ARGV})
+ endif()
+ endfunction()
+endif()
diff --git a/src/corelib/animation/qabstractanimation.cpp b/src/corelib/animation/qabstractanimation.cpp
index 46b01449d4..b7136dc055 100644
--- a/src/corelib/animation/qabstractanimation.cpp
+++ b/src/corelib/animation/qabstractanimation.cpp
@@ -220,7 +220,7 @@ QUnifiedTimer::QUnifiedTimer() :
QObject(), defaultDriver(this), lastTick(0), timingInterval(DEFAULT_TIMER_INTERVAL),
currentAnimationIdx(0), insideTick(false), insideRestart(false), consistentTiming(false), slowMode(false),
startTimersPending(false), stopTimerPending(false),
- slowdownFactor(5.0f), profilerCallback(0),
+ slowdownFactor(5.0f), profilerCallback(nullptr),
driverStartTime(0), temporalDrift(0)
{
time.invalidate();
@@ -922,7 +922,7 @@ qint64 QAnimationDriver::elapsed() const
The default animation driver just spins the timer...
*/
QDefaultAnimationDriver::QDefaultAnimationDriver(QUnifiedTimer *timer)
- : QAnimationDriver(0), m_unified_timer(timer)
+ : QAnimationDriver(nullptr), m_unified_timer(timer)
{
connect(this, SIGNAL(started()), this, SLOT(startTimer()));
connect(this, SIGNAL(stopped()), this, SLOT(stopTimer()));
@@ -1035,7 +1035,7 @@ void QAbstractAnimationPrivate::setState(QAbstractAnimation::State newState)
\sa QVariantAnimation, QAnimationGroup
*/
QAbstractAnimation::QAbstractAnimation(QObject *parent)
- : QObject(*new QAbstractAnimationPrivate, 0)
+ : QObject(*new QAbstractAnimationPrivate, nullptr)
{
// Allow auto-add on reparent
setParent(parent);
@@ -1045,7 +1045,7 @@ QAbstractAnimation::QAbstractAnimation(QObject *parent)
\internal
*/
QAbstractAnimation::QAbstractAnimation(QAbstractAnimationPrivate &dd, QObject *parent)
- : QObject(dd, 0)
+ : QObject(dd, nullptr)
{
// Allow auto-add on reparent
setParent(parent);
diff --git a/src/corelib/animation/qanimationgroup.cpp b/src/corelib/animation/qanimationgroup.cpp
index ed40817222..729f55d68f 100644
--- a/src/corelib/animation/qanimationgroup.cpp
+++ b/src/corelib/animation/qanimationgroup.cpp
@@ -133,7 +133,7 @@ QAbstractAnimation *QAnimationGroup::animationAt(int index) const
if (index < 0 || index >= d->animations.size()) {
qWarning("QAnimationGroup::animationAt: index is out of bounds");
- return 0;
+ return nullptr;
}
return d->animations.at(index);
@@ -195,8 +195,11 @@ void QAnimationGroup::insertAnimation(int index, QAbstractAnimation *animation)
return;
}
- if (QAnimationGroup *oldGroup = animation->group())
+ if (QAnimationGroup *oldGroup = animation->group()) {
oldGroup->removeAnimation(animation);
+ // ensure we don't insert out of bounds if oldGroup == this
+ index = qMin(index, d->animations.size());
+ }
d->animations.insert(index, animation);
QAbstractAnimationPrivate::get(animation)->group = this;
@@ -240,14 +243,14 @@ QAbstractAnimation *QAnimationGroup::takeAnimation(int index)
Q_D(QAnimationGroup);
if (index < 0 || index >= d->animations.size()) {
qWarning("QAnimationGroup::takeAnimation: no animation at index %d", index);
- return 0;
+ return nullptr;
}
QAbstractAnimation *animation = d->animations.at(index);
- QAbstractAnimationPrivate::get(animation)->group = 0;
+ QAbstractAnimationPrivate::get(animation)->group = nullptr;
// ### removing from list before doing setParent to avoid inifinite recursion
// in ChildRemoved event
d->animations.removeAt(index);
- animation->setParent(0);
+ animation->setParent(nullptr);
d->animationRemoved(index, animation);
return animation;
}
diff --git a/src/corelib/animation/qpropertyanimation.cpp b/src/corelib/animation/qpropertyanimation.cpp
index 2a3572d441..d014b5c441 100644
--- a/src/corelib/animation/qpropertyanimation.cpp
+++ b/src/corelib/animation/qpropertyanimation.cpp
@@ -92,7 +92,7 @@ QT_BEGIN_NAMESPACE
void QPropertyAnimationPrivate::updateMetaProperty()
{
if (!target || propertyName.isEmpty()) {
- propertyType = QVariant::Invalid;
+ propertyType = QMetaType::UnknownType;
propertyIndex = -1;
return;
}
@@ -102,11 +102,11 @@ void QPropertyAnimationPrivate::updateMetaProperty()
propertyType = targetValue->property(propertyName).userType();
propertyIndex = targetValue->metaObject()->indexOfProperty(propertyName);
- if (propertyType != QVariant::Invalid)
+ if (propertyType != QMetaType::UnknownType)
convertValues(propertyType);
if (propertyIndex == -1) {
//there is no Q_PROPERTY on the object
- propertyType = QVariant::Invalid;
+ propertyType = QMetaType::UnknownType;
if (!targetValue->dynamicPropertyNames().contains(propertyName))
qWarning("QPropertyAnimation: you're trying to animate a non-existing property %s of your QObject", propertyName.constData());
} else if (!targetValue->metaObject()->property(propertyIndex).isWritable()) {
@@ -259,7 +259,7 @@ void QPropertyAnimation::updateState(QAbstractAnimation::State newState,
QVariantAnimation::updateState(newState, oldState);
- QPropertyAnimation *animToStop = 0;
+ QPropertyAnimation *animToStop = nullptr;
{
static QBasicMutex mutex;
auto locker = qt_unique_lock(mutex);
diff --git a/src/corelib/animation/qsequentialanimationgroup.cpp b/src/corelib/animation/qsequentialanimationgroup.cpp
index 66e346a2fe..98ac04a14f 100644
--- a/src/corelib/animation/qsequentialanimationgroup.cpp
+++ b/src/corelib/animation/qsequentialanimationgroup.cpp
@@ -282,7 +282,7 @@ QPauseAnimation *QSequentialAnimationGroup::insertPause(int index, int msecs)
if (index < 0 || index > d->animations.size()) {
qWarning("QSequentialAnimationGroup::insertPause: index is out of bounds");
- return 0;
+ return nullptr;
}
QPauseAnimation *pause = new QPauseAnimation(msecs);
@@ -430,7 +430,7 @@ void QSequentialAnimationGroupPrivate::setCurrentAnimation(int index, bool inter
if (index == -1) {
Q_ASSERT(animations.isEmpty());
currentAnimationIndex = -1;
- currentAnimation = 0;
+ currentAnimation = nullptr;
return;
}
@@ -503,7 +503,7 @@ void QSequentialAnimationGroupPrivate::_q_uncontrolledAnimationFinished()
*/
void QSequentialAnimationGroupPrivate::animationInsertedAt(int index)
{
- if (currentAnimation == 0)
+ if (currentAnimation == nullptr)
setCurrentAnimation(0); // initialize the current animation
if (currentAnimationIndex == index
diff --git a/src/corelib/animation/qvariantanimation.cpp b/src/corelib/animation/qvariantanimation.cpp
index 216c015732..98b02f0202 100644
--- a/src/corelib/animation/qvariantanimation.cpp
+++ b/src/corelib/animation/qvariantanimation.cpp
@@ -209,7 +209,7 @@ void QVariantAnimationPrivate::updateInterpolator()
if (type == currentInterval.end.second.userType())
interpolator = getInterpolator(type);
else
- interpolator = 0;
+ interpolator = nullptr;
//we make sure that the interpolator is always set to something
if (!interpolator)
@@ -445,7 +445,7 @@ QVariantAnimation::Interpolator QVariantAnimationPrivate::getInterpolator(int in
{
QInterpolatorVector *interpolators = registeredInterpolators();
const auto locker = qt_scoped_lock(registeredInterpolatorsMutex);
- QVariantAnimation::Interpolator ret = 0;
+ QVariantAnimation::Interpolator ret = nullptr;
if (interpolationType < interpolators->count()) {
ret = interpolators->at(interpolationType);
if (ret) return ret;
@@ -479,7 +479,7 @@ QVariantAnimation::Interpolator QVariantAnimationPrivate::getInterpolator(int in
case QMetaType::QRectF:
return castToInterpolator(_q_interpolateVariant<QRectF>);
default:
- return 0; //this type is not handled
+ return nullptr; //this type is not handled
}
}
diff --git a/src/corelib/codecs/qicucodec.cpp b/src/corelib/codecs/qicucodec.cpp
index 5a778c2638..f9092277b2 100644
--- a/src/corelib/codecs/qicucodec.cpp
+++ b/src/corelib/codecs/qicucodec.cpp
@@ -381,7 +381,7 @@ static QTextCodec *loadQtCodec(const char *name)
return QIsciiCodec::create(name);
#endif
- return 0;
+ return nullptr;
}
/// \threadsafe
@@ -438,7 +438,7 @@ QTextCodec *QIcuCodec::defaultCodecUnlocked()
{
QCoreGlobalData *globalData = QCoreGlobalData::instance();
if (!globalData)
- return 0;
+ return nullptr;
QTextCodec *c = globalData->codecForLocale.loadAcquire();
if (c)
return c;
@@ -523,13 +523,13 @@ QTextCodec *QIcuCodec::codecForNameUnlocked(const char *name)
return c;
if (qt_only)
- return 0;
+ return nullptr;
// check whether there is really a converter for the name available.
UConverter *conv = ucnv_open(standardName, &error);
if (!conv) {
qDebug("codecForName: ucnv_open failed %s %s", standardName, u_errorName(error));
- return 0;
+ return nullptr;
}
//qDebug() << "QIcuCodec: Standard name for " << name << "is" << standardName;
ucnv_close(conv);
@@ -552,7 +552,7 @@ QTextCodec *QIcuCodec::codecForMibUnlocked(int mib)
if (mib == 2107)
return codecForNameUnlocked("TSCII");
- return 0;
+ return nullptr;
}
@@ -567,7 +567,7 @@ QIcuCodec::~QIcuCodec()
UConverter *QIcuCodec::getConverter(QTextCodec::ConverterState *state) const
{
- UConverter *conv = 0;
+ UConverter *conv = nullptr;
if (state) {
if (!state->d) {
// first time
@@ -609,7 +609,7 @@ QString QIcuCodec::convertToUnicode(const char *chars, int length, QTextCodec::C
ucnv_toUnicode(conv,
&uc, ucEnd,
&chars, end,
- 0, false, &error);
+ nullptr, false, &error);
if (!U_SUCCESS(error) && error != U_BUFFER_OVERFLOW_ERROR) {
qDebug("convertToUnicode failed: %s", u_errorName(error));
break;
@@ -646,7 +646,7 @@ QByteArray QIcuCodec::convertFromUnicode(const QChar *unicode, int length, QText
ucnv_fromUnicode(conv,
&ch, chEnd,
&uc, end,
- 0, false, &error);
+ nullptr, false, &error);
if (!U_SUCCESS(error))
qDebug("convertFromUnicode failed: %s", u_errorName(error));
convertedChars = ch - string.data();
diff --git a/src/corelib/codecs/qisciicodec.cpp b/src/corelib/codecs/qisciicodec.cpp
index d9a86d77c7..9689818559 100644
--- a/src/corelib/codecs/qisciicodec.cpp
+++ b/src/corelib/codecs/qisciicodec.cpp
@@ -74,7 +74,7 @@ QTextCodec *QIsciiCodec::create(const char *name)
if (qTextCodecNameMatch(name, codecs[i].name))
return new QIsciiCodec(i);
}
- return 0;
+ return nullptr;
}
QIsciiCodec::~QIsciiCodec()
diff --git a/src/corelib/codecs/qsimplecodec.cpp b/src/corelib/codecs/qsimplecodec.cpp
index 16a9b8a7c3..4e82620003 100644
--- a/src/corelib/codecs/qsimplecodec.cpp
+++ b/src/corelib/codecs/qsimplecodec.cpp
@@ -51,7 +51,7 @@ static const struct {
quint16 values[128];
} unicodevalues[QSimpleTextCodec::numSimpleCodecs] = {
// from RFC 1489, ftp://ftp.isi.edu/in-notes/rfc1489.txt
- { "KOI8-R", { "csKOI8R", 0 }, 2084,
+ { "KOI8-R", { "csKOI8R", nullptr }, 2084,
{ 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219/**/, 0x221A, 0x2248,
@@ -72,7 +72,7 @@ static const struct {
// it should be 0x2022 (BULLET).
// from RFC 2319, ftp://ftp.isi.edu/in-notes/rfc2319.txt
- { "KOI8-U", { "KOI8-RU", 0 }, 2088,
+ { "KOI8-U", { "KOI8-RU", nullptr }, 2088,
{ 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248,
@@ -97,7 +97,7 @@ static const struct {
// $ for A in 8 9 A B C D E F ; do for B in 0 1 2 3 4 5 6 7 8 9 A B C D E F ; do echo 0x${A}${B} 0xFFFD ; done ; done > /tmp/digits ; for a in 8859-* ; do (awk '/^0x[89ABCDEF]/{ print $1, $2 }' < $a ; cat /tmp/digits) | sort | uniq -w4 | cut -c6- | paste '-d ' - - - - - - - - | sed -e 's/ /, /g' -e 's/$/,/' -e '$ s/,$/} },/' -e '1 s/^/{ /' > ~/tmp/$a ; done
// then I inserted the files manually.
- { "ISO-8859-2", {"latin2", "iso-ir-101", "csISOLatin2", 0 }, 5,
+ { "ISO-8859-2", {"latin2", "iso-ir-101", "csISOLatin2", nullptr }, 5,
{ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
@@ -114,7 +114,7 @@ static const struct {
0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9} },
- { "ISO-8859-3", { "latin3", "iso-ir-109", "csISOLatin3", 0 }, 6,
+ { "ISO-8859-3", { "latin3", "iso-ir-109", "csISOLatin3", nullptr }, 6,
{ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
@@ -131,7 +131,7 @@ static const struct {
0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
0xFFFD, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7,
0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9} },
- { "ISO-8859-4", { "latin4", "iso-ir-110", "csISOLatin4", 0 }, 7,
+ { "ISO-8859-4", { "latin4", "iso-ir-110", "csISOLatin4", nullptr }, 7,
{ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
@@ -148,7 +148,7 @@ static const struct {
0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B,
0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9} },
- { "ISO-8859-5", { "cyrillic", "iso-ir-144", "csISOLatinCyrillic", 0 }, 8,
+ { "ISO-8859-5", { "cyrillic", "iso-ir-144", "csISOLatinCyrillic", nullptr }, 8,
{ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
@@ -165,7 +165,7 @@ static const struct {
0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F} },
- { "ISO-8859-6", { "ISO-8859-6-I", "ECMA-114", "ASMO-708", "arabic", "iso-ir-127", "csISOLatinArabic", 0 }, 82,
+ { "ISO-8859-6", { "ISO-8859-6-I", "ECMA-114", "ASMO-708", "arabic", "iso-ir-127", "csISOLatinArabic", nullptr }, 82,
{ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
@@ -182,7 +182,7 @@ static const struct {
0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F,
0x0650, 0x0651, 0x0652, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD} },
- { "ISO-8859-7", { "ECMA-118", "greek", "iso-ir-126", "csISOLatinGreek", 0 }, 10,
+ { "ISO-8859-7", { "ECMA-118", "greek", "iso-ir-126", "csISOLatinGreek", nullptr }, 10,
{ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
@@ -199,7 +199,7 @@ static const struct {
0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0xFFFD} },
- { "ISO-8859-8", { "ISO 8859-8-I", "iso-ir-138", "hebrew", "csISOLatinHebrew", 0 }, 85,
+ { "ISO-8859-8", { "ISO 8859-8-I", "iso-ir-138", "hebrew", "csISOLatinHebrew", nullptr }, 85,
{ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
@@ -216,7 +216,7 @@ static const struct {
0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
0x05E8, 0x05E9, 0x05EA, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD} },
- { "ISO-8859-9", { "iso-ir-148", "latin5", "csISOLatin5", 0 }, 12,
+ { "ISO-8859-9", { "iso-ir-148", "latin5", "csISOLatin5", nullptr }, 12,
{ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
@@ -233,7 +233,7 @@ static const struct {
0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF} },
- { "ISO-8859-10", { "iso-ir-157", "latin6", "ISO-8859-10:1992", "csISOLatin6", 0 }, 13,
+ { "ISO-8859-10", { "iso-ir-157", "latin6", "ISO-8859-10:1992", "csISOLatin6", nullptr }, 13,
{ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
@@ -250,7 +250,7 @@ static const struct {
0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF,
0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169,
0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138} },
- { "ISO-8859-13", { 0 }, 109,
+ { "ISO-8859-13", { nullptr }, 109,
{ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
@@ -267,7 +267,7 @@ static const struct {
0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019} },
- { "ISO-8859-14", { "iso-ir-199", "latin8", "iso-celtic", 0 }, 110,
+ { "ISO-8859-14", { "iso-ir-199", "latin8", "iso-celtic", nullptr }, 110,
{ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
@@ -284,7 +284,7 @@ static const struct {
0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B,
0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF} },
- { "ISO-8859-16", { "iso-ir-226", "latin10", 0 }, 112,
+ { "ISO-8859-16", { "iso-ir-226", "latin10", nullptr }, 112,
{ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
@@ -305,7 +305,7 @@ static const struct {
// next bits generated again from tables on the Unicode 3.0 CD.
// $ for a in CP* ; do (awk '/^0x[89ABCDEF]/{ print $1, $2 }' < $a) | sort | sed -e 's/#UNDEF.*$/0xFFFD/' | cut -c6- | paste '-d ' - - - - - - - - | sed -e 's/ /, /g' -e 's/$/,/' -e '$ s/,$/} },/' -e '1 s/^/{ /' > ~/tmp/$a ; done
- { "IBM850", { "CP850", "csPC850Multilingual", 0 }, 2009,
+ { "IBM850", { "CP850", "csPC850Multilingual", nullptr }, 2009,
{ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7,
0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,
0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9,
@@ -322,7 +322,7 @@ static const struct {
0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4,
0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8,
0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0} },
- { "IBM874", { "CP874", 0 }, -874, //### what is the mib?
+ { "IBM874", { "CP874", nullptr }, -874, //### what is the mib?
{ 0x20AC, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x2026, 0xFFFD, 0xFFFD,
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
@@ -339,7 +339,7 @@ static const struct {
0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,
0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD} },
- { "IBM866", { "CP866", "csIBM866", 0 }, 2086,
+ { "IBM866", { "CP866", "csIBM866", nullptr }, 2086,
{ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
@@ -357,7 +357,7 @@ static const struct {
0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E,
0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0} },
- { "windows-1250", { "CP1250", 0 }, 2250,
+ { "windows-1250", { "CP1250", nullptr }, 2250,
{ 0x20AC, 0xFFFD, 0x201A, 0xFFFD, 0x201E, 0x2026, 0x2020, 0x2021,
0xFFFD, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
@@ -374,7 +374,7 @@ static const struct {
0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9} },
- { "windows-1251", { "CP1251", 0 }, 2251,
+ { "windows-1251", { "CP1251", nullptr }, 2251,
{ 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
@@ -391,7 +391,7 @@ static const struct {
0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F} },
- { "windows-1252", { "CP1252", 0 }, 2252,
+ { "windows-1252", { "CP1252", nullptr }, 2252,
{ 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0xFFFD, 0x017D, 0xFFFD,
0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
@@ -408,7 +408,7 @@ static const struct {
0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF} },
- { "windows-1253", {"CP1253", 0 }, 2253,
+ { "windows-1253", {"CP1253", nullptr }, 2253,
{ 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
0xFFFD, 0x2030, 0xFFFD, 0x2039, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
@@ -425,7 +425,7 @@ static const struct {
0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0xFFFD} },
- { "windows-1254", { "CP1254", 0 }, 2254,
+ { "windows-1254", { "CP1254", nullptr }, 2254,
{ 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
@@ -442,7 +442,7 @@ static const struct {
0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF} },
- { "windows-1255", { "CP1255", 0 }, 2255,
+ { "windows-1255", { "CP1255", nullptr }, 2255,
{ 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
0x02C6, 0x2030, 0xFFFD, 0x2039, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
@@ -459,7 +459,7 @@ static const struct {
0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
0x05E8, 0x05E9, 0x05EA, 0xFFFD, 0xFFFD, 0x200E, 0x200F, 0xFFFD} },
- { "windows-1256", { "CP1256", 0 }, 2256,
+ { "windows-1256", { "CP1256", nullptr }, 2256,
{ 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
@@ -476,7 +476,7 @@ static const struct {
0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,
0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2} },
- { "windows-1257", { "CP1257", 0 }, 2257,
+ { "windows-1257", { "CP1257", nullptr }, 2257,
{ 0x20AC, 0xFFFD, 0x201A, 0xFFFD, 0x201E, 0x2026, 0x2020, 0x2021,
0xFFFD, 0x2030, 0xFFFD, 0x2039, 0xFFFD, 0x00A8, 0x02C7, 0x00B8,
0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
@@ -493,7 +493,7 @@ static const struct {
0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9} },
- { "windows-1258", { "CP1258", 0 }, 2258,
+ { "windows-1258", { "CP1258", nullptr }, 2258,
{ 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
0x02C6, 0x2030, 0xFFFD, 0x2039, 0x0152, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
@@ -511,7 +511,7 @@ static const struct {
0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7,
0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF} },
- { "macintosh", { "Apple Roman", "MacRoman", 0 }, 2027,
+ { "macintosh", { "Apple Roman", "MacRoman", nullptr }, 2027,
{ 0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1,
0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8,
0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3,
@@ -532,7 +532,7 @@ static const struct {
// This one is based on the charmap file
// /usr/share/i18n/charmaps/SAMI-WS2.gz, which is manually adapted
// to this format by Boerre Gaup <boerre@subdimension.com>
- { "WINSAMI2", { "WS2", 0 }, -165,
+ { "WINSAMI2", { "WS2", nullptr }, -165,
{ 0x20AC, 0xFFFD, 0x010C, 0x0192, 0x010D, 0x01B7, 0x0292, 0x01EE,
0x01EF, 0x0110, 0x0160, 0x2039, 0x0152, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
@@ -555,7 +555,7 @@ static const struct {
// to iso8859-11, so we name it 8859-11 here, but recognise the name tis620 too.
// $ for A in 8 9 A B C D E F ; do for B in 0 1 2 3 4 5 6 7 8 9 A B C D E F ; do echo x${A}${B} 0xFFFD ; done ; done > /tmp/digits ; (cut -c25- < TIS-620 ; cat /tmp/digits) | awk '/^x[89ABCDEF]/{ print $1, $2 }' | sed -e 's/<U/0x/' -e 's/>//' | sort | uniq -w4 | cut -c5- | paste '-d ' - - - - - - - - | sed -e 's/ /, /g' -e 's/$/,/' -e '$ s/,$/} },/' -e '1 s/^/{ /' > ~/tmp/tis-620
- { "TIS-620", { "ISO 8859-11", 0 }, 2259, // Thai character set mib enum taken from tis620 (which is byte by byte equivalent)
+ { "TIS-620", { "ISO 8859-11", nullptr }, 2259, // Thai character set mib enum taken from tis620 (which is byte by byte equivalent)
{ 0x20AC, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x2026, 0xFFFD, 0xFFFD,
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
@@ -582,7 +582,7 @@ static const struct {
Alias: r8
Alias: csHPRoman8
*/
- { "hp-roman8", { "roman8", "csHPRoman8", 0 }, 2004,
+ { "hp-roman8", { "roman8", "csHPRoman8", nullptr }, 2004,
{ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
@@ -603,7 +603,7 @@ static const struct {
// if you add more chacater sets at the end, change LAST_MIB above
};
-QSimpleTextCodec::QSimpleTextCodec(int i) : forwardIndex(i), reverseMap(0)
+QSimpleTextCodec::QSimpleTextCodec(int i) : forwardIndex(i), reverseMap(nullptr)
{
}
@@ -640,7 +640,7 @@ static QByteArray *buildReverseMap(int forwardIndex)
QString QSimpleTextCodec::convertToUnicode(const char* chars, int len, ConverterState *) const
{
- if (len <= 0 || chars == 0)
+ if (len <= 0 || chars == nullptr)
return QString();
const unsigned char * c = (const unsigned char *)chars;
@@ -665,7 +665,7 @@ QByteArray QSimpleTextCodec::convertFromUnicode(const QChar *in, int length, Con
QByteArray *rmap = reverseMap.loadAcquire();
if (!rmap){
rmap = buildReverseMap(this->forwardIndex);
- if (!reverseMap.testAndSetRelease(0, rmap)) {
+ if (!reverseMap.testAndSetRelease(nullptr, rmap)) {
delete rmap;
rmap = reverseMap.loadAcquire();
}
diff --git a/src/corelib/configure.json b/src/corelib/configure.json
index ae360239c6..eb60ad213c 100644
--- a/src/corelib/configure.json
+++ b/src/corelib/configure.json
@@ -1086,6 +1086,26 @@ Mozilla License) is included. The data is then also used in QNetworkCookieJar::v
"win32_system_libs": {
"label": "Windows System Libraries",
"condition": "config.win32 && libs.advapi32 && libs.gdi32 && libs.kernel32 && libs.netapi32 && libs.ole32 && libs.shell32 && libs.uuid && libs.user32 && libs.winmm && libs.ws2_32"
+ },
+ "cborstreamreader": {
+ "label": "CBOR stream reading",
+ "purpose": "Provides support for reading the CBOR binary format.
+
+Note that this is required for plugin loading. Qt GUI needs QPA plugins for basic operation.",
+ "section": "Utilities",
+ "output": [ "publicFeature" ]
+ },
+ "cborstreamwriter": {
+ "label": "CBOR stream writing",
+ "purpose": "Provides support for writing the CBOR binary format.",
+ "section": "Utilities",
+ "output": [ "publicFeature" ]
+ },
+ "binaryjson": {
+ "label": "Binary JSON (deprecated)",
+ "purpose": "Provides support for the deprecated binary JSON format.",
+ "section": "Utilities",
+ "output": [ "publicFeature" ]
}
},
diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro
index 6c101e21ca..3430154d13 100644
--- a/src/corelib/corelib.pro
+++ b/src/corelib/corelib.pro
@@ -17,6 +17,7 @@ DEFINES += QT_NO_USING_NAMESPACE QT_NO_FOREACH
msvc:equals(QT_ARCH, i386): QMAKE_LFLAGS += /BASE:0x67000000
CONFIG += simd optimize_full
+CONFIG += metatypes install_metatypes
QMAKE_DOCS = $$PWD/doc/qtcore.qdocconf
diff --git a/src/corelib/doc/snippets/code/doc_src_properties.cpp b/src/corelib/doc/snippets/code/doc_src_properties.cpp
index b72c9d13e1..a67945bbcf 100644
--- a/src/corelib/doc/snippets/code/doc_src_properties.cpp
+++ b/src/corelib/doc/snippets/code/doc_src_properties.cpp
@@ -61,6 +61,7 @@ Q_PROPERTY(type name
[USER bool]
[CONSTANT]
[FINAL])
+ [REQUIRED]
//! [0]
diff --git a/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp b/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp
index eb75a29ca2..a540b88247 100644
--- a/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_global_qglobal.cpp
@@ -50,6 +50,7 @@
//! [0]
label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
+label->setAlignment({ });
//! [0]
diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp
index aae2456bf1..36b47e6f6e 100644
--- a/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qcoreapplication.cpp
@@ -56,7 +56,7 @@ QApplication::sendEvent(mainWindow, &event);
//! [1]
QPushButton *quitButton = new QPushButton("Quit");
-connect(quitButton, SIGNAL(clicked()), &app, SLOT(quit()), Qt::QueuedConnection);
+connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection);
//! [1]
@@ -79,12 +79,12 @@ Q_COREAPP_STARTUP_FUNCTION(preRoutineMyDebugTool)
//! [4]
-static int *global_ptr = 0;
+static int *global_ptr = nullptr;
static void cleanup_ptr()
{
delete [] global_ptr;
- global_ptr = 0;
+ global_ptr = nullptr;
}
void init_ptr()
@@ -125,9 +125,9 @@ private:
//! [6]
static inline QString tr(const char *sourceText,
- const char *comment = 0);
+ const char *comment = nullptr);
static inline QString trUtf8(const char *sourceText,
- const char *comment = 0);
+ const char *comment = nullptr);
//! [6]
diff --git a/src/corelib/doc/snippets/code/src_corelib_statemachine_qstatemachine.cpp b/src/corelib/doc/snippets/code/src_corelib_statemachine_qstatemachine.cpp
index a606da1a0c..c756116de4 100644
--- a/src/corelib/doc/snippets/code/src_corelib_statemachine_qstatemachine.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_statemachine_qstatemachine.cpp
@@ -56,7 +56,7 @@ QState *s1 = new QState();
s1->assignProperty(&button, "text", "Click me");
QFinalState *s2 = new QFinalState();
-s1->addTransition(&button, SIGNAL(clicked()), s2);
+s1->addTransition(&button, &QPushButton::clicked, s2);
machine.addState(s1);
machine.addState(s2);
diff --git a/src/corelib/doc/snippets/code/src_corelib_thread_qfuturewatcher.cpp b/src/corelib/doc/snippets/code/src_corelib_thread_qfuturewatcher.cpp
index 043974b25b..336c1e9c79 100644
--- a/src/corelib/doc/snippets/code/src_corelib_thread_qfuturewatcher.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_thread_qfuturewatcher.cpp
@@ -52,7 +52,7 @@
// Instantiate the objects and connect to the finished signal.
MyClass myObject;
QFutureWatcher<int> watcher;
-connect(&watcher, SIGNAL(finished()), &myObject, SLOT(handleFinished()));
+connect(&watcher, QFutureWatcher<int>::finished, &myObject, &MyClass::handleFinished);
// Start the computation.
QFuture<int> future = QtConcurrent::run(...);
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp
index 11ab50687d..01f620cf08 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qbytearray.cpp
@@ -429,6 +429,19 @@ QByteArray::fromBase64("PHA+SGVsbG8/PC9wPg==", QByteArray::Base64Encoding); // r
QByteArray::fromBase64("PHA-SGVsbG8_PC9wPg==", QByteArray::Base64UrlEncoding); // returns "<p>Hello?</p>"
//! [44bis]
+//! [44ter]
+void process(const QByteArray &);
+
+if (auto result = QByteArray::fromBase64Encoding(encodedData))
+ process(*result);
+//! [44ter]
+
+//! [44quater]
+auto result = QByteArray::fromBase64Encoding(encodedData);
+if (result.decodingStatus == QByteArray::Base64DecodingStatus::Ok)
+ process(result.decoded);
+//! [44quater]
+
//! [45]
QByteArray text = QByteArray::fromHex("517420697320677265617421");
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp
index e070ada069..d30ad50ffc 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qhash.cpp
@@ -119,22 +119,6 @@ hash.insert("plenty", 2000);
//! [9]
-//! [10]
-QList<int> values = hash.values("plenty");
-for (int i = 0; i < values.size(); ++i)
- cout << values.at(i) << Qt::endl;
-//! [10]
-
-
-//! [11]
-QHash<QString, int>::iterator i = hash.find("plenty");
-while (i != hash.end() && i.key() == "plenty") {
- cout << i.value() << Qt::endl;
- ++i;
-}
-//! [11]
-
-
//! [12]
QHash<QString, int> hash;
...
diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp
index 004a810fce..80859d5ba5 100644
--- a/src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_tools_qtimeline.cpp
@@ -56,10 +56,10 @@ progressBar->setRange(0, 100);
// Construct a 1-second timeline with a frame range of 0 - 100
QTimeLine *timeLine = new QTimeLine(1000, this);
timeLine->setFrameRange(0, 100);
-connect(timeLine, SIGNAL(frameChanged(int)), progressBar, SLOT(setValue(int)));
+connect(timeLine, &QTimeLine::frameChanged, progressBar, &QProgressBar::setValue);
// Clicking the push button will start the progress bar animation
pushButton = new QPushButton(tr("Start animation"), this);
-connect(pushButton, SIGNAL(clicked()), timeLine, SLOT(start()));
+connect(pushButton, &QPushButton::clicked, timeLine, &QTimeLine::start);
...
//! [0]
diff --git a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp
index e91c41b305..879cdbe329 100644
--- a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp
+++ b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp
@@ -48,11 +48,10 @@
**
****************************************************************************/
-#include <QtGui>
-#include <QtWidgets>
-
#include "buttonwidget.h"
+#include <QtWidgets>
+
//! [0]
ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
: QWidget(parent)
@@ -62,15 +61,15 @@ ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
QGridLayout *gridLayout = new QGridLayout;
for (int i = 0; i < texts.size(); ++i) {
QPushButton *button = new QPushButton(texts[i]);
- connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
+ connect(button, &QPushButton::clicked, signalMapper, &QSignalMapper::map);
//! [0] //! [1]
signalMapper->setMapping(button, texts[i]);
gridLayout->addWidget(button, i / 3, i % 3);
}
- connect(signalMapper, SIGNAL(mapped(QString)),
+ connect(signalMapper, &QSignalMapper::mappedString,
//! [1] //! [2]
- this, SIGNAL(clicked(QString)));
+ this, &ButtonWidget::clicked);
setLayout(gridLayout);
}
@@ -84,7 +83,7 @@ ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
for (int i = 0; i < texts.size(); ++i) {
QString text = texts[i];
QPushButton *button = new QPushButton(text);
- connect(button, &QPushButton::clicked, [=] { clicked(text); });
+ connect(button, &QPushButton::clicked, [this, text] { clicked(text); });
gridLayout->addWidget(button, i / 3, i % 3);
}
setLayout(gridLayout);
diff --git a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h
index f55683c2d5..b9d59f8dd8 100644
--- a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h
+++ b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h
@@ -51,7 +51,7 @@
#ifndef BUTTONWIDGET_H
#define BUTTONWIDGET_H
-#include <qwidget.h>
+#include <QWidget>
class QSignalMapper;
class QString;
@@ -63,7 +63,7 @@ class ButtonWidget : public QWidget
Q_OBJECT
public:
- ButtonWidget(const QStringList &texts, QWidget *parent = 0);
+ ButtonWidget(const QStringList &texts, QWidget *parent = nullptr);
signals:
void clicked(const QString &text);
diff --git a/src/corelib/doc/snippets/resource-system/mainwindow.cpp b/src/corelib/doc/snippets/resource-system/mainwindow.cpp
index 86e93aaa62..6dc525304c 100644
--- a/src/corelib/doc/snippets/resource-system/mainwindow.cpp
+++ b/src/corelib/doc/snippets/resource-system/mainwindow.cpp
@@ -68,10 +68,10 @@ MainWindow::MainWindow()
readSettings();
- connect(textEdit->document(), SIGNAL(contentsChanged()),
- this, SLOT(documentWasModified()));
+ connect(textEdit->document(), &QTextEdit::contentsChanged,
+ this, &QAction::documentWasModified);
- setCurrentFile("");
+ setCurrentFile(QString());
setUnifiedTitleAndToolBarOnMac(true);
}
//! [2]
@@ -95,7 +95,7 @@ void MainWindow::newFile()
{
if (maybeSave()) {
textEdit->clear();
- setCurrentFile("");
+ setCurrentFile(QString());
}
}
//! [6]
@@ -162,31 +162,31 @@ void MainWindow::createActions()
newAct = new QAction(QIcon(":/images/new.png"), tr("&New"), this);
newAct->setShortcuts(QKeySequence::New);
newAct->setStatusTip(tr("Create a new file"));
- connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
+ connect(newAct, &QAction::triggered, this, &MainWindow::newFile);
//! [19]
openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this);
openAct->setShortcuts(QKeySequence::Open);
openAct->setStatusTip(tr("Open an existing file"));
- connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
+ connect(openAct, &QAction::triggered, this, &MainWindow::open);
//! [18] //! [19]
saveAct = new QAction(QIcon(":/images/save.png"), tr("&Save"), this);
saveAct->setShortcuts(QKeySequence::Save);
saveAct->setStatusTip(tr("Save the document to disk"));
- connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));
+ connect(saveAct, &QAction::triggered, this, &MainWindow::save);
saveAsAct = new QAction(tr("Save &As..."), this);
saveAsAct->setShortcuts(QKeySequence::SaveAs);
saveAsAct->setStatusTip(tr("Save the document under a new name"));
- connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));
+ connect(saveAsAct, &QAction::triggered, this, &MainWindow::saveAs);
//! [20]
exitAct = new QAction(tr("E&xit"), this);
exitAct->setShortcuts(QKeySequence::Quit);
//! [20]
exitAct->setStatusTip(tr("Exit the application"));
- connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
+ connect(exitAct, &QAction::triggered, this, &MainWindow::close);
//! [21]
cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this);
@@ -194,38 +194,38 @@ void MainWindow::createActions()
cutAct->setShortcuts(QKeySequence::Cut);
cutAct->setStatusTip(tr("Cut the current selection's contents to the "
"clipboard"));
- connect(cutAct, SIGNAL(triggered()), textEdit, SLOT(cut()));
+ connect(cutAct, &QAction::triggered, textEdit, &QTextEdit::cut);
copyAct = new QAction(QIcon(":/images/copy.png"), tr("&Copy"), this);
copyAct->setShortcuts(QKeySequence::Copy);
copyAct->setStatusTip(tr("Copy the current selection's contents to the "
"clipboard"));
- connect(copyAct, SIGNAL(triggered()), textEdit, SLOT(copy()));
+ connect(copyAct, &QAction::triggered, textEdit, &QTextEdit::copy);
pasteAct = new QAction(QIcon(":/images/paste.png"), tr("&Paste"), this);
pasteAct->setShortcuts(QKeySequence::Paste);
pasteAct->setStatusTip(tr("Paste the clipboard's contents into the current "
"selection"));
- connect(pasteAct, SIGNAL(triggered()), textEdit, SLOT(paste()));
+ connect(pasteAct, &QAction::triggered, textEdit, &QTextEdit::paste);
aboutAct = new QAction(tr("&About"), this);
aboutAct->setStatusTip(tr("Show the application's About box"));
- connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
+ connect(aboutAct, &QAction::triggered, this, &MainWindow::about);
//! [22]
aboutQtAct = new QAction(tr("About &Qt"), this);
aboutQtAct->setStatusTip(tr("Show the Qt library's About box"));
- connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
+ connect(aboutQtAct, &QAction::triggered, qApp, &QApplication::aboutQt);
//! [22]
//! [23]
cutAct->setEnabled(false);
//! [23] //! [24]
copyAct->setEnabled(false);
- connect(textEdit, SIGNAL(copyAvailable(bool)),
- cutAct, SLOT(setEnabled(bool)));
- connect(textEdit, SIGNAL(copyAvailable(bool)),
- copyAct, SLOT(setEnabled(bool)));
+ connect(textEdit, &QTextEdit::copyAvailable,
+ cutAct, &QAction::setEnabled);
+ connect(textEdit, &QTextEdit::copyAvailable,
+ copyAct, &QAction::setEnabled);
}
//! [24]
diff --git a/src/corelib/doc/snippets/statemachine/main.cpp b/src/corelib/doc/snippets/statemachine/main.cpp
index 8cd8b69e12..c399f4f199 100644
--- a/src/corelib/doc/snippets/statemachine/main.cpp
+++ b/src/corelib/doc/snippets/statemachine/main.cpp
@@ -48,13 +48,14 @@
**
****************************************************************************/
-#include <QtGui>
+#include <QtWidgets>
int main(int argv, char **args)
{
QApplication app(argv, args);
QLabel *label = new QLabel;
+ QPushButton *button = new QPushButton;
//![0]
QStateMachine machine;
@@ -70,14 +71,14 @@ int main(int argv, char **args)
//![4]
//![5]
- QObject::connect(s3, SIGNAL(entered()), button, SLOT(showMaximized()));
- QObject::connect(s3, SIGNAL(exited()), button, SLOT(showMinimized()));
+ QObject::connect(s3, &QState::entered, button, &QPushButton:showMaximized);
+ QObject::connect(s3, &QState::exited, button, &QPushButton::showMinimized);
//![5]
//![1]
- s1->addTransition(button, SIGNAL(clicked()), s2);
- s2->addTransition(button, SIGNAL(clicked()), s3);
- s3->addTransition(button, SIGNAL(clicked()), s1);
+ s1->addTransition(button, &QPushButton::clicked, s2);
+ s2->addTransition(button, &QPushButton::clicked, s3);
+ s3->addTransition(button, &QPushButton::clicked, s1);
//![1]
//![2]
diff --git a/src/corelib/doc/snippets/statemachine/main2.cpp b/src/corelib/doc/snippets/statemachine/main2.cpp
index 96eb912b14..dedd2d29bf 100644
--- a/src/corelib/doc/snippets/statemachine/main2.cpp
+++ b/src/corelib/doc/snippets/statemachine/main2.cpp
@@ -48,11 +48,11 @@
**
****************************************************************************/
-#include <QtGui>
+#include <QtWidgets>
int main(int argv, char **args)
{
- QApplication app(argv, args);
+ QApplication app(argv, args);
QStateMachine machine;
@@ -66,16 +66,17 @@ int main(int argv, char **args)
//![0]
//![2]
- s12->addTransition(quitButton, SIGNAL(clicked()), s12);
+ s12->addTransition(quitButton, &QPushButton::clicked, s12);
//![2]
//![1]
QFinalState *s2 = new QFinalState();
- s1->addTransition(quitButton, SIGNAL(clicked()), s2);
+ s1->addTransition(quitButton, &QPushButton::clicked, s2);
machine.addState(s2);
machine.setInitialState(s1);
- QObject::connect(&machine, SIGNAL(finished()), QApplication::instance(), SLOT(quit()));
+ QObject::connect(&machine, &QStateMachine::finished,
+ QCoreApplication::instance(), &QCoreApplication::quit);
//![1]
QButton *interruptButton = new QPushButton("Interrupt Button");
@@ -90,11 +91,11 @@ int main(int argv, char **args)
mbox->addButton(QMessageBox::Ok);
mbox->setText("Interrupted!");
mbox->setIcon(QMessageBox::Information);
- QObject::connect(s3, SIGNAL(entered()), mbox, SLOT(exec()));
+ QObject::connect(s3, &QState::entered, mbox, &QMessageBox::exec);
s3->addTransition(s1h);
machine.addState(s3);
- s1->addTransition(interruptButton, SIGNAL(clicked()), s3);
+ s1->addTransition(interruptButton, &QPushButton::clicked, s3);
//![3]
return app.exec();
diff --git a/src/corelib/doc/snippets/statemachine/main3.cpp b/src/corelib/doc/snippets/statemachine/main3.cpp
index bc9a0e29c4..b665565aef 100644
--- a/src/corelib/doc/snippets/statemachine/main3.cpp
+++ b/src/corelib/doc/snippets/statemachine/main3.cpp
@@ -62,7 +62,7 @@ int main(int argv, char **args)
//![0]
//![1]
- s1->addTransition(s1, SIGNAL(finished()), s2);
+ s1->addTransition(s1, &QState::finished, s2);
//![1]
return app.exec();
diff --git a/src/corelib/doc/snippets/statemachine/main5.cpp b/src/corelib/doc/snippets/statemachine/main5.cpp
index 38bb2cb475..d701f51e2b 100644
--- a/src/corelib/doc/snippets/statemachine/main5.cpp
+++ b/src/corelib/doc/snippets/statemachine/main5.cpp
@@ -98,7 +98,7 @@ int main(int argv, char **args)
s1->assignProperty(button, "geometry", QRectF(0, 0, 50, 50));
s2->assignProperty(button, "geometry", QRectF(0, 0, 100, 100));
- s1->addTransition(button, SIGNAL(clicked()), s2);
+ s1->addTransition(button, &QPushButton::clicked, s2);
//![3]
}
@@ -111,7 +111,7 @@ int main(int argv, char **args)
s1->assignProperty(button, "geometry", QRectF(0, 0, 50, 50));
s2->assignProperty(button, "geometry", QRectF(0, 0, 100, 100));
- QSignalTransition *transition = s1->addTransition(button, SIGNAL(clicked()), s2);
+ QSignalTransition *transition = s1->addTransition(button, &QPushButton::clicked, s2);
transition->addAnimation(new QPropertyAnimation(button, "geometry"));
//![4]
@@ -130,9 +130,9 @@ int main(int argv, char **args)
QState *s2 = new QState();
s2->assignProperty(button, "geometry", QRectF(0, 0, 50, 50));
- connect(s2, SIGNAL(entered()), messageBox, SLOT(exec()));
+ connect(s2, &QState::entered, messageBox, SLOT(exec()));
- s1->addTransition(button, SIGNAL(clicked()), s2);
+ s1->addTransition(button, &QPushButton::clicked, s2);
//![5]
}
@@ -151,10 +151,10 @@ int main(int argv, char **args)
s2->assignProperty(button, "geometry", QRectF(0, 0, 50, 50));
QState *s3 = new QState();
- connect(s3, SIGNAL(entered()), messageBox, SLOT(exec()));
+ connect(s3, &QState::entered, messageBox, SLOT(exec()));
- s1->addTransition(button, SIGNAL(clicked()), s2);
- s2->addTransition(s2, SIGNAL(propertiesAssigned()), s3);
+ s1->addTransition(button, &QPushButton::clicked, s2);
+ s2->addTransition(s2, &QState::propertiesAssigned, s3);
//![6]
}
diff --git a/src/corelib/doc/snippets/timers/analogclock.cpp b/src/corelib/doc/snippets/timers/analogclock.cpp
index 4e1957a450..3edfce3235 100644
--- a/src/corelib/doc/snippets/timers/analogclock.cpp
+++ b/src/corelib/doc/snippets/timers/analogclock.cpp
@@ -61,7 +61,7 @@ AnalogClock::AnalogClock(QWidget *parent)
//! [3] //! [4]
QTimer *timer = new QTimer(this);
//! [4] //! [5]
- connect(timer, SIGNAL(timeout()), this, SLOT(update()));
+ connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update));
//! [5] //! [6]
timer->start(1000);
//! [6]
diff --git a/src/corelib/doc/snippets/timers/timers.cpp b/src/corelib/doc/snippets/timers/timers.cpp
index 5f95899af2..eb0c82c625 100644
--- a/src/corelib/doc/snippets/timers/timers.cpp
+++ b/src/corelib/doc/snippets/timers/timers.cpp
@@ -61,13 +61,13 @@ Foo::Foo()
//! [0]
QTimer *timer = new QTimer(this);
//! [0] //! [1]
- connect(timer, SIGNAL(timeout()), this, SLOT(updateCaption()));
+ connect(timer, &QTimer::timeout, this, &Foo::updateCaption);
//! [1] //! [2]
timer->start(1000);
//! [2]
//! [3]
- QTimer::singleShot(200, this, SLOT(updateCaption()));
+ QTimer::singleShot(200, this, &Foo::updateCaption);
//! [3]
{
@@ -75,7 +75,7 @@ Foo::Foo()
//! [4]
QTimer *timer = new QTimer(this);
//! [4] //! [5]
- connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));
+ connect(timer, &QTimer::timeout, this, &Foo::processOneThing);
//! [5] //! [6]
timer->start();
//! [6]
diff --git a/src/corelib/doc/src/animation.qdoc b/src/corelib/doc/src/animation.qdoc
index 0c1b2aed17..9cbe50d4a9 100644
--- a/src/corelib/doc/src/animation.qdoc
+++ b/src/corelib/doc/src/animation.qdoc
@@ -356,11 +356,11 @@
state2->assignProperty(button, "geometry", QRect(250, 250, 100, 30));
QSignalTransition *transition1 = state1->addTransition(button,
- SIGNAL(clicked()), state2);
+ &QPushButton::clicked, state2);
transition1->addAnimation(new QPropertyAnimation(button, "geometry"));
QSignalTransition *transition2 = state2->addTransition(button,
- SIGNAL(clicked()), state1);
+ &QPushButton::clicked, state1);
transition2->addAnimation(new QPropertyAnimation(button, "geometry"));
machine->start();
diff --git a/src/corelib/doc/src/objectmodel/properties.qdoc b/src/corelib/doc/src/objectmodel/properties.qdoc
index 9ef08cce07..680e5598f0 100644
--- a/src/corelib/doc/src/objectmodel/properties.qdoc
+++ b/src/corelib/doc/src/objectmodel/properties.qdoc
@@ -144,6 +144,12 @@
optimizations in some cases, but is not enforced by moc. Care must be taken
never to override a \c FINAL property.
+ \li The presence of the \c REQUIRED attribute indicates that the property
+ should be set by a user of the class. This is not enforced by moc, and is
+ mostly useful for classes exposed to QML. In QML, classes with REQUIRED
+ properties cannot be instantiated unless all REQUIRED properties have
+ been set.
+
\endlist
The \c READ, \c WRITE, and \c RESET functions can be inherited.
diff --git a/src/corelib/doc/src/statemachine.qdoc b/src/corelib/doc/src/statemachine.qdoc
index 43c8497ef2..881a0785c6 100644
--- a/src/corelib/doc/src/statemachine.qdoc
+++ b/src/corelib/doc/src/statemachine.qdoc
@@ -323,12 +323,12 @@
QState *s1 = new QState(&machine);
QPushButton button;
- QSignalTransition *trans = new QSignalTransition(&button, SIGNAL(clicked()));
+ QSignalTransition *trans = new QSignalTransition(&button, &QPushButton::clicked);
s1->addTransition(trans);
QMessageBox msgBox;
msgBox.setText("The button was clicked; carry on.");
- QObject::connect(trans, SIGNAL(triggered()), &msgBox, SLOT(exec()));
+ QObject::connect(trans, QSignalTransition::triggered, &msgBox, &QMessageBox::exec);
machine.setInitialState(s1);
\endcode
diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h
index 1ea4e7d287..aa38ef18c0 100644
--- a/src/corelib/global/qcompilerdetection.h
+++ b/src/corelib/global/qcompilerdetection.h
@@ -365,7 +365,6 @@
# define Q_COMPILER_ATTRIBUTES
# define Q_COMPILER_AUTO_FUNCTION
# define Q_COMPILER_CLASS_ENUM
-# define Q_COMPILER_CONSTEXPR
# define Q_COMPILER_DECLTYPE
# define Q_COMPILER_DEFAULT_MEMBERS
# define Q_COMPILER_DELETE_MEMBERS
diff --git a/src/corelib/global/qconfig-bootstrapped.h b/src/corelib/global/qconfig-bootstrapped.h
index c6f071bc3f..b3daf43c04 100644
--- a/src/corelib/global/qconfig-bootstrapped.h
+++ b/src/corelib/global/qconfig-bootstrapped.h
@@ -74,6 +74,9 @@
#else
# define QT_FEATURE_alloca_malloc_h -1
#endif
+#define QT_FEATURE_binaryjson -1
+#define QT_FEATURE_cborstreamreader -1
+#define QT_FEATURE_cborstreamwriter 1
#define QT_CRYPTOGRAPHICHASH_ONLY_SHA1
#define QT_FEATURE_cxx11_random (__has_include(<random>) ? 1 : -1)
#define QT_NO_DATASTREAM
diff --git a/src/corelib/global/qflags.h b/src/corelib/global/qflags.h
index bd3c219968..4f46de5eaa 100644
--- a/src/corelib/global/qflags.h
+++ b/src/corelib/global/qflags.h
@@ -93,8 +93,10 @@ class QFlags
"long long will overflow.");
Q_STATIC_ASSERT_X((std::is_enum<Enum>::value), "QFlags is only usable on enumeration types.");
+#if QT_DEPRECATED_SINCE(5,15)
struct Private;
typedef int (Private::*Zero);
+#endif
template <typename E> friend QDataStream &operator>>(QDataStream &, QFlags<E> &);
template <typename E> friend QDataStream &operator<<(QDataStream &, QFlags<E>);
public:
@@ -115,8 +117,11 @@ public:
Q_DECL_CONSTEXPR inline QFlags(const QFlags &other);
Q_DECL_CONSTEXPR inline QFlags &operator=(const QFlags &other);
#endif
+ Q_DECL_CONSTEXPR inline QFlags() noexcept : i(0) {}
Q_DECL_CONSTEXPR inline QFlags(Enum flags) noexcept : i(Int(flags)) {}
- Q_DECL_CONSTEXPR inline QFlags(Zero = nullptr) noexcept : i(0) {}
+#if QT_DEPRECATED_SINCE(5,15)
+ QT_DEPRECATED_X("Use default constructor instead") Q_DECL_CONSTEXPR inline QFlags(Zero) noexcept : i(0) {}
+#endif
Q_DECL_CONSTEXPR inline QFlags(QFlag flag) noexcept : i(flag) {}
Q_DECL_CONSTEXPR inline QFlags(std::initializer_list<Enum> flags) noexcept
diff --git a/src/corelib/global/qfloat16.cpp b/src/corelib/global/qfloat16.cpp
index 0c9bb80cb2..80a851e4e4 100644
--- a/src/corelib/global/qfloat16.cpp
+++ b/src/corelib/global/qfloat16.cpp
@@ -146,6 +146,14 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \since 5.15
+ \fn qfloat16::copySign(qfloat16 sign) const noexcept
+
+ Returns a qfloat16 with the sign of \a sign but the rest of its value taken
+ from this qfloat16. Serves as qfloat16's equivalent of std::copysign().
+*/
+
+/*!
\internal
\since 5.14
Implements qFpClassify() for qfloat16.
diff --git a/src/corelib/global/qfloat16.h b/src/corelib/global/qfloat16.h
index 02fd2f03cc..f35eefd922 100644
--- a/src/corelib/global/qfloat16.h
+++ b/src/corelib/global/qfloat16.h
@@ -84,6 +84,9 @@ public:
bool isNaN() const noexcept { return ((b16 >> 8) & 0x7e) == 0x7e; }
bool isFinite() const noexcept { return ((b16 >> 8) & 0x7c) != 0x7c; }
Q_CORE_EXPORT int fpClassify() const noexcept;
+ // Can't specialize std::copysign() for qfloat16
+ qfloat16 copySign(qfloat16 sign) const noexcept
+ { return qfloat16(Wrap((sign.b16 & 0x8000) | (b16 & 0x7fff))); }
// Support for std::numeric_limits<qfloat16>
static constexpr qfloat16 _limit_epsilon() noexcept { return qfloat16(Wrap(0x1400)); }
static constexpr qfloat16 _limit_min() noexcept { return qfloat16(Wrap(0x400)); }
@@ -92,7 +95,9 @@ public:
static constexpr qfloat16 _limit_lowest() noexcept { return qfloat16(Wrap(0xfbff)); }
static constexpr qfloat16 _limit_infinity() noexcept { return qfloat16(Wrap(0x7c00)); }
static constexpr qfloat16 _limit_quiet_NaN() noexcept { return qfloat16(Wrap(0x7e00)); }
- // Signalling NaN is 0x7f00
+#if QT_CONFIG(signaling_nan)
+ static constexpr qfloat16 _limit_signaling_NaN() noexcept { return qfloat16(Wrap(0x7f00)); }
+#endif
inline constexpr bool isNormal() const noexcept
{ return (b16 & 0x7fff) == 0 || ((b16 & 0x7c00) && (b16 & 0x7c00) != 0x7c00); }
private:
@@ -328,6 +333,12 @@ public:
{ return QT_PREPEND_NAMESPACE(qfloat16)::_limit_infinity(); }
static constexpr QT_PREPEND_NAMESPACE(qfloat16) quiet_NaN()
{ return QT_PREPEND_NAMESPACE(qfloat16)::_limit_quiet_NaN(); }
+#if QT_CONFIG(signaling_nan)
+ static constexpr QT_PREPEND_NAMESPACE(qfloat16) signaling_NaN()
+ { return QT_PREPEND_NAMESPACE(qfloat16)::_limit_signaling_NaN(); }
+#else
+ static constexpr bool has_signaling_NaN = false;
+#endif
};
template<> class numeric_limits<const QT_PREPEND_NAMESPACE(qfloat16)>
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index c145c46f78..0f7ba8580e 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -139,10 +139,12 @@ Q_CORE_EXPORT void *qMemSet(void *dest, int c, size_t n);
// in. The idea here is to error or warn if otherwise implicit Qt
// assumptions are not fulfilled on new hardware or compilers
// (if this list becomes too long, consider factoring into a separate file)
-Q_STATIC_ASSERT_X(sizeof(int) == 4, "Qt assumes that int is 32 bits");
Q_STATIC_ASSERT_X(UCHAR_MAX == 255, "Qt assumes that char is 8 bits");
+Q_STATIC_ASSERT_X(sizeof(int) == 4, "Qt assumes that int is 32 bits");
Q_STATIC_ASSERT_X(QT_POINTER_SIZE == sizeof(void *), "QT_POINTER_SIZE defined incorrectly");
Q_STATIC_ASSERT_X(sizeof(float) == 4, "Qt assumes that float is 32 bits");
+Q_STATIC_ASSERT_X(sizeof(char16_t) == 2, "Qt assumes that char16_t is 16 bits");
+Q_STATIC_ASSERT_X(sizeof(char32_t) == 4, "Qt assumes that char32_t is 32 bits");
// While we'd like to check for __STDC_IEC_559__, as per ISO/IEC 9899:2011
// Annex F (C11, normative for C++11), there are a few corner cases regarding
@@ -250,7 +252,7 @@ Q_STATIC_ASSERT((std::is_same<qsizetype, qptrdiff>::value));
Qt::Alignment type is simply a typedef for
QFlags<Qt::AlignmentFlag>. QLabel::setAlignment() takes a
Qt::Alignment parameter, which means that any combination of
- Qt::AlignmentFlag values, or 0, is legal:
+ Qt::AlignmentFlag values, or \c{{ }}, is legal:
\snippet code/src_corelib_global_qglobal.cpp 0
@@ -318,10 +320,20 @@ Q_STATIC_ASSERT((std::is_same<qsizetype, qptrdiff>::value));
*/
/*!
+ \fn template <typename Enum> QFlags<Enum>::QFlags()
+ \since 5.15
+
+ Constructs a QFlags object with no flags set.
+*/
+
+/*!
\fn template <typename Enum> QFlags<Enum>::QFlags(Zero)
+ \deprecated
Constructs a QFlags object with no flags set. The parameter must be a
literal 0 value.
+
+ Deprecated, use default constructor instead.
*/
/*!
@@ -690,7 +702,7 @@ Q_STATIC_ASSERT((std::is_same<qsizetype, qptrdiff>::value));
64-bit integer literals in a platform-independent way. The
Q_CHECK_PTR() macro prints a warning containing the source code's
file name and line number, saying that the program ran out of
- memory, if the pointer is 0. The qPrintable() and qUtf8Printable()
+ memory, if the pointer is \nullptr. The qPrintable() and qUtf8Printable()
macros represent an easy way of printing text.
The QT_POINTER_SIZE macro expands to the size of a pointer in bytes.
@@ -3251,7 +3263,7 @@ QByteArray QSysInfo::bootUniqueId()
\macro void Q_CHECK_PTR(void *pointer)
\relates <QtGlobal>
- If \a pointer is 0, prints a message containing the source
+ If \a pointer is \nullptr, prints a message containing the source
code's file name and line number, saying that the program ran out
of memory and aborts program execution. It throws \c std::bad_alloc instead
if exceptions are enabled.
@@ -4770,9 +4782,11 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
/*!
\macro qMove(x)
\relates <QtGlobal>
+ \obsolete
- It expands to "std::move" if your compiler supports that C++11 function, or to nothing
- otherwise.
+ Use \c std::move instead.
+
+ It expands to "std::move".
qMove takes an rvalue reference to its parameter \a x, and converts it to an xvalue.
*/
@@ -4873,6 +4887,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
/*!
\macro Q_DECL_OVERRIDE
\since 5.0
+ \obsolete
\relates <QtGlobal>
This macro can be used to declare an overriding virtual
@@ -4880,8 +4895,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
an error if the overriding virtual function does not in fact
override anything.
- It expands to "override" if your compiler supports that C++11
- contextual keyword, or to nothing otherwise.
+ It expands to "override".
The macro goes at the end of the function, usually after the
\c{const}, if any:
@@ -4893,6 +4907,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
/*!
\macro Q_DECL_FINAL
\since 5.0
+ \obsolete
\relates <QtGlobal>
This macro can be used to declare an overriding virtual or a class
@@ -4900,10 +4915,7 @@ bool QInternal::activateCallbacks(Callback cb, void **parameters)
no longer override this virtual function, or inherit from this
class, respectively.
- It expands to "final" if your compiler supports that C++11
- contextual keyword, or something non-standard if your compiler
- supports something close enough to the C++11 semantics, or to
- nothing otherwise.
+ It expands to "final".
The macro goes at the end of the function, usually after the
\c{const}, if any:
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index fe8e8e8bc8..35c0482768 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -1272,8 +1272,10 @@ inline int qIntCast(float f) { return int(f); }
/*
Reentrant versions of basic rand() functions for random number generation
*/
-Q_CORE_EXPORT void qsrand(uint seed);
-Q_CORE_EXPORT int qrand();
+#if QT_DEPRECATED_SINCE(5, 15)
+Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_5_15("use QRandomGenerator instead") void qsrand(uint seed);
+Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_5_15("use QRandomGenerator instead") int qrand();
+#endif
#define QT_MODULE(x)
diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp
index 7d6beaf9c2..835fea0c77 100644
--- a/src/corelib/global/qlibraryinfo.cpp
+++ b/src/corelib/global/qlibraryinfo.cpp
@@ -124,12 +124,12 @@ public:
QLibrarySettings *ls = qt_library_settings();
if (ls) {
#ifndef QT_BUILD_QMAKE
- if (ls->reloadOnQAppAvailable && QCoreApplication::instance() != 0)
+ if (ls->reloadOnQAppAvailable && QCoreApplication::instance() != nullptr)
ls->load();
#endif
return ls->settings.data();
} else {
- return 0;
+ return nullptr;
}
}
};
@@ -146,7 +146,7 @@ void QLibrarySettings::load()
// If we get any settings here, those won't change when the application shows up.
settings.reset(QLibraryInfoPrivate::findConfiguration());
#ifndef QT_BUILD_QMAKE
- reloadOnQAppAvailable = (settings.data() == 0 && QCoreApplication::instance() == 0);
+ reloadOnQAppAvailable = (settings.data() == nullptr && QCoreApplication::instance() == nullptr);
bool haveDevicePaths;
bool haveEffectivePaths;
bool havePaths;
@@ -169,7 +169,7 @@ void QLibrarySettings::load()
|| children.contains(QLatin1String("Paths"));
#ifndef QT_BUILD_QMAKE
if (!havePaths)
- settings.reset(0);
+ settings.reset(nullptr);
#else
} else {
haveDevicePaths = false;
@@ -212,7 +212,7 @@ QSettings *QLibraryInfoPrivate::findConfiguration()
return new QSettings(qtconfig, QSettings::IniFormat);
}
#endif
- return 0; //no luck
+ return nullptr; //no luck
}
#endif // settings
@@ -792,7 +792,12 @@ QLibraryInfo::rawLocation(LibraryLocation loc, PathGroup group)
#ifndef QT_BUILD_QMAKE_BOOTSTRAP
if (!fromConf) {
- const char * volatile path = 0;
+ // "volatile" here is a hack to prevent compilers from doing a
+ // compile-time strlen() on "path". The issue is that Qt installers
+ // will binary-patch the Qt installation paths -- in such scenarios, Qt
+ // will be built with a dummy path, thus the compile-time result of
+ // strlen is meaningless.
+ const char * volatile path = nullptr;
if (loc == PrefixPath) {
path = getPrefix(
#ifdef QT_BUILD_QMAKE
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp
index c1dd04f03c..89f49324c0 100644
--- a/src/corelib/global/qlogging.cpp
+++ b/src/corelib/global/qlogging.cpp
@@ -1315,7 +1315,7 @@ static QStringList backtraceFramesForLogMessage(int frameCount)
if (function.startsWith(QLatin1String("_Z"))) {
QScopedPointer<char, QScopedPointerPodDeleter> demangled(
- abi::__cxa_demangle(function.toUtf8(), 0, 0, 0));
+ abi::__cxa_demangle(function.toUtf8(), nullptr, nullptr, nullptr));
if (demangled)
function = QString::fromUtf8(qCleanupFuncinfo(demangled.data()));
}
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
index 810c55709c..ea2c635303 100644
--- a/src/corelib/global/qnamespace.h
+++ b/src/corelib/global/qnamespace.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -523,6 +523,7 @@ public:
AA_DontUseNativeMenuBar = 6,
AA_MacDontSwapCtrlAndMeta = 7,
AA_Use96Dpi = 8,
+ AA_MSWindowsDisableVirtualKeyboard = 9,
#if QT_DEPRECATED_SINCE(5, 14)
AA_X11InitThreads Q_DECL_ENUMERATOR_DEPRECATED = 10,
#endif
@@ -1266,14 +1267,16 @@ public:
enum DateFormat {
TextDate, // default Qt
ISODate, // ISO 8601
- SystemLocaleDate, // deprecated
- LocalDate = SystemLocaleDate, // deprecated
- LocaleDate, // deprecated
- SystemLocaleShortDate,
- SystemLocaleLongDate,
- DefaultLocaleShortDate,
- DefaultLocaleLongDate,
- RFC2822Date, // RFC 2822 (+ 850 and 1036 during parsing)
+#if QT_DEPRECATED_SINCE(5, 15)
+ SystemLocaleDate Q_DECL_ENUMERATOR_DEPRECATED_X("Use QLocale"),
+ LocalDate Q_DECL_ENUMERATOR_DEPRECATED_X("Use QLocale") = 2, // i.e. SystemLocaleDate
+ LocaleDate Q_DECL_ENUMERATOR_DEPRECATED_X("Use QLocale"),
+ SystemLocaleShortDate Q_DECL_ENUMERATOR_DEPRECATED_X("Use QLocale"),
+ SystemLocaleLongDate Q_DECL_ENUMERATOR_DEPRECATED_X("Use QLocale"),
+ DefaultLocaleShortDate Q_DECL_ENUMERATOR_DEPRECATED_X("Use QLocale"),
+ DefaultLocaleLongDate Q_DECL_ENUMERATOR_DEPRECATED_X("Use QLocale"),
+#endif
+ RFC2822Date = 8, // RFC 2822 (+ 850 and 1036 during parsing)
ISODateWithMs
};
@@ -1575,9 +1578,12 @@ public:
MatchContains = 1,
MatchStartsWith = 2,
MatchEndsWith = 3,
- MatchRegExp = 4,
+#if QT_DEPRECATED_SINCE(5, 15)
+ MatchRegExp Q_DECL_ENUMERATOR_DEPRECATED_X("MatchRegExp is deprecated. Use MatchRegularExpression instead") = 4,
+#endif
MatchWildcard = 5,
MatchFixedString = 8,
+ MatchRegularExpression = 9,
MatchCaseSensitive = 16,
MatchWrap = 32,
MatchRecursive = 64
@@ -1763,6 +1769,9 @@ public:
PassThrough
};
+ // QTBUG-48701
+ enum ReturnByValue_t { ReturnByValue }; // ### Qt 7: Remove me
+
#ifndef Q_QDOC
// NOTE: Generally, do not add QT_Q_ENUM if a corresponding Q_Q_FLAG exists.
QT_Q_ENUM(ScrollBarPolicy)
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc
index 31e1bcc0da..6a84662323 100644
--- a/src/corelib/global/qnamespace.qdoc
+++ b/src/corelib/global/qnamespace.qdoc
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
@@ -293,6 +293,12 @@
This attribute must be set before QGuiApplication is constructed.
This value was added in 5.13
+ \value AA_MSWindowsDisableVirtualKeyboard When this attribute is set,
+ Windows' native on-screen virtual keyboard will not be shown
+ automatically when a text input widget gains focus on a system
+ without a physical keyboard.
+ This value was added in 5.15
+
The following values are deprecated or obsolete:
\value AA_ImmediateWidgetCreation This attribute is no longer fully
@@ -703,26 +709,38 @@
\value ISODateWithMs \l{ISO 8601} extended format, including milliseconds if applicable.
- \value SystemLocaleShortDate The \l{QLocale::ShortFormat}{short format} used
- by the \l{QLocale::system()}{operating system}.
+ \value SystemLocaleShortDate \e{This enum value is deprecated and
+ shall be removed in Qt 6.} Use QLocale's methods for converting
+ dates and times to and from strings, with the
+ \l{QLocale::ShortFormat}{short format} of
+ \l{QLocale::system()}{the locale used by the operating system}.
- \value SystemLocaleLongDate The \l{QLocale::LongFormat}{long format} used
- by the \l{QLocale::system()}{operating system}.
+ \value SystemLocaleLongDate \e{This enum value is deprecated and
+ shall be removed in Qt 6.} Use QLocale's methods for converting
+ dates and times to and from strings, with the
+ \l{QLocale::LongFormat}{long format} of \l{QLocale::system()}{the
+ locale used by the operating system}.
- \value DefaultLocaleShortDate The \l{QLocale::ShortFormat}{short format} specified
- by the \l{QLocale::setDefault()}{application's locale}.
+ \value DefaultLocaleShortDate \e{This enum value is deprecated and
+ shall be removed in Qt 6.} Use QLocale's methods for converting
+ dates and times to and from strings, with the
+ \l{QLocale::ShortFormat}{short format} of
+ \l{QLocale::setDefault()}{the application's locale}.
- \value DefaultLocaleLongDate The \l{QLocale::LongFormat}{long format} used
- by the \l{QLocale::setDefault()}{application's locale}.
+ \value DefaultLocaleLongDate \e{This enum value is deprecated and
+ shall be removed in Qt 6.} Use QLocale's methods for converting
+ dates and times to and from strings, with the
+ \l{QLocale::LongFormat}{long format} \l{QLocale::setDefault()}{the
+ application's locale}.
- \value SystemLocaleDate \e{This enum value is deprecated.} Use Qt::SystemLocaleShortDate
- instead (or Qt::SystemLocaleLongDate if you want long dates).
+ \value SystemLocaleDate \e{This enum value is deprecated and shall
+ be removed in Qt 6.} It is equivalent to SystemLocaleShortDate.
- \value LocaleDate \e{This enum value is deprecated.} Use Qt::DefaultLocaleShortDate
- instead (or Qt::DefaultLocaleLongDate if you want long dates).
+ \value LocaleDate \e{This enum value is deprecated and shall be
+ removed in Qt 6.} It is equivalent to DefaultLocaleShortDate.
- \value LocalDate \e{This enum value is deprecated.} Use Qt::SystemLocaleShortDate
- instead (or Qt::SystemLocaleLongDate if you want long dates).
+ \value LocalDate \e{This enum value is deprecated and shall be
+ removed in Qt 6.} It is equivalent to SystemLocaleShortDate.
\value RFC2822Date \l{RFC 2822}, \l{RFC 850} and \l{RFC 1036} format:
either \c{[ddd,] dd MMM yyyy [hh:mm[:ss]][ ±tzoff]}
@@ -2849,24 +2867,32 @@
This enum describes the type of matches that can be used when searching
for items in a model.
- \value MatchExactly Performs QVariant-based matching.
- \value MatchFixedString Performs string-based matching.
+ \value MatchExactly Performs QVariant-based matching.
+ \value MatchFixedString Performs string-based matching.
String-based comparisons are case-insensitive unless the
\c MatchCaseSensitive flag is also specified.
- \value MatchContains The search term is contained in the item.
- \value MatchStartsWith The search term matches the start of the item.
- \value MatchEndsWith The search term matches the end of the item.
- \value MatchCaseSensitive The search is case sensitive.
- \value MatchRegExp Performs string-based matching using a regular
- expression as the search term.
- \value MatchWildcard Performs string-based matching using a string with
+ \value MatchContains The search term is contained in the item.
+ \value MatchStartsWith The search term matches the start of the item.
+ \value MatchEndsWith The search term matches the end of the item.
+ \value MatchCaseSensitive The search is case sensitive.
+ \value MatchRegExp Performs string-based matching using a regular
+ expression as the search term. Uses the deprecated QRegExp class.
+ \e{This enum value is deprecated since Qt 5.15.}
+ \value MatchRegularExpression Performs string-based matching using a regular
+ expression as the search term. Uses QRegularExpression.
+ When using this flag, a QRegularExpression object can be passed as
+ parameter and will directly be used to perform the search. The case
+ sensitivity flag will be ignored as the QRegularExpression object is
+ expected to be fully configured.
+ This enum value was added in Qt 5.15.
+ \value MatchWildcard Performs string-based matching using a string with
wildcards as the search term.
- \value MatchWrap Perform a search that wraps around, so that when
+ \value MatchWrap Perform a search that wraps around, so that when
the search reaches the last item in the model, it begins again at
the first item and continues until all items have been examined.
- \value MatchRecursive Searches the entire hierarchy.
+ \value MatchRecursive Searches the entire hierarchy.
- \sa QString::compare(), QRegExp
+ \sa QString::compare(), QRegExp, QRegularExpression
*/
/*!
@@ -3306,3 +3332,15 @@
\value RoundPreferFloor Round up for .75 and above.
\value PassThrough Don't round.
*/
+
+/*!
+ \enum Qt::ReturnByValue_t
+ \since 5.15
+
+ This is a dummy type, designed to help users transition from certain deprecated APIs to their replacement APIs.
+
+ \sa QCursor::bitmap()
+ \sa QCursor::mask()
+ \sa QLabel::picture()
+ \sa QLabel::pixmap()
+*/
diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri
index fe81689932..a33ffe75f2 100644
--- a/src/corelib/io/io.pri
+++ b/src/corelib/io/io.pri
@@ -136,6 +136,7 @@ qtConfig(settings) {
} else: darwin:!nacl {
SOURCES += io/qsettings_mac.cpp
}
+ wasm : SOURCES += io/qsettings_wasm.cpp
}
win32 {
@@ -182,7 +183,9 @@ win32 {
SOURCES += io/qstorageinfo_mac.cpp
qtConfig(processenvironment): \
OBJECTIVE_SOURCES += io/qprocess_darwin.mm
- OBJECTIVE_SOURCES += io/qstandardpaths_mac.mm
+ OBJECTIVE_SOURCES += \
+ io/qstandardpaths_mac.mm \
+ io/qfilesystemengine_mac.mm
osx {
LIBS += -framework DiskArbitration -framework IOKit
} else {
diff --git a/src/corelib/io/qabstractfileengine.cpp b/src/corelib/io/qabstractfileengine.cpp
index 8a1679c5af..070139b608 100644
--- a/src/corelib/io/qabstractfileengine.cpp
+++ b/src/corelib/io/qabstractfileengine.cpp
@@ -658,7 +658,7 @@ QStringList QAbstractFileEngine::entryList(QDir::Filters filters, const QStringL
QAbstractFileEngine::FileFlags QAbstractFileEngine::fileFlags(FileFlags type) const
{
Q_UNUSED(type);
- return nullptr;
+ return {};
}
/*!
diff --git a/src/corelib/io/qbuffer.cpp b/src/corelib/io/qbuffer.cpp
index 8e980733de..595fcd2724 100644
--- a/src/corelib/io/qbuffer.cpp
+++ b/src/corelib/io/qbuffer.cpp
@@ -227,7 +227,7 @@ QBuffer::~QBuffer()
\snippet buffer/buffer.cpp 4
- If \a byteArray is 0, the buffer creates its own internal
+ If \a byteArray is \nullptr, the buffer creates its own internal
QByteArray to work on. This byte array is initially empty.
\sa buffer(), setData(), open()
diff --git a/src/corelib/io/qdiriterator.cpp b/src/corelib/io/qdiriterator.cpp
index ce436b06e3..1cf6b1be08 100644
--- a/src/corelib/io/qdiriterator.cpp
+++ b/src/corelib/io/qdiriterator.cpp
@@ -181,7 +181,7 @@ QDirIteratorPrivate::QDirIteratorPrivate(const QFileSystemEntry &entry, const QS
#elif QT_CONFIG(regularexpression)
nameRegExps.reserve(nameFilters.size());
for (const auto &filter : nameFilters) {
- QString re = QRegularExpression::anchoredPattern(QRegularExpression::wildcardToRegularExpression(filter));
+ QString re = QRegularExpression::wildcardToRegularExpression(filter);
nameRegExps.append(
QRegularExpression(re, (filters & QDir::CaseSensitive) ? QRegularExpression::NoPatternOption : QRegularExpression::CaseInsensitiveOption));
}
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index 95f03ef816..5320ae2986 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -251,7 +251,7 @@ QFile::QFile(QFilePrivate &dd)
Constructs a QFile object.
*/
QFile::QFile()
- : QFileDevice(*new QFilePrivate, 0)
+ : QFileDevice(*new QFilePrivate, nullptr)
{
}
/*!
@@ -265,7 +265,7 @@ QFile::QFile(QObject *parent)
Constructs a new file object to represent the file with the given \a name.
*/
QFile::QFile(const QString &name)
- : QFileDevice(*new QFilePrivate, 0)
+ : QFileDevice(*new QFilePrivate, nullptr)
{
Q_D(QFile);
d->fileName = name;
diff --git a/src/corelib/io/qfiledevice.cpp b/src/corelib/io/qfiledevice.cpp
index ee619d99cc..b0aba3193c 100644
--- a/src/corelib/io/qfiledevice.cpp
+++ b/src/corelib/io/qfiledevice.cpp
@@ -202,7 +202,7 @@ QFileDevice::QFileDevice(QFileDevicePrivate &dd)
\internal
*/
QFileDevice::QFileDevice()
- : QIODevice(*new QFileDevicePrivate, 0)
+ : QIODevice(*new QFileDevicePrivate, nullptr)
{
}
/*!
diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp
index 89834de29f..3fe1aec41f 100644
--- a/src/corelib/io/qfileinfo.cpp
+++ b/src/corelib/io/qfileinfo.cpp
@@ -134,7 +134,7 @@ uint QFileInfoPrivate::getFileFlags(QAbstractFileEngine::FileFlags request) cons
// extra syscall. Bundle detecton on Mac can be slow, expecially on network
// paths, so we separate out that as well.
- QAbstractFileEngine::FileFlags req = nullptr;
+ QAbstractFileEngine::FileFlags req;
uint cachedFlags = 0;
if (request & (QAbstractFileEngine::FlagsMask | QAbstractFileEngine::TypesMask)) {
@@ -1145,6 +1145,25 @@ bool QFileInfo::isShortcut() const
[d]() { return d->getFileFlags(QAbstractFileEngine::LinkType); });
}
+
+/*!
+ Returns \c true if the object points to a junction;
+ otherwise returns \c false.
+
+ Junctions only exist on Windows' NTFS file system, and are typically
+ created by the \c{mklink} command. They can be thought of as symlinks for
+ directories, and can only be created for absolute paths on the local
+ volume.
+*/
+bool QFileInfo::isJunction() const
+{
+ Q_D(const QFileInfo);
+ return d->checkAttribute<bool>(
+ QFileSystemMetaData::LegacyLinkType,
+ [d]() { return d->metaData.isJunction(); },
+ [d]() { return d->getFileFlags(QAbstractFileEngine::LinkType); });
+}
+
/*!
Returns \c true if the object points to a directory or to a symbolic
link to a directory, and that directory is the root directory; otherwise
diff --git a/src/corelib/io/qfileinfo.h b/src/corelib/io/qfileinfo.h
index 3ac028085a..7c7ff56ae4 100644
--- a/src/corelib/io/qfileinfo.h
+++ b/src/corelib/io/qfileinfo.h
@@ -113,6 +113,7 @@ public:
bool isSymLink() const;
bool isSymbolicLink() const;
bool isShortcut() const;
+ bool isJunction() const;
bool isRoot() const;
bool isBundle() const;
diff --git a/src/corelib/io/qfilesystemengine_mac.mm b/src/corelib/io/qfilesystemengine_mac.mm
new file mode 100644
index 0000000000..4bbce9e5f6
--- /dev/null
+++ b/src/corelib/io/qfilesystemengine_mac.mm
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qplatformdefs.h"
+#include "qfilesystemengine_p.h"
+#include "qfile.h"
+#include "qurl.h"
+
+#include <QtCore/private/qcore_mac_p.h>
+#include <CoreFoundation/CoreFoundation.h>
+
+QT_BEGIN_NAMESPACE
+
+/*
+ This implementation does not enable the "put back" option in Finder
+ for the trashed object. The only way to get this is to use Finder automation,
+ which would query the user for permission to access Finder using a modal,
+ blocking dialog - which we definitely can't have in a console application.
+
+ Using Finder would also play the trash sound, which we don't want either in
+ such a core API; applications that want that can play the sound themselves.
+*/
+//static
+bool QFileSystemEngine::moveFileToTrash(const QFileSystemEntry &source,
+ QFileSystemEntry &newLocation, QSystemError &error)
+{
+ QFileInfo info(source.filePath());
+ @autoreleasepool {
+ NSString *filepath = info.filePath().toNSString();
+ NSURL *fileurl = [NSURL fileURLWithPath:filepath isDirectory:info.isDir()];
+ NSURL *resultingUrl = nil;
+ NSError *nserror = nil;
+ NSFileManager *fm = [NSFileManager defaultManager];
+ if ([fm trashItemAtURL:fileurl resultingItemURL:&resultingUrl error:&nserror] != YES) {
+ error = QSystemError(nserror.code, QSystemError::NativeError);
+ return false;
+ }
+ newLocation = QFileSystemEntry(QUrl::fromNSURL(resultingUrl).path());
+ }
+ return true;
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/io/qfilesystemengine_p.h b/src/corelib/io/qfilesystemengine_p.h
index ecfdc03743..555483a972 100644
--- a/src/corelib/io/qfilesystemengine_p.h
+++ b/src/corelib/io/qfilesystemengine_p.h
@@ -88,7 +88,7 @@ inline bool qIsFilenameBroken(const QFileSystemEntry &entry)
Q_RETURN_ON_INVALID_FILENAME("Broken filename passed to function", (result)); \
} while (false)
-class QFileSystemEngine
+class Q_AUTOTEST_EXPORT QFileSystemEngine
{
public:
static bool isCaseSensitive()
@@ -155,6 +155,7 @@ public:
static bool createLink(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
static bool copyFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
+ static bool moveFileToTrash(const QFileSystemEntry &source, QFileSystemEntry &newLocation, QSystemError &error);
static bool renameFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
static bool renameOverwriteFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error);
static bool removeFile(const QFileSystemEntry &entry, QSystemError &error);
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
index 38cb6a423d..16901be187 100644
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -42,6 +42,8 @@
#include "qplatformdefs.h"
#include "qfilesystemengine_p.h"
#include "qfile.h"
+#include "qstorageinfo.h"
+#include "qtextstream.h"
#include <QtCore/qoperatingsystemversion.h>
#include <QtCore/private/qcore_unix_p.h>
@@ -1076,14 +1078,14 @@ bool QFileSystemEngine::cloneFile(int srcfd, int dstfd, const QFileSystemMetaDat
// sendfile(2) is limited in the kernel to 2G - 4k
const size_t SendfileSize = 0x7ffff000;
- ssize_t n = ::sendfile(dstfd, srcfd, NULL, SendfileSize);
+ ssize_t n = ::sendfile(dstfd, srcfd, nullptr, SendfileSize);
if (n == -1) {
// if we got an error here, give up and try at an upper layer
return false;
}
while (n) {
- n = ::sendfile(dstfd, srcfd, NULL, SendfileSize);
+ n = ::sendfile(dstfd, srcfd, nullptr, SendfileSize);
if (n == -1) {
// uh oh, this is probably a real error (like ENOSPC), but we have
// no way to notify QFile of partial success, so just erase any work
@@ -1197,6 +1199,197 @@ bool QFileSystemEngine::createLink(const QFileSystemEntry &source, const QFileSy
return false;
}
+#ifndef Q_OS_DARWIN
+/*
+ Implementing as per https://specifications.freedesktop.org/trash-spec/trashspec-1.0.html
+*/
+static QString freeDesktopTrashLocation(const QString &sourcePath)
+{
+ auto makeTrashDir = [](const QDir &topDir, const QString &trashDir) -> QString {
+ auto ownerPerms = QFileDevice::ReadOwner
+ | QFileDevice::WriteOwner
+ | QFileDevice::ExeOwner;
+ QString targetDir = topDir.filePath(trashDir);
+ if (topDir.mkdir(trashDir))
+ QFile::setPermissions(targetDir, ownerPerms);
+ if (QFileInfo(targetDir).isDir())
+ return targetDir;
+ return QString();
+ };
+ auto isSticky = [](const QFileInfo &fileInfo) -> bool {
+ struct stat st;
+ if (stat(QFile::encodeName(fileInfo.absoluteFilePath()).constData(), &st) == 0)
+ return st.st_mode & S_ISVTX;
+
+ return false;
+ };
+
+ QString trash;
+ const QLatin1String dotTrash(".Trash");
+ const QStorageInfo sourceStorage(sourcePath);
+ const QStorageInfo homeStorage(QDir::home());
+ // We support trashing of files outside the users home partition
+ if (sourceStorage != homeStorage) {
+ QDir topDir(sourceStorage.rootPath());
+ /*
+ Method 1:
+ "An administrator can create an $topdir/.Trash directory. The permissions on this
+ directories should permit all users who can trash files at all to write in it;
+ and the “sticky bit” in the permissions must be set, if the file system supports
+ it.
+ When trashing a file from a non-home partition/device, an implementation
+ (if it supports trashing in top directories) MUST check for the presence
+ of $topdir/.Trash."
+ */
+ const QString userID = QString::number(::getuid());
+ if (topDir.cd(dotTrash)) {
+ const QFileInfo trashInfo(topDir.path());
+
+ // we MUST check that the sticky bit is set, and that it is not a symlink
+ if (trashInfo.isSymLink()) {
+ // we SHOULD report the failed check to the administrator
+ qCritical("Warning: '%s' is a symlink to '%s'",
+ trashInfo.absoluteFilePath().toLocal8Bit().constData(),
+ trashInfo.symLinkTarget().toLatin1().constData());
+ } else if (!isSticky(trashInfo)) {
+ // we SHOULD report the failed check to the administrator
+ qCritical("Warning: '%s' doesn't have sticky bit set!",
+ trashInfo.absoluteFilePath().toLocal8Bit().constData());
+ } else if (trashInfo.isDir()) {
+ /*
+ "If the directory exists and passes the checks, a subdirectory of the
+ $topdir/.Trash directory is to be used as the user's trash directory
+ for this partition/device. The name of this subdirectory is the numeric
+ identifier of the current user ($topdir/.Trash/$uid).
+ When trashing a file, if this directory does not exist for the current user,
+ the implementation MUST immediately create it, without any warnings or
+ delays for the user."
+ */
+ trash = makeTrashDir(topDir, userID);
+ }
+ }
+ /*
+ Method 2:
+ "If an $topdir/.Trash directory is absent, an $topdir/.Trash-$uid directory is to be
+ used as the user's trash directory for this device/partition. [...] When trashing a
+ file, if an $topdir/.Trash-$uid directory does not exist, the implementation MUST
+ immediately create it, without any warnings or delays for the user."
+ */
+ if (trash.isEmpty()) {
+ topDir = QDir(sourceStorage.rootPath());
+ const QString userTrashDir = dotTrash + QLatin1Char('-') + userID;
+ trash = makeTrashDir(topDir, userTrashDir);
+ }
+ }
+ /*
+ "If both (1) and (2) fail [...], the implementation MUST either trash the
+ file into the user's “home trash” or refuse to trash it."
+
+ We trash the file into the user's home trash.
+ */
+ if (trash.isEmpty()) {
+ QDir topDir = QDir::home();
+ trash = makeTrashDir(topDir, dotTrash);
+ if (!QFileInfo(trash).isDir()) {
+ qWarning("Unable to establish trash directory %s in %s",
+ dotTrash.latin1(), topDir.path().toLocal8Bit().constData());
+ }
+ }
+
+ return trash;
+}
+
+//static
+bool QFileSystemEngine::moveFileToTrash(const QFileSystemEntry &source,
+ QFileSystemEntry &newLocation, QSystemError &error)
+{
+ const QFileInfo sourceInfo(source.filePath());
+ if (!sourceInfo.exists()) {
+ error = QSystemError(ENOENT, QSystemError::StandardLibraryError);
+ return false;
+ }
+ const QString sourcePath = sourceInfo.absoluteFilePath();
+
+ QDir trashDir(freeDesktopTrashLocation(sourcePath));
+ if (!trashDir.exists())
+ return false;
+ /*
+ "A trash directory contains two subdirectories, named info and files."
+ */
+ const QLatin1String filesDir("files");
+ const QLatin1String infoDir("info");
+ trashDir.mkdir(filesDir);
+ int savedErrno = errno;
+ trashDir.mkdir(infoDir);
+ if (!savedErrno)
+ savedErrno = errno;
+ if (!trashDir.exists(filesDir) || !trashDir.exists(infoDir)) {
+ error = QSystemError(savedErrno, QSystemError::StandardLibraryError);
+ return false;
+ }
+ /*
+ "The $trash/files directory contains the files and directories that were trashed.
+ The names of files in this directory are to be determined by the implementation;
+ the only limitation is that they must be unique within the directory. Even if a
+ file with the same name and location gets trashed many times, each subsequent
+ trashing must not overwrite a previous copy."
+ */
+ const QString trashedName = sourceInfo.isDir()
+ ? QDir(sourcePath).dirName()
+ : sourceInfo.fileName();
+ QString uniqueTrashedName = QLatin1Char('/') + trashedName;
+ QString infoFileName;
+ int counter = 0;
+ QFile infoFile;
+ do {
+ while (QFile::exists(trashDir.filePath(filesDir) + uniqueTrashedName)) {
+ ++counter;
+ uniqueTrashedName = QString(QLatin1String("/%1-%2"))
+ .arg(trashedName)
+ .arg(counter, 4, 10, QLatin1Char('0'));
+ }
+ /*
+ "The $trash/info directory contains an "information file" for every file and directory
+ in $trash/files. This file MUST have exactly the same name as the file or directory in
+ $trash/files, plus the extension ".trashinfo"
+ [...]
+ When trashing a file or directory, the implementation MUST create the corresponding
+ file in $trash/info first. Moreover, it MUST try to do this in an atomic fashion,
+ so that if two processes try to trash files with the same filename this will result
+ in two different trash files. On Unix-like systems this is done by generating a
+ filename, and then opening with O_EXCL. If that succeeds the creation was atomic
+ (at least on the same machine), if it fails you need to pick another filename."
+ */
+ infoFileName = trashDir.filePath(infoDir)
+ + uniqueTrashedName + QLatin1String(".trashinfo");
+ infoFile.setFileName(infoFileName);
+ } while (!infoFile.open(QIODevice::NewOnly | QIODevice::WriteOnly | QIODevice::Text));
+
+ const QString targetPath = trashDir.filePath(filesDir) + uniqueTrashedName;
+ const QFileSystemEntry target(targetPath);
+
+ if (!renameFile(source, target, error)) {
+ infoFile.close();
+ infoFile.remove();
+ error = QSystemError(errno, QSystemError::StandardLibraryError);
+ return false;
+ }
+
+ QTextStream out(&infoFile);
+#if QT_CONFIG(textcodec)
+ out.setCodec("UTF-8");
+#endif
+ out << "[Trash Info]" << Qt::endl;
+ out << "Path=" << sourcePath << Qt::endl;
+ out << "DeletionDate="
+ << QDateTime::currentDateTime().toString(QLatin1String("yyyy-MM-ddThh:mm:ss")) << Qt::endl;
+ infoFile.close();
+
+ newLocation = QFileSystemEntry(targetPath);
+ return true;
+}
+#endif
+
//static
bool QFileSystemEngine::copyFile(const QFileSystemEntry &source, const QFileSystemEntry &target, QSystemError &error)
{
diff --git a/src/corelib/io/qfilesystemengine_win.cpp b/src/corelib/io/qfilesystemengine_win.cpp
index ae29190848..71a0e36693 100644
--- a/src/corelib/io/qfilesystemengine_win.cpp
+++ b/src/corelib/io/qfilesystemengine_win.cpp
@@ -41,6 +41,7 @@
#include "qoperatingsystemversion.h"
#include "qplatformdefs.h"
#include "qsysinfo.h"
+#include "qscopeguard.h"
#include "private/qabstractfileengine_p.h"
#include "private/qfsfileengine_p.h"
#include <private/qsystemlibrary_p.h>
@@ -59,6 +60,8 @@
#include <objbase.h>
#ifndef Q_OS_WINRT
# include <shlobj.h>
+# include <shobjidl.h>
+# include <shellapi.h>
# include <lm.h>
# include <accctrl.h>
#endif
@@ -422,6 +425,104 @@ static inline bool getFindData(QString path, WIN32_FIND_DATA &findData)
return false;
}
+#if defined(__IFileOperation_INTERFACE_DEFINED__)
+class FileOperationProgressSink : public IFileOperationProgressSink
+{
+public:
+ FileOperationProgressSink()
+ : ref(1)
+ {}
+ virtual ~FileOperationProgressSink() {}
+
+ ULONG STDMETHODCALLTYPE AddRef()
+ {
+ return ++ref;
+ }
+ ULONG STDMETHODCALLTYPE Release()
+ {
+ if (--ref == 0) {
+ delete this;
+ return 0;
+ }
+ return ref;
+ }
+ HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject)
+ {
+ if (!ppvObject)
+ return E_POINTER;
+
+ *ppvObject = nullptr;
+
+ if (iid == __uuidof(IUnknown)) {
+ *ppvObject = static_cast<IUnknown*>(this);
+ } else if (iid == __uuidof(IFileOperationProgressSink)) {
+ *ppvObject = static_cast<IFileOperationProgressSink*>(this);
+ }
+
+ if (*ppvObject) {
+ AddRef();
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+ }
+
+ HRESULT STDMETHODCALLTYPE StartOperations()
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE FinishOperations(HRESULT)
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE PreRenameItem(DWORD, IShellItem *, LPCWSTR)
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE PostRenameItem(DWORD, IShellItem *, LPCWSTR, HRESULT, IShellItem *)
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE PreMoveItem(DWORD, IShellItem *, IShellItem *, LPCWSTR)
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE PostMoveItem(DWORD, IShellItem *, IShellItem *, LPCWSTR, HRESULT,
+ IShellItem *)
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE PreCopyItem(DWORD, IShellItem *, IShellItem *, LPCWSTR )
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE PostCopyItem(DWORD, IShellItem *, IShellItem *, LPCWSTR, HRESULT,
+ IShellItem *)
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE PreDeleteItem(DWORD dwFlags, IShellItem *)
+ {
+ // stop the operation if the file will be deleted rather than trashed
+ return (dwFlags & TSF_DELETE_RECYCLE_IF_POSSIBLE) ? S_OK : E_FAIL;
+ }
+ HRESULT STDMETHODCALLTYPE PostDeleteItem(DWORD /* dwFlags */, IShellItem * /* psiItem */,
+ HRESULT /* hrDelete */, IShellItem *psiNewlyCreated)
+ {
+ if (psiNewlyCreated) {
+ wchar_t *pszName = nullptr;
+ psiNewlyCreated->GetDisplayName(SIGDN_FILESYSPATH, &pszName);
+ if (pszName) {
+ targetPath = QString::fromWCharArray(pszName);
+ CoTaskMemFree(pszName);
+ }
+ }
+ return S_OK;
+ }
+ HRESULT STDMETHODCALLTYPE PreNewItem(DWORD, IShellItem *, LPCWSTR)
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE PostNewItem(DWORD, IShellItem *, LPCWSTR, LPCWSTR, DWORD, HRESULT,
+ IShellItem *)
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE UpdateProgress(UINT,UINT)
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE ResetTimer()
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE PauseTimer()
+ { return S_OK; }
+ HRESULT STDMETHODCALLTYPE ResumeTimer()
+ { return S_OK; }
+
+ QString targetPath;
+private:
+ ULONG ref;
+};
+#endif
+
bool QFileSystemEngine::uncListSharesOnServer(const QString &server, QStringList *list)
{
DWORD res = ERROR_NOT_SUPPORTED;
@@ -1123,67 +1224,62 @@ static bool isDirPath(const QString &dirPath, bool *existed)
return fileAttrib & FILE_ATTRIBUTE_DIRECTORY;
}
+// NOTE: if \a shouldMkdirFirst is false, we assume the caller did try to mkdir
+// before calling this function.
+static bool createDirectoryWithParents(const QString &nativeName, bool shouldMkdirFirst = true)
+{
+ const auto isUNCRoot = [](const QString &nativeName) {
+ return nativeName.startsWith(QLatin1String("\\\\")) && nativeName.count(QDir::separator()) <= 3;
+ };
+ const auto isDriveName = [](const QString &nativeName) {
+ return nativeName.size() == 2 && nativeName.at(1) == QLatin1Char(':');
+ };
+ const auto isDir = [](const QString &nativeName) {
+ bool exists = false;
+ return isDirPath(nativeName, &exists) && exists;
+ };
+ // Do not try to mkdir a UNC root path or a drive letter.
+ if (isUNCRoot(nativeName) || isDriveName(nativeName))
+ return false;
+
+ if (shouldMkdirFirst) {
+ if (mkDir(nativeName))
+ return true;
+ }
+
+ const int backSlash = nativeName.lastIndexOf(QDir::separator());
+ if (backSlash < 1)
+ return false;
+
+ const QString parentNativeName = nativeName.left(backSlash);
+ if (!createDirectoryWithParents(parentNativeName))
+ return false;
+
+ // try again
+ if (mkDir(nativeName))
+ return true;
+ return isDir(nativeName);
+}
+
//static
bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool createParents)
{
QString dirName = entry.filePath();
Q_CHECK_FILE_NAME(dirName, false);
- if (createParents) {
- dirName = QDir::toNativeSeparators(QDir::cleanPath(dirName));
- // We spefically search for / so \ would break it..
- int oldslash = -1;
- if (dirName.startsWith(QLatin1String("\\\\"))) {
- // Don't try to create the root path of a UNC path;
- // CreateDirectory() will just return ERROR_INVALID_NAME.
- for (int i = 0; i < dirName.size(); ++i) {
- if (dirName.at(i) != QDir::separator()) {
- oldslash = i;
- break;
- }
- }
- if (oldslash != -1)
- oldslash = dirName.indexOf(QDir::separator(), oldslash);
- } else if (dirName.size() > 2
- && dirName.at(1) == QLatin1Char(':')) {
- // Don't try to call mkdir with just a drive letter
- oldslash = 2;
- }
- for (int slash=0; slash != -1; oldslash = slash) {
- slash = dirName.indexOf(QDir::separator(), oldslash+1);
- if (slash == -1) {
- if (oldslash == dirName.length())
- break;
- slash = dirName.length();
- }
- if (slash) {
- DWORD lastError;
- QString chunk = dirName.left(slash);
- if (!mkDir(chunk, &lastError)) {
- if (lastError == ERROR_ALREADY_EXISTS || lastError == ERROR_ACCESS_DENIED) {
- bool existed = false;
- if (isDirPath(chunk, &existed) && existed)
- continue;
-#ifdef Q_OS_WINRT
- static QThreadStorage<QString> dataLocation;
- if (!dataLocation.hasLocalData())
- dataLocation.setLocalData(QDir::toNativeSeparators(QStandardPaths::writableLocation(QStandardPaths::DataLocation)));
- static QThreadStorage<QString> tempLocation;
- if (!tempLocation.hasLocalData())
- tempLocation.setLocalData(QDir::toNativeSeparators(QStandardPaths::writableLocation(QStandardPaths::TempLocation)));
- // We try to create something outside the sandbox, which is forbidden
- // However we could still try to pass into the sandbox
- if (dataLocation.localData().startsWith(chunk) || tempLocation.localData().startsWith(chunk))
- continue;
-#endif
- }
- return false;
- }
- }
- }
+ dirName = QDir::toNativeSeparators(QDir::cleanPath(dirName));
+
+ // try to mkdir this directory
+ DWORD lastError;
+ if (mkDir(dirName, &lastError))
return true;
- }
- return mkDir(entry.filePath());
+ // mkpath should return true, if the directory already exists, mkdir false.
+ if (!createParents)
+ return false;
+ if (lastError == ERROR_ALREADY_EXISTS)
+ return isDirPath(dirName, nullptr);
+
+ return createDirectoryWithParents(dirName, false);
}
//static
@@ -1436,6 +1532,97 @@ bool QFileSystemEngine::removeFile(const QFileSystemEntry &entry, QSystemError &
return ret;
}
+/*
+ If possible, we use the IFileOperation implementation, which allows us to determine
+ the location of the object in the trash.
+ If not (likely on mingw), we fall back to the old API, which won't allow us to know
+ that.
+*/
+//static
+bool QFileSystemEngine::moveFileToTrash(const QFileSystemEntry &source,
+ QFileSystemEntry &newLocation, QSystemError &error)
+{
+#ifndef Q_OS_WINRT
+ // we need the "display name" of the file, so can't use nativeFilePath
+ const QString sourcePath = QDir::toNativeSeparators(source.filePath());
+
+# if defined(__IFileOperation_INTERFACE_DEFINED__)
+ CoInitialize(NULL);
+ IFileOperation *pfo = nullptr;
+ IShellItem *deleteItem = nullptr;
+ FileOperationProgressSink *sink = nullptr;
+ HRESULT hres = E_FAIL;
+
+ auto coUninitialize = qScopeGuard([&](){
+ if (sink)
+ sink->Release();
+ if (deleteItem)
+ deleteItem->Release();
+ if (pfo)
+ pfo->Release();
+ CoUninitialize();
+ if (!SUCCEEDED(hres))
+ error = QSystemError(hres, QSystemError::NativeError);
+ });
+
+ hres = CoCreateInstance(CLSID_FileOperation, nullptr, CLSCTX_ALL, IID_PPV_ARGS(&pfo));
+ if (!pfo)
+ return false;
+ pfo->SetOperationFlags(FOF_ALLOWUNDO | FOFX_RECYCLEONDELETE | FOF_NOCONFIRMATION
+ | FOF_SILENT | FOF_NOERRORUI);
+ hres = SHCreateItemFromParsingName(reinterpret_cast<const wchar_t*>(sourcePath.utf16()),
+ nullptr, IID_PPV_ARGS(&deleteItem));
+ if (!deleteItem)
+ return false;
+ sink = new FileOperationProgressSink;
+ hres = pfo->DeleteItem(deleteItem, static_cast<IFileOperationProgressSink*>(sink));
+ if (!SUCCEEDED(hres))
+ return false;
+ hres = pfo->PerformOperations();
+ if (!SUCCEEDED(hres))
+ return false;
+ newLocation = QFileSystemEntry(sink->targetPath);
+
+# else // no IFileOperation in SDK (mingw, likely) - fall back to SHFileOperation
+
+ // double null termination needed, so can't use QString::utf16
+ QVarLengthArray<wchar_t, MAX_PATH + 1> winFile(sourcePath.length() + 2);
+ sourcePath.toWCharArray(winFile.data());
+ winFile[sourcePath.length()] = wchar_t{};
+ winFile[sourcePath.length() + 1] = wchar_t{};
+
+ SHFILEOPSTRUCTW operation;
+ operation.hwnd = nullptr;
+ operation.wFunc = FO_DELETE;
+ operation.pFrom = winFile.constData();
+ operation.pTo = nullptr;
+ operation.fFlags = FOF_ALLOWUNDO | FOF_NO_UI;
+ operation.fAnyOperationsAborted = FALSE;
+ operation.hNameMappings = nullptr;
+ operation.lpszProgressTitle = nullptr;
+
+ int result = SHFileOperation(&operation);
+ if (result != 0) {
+ error = QSystemError(result, QSystemError::NativeError);
+ return false;
+ }
+ /*
+ This implementation doesn't let us know where the file ended up, even if
+ we would specify FOF_WANTMAPPINGHANDLE | FOF_RENAMEONCOLLISION, as
+ FOF_RENAMEONCOLLISION has no effect unless files are moved, copied, or renamed.
+ */
+ Q_UNUSED(newLocation);
+# endif // IFileOperation fallback
+ return true;
+
+#else // Q_OS_WINRT
+ Q_UNUSED(source);
+ Q_UNUSED(newLocation);
+ Q_UNUSED(error);
+ return false;
+#endif
+}
+
//static
bool QFileSystemEngine::setPermissions(const QFileSystemEntry &entry, QFile::Permissions permissions, QSystemError &error,
QFileSystemMetaData *data)
diff --git a/src/corelib/io/qfilesystemmetadata_p.h b/src/corelib/io/qfilesystemmetadata_p.h
index 81f4b3ba13..3154658e5c 100644
--- a/src/corelib/io/qfilesystemmetadata_p.h
+++ b/src/corelib/io/qfilesystemmetadata_p.h
@@ -76,8 +76,7 @@ class Q_AUTOTEST_EXPORT QFileSystemMetaData
{
public:
QFileSystemMetaData()
- : knownFlagsMask(nullptr),
- size_(-1)
+ : size_(-1)
{
}
@@ -111,8 +110,10 @@ public:
AliasType = 0x0,
#endif
#if defined(Q_OS_WIN)
+ JunctionType = 0x04000000,
WinLnkType = 0x08000000, // Note: Uses the same position for AliasType on Mac
#else
+ JunctionType = 0x0,
WinLnkType = 0x0,
#endif
SequentialType = 0x00800000, // Note: overlaps with QAbstractFileEngine::RootFlag
@@ -184,7 +185,7 @@ public:
void clear()
{
- knownFlagsMask = nullptr;
+ knownFlagsMask = {};
}
void clearFlags(MetaDataFlags flags = AllMetaDataFlags)
@@ -205,8 +206,10 @@ public:
bool wasDeleted() const { return (entryFlags & WasDeletedAttribute); }
#if defined(Q_OS_WIN)
bool isLnkFile() const { return (entryFlags & WinLnkType); }
+ bool isJunction() const { return (entryFlags & JunctionType); }
#else
bool isLnkFile() const { return false; }
+ bool isJunction() const { return false; }
#endif
qint64 size() const { return size_; }
@@ -356,9 +359,15 @@ inline void QFileSystemMetaData::fillFromFindData(WIN32_FIND_DATA &findData, boo
if (setLinkType) {
knownFlagsMask |= LinkType;
entryFlags &= ~LinkType;
- if ((fileAttribute_ & FILE_ATTRIBUTE_REPARSE_POINT)
- && (findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK)) {
- entryFlags |= LinkType;
+ if (fileAttribute_ & FILE_ATTRIBUTE_REPARSE_POINT) {
+ if (findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK) {
+ entryFlags |= LinkType;
+#if defined(IO_REPARSE_TAG_MOUNT_POINT)
+ } else if ((fileAttribute_ & FILE_ATTRIBUTE_DIRECTORY)
+ && (findData.dwReserved0 == IO_REPARSE_TAG_MOUNT_POINT)) {
+ entryFlags |= JunctionType;
+#endif
+ }
}
}
}
diff --git a/src/corelib/io/qfilesystemwatcher.cpp b/src/corelib/io/qfilesystemwatcher.cpp
index 54460aff77..86c8963cb6 100644
--- a/src/corelib/io/qfilesystemwatcher.cpp
+++ b/src/corelib/io/qfilesystemwatcher.cpp
@@ -88,7 +88,7 @@ QFileSystemWatcherEngine *QFileSystemWatcherPrivate::createNativeEngine(QObject
}
QFileSystemWatcherPrivate::QFileSystemWatcherPrivate()
- : native(0), poller(0)
+ : native(nullptr), poller(nullptr)
{
}
diff --git a/src/corelib/io/qfilesystemwatcher_inotify.cpp b/src/corelib/io/qfilesystemwatcher_inotify.cpp
index ca1f6cc359..888af998a5 100644
--- a/src/corelib/io/qfilesystemwatcher_inotify.cpp
+++ b/src/corelib/io/qfilesystemwatcher_inotify.cpp
@@ -242,7 +242,7 @@ QInotifyFileSystemWatcherEngine *QInotifyFileSystemWatcherEngine::create(QObject
if (fd == -1) {
fd = inotify_init();
if (fd == -1)
- return 0;
+ return nullptr;
}
return new QInotifyFileSystemWatcherEngine(fd, parent);
}
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp
index 0d73839f8d..3042eac2f0 100644
--- a/src/corelib/io/qfsfileengine.cpp
+++ b/src/corelib/io/qfsfileengine.cpp
@@ -911,14 +911,7 @@ bool QFSFileEngine::supportsExtension(Extension extension) const
}
/*! \fn bool QFSFileEngine::caseSensitive() const
- Returns \c true for Windows, false for Unix.
-*/
-
-/*! \fn bool QFSFileEngine::copy(const QString &copyName)
-
- For Windows or Apple platforms, copy the file to file \a copyName.
-
- Not implemented for other Unix platforms.
+ Returns \c false for Windows, true for Unix.
*/
/*! \fn QString QFSFileEngine::currentPath(const QString &fileName)
@@ -950,11 +943,34 @@ bool QFSFileEngine::supportsExtension(Extension extension) const
\reimp
*/
-/*! \fn QString QFSFileEngine::homePath()
+/*!
Returns the home path of the current user.
\sa rootPath()
*/
+QString QFSFileEngine::homePath()
+{
+ return QFileSystemEngine::homePath();
+}
+
+/*!
+ Returns the root path.
+
+ \sa homePath()
+*/
+QString QFSFileEngine::rootPath()
+{
+ return QFileSystemEngine::rootPath();
+}
+
+/*!
+ Returns the temporary path (i.e., a path in which it is safe
+ to store temporary files).
+*/
+QString QFSFileEngine::tempPath()
+{
+ return QFileSystemEngine::tempPath();
+}
/*! \fn bool QFSFileEngine::isRelativePath() const
\reimp
@@ -968,9 +984,6 @@ bool QFSFileEngine::supportsExtension(Extension extension) const
true if successful; otherwise returns \c false.
*/
-/*! \fn bool QFSFileEngine::mkdir(const QString &name, bool createParentDirectories) const
- \reimp
-*/
/*! \fn uint QFSFileEngine::ownerId(QAbstractFileEngine::FileOwner own) const
In Unix, if stat() is successful, the \c uid is returned if
@@ -984,35 +997,87 @@ bool QFSFileEngine::supportsExtension(Extension extension) const
\reimp
*/
-/*! \fn bool QFSFileEngine::remove()
- \reimp
+/*!
+ For Windows or Apple platforms, copy the file to file \a copyName.
+
+ Not implemented for other Unix platforms.
*/
+bool QFSFileEngine::copy(const QString &copyName)
+{
+ Q_D(QFSFileEngine);
+ QSystemError error;
+ bool ret = QFileSystemEngine::copyFile(d->fileEntry, QFileSystemEntry(copyName), error);
+ if (!ret)
+ setError(QFile::CopyError, error.toString());
+ return ret;
+}
-/*! \fn bool QFSFileEngine::rename(const QString &newName)
+/*!
\reimp
*/
+bool QFSFileEngine::remove()
+{
+ Q_D(QFSFileEngine);
+ QSystemError error;
+ bool ret = QFileSystemEngine::removeFile(d->fileEntry, error);
+ d->metaData.clear();
+ if (!ret)
+ setError(QFile::RemoveError, error.toString());
+ return ret;
+}
-
-/*! \fn bool QFSFileEngine::renameOverwrite(const QString &newName)
+/*!
\reimp
*/
-
-/*! \fn bool QFSFileEngine::rmdir(const QString &name, bool recurseParentDirectories) const
+bool QFSFileEngine::rename(const QString &newName)
+{
+ Q_D(QFSFileEngine);
+ QSystemError error;
+ bool ret = QFileSystemEngine::renameFile(d->fileEntry, QFileSystemEntry(newName), error);
+ if (!ret)
+ setError(QFile::RenameError, error.toString());
+ return ret;
+}
+/*!
\reimp
*/
+bool QFSFileEngine::renameOverwrite(const QString &newName)
+{
+ Q_D(QFSFileEngine);
+ QSystemError error;
+ bool ret = QFileSystemEngine::renameOverwriteFile(d->fileEntry, QFileSystemEntry(newName), error);
+ if (!ret)
+ setError(QFile::RenameError, error.toString());
+ return ret;
+}
-/*! \fn QString QFSFileEngine::rootPath()
- Returns the root path.
+/*!
+ \reimp
+*/
+bool QFSFileEngine::mkdir(const QString &name, bool createParentDirectories) const
+{
+ return QFileSystemEngine::createDirectory(QFileSystemEntry(name), createParentDirectories);
+}
- \sa homePath()
+/*!
+ \reimp
*/
+bool QFSFileEngine::rmdir(const QString &name, bool recurseParentDirectories) const
+{
+ return QFileSystemEngine::removeDirectory(QFileSystemEntry(name), recurseParentDirectories);
+}
-/*! \fn bool QFSFileEngine::setCurrentPath(const QString &path)
+
+/*!
Sets the current path (e.g., for QDir), to \a path. Returns \c true if the
new path exists; otherwise this function does nothing, and returns \c false.
\sa currentPath()
*/
+bool QFSFileEngine::setCurrentPath(const QString &path)
+{
+ return QFileSystemEngine::setCurrentPath(QFileSystemEntry(path));
+}
/*! \fn bool QFSFileEngine::setPermissions(uint perms)
\reimp
@@ -1022,11 +1087,6 @@ bool QFSFileEngine::supportsExtension(Extension extension) const
\reimp
*/
-/*! \fn QString QFSFileEngine::tempPath()
- Returns the temporary path (i.e., a path in which it is safe
- to store temporary files).
-*/
-
/*! \fn QAbstractFileEngine::FileFlags QFSFileEnginePrivate::getPermissions(QAbstractFileEngine::FileFlags type) const
\internal
*/
diff --git a/src/corelib/io/qfsfileengine_unix.cpp b/src/corelib/io/qfsfileengine_unix.cpp
index d4983c72af..4610e9306c 100644
--- a/src/corelib/io/qfsfileengine_unix.cpp
+++ b/src/corelib/io/qfsfileengine_unix.cpp
@@ -304,54 +304,6 @@ bool QFSFileEnginePrivate::nativeIsSequential() const
return isSequentialFdFh();
}
-bool QFSFileEngine::remove()
-{
- Q_D(QFSFileEngine);
- QSystemError error;
- bool ret = QFileSystemEngine::removeFile(d->fileEntry, error);
- d->metaData.clear();
- if (!ret) {
- setError(QFile::RemoveError, error.toString());
- }
- return ret;
-}
-
-bool QFSFileEngine::copy(const QString &newName)
-{
- Q_D(QFSFileEngine);
- QSystemError error;
- bool ret = QFileSystemEngine::copyFile(d->fileEntry, QFileSystemEntry(newName), error);
- if (!ret) {
- setError(QFile::CopyError, error.toString());
- }
- return ret;
-}
-
-bool QFSFileEngine::renameOverwrite(const QString &newName)
-{
- Q_D(QFSFileEngine);
- QSystemError error;
- bool ret = QFileSystemEngine::renameOverwriteFile(d->fileEntry, QFileSystemEntry(newName), error);
-
- if (!ret)
- setError(QFile::RenameError, error.toString());
-
- return ret;
-}
-
-bool QFSFileEngine::rename(const QString &newName)
-{
- Q_D(QFSFileEngine);
- QSystemError error;
- bool ret = QFileSystemEngine::renameFile(d->fileEntry, QFileSystemEntry(newName), error);
-
- if (!ret) {
- setError(QFile::RenameError, error.toString());
- }
-
- return ret;
-}
-
bool QFSFileEngine::link(const QString &newName)
{
Q_D(QFSFileEngine);
@@ -368,45 +320,16 @@ qint64 QFSFileEnginePrivate::nativeSize() const
return sizeFdFh();
}
-bool QFSFileEngine::mkdir(const QString &name, bool createParentDirectories) const
-{
- return QFileSystemEngine::createDirectory(QFileSystemEntry(name), createParentDirectories);
-}
-
-bool QFSFileEngine::rmdir(const QString &name, bool recurseParentDirectories) const
-{
- return QFileSystemEngine::removeDirectory(QFileSystemEntry(name), recurseParentDirectories);
-}
-
bool QFSFileEngine::caseSensitive() const
{
return true;
}
-bool QFSFileEngine::setCurrentPath(const QString &path)
-{
- return QFileSystemEngine::setCurrentPath(QFileSystemEntry(path));
-}
-
QString QFSFileEngine::currentPath(const QString &)
{
return QFileSystemEngine::currentPath().filePath();
}
-QString QFSFileEngine::homePath()
-{
- return QFileSystemEngine::homePath();
-}
-
-QString QFSFileEngine::rootPath()
-{
- return QFileSystemEngine::rootPath();
-}
-
-QString QFSFileEngine::tempPath()
-{
- return QFileSystemEngine::tempPath();
-}
QFileInfoList QFSFileEngine::drives()
{
diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp
index 19cc3e6402..dd4882a2bc 100644
--- a/src/corelib/io/qfsfileengine_win.cpp
+++ b/src/corelib/io/qfsfileengine_win.cpp
@@ -443,66 +443,11 @@ bool QFSFileEnginePrivate::nativeIsSequential() const
#endif
}
-bool QFSFileEngine::remove()
-{
- Q_D(QFSFileEngine);
- QSystemError error;
- bool ret = QFileSystemEngine::removeFile(d->fileEntry, error);
- if (!ret)
- setError(QFile::RemoveError, error.toString());
- return ret;
-}
-
-bool QFSFileEngine::copy(const QString &copyName)
-{
- Q_D(QFSFileEngine);
- QSystemError error;
- bool ret = QFileSystemEngine::copyFile(d->fileEntry, QFileSystemEntry(copyName), error);
- if (!ret)
- setError(QFile::CopyError, error.toString());
- return ret;
-}
-
-bool QFSFileEngine::rename(const QString &newName)
-{
- Q_D(QFSFileEngine);
- QSystemError error;
- bool ret = QFileSystemEngine::renameFile(d->fileEntry, QFileSystemEntry(newName), error);
- if (!ret)
- setError(QFile::RenameError, error.toString());
- return ret;
-}
-
-bool QFSFileEngine::renameOverwrite(const QString &newName)
-{
- Q_D(QFSFileEngine);
- QSystemError error;
- bool ret = QFileSystemEngine::renameOverwriteFile(d->fileEntry, QFileSystemEntry(newName), error);
- if (!ret)
- setError(QFile::RenameError, error.toString());
- return ret;
-}
-
-bool QFSFileEngine::mkdir(const QString &name, bool createParentDirectories) const
-{
- return QFileSystemEngine::createDirectory(QFileSystemEntry(name), createParentDirectories);
-}
-
-bool QFSFileEngine::rmdir(const QString &name, bool recurseParentDirectories) const
-{
- return QFileSystemEngine::removeDirectory(QFileSystemEntry(name), recurseParentDirectories);
-}
-
bool QFSFileEngine::caseSensitive() const
{
return false;
}
-bool QFSFileEngine::setCurrentPath(const QString &path)
-{
- return QFileSystemEngine::setCurrentPath(QFileSystemEntry(path));
-}
-
QString QFSFileEngine::currentPath(const QString &fileName)
{
#if !defined(Q_OS_WINRT)
@@ -530,21 +475,6 @@ QString QFSFileEngine::currentPath(const QString &fileName)
#endif // Q_OS_WINRT
}
-QString QFSFileEngine::homePath()
-{
- return QFileSystemEngine::homePath();
-}
-
-QString QFSFileEngine::rootPath()
-{
- return QFileSystemEngine::rootPath();
-}
-
-QString QFSFileEngine::tempPath()
-{
- return QFileSystemEngine::tempPath();
-}
-
#if !defined(Q_OS_WINRT)
// cf QStorageInfo::isReady
static inline bool isDriveReady(const wchar_t *path)
@@ -661,14 +591,14 @@ QAbstractFileEngine::FileFlags QFSFileEngine::fileFlags(QAbstractFileEngine::Fil
if (type & Refresh)
d->metaData.clear();
- QAbstractFileEngine::FileFlags ret = 0;
+ QAbstractFileEngine::FileFlags ret;
if (type & FlagsMask)
ret |= LocalDiskFlag;
bool exists;
{
- QFileSystemMetaData::MetaDataFlags queryFlags = 0;
+ QFileSystemMetaData::MetaDataFlags queryFlags;
queryFlags |= QFileSystemMetaData::MetaDataFlags(uint(type))
& QFileSystemMetaData::Permissions;
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
index 076b2394ba..cc1d110252 100644
--- a/src/corelib/io/qiodevice.cpp
+++ b/src/corelib/io/qiodevice.cpp
@@ -461,7 +461,7 @@ QIODevice::QIODevice(QIODevicePrivate &dd)
*/
QIODevice::QIODevice()
- : QObject(*new QIODevicePrivate, 0)
+ : QObject(*new QIODevicePrivate, nullptr)
{
#if defined QIODEVICE_DEBUG
QFile *file = qobject_cast<QFile *>(this);
@@ -1829,7 +1829,7 @@ QByteArray QIODevicePrivate::peek(qint64 maxSize)
/*! \fn bool QIODevice::getChar(char *c)
Reads one character from the device and stores it in \a c. If \a c
- is 0, the character is discarded. Returns \c true on success;
+ is \nullptr, the character is discarded. Returns \c true on success;
otherwise returns \c false.
\sa read(), putChar(), ungetChar()
diff --git a/src/corelib/io/qnoncontiguousbytedevice.cpp b/src/corelib/io/qnoncontiguousbytedevice.cpp
index d1806aa12b..df0197e8eb 100644
--- a/src/corelib/io/qnoncontiguousbytedevice.cpp
+++ b/src/corelib/io/qnoncontiguousbytedevice.cpp
@@ -127,7 +127,7 @@ QT_BEGIN_NAMESPACE
\internal
*/
-QNonContiguousByteDevice::QNonContiguousByteDevice() : QObject((QObject*)0)
+QNonContiguousByteDevice::QNonContiguousByteDevice() : QObject((QObject*)nullptr)
{
}
@@ -188,7 +188,7 @@ const char* QNonContiguousByteDeviceByteArrayImpl::readPointer(qint64 maximumLen
{
if (atEnd()) {
len = -1;
- return 0;
+ return nullptr;
}
if (maximumLength != -1)
@@ -241,7 +241,7 @@ const char* QNonContiguousByteDeviceRingBufferImpl::readPointer(qint64 maximumLe
{
if (atEnd()) {
len = -1;
- return 0;
+ return nullptr;
}
const char *returnValue = ringBuffer->readPointerAtPosition(currentPosition, len);
@@ -282,7 +282,7 @@ qint64 QNonContiguousByteDeviceRingBufferImpl::size() const
QNonContiguousByteDeviceIoDeviceImpl::QNonContiguousByteDeviceIoDeviceImpl(QIODevice *d)
: QNonContiguousByteDevice(),
- currentReadBuffer(0), currentReadBufferSize(16*1024),
+ currentReadBuffer(nullptr), currentReadBufferSize(16*1024),
currentReadBufferAmount(0), currentReadBufferPosition(0), totalAdvancements(0),
eof(false)
{
@@ -301,10 +301,10 @@ const char* QNonContiguousByteDeviceIoDeviceImpl::readPointer(qint64 maximumLeng
{
if (eof == true) {
len = -1;
- return 0;
+ return nullptr;
}
- if (currentReadBuffer == 0)
+ if (currentReadBuffer == nullptr)
currentReadBuffer = new QByteArray(currentReadBufferSize, '\0'); // lazy alloc
if (maximumLength == -1)
@@ -323,7 +323,7 @@ const char* QNonContiguousByteDeviceIoDeviceImpl::readPointer(qint64 maximumLeng
// size was unknown before, emit a readProgress with the final size
if (size() == -1)
emit readProgress(totalAdvancements, totalAdvancements);
- return 0;
+ return nullptr;
}
currentReadBufferAmount = haveRead;
@@ -349,7 +349,7 @@ bool QNonContiguousByteDeviceIoDeviceImpl::advanceReadPointer(qint64 amount)
if (currentReadBufferPosition > currentReadBufferAmount) {
qint64 i = currentReadBufferPosition - currentReadBufferAmount;
while (i > 0) {
- if (device->getChar(0) == false) {
+ if (device->getChar(nullptr) == false) {
emit readProgress(totalAdvancements - i, size());
return false; // ### FIXME handle eof
}
@@ -377,7 +377,7 @@ bool QNonContiguousByteDeviceIoDeviceImpl::reset()
totalAdvancements = 0; //reset the progress counter
if (currentReadBuffer) {
delete currentReadBuffer;
- currentReadBuffer = 0;
+ currentReadBuffer = nullptr;
}
currentReadBufferAmount = 0;
currentReadBufferPosition = 0;
@@ -405,7 +405,7 @@ qint64 QNonContiguousByteDeviceIoDeviceImpl::pos() const
return device->pos();
}
-QByteDeviceWrappingIoDevice::QByteDeviceWrappingIoDevice(QNonContiguousByteDevice *bd) : QIODevice((QObject*)0)
+QByteDeviceWrappingIoDevice::QByteDeviceWrappingIoDevice(QNonContiguousByteDevice *bd) : QIODevice((QObject*)nullptr)
{
byteDevice = bd;
connect(bd, SIGNAL(readyRead()), SIGNAL(readyRead()));
diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp
index 49e0847d44..aedcae2cdc 100644
--- a/src/corelib/io/qprocess.cpp
+++ b/src/corelib/io/qprocess.cpp
@@ -216,7 +216,7 @@ void QProcessEnvironmentPrivate::insert(const QProcessEnvironmentPrivate &other)
environment variables to be removed.
*/
QProcessEnvironment::QProcessEnvironment()
- : d(0)
+ : d(nullptr)
{
}
@@ -436,18 +436,18 @@ void QProcessPrivate::Channel::clear()
case PipeSource:
Q_ASSERT(process);
process->stdinChannel.type = Normal;
- process->stdinChannel.process = 0;
+ process->stdinChannel.process = nullptr;
break;
case PipeSink:
Q_ASSERT(process);
process->stdoutChannel.type = Normal;
- process->stdoutChannel.process = 0;
+ process->stdoutChannel.process = nullptr;
break;
}
type = Normal;
file.clear();
- process = 0;
+ process = nullptr;
}
/*!
@@ -869,8 +869,8 @@ QProcessPrivate::QProcessPrivate()
sequenceNumber = 0;
exitCode = 0;
exitStatus = QProcess::NormalExit;
- startupSocketNotifier = 0;
- deathNotifier = 0;
+ startupSocketNotifier = nullptr;
+ deathNotifier = nullptr;
childStartedPipe[0] = INVALID_Q_PIPE;
childStartedPipe[1] = INVALID_Q_PIPE;
forkfd = -1;
@@ -924,23 +924,23 @@ void QProcessPrivate::cleanup()
if (stdoutChannel.notifier) {
delete stdoutChannel.notifier;
- stdoutChannel.notifier = 0;
+ stdoutChannel.notifier = nullptr;
}
if (stderrChannel.notifier) {
delete stderrChannel.notifier;
- stderrChannel.notifier = 0;
+ stderrChannel.notifier = nullptr;
}
if (stdinChannel.notifier) {
delete stdinChannel.notifier;
- stdinChannel.notifier = 0;
+ stdinChannel.notifier = nullptr;
}
if (startupSocketNotifier) {
delete startupSocketNotifier;
- startupSocketNotifier = 0;
+ startupSocketNotifier = nullptr;
}
if (deathNotifier) {
delete deathNotifier;
- deathNotifier = 0;
+ deathNotifier = nullptr;
}
closeChannel(&stdoutChannel);
closeChannel(&stderrChannel);
@@ -1229,7 +1229,7 @@ void QProcessPrivate::closeWriteChannel()
#endif
if (stdinChannel.notifier) {
delete stdinChannel.notifier;
- stdinChannel.notifier = 0;
+ stdinChannel.notifier = nullptr;
}
#ifdef Q_OS_WIN
// ### Find a better fix, feeding the process little by little
@@ -2617,7 +2617,7 @@ QT_END_INCLUDE_NAMESPACE
QStringList QProcess::systemEnvironment()
{
QStringList tmp;
- char *entry = 0;
+ char *entry = nullptr;
int count = 0;
while ((entry = environ[count++]))
tmp << QString::fromLocal8Bit(entry);
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index 0c80daa024..2186f23ab6 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -246,7 +246,7 @@ bool QProcessPrivate::openChannel(Channel &channel)
return false;
// create the socket notifiers
- if (threadData->hasEventDispatcher()) {
+ if (threadData.loadRelaxed()->hasEventDispatcher()) {
if (&channel == &stdinChannel) {
channel.notifier = new QSocketNotifier(channel.pipe[1],
QSocketNotifier::Write, q);
@@ -338,11 +338,11 @@ static char **_q_dupEnvironment(const QProcessEnvironmentPrivate::Map &environme
{
*envc = 0;
if (environment.isEmpty())
- return 0;
+ return nullptr;
char **envp = new char *[environment.count() + 2];
- envp[environment.count()] = 0;
- envp[environment.count() + 1] = 0;
+ envp[environment.count()] = nullptr;
+ envp[environment.count() + 1] = nullptr;
auto it = environment.constBegin();
const auto end = environment.constEnd();
@@ -377,7 +377,7 @@ void QProcessPrivate::startProcess()
return;
}
- if (threadData->hasEventDispatcher()) {
+ if (threadData.loadRelaxed()->hasEventDispatcher()) {
startupSocketNotifier = new QSocketNotifier(childStartedPipe[0],
QSocketNotifier::Read, q);
QObject::connect(startupSocketNotifier, SIGNAL(activated(int)),
@@ -390,7 +390,7 @@ void QProcessPrivate::startProcess()
// Create argument list with right number of elements, and set the final
// one to 0.
char **argv = new char *[arguments.count() + 2];
- argv[arguments.count() + 1] = 0;
+ argv[arguments.count() + 1] = nullptr;
// Encode the program name.
QByteArray encodedProgramName = QFile::encodeName(program);
@@ -437,13 +437,13 @@ void QProcessPrivate::startProcess()
// Duplicate the environment.
int envc = 0;
- char **envp = 0;
+ char **envp = nullptr;
if (environment.d.constData()) {
envp = _q_dupEnvironment(environment.d.constData()->vars, &envc);
}
// Encode the working directory if it's non-empty, otherwise just pass 0.
- const char *workingDirPtr = 0;
+ const char *workingDirPtr = nullptr;
QByteArray encodedWorkingDirectory;
if (!workingDirectory.isEmpty()) {
encodedWorkingDirectory = QFile::encodeName(workingDirectory);
@@ -451,8 +451,13 @@ void QProcessPrivate::startProcess()
}
// Start the process manager, and fork off the child process.
+ // ### Qt6: revisit whether the change in behavior due to not using fork()
+ // is acceptable for derived classes.
+ int ffdflags = FFD_CLOEXEC;
+ if (typeid(*q) != typeid(QProcess))
+ ffdflags |= FFD_USE_FORK;
pid_t childPid;
- forkfd = ::forkfd(FFD_CLOEXEC, &childPid);
+ forkfd = ::forkfd(ffdflags , &childPid);
int lastForkErrno = errno;
if (forkfd != FFD_CHILD_PROCESS) {
// Parent process.
@@ -517,7 +522,7 @@ void QProcessPrivate::startProcess()
if (stderrChannel.pipe[0] != -1)
::fcntl(stderrChannel.pipe[0], F_SETFL, ::fcntl(stderrChannel.pipe[0], F_GETFL) | O_NONBLOCK);
- if (threadData->eventDispatcher.loadAcquire()) {
+ if (threadData.loadRelaxed()->eventDispatcher.loadAcquire()) {
deathNotifier = new QSocketNotifier(forkfd, QSocketNotifier::Read, q);
QObject::connect(deathNotifier, SIGNAL(activated(int)),
q, SLOT(_q_processDied()));
@@ -596,7 +601,7 @@ bool QProcessPrivate::processStarted(QString *errorMessage)
if (startupSocketNotifier) {
startupSocketNotifier->setEnabled(false);
startupSocketNotifier->deleteLater();
- startupSocketNotifier = 0;
+ startupSocketNotifier = nullptr;
}
qt_safe_close(childStartedPipe[0]);
childStartedPipe[0] = -1;
@@ -889,7 +894,7 @@ bool QProcessPrivate::waitForDeadChild()
crashed = info.code != CLD_EXITED;
delete deathNotifier;
- deathNotifier = 0;
+ deathNotifier = nullptr;
EINTR_LOOP(ret, forkfd_close(forkfd));
forkfd = -1; // Child is dead, don't try to kill it anymore
@@ -935,7 +940,7 @@ bool QProcessPrivate::startDetached(qint64 *pid)
struct sigaction noaction;
memset(&noaction, 0, sizeof(noaction));
noaction.sa_handler = SIG_IGN;
- ::sigaction(SIGPIPE, &noaction, 0);
+ ::sigaction(SIGPIPE, &noaction, nullptr);
::setsid();
@@ -964,7 +969,7 @@ bool QProcessPrivate::startDetached(qint64 *pid)
char **argv = new char *[arguments.size() + 2];
for (int i = 0; i < arguments.size(); ++i)
argv[i + 1] = ::strdup(QFile::encodeName(arguments.at(i)).constData());
- argv[arguments.size() + 1] = 0;
+ argv[arguments.size() + 1] = nullptr;
// Duplicate the environment.
int envc = 0;
@@ -991,7 +996,7 @@ bool QProcessPrivate::startDetached(qint64 *pid)
struct sigaction noaction;
memset(&noaction, 0, sizeof(noaction));
noaction.sa_handler = SIG_IGN;
- ::sigaction(SIGPIPE, &noaction, 0);
+ ::sigaction(SIGPIPE, &noaction, nullptr);
// '\1' means execv failed
char c = '\1';
@@ -1002,7 +1007,7 @@ bool QProcessPrivate::startDetached(qint64 *pid)
struct sigaction noaction;
memset(&noaction, 0, sizeof(noaction));
noaction.sa_handler = SIG_IGN;
- ::sigaction(SIGPIPE, &noaction, 0);
+ ::sigaction(SIGPIPE, &noaction, nullptr);
// '\2' means internal error
char c = '\2';
diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp
index 3ba86063e3..1527cf93ed 100644
--- a/src/corelib/io/qprocess_win.cpp
+++ b/src/corelib/io/qprocess_win.cpp
@@ -49,7 +49,6 @@
#include <qelapsedtimer.h>
#include <qfileinfo.h>
#include <qrandom.h>
-#include <qregexp.h>
#include <qwineventnotifier.h>
#include <private/qsystemlibrary_p.h>
#include <private/qthread_p.h>
@@ -398,7 +397,17 @@ static QString qt_create_commandline(const QString &program, const QStringList &
for (int i=0; i<arguments.size(); ++i) {
QString tmp = arguments.at(i);
// Quotes are escaped and their preceding backslashes are doubled.
- tmp.replace(QRegExp(QLatin1String("(\\\\*)\"")), QLatin1String("\\1\\1\\\""));
+ int index = tmp.indexOf(QLatin1Char('"'));
+ while (index >= 0) {
+ // Escape quote
+ tmp.insert(index++, QLatin1Char('\\'));
+ // Double preceding backslashes (ignoring the one we just inserted)
+ for (int i = index - 2 ; i >= 0 && tmp.at(i) == QLatin1Char('\\') ; --i) {
+ tmp.insert(i, QLatin1Char('\\'));
+ index++;
+ }
+ index = tmp.indexOf(QLatin1Char('"'), index + 1);
+ }
if (tmp.isEmpty() || tmp.contains(QLatin1Char(' ')) || tmp.contains(QLatin1Char('\t'))) {
// The argument must not end with a \ since this would be interpreted
// as escaping the quote -- rather put the \ behind the quote: e.g.
@@ -590,7 +599,7 @@ void QProcessPrivate::startProcess()
if (!pid)
return;
- if (threadData->hasEventDispatcher()) {
+ if (threadData.loadRelaxed()->hasEventDispatcher()) {
processFinishedNotifier = new QWinEventNotifier(pid->hProcess, q);
QObject::connect(processFinishedNotifier, SIGNAL(activated(HANDLE)), q, SLOT(_q_processDied()));
processFinishedNotifier->setEnabled(true);
diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp
index a494daa29f..225ee0a769 100644
--- a/src/corelib/io/qresource.cpp
+++ b/src/corelib/io/qresource.cpp
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation.
+** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -60,14 +60,14 @@
#include "private/qtools_p.h"
#include "private/qsystemerror_p.h"
+#ifndef QT_NO_COMPRESS
+# include <zconf.h>
+# include <zlib.h>
+#endif
#if QT_CONFIG(zstd)
# include <zstd.h>
#endif
-#ifdef Q_OS_UNIX
-# include "private/qcore_unix_p.h"
-#endif
-
#if defined(Q_OS_UNIX) && !defined(Q_OS_NACL) && !defined(Q_OS_INTEGRITY)
# define QT_USE_MMAP
# include <sys/mman.h>
@@ -296,6 +296,8 @@ public:
void ensureInitialized() const;
void ensureChildren() const;
+ qint64 uncompressedSize() const Q_DECL_PURE_FUNCTION;
+ qsizetype decompress(char *buffer, qsizetype bufferSize) const;
bool load(const QString &file);
void clear();
@@ -440,6 +442,78 @@ QResourcePrivate::ensureChildren() const
}
}
+qint64 QResourcePrivate::uncompressedSize() const
+{
+ switch (compressionAlgo) {
+ case QResource::NoCompression:
+ return size;
+
+ case QResource::ZlibCompression:
+#ifndef QT_NO_COMPRESS
+ if (size_t(size) >= sizeof(quint32))
+ return qFromBigEndian<quint32>(data);
+#else
+ Q_ASSERT(!"QResource: Qt built without support for Zlib compression");
+ Q_UNREACHABLE();
+#endif
+ break;
+
+ case QResource::ZstdCompression: {
+#if QT_CONFIG(zstd)
+ size_t n = ZSTD_getFrameContentSize(data, size);
+ return ZSTD_isError(n) ? -1 : qint64(n);
+#else
+ // This should not happen because we've refused to load such resource
+ Q_ASSERT(!"QResource: Qt built without support for Zstd compression");
+ Q_UNREACHABLE();
+#endif
+ }
+
+ }
+ return -1;
+}
+
+qsizetype QResourcePrivate::decompress(char *buffer, qsizetype bufferSize) const
+{
+ Q_ASSERT(data);
+
+ switch (compressionAlgo) {
+ case QResource::NoCompression:
+ Q_UNREACHABLE();
+ break;
+
+ case QResource::ZlibCompression: {
+#ifndef QT_NO_COMPRESS
+ uLong len = uLong(bufferSize);
+ int res = ::uncompress(reinterpret_cast<Bytef *>(buffer), &len,
+ data + sizeof(quint32), uLong(size - sizeof(quint32)));
+ if (res != Z_OK) {
+ qWarning("QResource: error decompressing zlib content (%d)", res);
+ return -1;
+ }
+ return len;
+#else
+ Q_UNREACHABLE();
+#endif
+ }
+
+ case QResource::ZstdCompression: {
+#if QT_CONFIG(zstd)
+ size_t usize = ZSTD_decompress(buffer, bufferSize, data, size);
+ if (ZSTD_isError(usize)) {
+ qWarning("QResource: error decompressing zstd content: %s", ZSTD_getErrorName(usize));
+ return -1;
+ }
+ return usize;
+#else
+ Q_UNREACHABLE();
+#endif
+ }
+ }
+
+ return -1;
+}
+
/*!
Constructs a QResource pointing to \a file. \a locale is used to
load a specific localization of a resource data.
@@ -600,9 +674,12 @@ QResource::Compression QResource::compressionAlgorithm() const
}
/*!
- Returns the size of the data backing the resource.
+ Returns the size of the stored data backing the resource.
- \sa data(), isFile()
+ If the resource is compressed, this function returns the size of the
+ compressed data. See uncompressedSize() for the uncompressed size.
+
+ \sa data(), uncompressedSize(), isFile()
*/
qint64 QResource::size() const
@@ -613,12 +690,29 @@ qint64 QResource::size() const
}
/*!
- Returns direct access to a read only segment of data that this resource
- represents. If the resource is compressed the data returned is compressed
- and the appropriate library functions must be used to access the data. If
- the resource is a directory \nullptr is returned.
+ \since 5.15
+
+ Returns the size of the data in this resource. If the data was not
+ compressed, this function returns the same as size(). If it was, then this
+ function extracts the size of the original uncompressed data from the
+ stored stream.
+
+ \sa size(), uncompressedData(), isFile()
+*/
+qint64 QResource::uncompressedSize() const
+{
+ Q_D(const QResource);
+ d->ensureInitialized();
+ return d->uncompressedSize();
+}
+
+/*!
+ Returns direct access to a segment of read-only data, that this resource
+ represents. If the resource is compressed, the data returned is also
+ compressed. The caller must then decompress the data or use
+ uncompressedData(). If the resource is a directory, \c nullptr is returned.
- \sa size(), compressionAlgorithm(), isFile()
+ \sa uncompressedData(), size(), isFile()
*/
const uchar *QResource::data() const
@@ -629,6 +723,42 @@ const uchar *QResource::data() const
}
/*!
+ \since 5.15
+
+ Returns the resource data, decompressing it first, if the data was stored
+ compressed. If the resource is a directory or an error occurs while
+ decompressing, a null QByteArray is returned.
+
+ \note If the data was compressed, this function will decompress every time
+ it is called. The result is not cached between calls.
+
+ \sa uncompressedData(), size(), isCompressed(), isFile()
+*/
+
+QByteArray QResource::uncompressedData() const
+{
+ Q_D(const QResource);
+ qint64 n = uncompressedSize();
+ if (n < 0)
+ return QByteArray();
+ if (n > std::numeric_limits<QByteArray::size_type>::max()) {
+ qWarning("QResource: compressed content does not fit into a QByteArray; use QFile instead");
+ return QByteArray();
+ }
+ if (d->compressionAlgo == NoCompression)
+ return QByteArray::fromRawData(reinterpret_cast<const char *>(d->data), n);
+
+ // decompress
+ QByteArray result(n, Qt::Uninitialized);
+ n = d->decompress(result.data(), n);
+ if (n < 0)
+ result.clear();
+ else
+ result.truncate(n);
+ return result;
+}
+
+/*!
\since 5.8
Returns the date and time when the file was last modified before
@@ -1451,13 +1581,7 @@ bool QResourceFileEngine::link(const QString &)
qint64 QResourceFileEngine::size() const
{
Q_D(const QResourceFileEngine);
- if (!d->resource.isValid())
- return 0;
- if (d->resource.compressionAlgorithm() != QResource::NoCompression) {
- d->uncompress();
- return d->uncompressed.size();
- }
- return d->resource.size();
+ return d->resource.isValid() ? d->resource.uncompressedSize() : 0;
}
qint64 QResourceFileEngine::pos() const
@@ -1494,7 +1618,7 @@ bool QResourceFileEngine::isSequential() const
QAbstractFileEngine::FileFlags QResourceFileEngine::fileFlags(QAbstractFileEngine::FileFlags type) const
{
Q_D(const QResourceFileEngine);
- QAbstractFileEngine::FileFlags ret = 0;
+ QAbstractFileEngine::FileFlags ret;
if(!d->resource.isValid())
return ret;
@@ -1586,7 +1710,7 @@ QAbstractFileEngine::Iterator *QResourceFileEngine::beginEntryList(QDir::Filters
*/
QAbstractFileEngine::Iterator *QResourceFileEngine::endEntryList()
{
- return 0;
+ return nullptr;
}
bool QResourceFileEngine::extension(Extension extension, const ExtensionOption *option, ExtensionReturn *output)
@@ -1596,7 +1720,7 @@ bool QResourceFileEngine::extension(Extension extension, const ExtensionOption *
const MapExtensionOption *options = (const MapExtensionOption*)(option);
MapExtensionReturn *returnValue = static_cast<MapExtensionReturn*>(output);
returnValue->address = d->map(options->offset, options->size, options->flags);
- return (returnValue->address != 0);
+ return (returnValue->address != nullptr);
}
if (extension == UnMapExtension) {
const UnMapExtensionOption *options = (const UnMapExtensionOption*)option;
@@ -1615,22 +1739,21 @@ uchar *QResourceFileEnginePrivate::map(qint64 offset, qint64 size, QFile::Memory
Q_Q(QResourceFileEngine);
Q_UNUSED(flags);
- qint64 max = resource.size();
- if (resource.compressionAlgorithm() != QResource::NoCompression) {
- uncompress();
- max = uncompressed.size();
- }
-
+ qint64 max = resource.uncompressedSize();
qint64 end;
if (offset < 0 || size <= 0 || !resource.isValid() ||
add_overflow(offset, size, &end) || end > max) {
q->setError(QFile::UnspecifiedError, QString());
- return 0;
+ return nullptr;
}
const uchar *address = resource.data();
- if (resource.compressionAlgorithm() != QResource::NoCompression)
+ if (resource.compressionAlgorithm() != QResource::NoCompression) {
+ uncompress();
+ if (uncompressed.isNull())
+ return nullptr;
address = reinterpret_cast<const uchar *>(uncompressed.constData());
+ }
return const_cast<uchar *>(address) + offset;
}
@@ -1643,41 +1766,10 @@ bool QResourceFileEnginePrivate::unmap(uchar *ptr)
void QResourceFileEnginePrivate::uncompress() const
{
- if (uncompressed.isEmpty() && resource.size()) {
- quint64 size;
- switch (resource.compressionAlgorithm()) {
- case QResource::NoCompression:
- return; // nothing to do
-
- case QResource::ZlibCompression:
-#ifndef QT_NO_COMPRESS
- uncompressed = qUncompress(resource.data(), resource.size());
-#else
- Q_ASSERT(!"QResourceFileEngine::open: Qt built without support for Zlib compression");
-#endif
- break;
-
- case QResource::ZstdCompression:
-#if QT_CONFIG(zstd)
- size = ZSTD_getFrameContentSize(resource.data(), resource.size());
- if (!ZSTD_isError(size)) {
- if (size >= MaxAllocSize) {
- qWarning("QResourceFileEngine::open: content bigger than memory (size %lld)", size);
- } else {
- uncompressed = QByteArray(size, Qt::Uninitialized);
- size = ZSTD_decompress(const_cast<char *>(uncompressed.data()), size,
- resource.data(), resource.size());
- }
- }
- if (ZSTD_isError(size))
- qWarning("QResourceFileEngine::open: error decoding: %s", ZSTD_getErrorName(size));
-#else
- Q_UNUSED(size);
- Q_ASSERT(!"QResourceFileEngine::open: Qt built without support for Zstd compression");
-#endif
- break;
- }
- }
+ if (resource.compressionAlgorithm() == QResource::NoCompression
+ || !uncompressed.isEmpty() || resource.size() == 0)
+ return; // nothing to do
+ uncompressed = resource.uncompressedData();
}
#endif // !defined(QT_BOOTSTRAPPED)
diff --git a/src/corelib/io/qresource.h b/src/corelib/io/qresource.h
index 5ee8d5d266..52b0d74d29 100644
--- a/src/corelib/io/qresource.h
+++ b/src/corelib/io/qresource.h
@@ -1,6 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2019 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -75,6 +76,8 @@ public:
Compression compressionAlgorithm() const;
qint64 size() const;
const uchar *data() const;
+ qint64 uncompressedSize() const;
+ QByteArray uncompressedData() const;
QDateTime lastModified() const;
#if QT_DEPRECATED_SINCE(5, 13)
diff --git a/src/corelib/io/qsavefile.cpp b/src/corelib/io/qsavefile.cpp
index 0a884a7df9..067ccda3df 100644
--- a/src/corelib/io/qsavefile.cpp
+++ b/src/corelib/io/qsavefile.cpp
@@ -116,7 +116,7 @@ QSaveFile::QSaveFile(const QString &name)
Constructs a new file object to represent the file with the given \a name.
*/
QSaveFile::QSaveFile(const QString &name)
- : QFileDevice(*new QSaveFilePrivate, 0)
+ : QFileDevice(*new QSaveFilePrivate, nullptr)
{
Q_D(QSaveFile);
d->fileName = name;
diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp
index fc7122d904..b191397e7e 100644
--- a/src/corelib/io/qsettings.cpp
+++ b/src/corelib/io/qsettings.cpp
@@ -76,10 +76,6 @@
# include <ioLib.h>
#endif
-#ifdef Q_OS_WASM
-#include <emscripten.h>
-#endif
-
#include <algorithm>
#include <stdlib.h>
@@ -210,7 +206,7 @@ QConfFile *QConfFile::fromName(const QString &fileName, bool _userPerms)
ConfFileHash *usedHash = usedHashFunc();
ConfFileCache *unusedCache = unusedCacheFunc();
- QConfFile *confFile = 0;
+ QConfFile *confFile = nullptr;
const auto locker = qt_scoped_lock(settingsGlobalMutex);
if (!(confFile = usedHash->value(absPath))) {
@@ -234,7 +230,7 @@ void QConfFile::clearCache()
// QSettingsPrivate
QSettingsPrivate::QSettingsPrivate(QSettings::Format format)
- : format(format), scope(QSettings::UserScope /* nothing better to put */), iniCodec(0), fallbacks(true),
+ : format(format), scope(QSettings::UserScope /* nothing better to put */), iniCodec(nullptr), fallbacks(true),
pendingChanges(false), status(QSettings::NoError)
{
}
@@ -242,7 +238,7 @@ QSettingsPrivate::QSettingsPrivate(QSettings::Format format)
QSettingsPrivate::QSettingsPrivate(QSettings::Format format, QSettings::Scope scope,
const QString &organization, const QString &application)
: format(format), scope(scope), organizationName(organization), applicationName(application),
- iniCodec(0), fallbacks(true), pendingChanges(false), status(QSettings::NoError)
+ iniCodec(nullptr), fallbacks(true), pendingChanges(false), status(QSettings::NoError)
{
}
@@ -295,7 +291,7 @@ after_loop:
// see also qsettings_win.cpp, qsettings_winrt.cpp and qsettings_mac.cpp
-#if !defined(Q_OS_WIN) && !defined(Q_OS_MAC)
+#if !defined(Q_OS_WIN) && !defined(Q_OS_MAC) && !defined(Q_OS_WASM)
QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format, QSettings::Scope scope,
const QString &organization, const QString &application)
{
@@ -400,12 +396,12 @@ QString QSettingsPrivate::variantToString(const QVariant &v)
{
QString result;
- switch (v.type()) {
- case QVariant::Invalid:
+ switch (v.userType()) {
+ case QMetaType::UnknownType:
result = QLatin1String("@Invalid()");
break;
- case QVariant::ByteArray: {
+ case QMetaType::QByteArray: {
QByteArray a = v.toByteArray();
result = QLatin1String("@ByteArray(")
+ QLatin1String(a.constData(), a.size())
@@ -413,14 +409,14 @@ QString QSettingsPrivate::variantToString(const QVariant &v)
break;
}
- case QVariant::String:
- case QVariant::LongLong:
- case QVariant::ULongLong:
- case QVariant::Int:
- case QVariant::UInt:
- case QVariant::Bool:
- case QVariant::Double:
- case QVariant::KeySequence: {
+ case QMetaType::QString:
+ case QMetaType::LongLong:
+ case QMetaType::ULongLong:
+ case QMetaType::Int:
+ case QMetaType::UInt:
+ case QMetaType::Bool:
+ case QMetaType::Double:
+ case QMetaType::QKeySequence: {
result = v.toString();
if (result.contains(QChar::Null))
result = QLatin1String("@String(") + result + QLatin1Char(')');
@@ -429,17 +425,17 @@ QString QSettingsPrivate::variantToString(const QVariant &v)
break;
}
#ifndef QT_NO_GEOM_VARIANT
- case QVariant::Rect: {
+ case QMetaType::QRect: {
QRect r = qvariant_cast<QRect>(v);
result = QString::asprintf("@Rect(%d %d %d %d)", r.x(), r.y(), r.width(), r.height());
break;
}
- case QVariant::Size: {
+ case QMetaType::QSize: {
QSize s = qvariant_cast<QSize>(v);
result = QString::asprintf("@Size(%d %d)", s.width(), s.height());
break;
}
- case QVariant::Point: {
+ case QMetaType::QPoint: {
QPoint p = qvariant_cast<QPoint>(v);
result = QString::asprintf("@Point(%d %d)", p.x(), p.y());
break;
@@ -450,7 +446,7 @@ QString QSettingsPrivate::variantToString(const QVariant &v)
#ifndef QT_NO_DATASTREAM
QDataStream::Version version;
const char *typeSpec;
- if (v.type() == QVariant::DateTime) {
+ if (v.userType() == QMetaType::QDateTime) {
version = QDataStream::Qt_5_6;
typeSpec = "@DateTime(";
} else {
@@ -928,8 +924,8 @@ QStringList QSettingsPrivate::splitArgs(const QString &s, int idx)
void QConfFileSettingsPrivate::initFormat()
{
extension = (format == QSettings::NativeFormat) ? QLatin1String(".conf") : QLatin1String(".ini");
- readFunc = 0;
- writeFunc = 0;
+ readFunc = nullptr;
+ writeFunc = nullptr;
#if defined(Q_OS_MAC)
caseSensitivity = (format == QSettings::NativeFormat) ? Qt::CaseSensitive : IniCaseSensitivity;
#else
@@ -1185,7 +1181,9 @@ QConfFileSettingsPrivate::QConfFileSettingsPrivate(QSettings::Format format,
confFiles.append(QConfFile::fromName(systemPath.path + orgFile, false));
}
+#ifndef Q_OS_WASM // wasm needs to delay access until after file sync
initAccess();
+#endif
}
QConfFileSettingsPrivate::QConfFileSettingsPrivate(const QString &fileName,
@@ -1548,13 +1546,6 @@ void QConfFileSettingsPrivate::syncConfFile(QConfFile *confFile)
perms |= QFile::ReadGroup | QFile::ReadOther;
QFile(confFile->name).setPermissions(perms);
}
-#ifdef Q_OS_WASM
- EM_ASM(
- // Sync sandbox filesystem to persistent database filesystem. See QTBUG-70002
- FS.syncfs(false, function(err) {
- });
- );
-#endif
} else {
setStatus(QSettings::AccessError);
}
@@ -1897,8 +1888,8 @@ bool QConfFileSettingsPrivate::writeIniFile(QIODevice &device, const ParsedSetti
QVariant(QString("foo")).toList() returns an empty
list, not a list containing "foo".
*/
- if (value.type() == QVariant::StringList
- || (value.type() == QVariant::List && value.toList().size() != 1)) {
+ if (value.userType() == QMetaType::QStringList
+ || (value.userType() == QMetaType::QVariantList && value.toList().size() != 1)) {
iniEscapedStringList(variantListToStringList(value.toList()), block, iniCodec);
} else {
iniEscapedString(variantToString(value), block, iniCodec);
@@ -3347,7 +3338,7 @@ bool QSettings::contains(const QString &key) const
{
Q_D(const QSettings);
QString k = d->actualKey(key);
- return d->get(k, 0);
+ return d->get(k, nullptr);
}
/*!
diff --git a/src/corelib/io/qsettings_p.h b/src/corelib/io/qsettings_p.h
index d18c96a06c..c30f099a72 100644
--- a/src/corelib/io/qsettings_p.h
+++ b/src/corelib/io/qsettings_p.h
@@ -57,6 +57,10 @@
#include "QtCore/qiodevice.h"
#include "QtCore/qstack.h"
#include "QtCore/qstringlist.h"
+
+#include <QtCore/qvariant.h>
+#include "qsettings.h"
+
#ifndef QT_NO_QOBJECT
#include "private/qobject_p.h"
#endif
@@ -253,6 +257,10 @@ protected:
mutable QSettings::Status status;
};
+#ifdef Q_OS_WASM
+class QWasmSettingsPrivate;
+#endif
+
class QConfFileSettingsPrivate : public QSettingsPrivate
{
public:
@@ -281,7 +289,7 @@ public:
private:
void initFormat();
- void initAccess();
+ virtual void initAccess();
void syncConfFile(QConfFile *confFile);
bool writeIniFile(QIODevice &device, const ParsedSettingsMap &map);
#ifdef Q_OS_MAC
@@ -297,6 +305,9 @@ private:
QString extension;
Qt::CaseSensitivity caseSensitivity;
int nextPosition;
+#ifdef Q_OS_WASM
+ friend class QWasmSettingsPrivate;
+#endif
};
QT_END_NAMESPACE
diff --git a/src/corelib/io/qsettings_wasm.cpp b/src/corelib/io/qsettings_wasm.cpp
new file mode 100644
index 0000000000..8d8f4b505c
--- /dev/null
+++ b/src/corelib/io/qsettings_wasm.cpp
@@ -0,0 +1,259 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qsettings.h"
+#ifndef QT_NO_SETTINGS
+
+#include "qsettings_p.h"
+#ifndef QT_NO_QOBJECT
+#include "qcoreapplication.h"
+#include <QFile>
+#endif // QT_NO_QOBJECT
+#include <QDebug>
+
+#include <QFileInfo>
+#include <QDir>
+#include <emscripten.h>
+
+QT_BEGIN_NAMESPACE
+
+static bool isReadReady = false;
+
+class QWasmSettingsPrivate : public QConfFileSettingsPrivate
+{
+public:
+ QWasmSettingsPrivate(QSettings::Scope scope, const QString &organization,
+ const QString &application);
+ ~QWasmSettingsPrivate();
+
+ bool get(const QString &key, QVariant *value) const override;
+ QStringList children(const QString &prefix, ChildSpec spec) const override;
+ void clear() override;
+ void sync() override;
+ void flush() override;
+ bool isWritable() const override;
+
+ void syncToLocal(const char *data, int size);
+ void loadLocal(const QByteArray &filename);
+ void setReady();
+ void initAccess() override;
+
+private:
+ QString databaseName;
+ QString id;
+};
+
+static void QWasmSettingsPrivate_onLoad(void *userData, void *dataPtr, int size)
+{
+ QWasmSettingsPrivate *wasm = reinterpret_cast<QWasmSettingsPrivate *>(userData);
+
+ QFile file(wasm->fileName());
+ QFileInfo fileInfo(wasm->fileName());
+ QDir dir(fileInfo.path());
+ if (!dir.exists())
+ dir.mkpath(fileInfo.path());
+
+ if (file.open(QFile::WriteOnly)) {
+ file.write(reinterpret_cast<char *>(dataPtr), size);
+ file.close();
+ wasm->setReady();
+ }
+}
+
+static void QWasmSettingsPrivate_onError(void *userData)
+{
+ QWasmSettingsPrivate *wasm = reinterpret_cast<QWasmSettingsPrivate *>(userData);
+ if (wasm)
+ wasm->setStatus(QSettings::AccessError);
+}
+
+static void QWasmSettingsPrivate_onStore(void *userData)
+{
+ QWasmSettingsPrivate *wasm = reinterpret_cast<QWasmSettingsPrivate *>(userData);
+ if (wasm)
+ wasm->setStatus(QSettings::NoError);
+}
+
+static void QWasmSettingsPrivate_onCheck(void *userData, int exists)
+{
+ QWasmSettingsPrivate *wasm = reinterpret_cast<QWasmSettingsPrivate *>(userData);
+ if (wasm) {
+ if (exists)
+ wasm->loadLocal(wasm->fileName().toLocal8Bit());
+ else
+ wasm->setReady();
+ }
+}
+
+QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format,
+ QSettings::Scope scope,
+ const QString &organization,
+ const QString &application)
+{
+ Q_UNUSED(format)
+ if (organization == QLatin1String("Qt"))
+ {
+ QString organizationDomain = QCoreApplication::organizationDomain();
+ QString applicationName = QCoreApplication::applicationName();
+
+ QSettingsPrivate *newSettings;
+ newSettings = new QWasmSettingsPrivate(scope, organizationDomain, applicationName);
+
+ newSettings->beginGroupOrArray(QSettingsGroup(normalizedKey(organization)));
+ if (!application.isEmpty())
+ newSettings->beginGroupOrArray(QSettingsGroup(normalizedKey(application)));
+
+ return newSettings;
+ }
+ return new QWasmSettingsPrivate(scope, organization, application);
+}
+
+QWasmSettingsPrivate::QWasmSettingsPrivate(QSettings::Scope scope, const QString &organization,
+ const QString &application)
+ : QConfFileSettingsPrivate(QSettings::NativeFormat, scope, organization, application)
+{
+ setStatus(QSettings::AccessError); // access error until sandbox gets loaded
+ databaseName = organization;
+ id = application;
+
+ emscripten_idb_async_exists("/home/web_user",
+ fileName().toLocal8Bit(),
+ reinterpret_cast<void*>(this),
+ QWasmSettingsPrivate_onCheck,
+ QWasmSettingsPrivate_onError);
+}
+
+QWasmSettingsPrivate::~QWasmSettingsPrivate()
+{
+}
+
+ void QWasmSettingsPrivate::initAccess()
+{
+ if (isReadReady)
+ QConfFileSettingsPrivate::initAccess();
+}
+
+bool QWasmSettingsPrivate::get(const QString &key, QVariant *value) const
+{
+ if (isReadReady)
+ return QConfFileSettingsPrivate::get(key, value);
+
+ return false;
+}
+
+QStringList QWasmSettingsPrivate::children(const QString &prefix, ChildSpec spec) const
+{
+ return QConfFileSettingsPrivate::children(prefix, spec);
+}
+
+void QWasmSettingsPrivate::clear()
+{
+ QConfFileSettingsPrivate::clear();
+ emscripten_idb_async_delete("/home/web_user",
+ fileName().toLocal8Bit(),
+ reinterpret_cast<void*>(this),
+ QWasmSettingsPrivate_onStore,
+ QWasmSettingsPrivate_onError);
+}
+
+void QWasmSettingsPrivate::sync()
+{
+ QConfFileSettingsPrivate::sync();
+
+ QFile file(fileName());
+ if (file.open(QFile::ReadOnly)) {
+ QByteArray dataPointer = file.readAll();
+
+ emscripten_idb_async_store("/home/web_user",
+ fileName().toLocal8Bit(),
+ reinterpret_cast<void *>(dataPointer.data()),
+ dataPointer.length(),
+ reinterpret_cast<void*>(this),
+ QWasmSettingsPrivate_onStore,
+ QWasmSettingsPrivate_onError);
+ }
+}
+
+void QWasmSettingsPrivate::flush()
+{
+ sync();
+}
+
+bool QWasmSettingsPrivate::isWritable() const
+{
+ return isReadReady && QConfFileSettingsPrivate::isWritable();
+}
+
+void QWasmSettingsPrivate::syncToLocal(const char *data, int size)
+{
+ QFile file(fileName());
+
+ if (file.open(QFile::WriteOnly)) {
+ file.write(data, size + 1);
+ QByteArray data = file.readAll();
+
+ emscripten_idb_async_store("/home/web_user",
+ fileName().toLocal8Bit(),
+ reinterpret_cast<void *>(data.data()),
+ data.length(),
+ reinterpret_cast<void*>(this),
+ QWasmSettingsPrivate_onStore,
+ QWasmSettingsPrivate_onError);
+ setReady();
+ }
+}
+
+void QWasmSettingsPrivate::loadLocal(const QByteArray &filename)
+{
+ emscripten_idb_async_load("/home/web_user",
+ filename.data(),
+ reinterpret_cast<void*>(this),
+ QWasmSettingsPrivate_onLoad,
+ QWasmSettingsPrivate_onError);
+}
+
+void QWasmSettingsPrivate::setReady()
+{
+ isReadReady = true;
+ setStatus(QSettings::NoError);
+ QConfFileSettingsPrivate::initAccess();
+}
+
+QT_END_NAMESPACE
+#endif // QT_NO_SETTINGS
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index 878e007fb0..659552b72f 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -823,7 +823,7 @@ recodeFromUser(const QString &input, const ushort *actions, int from, int to)
QString output;
const QChar *begin = input.constData() + from;
const QChar *end = input.constData() + to;
- if (qt_urlRecode(output, begin, end, nullptr, actions))
+ if (qt_urlRecode(output, begin, end, {}, actions))
return output;
return input.mid(from, to - from);
diff --git a/src/corelib/itemmodels/qabstractitemmodel.cpp b/src/corelib/itemmodels/qabstractitemmodel.cpp
index 6e97c2fd39..608407c136 100644
--- a/src/corelib/itemmodels/qabstractitemmodel.cpp
+++ b/src/corelib/itemmodels/qabstractitemmodel.cpp
@@ -46,6 +46,7 @@
#include <qdebug.h>
#include <qvector.h>
#include <qregexp.h>
+#include <qregularexpression.h>
#include <qstack.h>
#include <qbitarray.h>
#include <qdatetime.h>
@@ -60,7 +61,7 @@ Q_LOGGING_CATEGORY(lcCheckIndex, "qt.core.qabstractitemmodel.checkindex")
QPersistentModelIndexData *QPersistentModelIndexData::create(const QModelIndex &index)
{
Q_ASSERT(index.isValid()); // we will _never_ insert an invalid index in the list
- QPersistentModelIndexData *d = 0;
+ QPersistentModelIndexData *d = nullptr;
QAbstractItemModel *model = const_cast<QAbstractItemModel *>(index.model());
QHash<QModelIndex, QPersistentModelIndexData *> &indexes = model->d_func()->persistent.indexes;
const auto it = indexes.constFind(index);
@@ -135,7 +136,7 @@ void QPersistentModelIndexData::destroy(QPersistentModelIndexData *data)
*/
QPersistentModelIndex::QPersistentModelIndex()
- : d(0)
+ : d(nullptr)
{
}
@@ -157,7 +158,7 @@ QPersistentModelIndex::QPersistentModelIndex(const QPersistentModelIndex &other)
*/
QPersistentModelIndex::QPersistentModelIndex(const QModelIndex &index)
- : d(0)
+ : d(nullptr)
{
if (index.isValid()) {
d = QPersistentModelIndexData::create(index);
@@ -175,7 +176,7 @@ QPersistentModelIndex::~QPersistentModelIndex()
{
if (d && !d->ref.deref()) {
QPersistentModelIndexData::destroy(d);
- d = 0;
+ d = nullptr;
}
}
@@ -256,7 +257,7 @@ QPersistentModelIndex &QPersistentModelIndex::operator=(const QModelIndex &other
d = QPersistentModelIndexData::create(other);
if (d) d->ref.ref();
} else {
- d = 0;
+ d = nullptr;
}
return *this;
}
@@ -343,7 +344,7 @@ void *QPersistentModelIndex::internalPointer() const
{
if (d)
return d->index.internalPointer();
- return 0;
+ return nullptr;
}
/*!
@@ -431,7 +432,7 @@ Qt::ItemFlags QPersistentModelIndex::flags() const
{
if (d)
return d->index.flags();
- return 0;
+ return { };
}
/*!
@@ -441,7 +442,7 @@ const QAbstractItemModel *QPersistentModelIndex::model() const
{
if (d)
return d->index.model();
- return 0;
+ return nullptr;
}
/*!
@@ -483,7 +484,7 @@ QDebug operator<<(QDebug dbg, const QPersistentModelIndex &idx)
class QEmptyItemModel : public QAbstractItemModel
{
public:
- explicit QEmptyItemModel(QObject *parent = 0) : QAbstractItemModel(parent) {}
+ explicit QEmptyItemModel(QObject *parent = nullptr) : QAbstractItemModel(parent) {}
QModelIndex index(int, int, const QModelIndex &) const override { return QModelIndex(); }
QModelIndex parent(const QModelIndex &) const override { return QModelIndex(); }
int rowCount(const QModelIndex &) const override { return 0; }
@@ -551,32 +552,32 @@ const QHash<int,QByteArray> &QAbstractItemModelPrivate::defaultRoleNames()
bool QAbstractItemModelPrivate::isVariantLessThan(const QVariant &left, const QVariant &right,
Qt::CaseSensitivity cs, bool isLocaleAware)
{
- if (left.userType() == QVariant::Invalid)
+ if (left.userType() == QMetaType::UnknownType)
return false;
- if (right.userType() == QVariant::Invalid)
+ if (right.userType() == QMetaType::UnknownType)
return true;
switch (left.userType()) {
- case QVariant::Int:
+ case QMetaType::Int:
return left.toInt() < right.toInt();
- case QVariant::UInt:
+ case QMetaType::UInt:
return left.toUInt() < right.toUInt();
- case QVariant::LongLong:
+ case QMetaType::LongLong:
return left.toLongLong() < right.toLongLong();
- case QVariant::ULongLong:
+ case QMetaType::ULongLong:
return left.toULongLong() < right.toULongLong();
case QMetaType::Float:
return left.toFloat() < right.toFloat();
- case QVariant::Double:
+ case QMetaType::Double:
return left.toDouble() < right.toDouble();
- case QVariant::Char:
+ case QMetaType::QChar:
return left.toChar() < right.toChar();
- case QVariant::Date:
+ case QMetaType::QDate:
return left.toDate() < right.toDate();
- case QVariant::Time:
+ case QMetaType::QTime:
return left.toTime() < right.toTime();
- case QVariant::DateTime:
+ case QMetaType::QDateTime:
return left.toDateTime() < right.toDateTime();
- case QVariant::String:
+ case QMetaType::QString:
default:
if (isLocaleAware)
return left.toString().localeAwareCompare(right.toString()) < 0;
@@ -590,19 +591,19 @@ static uint typeOfVariant(const QVariant &value)
{
//return 0 for integer, 1 for floating point and 2 for other
switch (value.userType()) {
- case QVariant::Bool:
- case QVariant::Int:
- case QVariant::UInt:
- case QVariant::LongLong:
- case QVariant::ULongLong:
- case QVariant::Char:
+ case QMetaType::Bool:
+ case QMetaType::Int:
+ case QMetaType::UInt:
+ case QMetaType::LongLong:
+ case QMetaType::ULongLong:
+ case QMetaType::QChar:
case QMetaType::Short:
case QMetaType::UShort:
case QMetaType::UChar:
case QMetaType::ULong:
case QMetaType::Long:
return 0;
- case QVariant::Double:
+ case QMetaType::Double:
case QMetaType::Float:
return 1;
default:
@@ -1949,10 +1950,10 @@ QStringList QAbstractItemModel::mimeTypes() const
QMimeData *QAbstractItemModel::mimeData(const QModelIndexList &indexes) const
{
if (indexes.count() <= 0)
- return 0;
+ return nullptr;
QStringList types = mimeTypes();
if (types.isEmpty())
- return 0;
+ return nullptr;
QMimeData *data = new QMimeData();
QString format = types.at(0);
QByteArray encoded;
@@ -2295,7 +2296,7 @@ Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
{
Q_D(const QAbstractItemModel);
if (!d->indexValid(index))
- return 0;
+ return { };
return Qt::ItemIsSelectable|Qt::ItemIsEnabled;
}
@@ -2358,6 +2359,7 @@ QModelIndexList QAbstractItemModel::match(const QModelIndex &start, int role,
bool wrap = flags & Qt::MatchWrap;
bool allHits = (hits == -1);
QString text; // only convert to a string if it is needed
+ QRegularExpression rx; // only create it if needed
const int column = start.column();
QModelIndex p = parent(start);
int from = start.row();
@@ -2374,17 +2376,39 @@ QModelIndexList QAbstractItemModel::match(const QModelIndex &start, int role,
if (matchType == Qt::MatchExactly) {
if (value == v)
result.append(idx);
- } else { // QString based matching
- if (text.isEmpty()) // lazy conversion
- text = value.toString();
+ } else { // QString or regular expression based matching
+ if (matchType == Qt::MatchRegularExpression) {
+ if (rx.pattern().isEmpty()) {
+ if (value.userType() == QMetaType::QRegularExpression) {
+ rx = value.toRegularExpression();
+ } else {
+ rx.setPattern(value.toString());
+ if (cs == Qt::CaseInsensitive)
+ rx.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
+ }
+ }
+ } else if (matchType == Qt::MatchWildcard) {
+ if (rx.pattern().isEmpty())
+ rx.setPattern(QRegularExpression::wildcardToRegularExpression(value.toString()));
+ if (cs == Qt::CaseInsensitive)
+ rx.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
+ } else {
+ if (text.isEmpty()) // lazy conversion
+ text = value.toString();
+ }
+
QString t = v.toString();
switch (matchType) {
+#if QT_DEPRECATED_SINCE(5, 15)
case Qt::MatchRegExp:
if (QRegExp(text, cs).exactMatch(t))
result.append(idx);
break;
+#endif
+ case Qt::MatchRegularExpression:
+ Q_FALLTHROUGH();
case Qt::MatchWildcard:
- if (QRegExp(text, cs, QRegExp::Wildcard).exactMatch(t))
+ if (t.contains(rx))
result.append(idx);
break;
case Qt::MatchStartsWith:
diff --git a/src/corelib/itemmodels/qabstractproxymodel.cpp b/src/corelib/itemmodels/qabstractproxymodel.cpp
index c863406afd..87559cd6b2 100644
--- a/src/corelib/itemmodels/qabstractproxymodel.cpp
+++ b/src/corelib/itemmodels/qabstractproxymodel.cpp
@@ -159,7 +159,7 @@ QAbstractItemModel *QAbstractProxyModel::sourceModel() const
{
Q_D(const QAbstractProxyModel);
if (d->model == QAbstractItemModelPrivate::staticEmptyModel())
- return 0;
+ return nullptr;
return d->model;
}
diff --git a/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp b/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp
index 0319d215a1..3afa132483 100644
--- a/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp
+++ b/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp
@@ -497,7 +497,7 @@ void QConcatenateTablesProxyModel::removeSourceModel(QAbstractItemModel *sourceM
{
Q_D(QConcatenateTablesProxyModel);
Q_ASSERT(d->m_models.contains(sourceModel));
- disconnect(sourceModel, 0, this, 0);
+ disconnect(sourceModel, nullptr, this, nullptr);
const int rowsRemoved = sourceModel->rowCount();
const int rowsPrior = d->computeRowsPrior(sourceModel); // location of removed section
diff --git a/src/corelib/itemmodels/qidentityproxymodel.cpp b/src/corelib/itemmodels/qidentityproxymodel.cpp
index 39992eccd3..f5684c6eda 100644
--- a/src/corelib/itemmodels/qidentityproxymodel.cpp
+++ b/src/corelib/itemmodels/qidentityproxymodel.cpp
@@ -313,6 +313,30 @@ bool QIdentityProxyModel::removeRows(int row, int count, const QModelIndex& pare
/*!
\reimp
+ \since 5.15
+ */
+bool QIdentityProxyModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild)
+{
+ Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == this : true);
+ Q_ASSERT(destinationParent.isValid() ? destinationParent.model() == this : true);
+ Q_D(QIdentityProxyModel);
+ return d->model->moveRows(mapToSource(sourceParent), sourceRow, count, mapToSource(destinationParent), destinationChild);
+}
+
+/*!
+ \reimp
+ \since 5.15
+ */
+bool QIdentityProxyModel::moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild)
+{
+ Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == this : true);
+ Q_ASSERT(destinationParent.isValid() ? destinationParent.model() == this : true);
+ Q_D(QIdentityProxyModel);
+ return d->model->moveColumns(mapToSource(sourceParent), sourceColumn, count, mapToSource(destinationParent), destinationChild);
+}
+
+/*!
+ \reimp
*/
int QIdentityProxyModel::rowCount(const QModelIndex& parent) const
{
diff --git a/src/corelib/itemmodels/qidentityproxymodel.h b/src/corelib/itemmodels/qidentityproxymodel.h
index 89ac89cdba..4c14e6176a 100644
--- a/src/corelib/itemmodels/qidentityproxymodel.h
+++ b/src/corelib/itemmodels/qidentityproxymodel.h
@@ -77,6 +77,8 @@ public:
bool insertRows(int row, int count, const QModelIndex& parent = QModelIndex()) override;
bool removeColumns(int column, int count, const QModelIndex& parent = QModelIndex()) override;
bool removeRows(int row, int count, const QModelIndex& parent = QModelIndex()) override;
+ bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) override;
+ bool moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild) override;
protected:
QIdentityProxyModel(QIdentityProxyModelPrivate &dd, QObject* parent);
diff --git a/src/corelib/itemmodels/qitemselectionmodel.cpp b/src/corelib/itemmodels/qitemselectionmodel.cpp
index ebcc3b10ca..e4ac5da299 100644
--- a/src/corelib/itemmodels/qitemselectionmodel.cpp
+++ b/src/corelib/itemmodels/qitemselectionmodel.cpp
@@ -656,7 +656,7 @@ void QItemSelectionModelPrivate::initModel(QAbstractItemModel *m)
SLOT(_q_layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)) },
{ SIGNAL(modelReset()),
SLOT(reset()) },
- { 0, 0 }
+ { nullptr, nullptr }
};
if (model == m)
diff --git a/src/corelib/itemmodels/qitemselectionmodel.h b/src/corelib/itemmodels/qitemselectionmodel.h
index 3c3f9fb1ac..5820695592 100644
--- a/src/corelib/itemmodels/qitemselectionmodel.h
+++ b/src/corelib/itemmodels/qitemselectionmodel.h
@@ -171,11 +171,11 @@ public:
QModelIndex currentIndex() const;
Q_INVOKABLE bool isSelected(const QModelIndex &index) const;
- Q_INVOKABLE bool isRowSelected(int row, const QModelIndex &parent) const;
- Q_INVOKABLE bool isColumnSelected(int column, const QModelIndex &parent) const;
+ Q_INVOKABLE bool isRowSelected(int row, const QModelIndex &parent = QModelIndex()) const;
+ Q_INVOKABLE bool isColumnSelected(int column, const QModelIndex &parent = QModelIndex()) const;
- Q_INVOKABLE bool rowIntersectsSelection(int row, const QModelIndex &parent) const;
- Q_INVOKABLE bool columnIntersectsSelection(int column, const QModelIndex &parent) const;
+ Q_INVOKABLE bool rowIntersectsSelection(int row, const QModelIndex &parent = QModelIndex()) const;
+ Q_INVOKABLE bool columnIntersectsSelection(int column, const QModelIndex &parent = QModelIndex()) const;
bool hasSelection() const;
diff --git a/src/corelib/itemmodels/qstringlistmodel.cpp b/src/corelib/itemmodels/qstringlistmodel.cpp
index 4c7616a126..a950783ed8 100644
--- a/src/corelib/itemmodels/qstringlistmodel.cpp
+++ b/src/corelib/itemmodels/qstringlistmodel.cpp
@@ -306,24 +306,23 @@ bool QStringListModel::moveRows(const QModelIndex &sourceParent, int sourceRow,
{
if (sourceRow < 0
|| sourceRow + count - 1 >= rowCount(sourceParent)
- || destinationChild <= 0
+ || destinationChild < 0
|| destinationChild > rowCount(destinationParent)
+ || sourceRow == destinationChild
|| sourceRow == destinationChild - 1
- || count <= 0) {
+ || count <= 0
+ || sourceParent.isValid()
+ || destinationParent.isValid()) {
return false;
}
if (!beginMoveRows(QModelIndex(), sourceRow, sourceRow + count - 1, QModelIndex(), destinationChild))
return false;
- /*
- QList::move assumes that the second argument is the index where the item will end up to
- i.e. the valid range for that argument is from 0 to QList::size()-1
- QAbstractItemModel::moveRows when source and destinations have the same parent assumes that
- the item will end up being in the row BEFORE the one indicated by destinationChild
- i.e. the valid range for that argument is from 1 to QList::size()
- For this reason we remove 1 from destinationChild when using it inside QList
- */
- destinationChild--;
- const int fromRow = destinationChild < sourceRow ? (sourceRow + count - 1) : sourceRow;
+
+ int fromRow = sourceRow;
+ if (destinationChild < sourceRow)
+ fromRow += count - 1;
+ else
+ destinationChild--;
while (count--)
lst.move(fromRow, destinationChild);
endMoveRows();
diff --git a/src/corelib/kernel/qabstracteventdispatcher.cpp b/src/corelib/kernel/qabstracteventdispatcher.cpp
index 7215b3f2bd..685a0c595a 100644
--- a/src/corelib/kernel/qabstracteventdispatcher.cpp
+++ b/src/corelib/kernel/qabstracteventdispatcher.cpp
@@ -160,7 +160,7 @@ QAbstractEventDispatcher::~QAbstractEventDispatcher()
/*!
Returns a pointer to the event dispatcher object for the specified
- \a thread. If \a thread is zero, the current thread is used. If no
+ \a thread. If \a thread is \nullptr, the current thread is used. If no
event dispatcher exists for the specified thread, this function
returns \nullptr.
diff --git a/src/corelib/kernel/qbasictimer.cpp b/src/corelib/kernel/qbasictimer.cpp
index ea8f8e2c77..623ecb9b8b 100644
--- a/src/corelib/kernel/qbasictimer.cpp
+++ b/src/corelib/kernel/qbasictimer.cpp
@@ -216,13 +216,11 @@ void QBasicTimer::stop()
{
if (id) {
QAbstractEventDispatcher *eventDispatcher = QAbstractEventDispatcher::instance();
- if (eventDispatcher) {
- if (Q_UNLIKELY(!eventDispatcher->unregisterTimer(id))) {
- qWarning("QBasicTimer::stop: Failed. Possibly trying to stop from a different thread");
- return;
- }
- QAbstractEventDispatcherPrivate::releaseTimerId(id);
+ if (eventDispatcher && !eventDispatcher->unregisterTimer(id)) {
+ qWarning("QBasicTimer::stop: Failed. Possibly trying to stop from a different thread");
+ return;
}
+ QAbstractEventDispatcherPrivate::releaseTimerId(id);
}
id = 0;
}
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index e25049f821..34f54d8f94 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -121,7 +121,6 @@
#endif
#ifdef Q_OS_WASM
-#include <emscripten.h>
#include <emscripten/val.h>
#endif
@@ -135,23 +134,6 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_QOBJECT
-class QMutexUnlocker
-{
-public:
- inline explicit QMutexUnlocker(QMutex *m)
- : mtx(m)
- { }
- inline ~QMutexUnlocker() { unlock(); }
- inline void unlock() { if (mtx) mtx->unlock(); mtx = 0; }
-
-private:
- Q_DISABLE_COPY(QMutexUnlocker)
-
- QMutex *mtx;
-};
-#endif
-
#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
extern QString qAppFileName();
#endif
@@ -497,13 +479,6 @@ QCoreApplicationPrivate::QCoreApplicationPrivate(int &aargc, char **aargv, uint
QCoreApplicationPrivate::~QCoreApplicationPrivate()
{
-#ifdef Q_OS_WASM
- EM_ASM(
- // unmount persistent directory as IDBFS
- // see also QTBUG-70002
- FS.unmount('/home/web_user');
- );
-#endif
#ifndef QT_NO_QOBJECT
cleanupThreadData();
#endif
@@ -517,25 +492,27 @@ QCoreApplicationPrivate::~QCoreApplicationPrivate()
void QCoreApplicationPrivate::cleanupThreadData()
{
- if (threadData && !threadData_clean) {
+ auto thisThreadData = threadData.loadRelaxed();
+
+ if (thisThreadData && !threadData_clean) {
#if QT_CONFIG(thread)
- void *data = &threadData->tls;
+ void *data = &thisThreadData->tls;
QThreadStorageData::finish((void **)data);
#endif
// need to clear the state of the mainData, just in case a new QCoreApplication comes along.
- const auto locker = qt_scoped_lock(threadData->postEventList.mutex);
- for (int i = 0; i < threadData->postEventList.size(); ++i) {
- const QPostEvent &pe = threadData->postEventList.at(i);
+ const auto locker = qt_scoped_lock(thisThreadData->postEventList.mutex);
+ for (int i = 0; i < thisThreadData->postEventList.size(); ++i) {
+ const QPostEvent &pe = thisThreadData->postEventList.at(i);
if (pe.event) {
--pe.receiver->d_func()->postedEvents;
pe.event->posted = false;
delete pe.event;
}
}
- threadData->postEventList.clear();
- threadData->postEventList.recursion = 0;
- threadData->quitNow = false;
+ thisThreadData->postEventList.clear();
+ thisThreadData->postEventList.recursion = 0;
+ thisThreadData->quitNow = false;
threadData_clean = true;
}
}
@@ -553,10 +530,10 @@ void QCoreApplicationPrivate::eventDispatcherReady()
{
}
-QBasicAtomicPointer<QThread> QCoreApplicationPrivate::theMainThread = Q_BASIC_ATOMIC_INITIALIZER(0);
+QBasicAtomicPointer<QThread> QCoreApplicationPrivate::theMainThread = Q_BASIC_ATOMIC_INITIALIZER(nullptr);
QThread *QCoreApplicationPrivate::mainThread()
{
- Q_ASSERT(theMainThread.loadRelaxed() != 0);
+ Q_ASSERT(theMainThread.loadRelaxed() != nullptr);
return theMainThread.loadRelaxed();
}
@@ -713,7 +690,7 @@ QCoreApplication::QCoreApplication(QCoreApplicationPrivate &p)
#ifdef QT_NO_QOBJECT
: d_ptr(&p)
#else
- : QObject(p, 0)
+ : QObject(p, nullptr)
#endif
{
d_func()->q_ptr = this;
@@ -795,17 +772,8 @@ void QCoreApplicationPrivate::init()
Q_ASSERT_X(!QCoreApplication::self, "QCoreApplication", "there should be only one application object");
QCoreApplication::self = q;
-#ifdef Q_OS_WASM
- EM_ASM(
- // mount and sync persistent filesystem to sandbox
- FS.mount(IDBFS, {}, '/home/web_user');
- FS.syncfs(true, function(err) {
- if (err)
- Module.print(err);
- });
- );
-
#if QT_CONFIG(thread)
+#ifdef Q_OS_WASM
QThreadPrivate::idealThreadCount = emscripten::val::global("navigator")["hardwareConcurrency"].as<int>();
#endif
#endif
@@ -858,7 +826,8 @@ void QCoreApplicationPrivate::init()
#ifndef QT_NO_QOBJECT
// use the event dispatcher created by the app programmer (if any)
Q_ASSERT(!eventDispatcher);
- eventDispatcher = threadData->eventDispatcher.loadRelaxed();
+ auto thisThreadData = threadData.loadRelaxed();
+ eventDispatcher = thisThreadData->eventDispatcher.loadRelaxed();
// otherwise we create one
if (!eventDispatcher)
@@ -866,11 +835,11 @@ void QCoreApplicationPrivate::init()
Q_ASSERT(eventDispatcher);
if (!eventDispatcher->parent()) {
- eventDispatcher->moveToThread(threadData->thread.loadAcquire());
+ eventDispatcher->moveToThread(thisThreadData->thread.loadAcquire());
eventDispatcher->setParent(q);
}
- threadData->eventDispatcher = eventDispatcher;
+ thisThreadData->eventDispatcher = eventDispatcher;
eventDispatcherReady();
#endif
@@ -914,7 +883,7 @@ QCoreApplication::~QCoreApplication()
#endif
#ifndef QT_NO_QOBJECT
- d_func()->threadData->eventDispatcher = nullptr;
+ d_func()->threadData.loadRelaxed()->eventDispatcher = nullptr;
if (QCoreApplicationPrivate::eventDispatcher)
QCoreApplicationPrivate::eventDispatcher->closingDown();
QCoreApplicationPrivate::eventDispatcher = nullptr;
@@ -1170,7 +1139,7 @@ bool QCoreApplication::notify(QObject *receiver, QEvent *event)
static bool doNotify(QObject *receiver, QEvent *event)
{
- if (receiver == 0) { // serious error
+ if (receiver == nullptr) { // serious error
qWarning("QCoreApplication::notify: Unexpected null receiver");
return true;
}
@@ -1185,7 +1154,7 @@ static bool doNotify(QObject *receiver, QEvent *event)
bool QCoreApplicationPrivate::sendThroughApplicationEventFilters(QObject *receiver, QEvent *event)
{
// We can't access the application event filters outside of the main thread (race conditions)
- Q_ASSERT(receiver->d_func()->threadData->thread.loadAcquire() == mainThread());
+ Q_ASSERT(receiver->d_func()->threadData.loadRelaxed()->thread.loadAcquire() == mainThread());
if (extraData) {
// application event filters are only called for objects in the GUI thread
@@ -1238,7 +1207,7 @@ bool QCoreApplicationPrivate::notify_helper(QObject *receiver, QEvent * event)
// send to all application event filters (only does anything in the main thread)
if (QCoreApplication::self
- && receiver->d_func()->threadData->thread.loadAcquire() == mainThread()
+ && receiver->d_func()->threadData.loadRelaxed()->thread.loadAcquire() == mainThread()
&& QCoreApplication::self->d_func()->sendThroughApplicationEventFilters(receiver, event)) {
filtered = true;
return filtered;
@@ -1414,12 +1383,12 @@ int QCoreApplication::exec()
void QCoreApplicationPrivate::execCleanup()
{
- threadData->quitNow = false;
+ threadData.loadRelaxed()->quitNow = false;
in_exec = false;
if (!aboutToQuitEmitted)
emit q_func()->aboutToQuit(QCoreApplication::QPrivateSignal());
aboutToQuitEmitted = true;
- QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+ QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
}
@@ -1451,7 +1420,7 @@ void QCoreApplication::exit(int returnCode)
{
if (!self)
return;
- QThreadData *data = self->d_func()->threadData;
+ QThreadData *data = self->d_func()->threadData.loadRelaxed();
data->quitNow = true;
for (int i = 0; i < data->eventLoops.size(); ++i) {
QEventLoop *eventLoop = data->eventLoops.at(i);
@@ -1501,6 +1470,38 @@ bool QCoreApplication::sendSpontaneousEvent(QObject *receiver, QEvent *event)
#endif // QT_NO_QOBJECT
+QCoreApplicationPrivate::QPostEventListLocker QCoreApplicationPrivate::lockThreadPostEventList(QObject *object)
+{
+ QPostEventListLocker locker;
+
+ if (!object) {
+ locker.threadData = QThreadData::current();
+ locker.locker = qt_unique_lock(locker.threadData->postEventList.mutex);
+ return locker;
+ }
+
+ auto &threadData = QObjectPrivate::get(object)->threadData;
+
+ // if object has moved to another thread, follow it
+ for (;;) {
+ // synchronizes with the storeRelease in QObject::moveToThread
+ locker.threadData = threadData.loadAcquire();
+ if (!locker.threadData) {
+ // destruction in progress
+ return locker;
+ }
+
+ auto temporaryLocker = qt_unique_lock(locker.threadData->postEventList.mutex);
+ if (locker.threadData == threadData.loadAcquire()) {
+ locker.locker = std::move(temporaryLocker);
+ break;
+ }
+ }
+
+ Q_ASSERT(locker.threadData);
+ return locker;
+}
+
/*!
\since 4.3
@@ -1530,38 +1531,20 @@ void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)
{
Q_TRACE_SCOPE(QCoreApplication_postEvent, receiver, event, event->type());
- if (receiver == 0) {
+ if (receiver == nullptr) {
qWarning("QCoreApplication::postEvent: Unexpected null receiver");
delete event;
return;
}
- QThreadData * volatile * pdata = &receiver->d_func()->threadData;
- QThreadData *data = *pdata;
- if (!data) {
+ auto locker = QCoreApplicationPrivate::lockThreadPostEventList(receiver);
+ if (!locker.threadData) {
// posting during destruction? just delete the event to prevent a leak
delete event;
return;
}
- // lock the post event mutex
- data->postEventList.mutex.lock();
-
- // if object has moved to another thread, follow it
- while (data != *pdata) {
- data->postEventList.mutex.unlock();
-
- data = *pdata;
- if (!data) {
- // posting during destruction? just delete the event to prevent a leak
- delete event;
- return;
- }
-
- data->postEventList.mutex.lock();
- }
-
- QMutexUnlocker locker(&data->postEventList.mutex);
+ QThreadData *data = locker.threadData;
// if this is one of the compressible events, do compression
if (receiver->d_func()->postedEvents
@@ -1652,7 +1635,7 @@ bool QCoreApplication::compressEvent(QEvent *event, QObject *receiver, QPostEven
for (int i = 0; i < postedEvents->size(); ++i) {
const QPostEvent &cur = postedEvents->at(i);
if (cur.receiver != receiver
- || cur.event == 0
+ || cur.event == nullptr
|| cur.event->type() != event->type())
continue;
// found an event for this receiver
@@ -1801,7 +1784,7 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
// null out the event so if sendPostedEvents recurses, it
// will ignore this one, as it's been re-posted.
- const_cast<QPostEvent &>(pe).event = 0;
+ const_cast<QPostEvent &>(pe).event = nullptr;
// re-post the copied event so it isn't lost
data->postEventList.addEvent(pe_copy);
@@ -1821,7 +1804,7 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
// next, update the data structure so that we're ready
// for the next event.
- const_cast<QPostEvent &>(pe).event = 0;
+ const_cast<QPostEvent &>(pe).event = nullptr;
locker.unlock();
const auto relocker = qScopeGuard([&locker] { locker.lock(); });
@@ -1860,8 +1843,8 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
void QCoreApplication::removePostedEvents(QObject *receiver, int eventType)
{
- QThreadData *data = receiver ? receiver->d_func()->threadData : QThreadData::current();
- auto locker = qt_unique_lock(data->postEventList.mutex);
+ auto locker = QCoreApplicationPrivate::lockThreadPostEventList(receiver);
+ QThreadData *data = locker.threadData;
// the QObject destructor calls this function directly. this can
// happen while the event loop is in the middle of posting events,
@@ -1884,7 +1867,7 @@ void QCoreApplication::removePostedEvents(QObject *receiver, int eventType)
--pe.receiver->d_func()->postedEvents;
pe.event->posted = false;
events.append(pe.event);
- const_cast<QPostEvent &>(pe).event = 0;
+ const_cast<QPostEvent &>(pe).event = nullptr;
} else if (!data->postEventList.recursion) {
if (i != j)
qSwap(data->postEventList[i], data->postEventList[j]);
@@ -1946,7 +1929,7 @@ void QCoreApplicationPrivate::removePostedEvent(QEvent * event)
--pe.receiver->d_func()->postedEvents;
pe.event->posted = false;
delete pe.event;
- const_cast<QPostEvent &>(pe).event = 0;
+ const_cast<QPostEvent &>(pe).event = nullptr;
return;
}
}
@@ -2221,7 +2204,7 @@ QString QCoreApplication::translate(const char *context, const char *sourceText,
// Declared in qglobal.h
QString qtTrId(const char *id, int n)
{
- return QCoreApplication::translate(0, id, 0, n);
+ return QCoreApplication::translate(nullptr, id, nullptr, n);
}
bool QCoreApplicationPrivate::isTranslatorInstalled(QTranslator *translator)
@@ -2973,7 +2956,7 @@ QAbstractEventDispatcher *QCoreApplication::eventDispatcher()
{
if (QCoreApplicationPrivate::theMainThread.loadAcquire())
return QCoreApplicationPrivate::theMainThread.loadRelaxed()->eventDispatcher();
- return 0;
+ return nullptr;
}
/*!
diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h
index 3bad42d076..9d2fde619c 100644
--- a/src/corelib/kernel/qcoreapplication_p.h
+++ b/src/corelib/kernel/qcoreapplication_p.h
@@ -61,6 +61,7 @@
#endif
#ifndef QT_NO_QOBJECT
#include "private/qobject_p.h"
+#include "private/qlocking_p.h"
#endif
#ifdef Q_OS_MACOS
@@ -140,6 +141,15 @@ public:
static void checkReceiverThread(QObject *receiver);
void cleanupThreadData();
+
+ struct QPostEventListLocker
+ {
+ QThreadData *threadData;
+ std::unique_lock<QMutex> locker;
+
+ void unlock() { locker.unlock(); }
+ };
+ static QPostEventListLocker lockThreadPostEventList(QObject *object);
#endif // QT_NO_QOBJECT
int &argc;
diff --git a/src/corelib/kernel/qcoreapplication_win.cpp b/src/corelib/kernel/qcoreapplication_win.cpp
index 961b96710e..765f129758 100644
--- a/src/corelib/kernel/qcoreapplication_win.cpp
+++ b/src/corelib/kernel/qcoreapplication_win.cpp
@@ -918,7 +918,7 @@ QDebug operator<<(QDebug dbg, const MSG &msg)
#ifndef QT_NO_QOBJECT
void QCoreApplicationPrivate::removePostedTimerEvent(QObject *object, int timerId)
{
- QThreadData *data = object->d_func()->threadData;
+ QThreadData *data = object->d_func()->threadData.loadRelaxed();
const auto locker = qt_scoped_lock(data->postEventList.mutex);
if (data->postEventList.size() == 0)
diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp
index 4cfc749386..e3326f00d7 100644
--- a/src/corelib/kernel/qcoreevent.cpp
+++ b/src/corelib/kernel/qcoreevent.cpp
@@ -295,7 +295,7 @@ QT_BEGIN_NAMESPACE
Contructs an event object of type \a type.
*/
QEvent::QEvent(Type type)
- : d(0), t(type), posted(false), spont(false), m_accept(true)
+ : d(nullptr), t(type), posted(false), spont(false), m_accept(true)
{
Q_TRACE(QEvent_ctor, this, t);
}
diff --git a/src/corelib/kernel/qeventdispatcher_glib.cpp b/src/corelib/kernel/qeventdispatcher_glib.cpp
index d9746ef6e2..92f3553247 100644
--- a/src/corelib/kernel/qeventdispatcher_glib.cpp
+++ b/src/corelib/kernel/qeventdispatcher_glib.cpp
@@ -114,9 +114,9 @@ static GSourceFuncs socketNotifierSourceFuncs = {
socketNotifierSourcePrepare,
socketNotifierSourceCheck,
socketNotifierSourceDispatch,
- NULL,
- NULL,
- NULL
+ nullptr,
+ nullptr,
+ nullptr
};
struct GTimerSource
@@ -188,9 +188,9 @@ static GSourceFuncs timerSourceFuncs = {
timerSourcePrepare,
timerSourceCheck,
timerSourceDispatch,
- NULL,
- NULL,
- NULL
+ nullptr,
+ nullptr,
+ nullptr
};
struct GIdleTimerSource
@@ -227,7 +227,7 @@ static gboolean idleTimerSourceCheck(GSource *source)
static gboolean idleTimerSourceDispatch(GSource *source, GSourceFunc, gpointer)
{
GTimerSource *timerSource = reinterpret_cast<GIdleTimerSource *>(source)->timerSource;
- (void) timerSourceDispatch(&timerSource->source, 0, 0);
+ (void) timerSourceDispatch(&timerSource->source, nullptr, nullptr);
return true;
}
@@ -235,9 +235,9 @@ static GSourceFuncs idleTimerSourceFuncs = {
idleTimerSourcePrepare,
idleTimerSourceCheck,
idleTimerSourceDispatch,
- NULL,
- NULL,
- NULL
+ nullptr,
+ nullptr,
+ nullptr
};
struct GPostEventSource
@@ -267,7 +267,7 @@ static gboolean postEventSourcePrepare(GSource *s, gint *timeout)
static gboolean postEventSourceCheck(GSource *source)
{
- return postEventSourcePrepare(source, 0);
+ return postEventSourcePrepare(source, nullptr);
}
static gboolean postEventSourceDispatch(GSource *s, GSourceFunc, gpointer)
@@ -283,9 +283,9 @@ static GSourceFuncs postEventSourceFuncs = {
postEventSourcePrepare,
postEventSourceCheck,
postEventSourceDispatch,
- NULL,
- NULL,
- NULL
+ nullptr,
+ nullptr,
+ nullptr
};
@@ -372,10 +372,10 @@ QEventDispatcherGlib::~QEventDispatcherGlib()
d->timerSource->timerList.~QTimerInfoList();
g_source_destroy(&d->timerSource->source);
g_source_unref(&d->timerSource->source);
- d->timerSource = 0;
+ d->timerSource = nullptr;
g_source_destroy(&d->idleTimerSource->source);
g_source_unref(&d->idleTimerSource->source);
- d->idleTimerSource = 0;
+ d->idleTimerSource = nullptr;
// destroy socket notifier source
for (int i = 0; i < d->socketNotifierSource->pollfds.count(); ++i) {
@@ -386,19 +386,19 @@ QEventDispatcherGlib::~QEventDispatcherGlib()
d->socketNotifierSource->pollfds.~QList<GPollFDWithQSocketNotifier *>();
g_source_destroy(&d->socketNotifierSource->source);
g_source_unref(&d->socketNotifierSource->source);
- d->socketNotifierSource = 0;
+ d->socketNotifierSource = nullptr;
// destroy post event source
g_source_destroy(&d->postEventSource->source);
g_source_unref(&d->postEventSource->source);
- d->postEventSource = 0;
+ d->postEventSource = nullptr;
- Q_ASSERT(d->mainContext != 0);
+ Q_ASSERT(d->mainContext != nullptr);
#if GLIB_CHECK_VERSION (2, 22, 0)
g_main_context_pop_thread_default (d->mainContext);
#endif
g_main_context_unref(d->mainContext);
- d->mainContext = 0;
+ d->mainContext = nullptr;
}
bool QEventDispatcherGlib::processEvents(QEventLoop::ProcessEventsFlags flags)
diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp
index 5bc65b7110..0165ce9075 100644
--- a/src/corelib/kernel/qeventdispatcher_unix.cpp
+++ b/src/corelib/kernel/qeventdispatcher_unix.cpp
@@ -463,13 +463,15 @@ bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags)
// we are awake, broadcast it
emit awake();
- QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData);
+
+ auto threadData = d->threadData.loadRelaxed();
+ QCoreApplicationPrivate::sendPostedEvents(nullptr, 0, threadData);
const bool include_timers = (flags & QEventLoop::X11ExcludeTimers) == 0;
const bool include_notifiers = (flags & QEventLoop::ExcludeSocketNotifiers) == 0;
const bool wait_for_events = flags & QEventLoop::WaitForMoreEvents;
- const bool canWait = (d->threadData->canWaitLocked()
+ const bool canWait = (threadData->canWaitLocked()
&& !d->interrupt.loadRelaxed()
&& wait_for_events);
diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp
index 87623f304a..8616631603 100644
--- a/src/corelib/kernel/qeventdispatcher_win.cpp
+++ b/src/corelib/kernel/qeventdispatcher_win.cpp
@@ -636,11 +636,11 @@ void QEventDispatcherWin32::registerSocketNotifier(QSocketNotifier *notifier)
int type = notifier->type();
#ifndef QT_NO_DEBUG
if (sockfd < 0) {
- qWarning("QSocketNotifier: Internal error");
+ qWarning("QEventDispatcherWin32::registerSocketNotifier: invalid socket identifier");
return;
}
if (notifier->thread() != thread() || thread() != QThread::currentThread()) {
- qWarning("QSocketNotifier: socket notifiers cannot be enabled from another thread");
+ qWarning("QEventDispatcherWin32: socket notifiers cannot be enabled from another thread");
return;
}
#endif
@@ -697,11 +697,11 @@ void QEventDispatcherWin32::unregisterSocketNotifier(QSocketNotifier *notifier)
#ifndef QT_NO_DEBUG
int sockfd = notifier->socket();
if (sockfd < 0) {
- qWarning("QSocketNotifier: Internal error");
+ qWarning("QEventDispatcherWin32::unregisterSocketNotifier: invalid socket identifier");
return;
}
if (notifier->thread() != thread() || thread() != QThread::currentThread()) {
- qWarning("QSocketNotifier: socket notifiers cannot be disabled from another thread");
+ qWarning("QEventDispatcherWin32: socket notifiers cannot be disabled from another thread");
return;
}
#endif
@@ -783,8 +783,7 @@ bool QEventDispatcherWin32::unregisterTimer(int timerId)
qWarning("QEventDispatcherWin32::unregisterTimer: invalid argument");
return false;
}
- QThread *currentThread = QThread::currentThread();
- if (thread() != currentThread) {
+ if (thread() != QThread::currentThread()) {
qWarning("QEventDispatcherWin32::unregisterTimer: timers cannot be stopped from another thread");
return false;
}
@@ -811,8 +810,7 @@ bool QEventDispatcherWin32::unregisterTimers(QObject *object)
qWarning("QEventDispatcherWin32::unregisterTimers: invalid argument");
return false;
}
- QThread *currentThread = QThread::currentThread();
- if (object->thread() != thread() || thread() != currentThread) {
+ if (object->thread() != thread() || thread() != QThread::currentThread()) {
qWarning("QEventDispatcherWin32::unregisterTimers: timers cannot be stopped from another thread");
return false;
}
@@ -837,10 +835,12 @@ bool QEventDispatcherWin32::unregisterTimers(QObject *object)
QList<QEventDispatcherWin32::TimerInfo>
QEventDispatcherWin32::registeredTimers(QObject *object) const
{
+#ifndef QT_NO_DEBUG
if (!object) {
qWarning("QEventDispatcherWin32:registeredTimers: invalid argument");
return QList<TimerInfo>();
}
+#endif
Q_D(const QEventDispatcherWin32);
QList<TimerInfo> list;
@@ -853,13 +853,13 @@ QEventDispatcherWin32::registeredTimers(QObject *object) const
bool QEventDispatcherWin32::registerEventNotifier(QWinEventNotifier *notifier)
{
- if (!notifier) {
- qWarning("QWinEventNotifier: Internal error");
- return false;
- } else if (notifier->thread() != thread() || thread() != QThread::currentThread()) {
- qWarning("QWinEventNotifier: event notifiers cannot be enabled from another thread");
+ Q_ASSERT(notifier);
+#ifndef QT_NO_DEBUG
+ if (notifier->thread() != thread() || thread() != QThread::currentThread()) {
+ qWarning("QEventDispatcherWin32: event notifiers cannot be enabled from another thread");
return false;
}
+#endif
Q_D(QEventDispatcherWin32);
@@ -877,13 +877,13 @@ bool QEventDispatcherWin32::registerEventNotifier(QWinEventNotifier *notifier)
void QEventDispatcherWin32::unregisterEventNotifier(QWinEventNotifier *notifier)
{
- if (!notifier) {
- qWarning("QWinEventNotifier: Internal error");
- return;
- } else if (notifier->thread() != thread() || thread() != QThread::currentThread()) {
- qWarning("QWinEventNotifier: event notifiers cannot be disabled from another thread");
+ Q_ASSERT(notifier);
+#ifndef QT_NO_DEBUG
+ if (notifier->thread() != thread() || thread() != QThread::currentThread()) {
+ qWarning("QEventDispatcherWin32: event notifiers cannot be disabled from another thread");
return;
}
+#endif
Q_D(QEventDispatcherWin32);
@@ -1048,7 +1048,7 @@ bool QEventDispatcherWin32::event(QEvent *e)
void QEventDispatcherWin32::sendPostedEvents()
{
Q_D(QEventDispatcherWin32);
- QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData);
+ QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData.loadRelaxed());
}
HWND QEventDispatcherWin32::internalHwnd()
diff --git a/src/corelib/kernel/qeventloop.cpp b/src/corelib/kernel/qeventloop.cpp
index eacd0c4e73..5a5dfb06aa 100644
--- a/src/corelib/kernel/qeventloop.cpp
+++ b/src/corelib/kernel/qeventloop.cpp
@@ -106,7 +106,7 @@ QEventLoop::QEventLoop(QObject *parent)
if (!QCoreApplication::instance() && QCoreApplicationPrivate::threadRequiresCoreApplication()) {
qWarning("QEventLoop: Cannot be used without QApplication");
} else {
- d->threadData->ensureEventDispatcher();
+ d->threadData.loadRelaxed()->ensureEventDispatcher();
}
}
@@ -133,9 +133,10 @@ QEventLoop::~QEventLoop()
bool QEventLoop::processEvents(ProcessEventsFlags flags)
{
Q_D(QEventLoop);
- if (!d->threadData->hasEventDispatcher())
+ auto threadData = d->threadData.loadRelaxed();
+ if (!threadData->hasEventDispatcher())
return false;
- return d->threadData->eventDispatcher.loadRelaxed()->processEvents(flags);
+ return threadData->eventDispatcher.loadRelaxed()->processEvents(flags);
}
/*!
@@ -164,9 +165,11 @@ bool QEventLoop::processEvents(ProcessEventsFlags flags)
int QEventLoop::exec(ProcessEventsFlags flags)
{
Q_D(QEventLoop);
+ auto threadData = d->threadData.loadRelaxed();
+
//we need to protect from race condition with QThread::exit
- QMutexLocker locker(&static_cast<QThreadPrivate *>(QObjectPrivate::get(d->threadData->thread.loadAcquire()))->mutex);
- if (d->threadData->quitNow)
+ QMutexLocker locker(&static_cast<QThreadPrivate *>(QObjectPrivate::get(threadData->thread.loadAcquire()))->mutex);
+ if (threadData->quitNow)
return -1;
if (d->inExec) {
@@ -183,8 +186,11 @@ int QEventLoop::exec(ProcessEventsFlags flags)
{
d->inExec = true;
d->exit.storeRelease(false);
- ++d->threadData->loopLevel;
- d->threadData->eventLoops.push(d->q_func());
+
+ auto threadData = d->threadData.loadRelaxed();
+ ++threadData->loopLevel;
+ threadData->eventLoops.push(d->q_func());
+
locker.unlock();
}
@@ -198,11 +204,12 @@ int QEventLoop::exec(ProcessEventsFlags flags)
"QCoreApplication::notify() and catch all exceptions there.\n");
}
locker.relock();
- QEventLoop *eventLoop = d->threadData->eventLoops.pop();
+ auto threadData = d->threadData.loadRelaxed();
+ QEventLoop *eventLoop = threadData->eventLoops.pop();
Q_ASSERT_X(eventLoop == d->q_func(), "QEventLoop::exec()", "internal error");
Q_UNUSED(eventLoop); // --release warning
d->inExec = false;
- --d->threadData->loopLevel;
+ --threadData->loopLevel;
}
};
LoopReference ref(d, locker);
@@ -217,7 +224,7 @@ int QEventLoop::exec(ProcessEventsFlags flags)
// exception, which returns control to the browser while preserving the C++ stack.
// Event processing then continues as normal. The sleep call below never returns.
// QTBUG-70185
- if (d->threadData->loopLevel > 1)
+ if (threadData->loopLevel > 1)
emscripten_sleep(1);
#endif
@@ -247,7 +254,7 @@ int QEventLoop::exec(ProcessEventsFlags flags)
void QEventLoop::processEvents(ProcessEventsFlags flags, int maxTime)
{
Q_D(QEventLoop);
- if (!d->threadData->hasEventDispatcher())
+ if (!d->threadData.loadRelaxed()->hasEventDispatcher())
return;
QElapsedTimer start;
@@ -276,21 +283,22 @@ void QEventLoop::processEvents(ProcessEventsFlags flags, int maxTime)
void QEventLoop::exit(int returnCode)
{
Q_D(QEventLoop);
- if (!d->threadData->hasEventDispatcher())
+ auto threadData = d->threadData.loadAcquire();
+ if (!threadData->hasEventDispatcher())
return;
d->returnCode.storeRelaxed(returnCode);
d->exit.storeRelease(true);
- d->threadData->eventDispatcher.loadRelaxed()->interrupt();
+ threadData->eventDispatcher.loadRelaxed()->interrupt();
#ifdef Q_OS_WASM
// QEventLoop::exec() never returns in emscripten. We implement approximate behavior here.
// QTBUG-70185
- if (d->threadData->loopLevel == 1) {
+ if (threadData->loopLevel == 1) {
emscripten_force_exit(returnCode);
} else {
d->inExec = false;
- --d->threadData->loopLevel;
+ --threadData->loopLevel;
}
#endif
}
@@ -316,9 +324,10 @@ bool QEventLoop::isRunning() const
void QEventLoop::wakeUp()
{
Q_D(QEventLoop);
- if (!d->threadData->hasEventDispatcher())
+ auto threadData = d->threadData.loadAcquire();
+ if (!threadData->hasEventDispatcher())
return;
- d->threadData->eventDispatcher.loadRelaxed()->wakeUp();
+ threadData->eventDispatcher.loadRelaxed()->wakeUp();
}
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index 5cb30a74ac..1661520b78 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -282,14 +282,14 @@ QObject *QMetaObject::newInstance(QGenericArgument val0,
idx = indexOfConstructor(norm.constData());
}
if (idx < 0)
- return 0;
+ return nullptr;
- QObject *returnValue = 0;
+ QObject *returnValue = nullptr;
void *param[] = {&returnValue, val0.data(), val1.data(), val2.data(), val3.data(), val4.data(),
val5.data(), val6.data(), val7.data(), val8.data(), val9.data()};
if (static_metacall(CreateInstance, idx, param) >= 0)
- return 0;
+ return nullptr;
return returnValue;
}
@@ -301,7 +301,7 @@ int QMetaObject::static_metacall(Call cl, int idx, void **argv) const
Q_ASSERT(priv(d.data)->revision >= 6);
if (!d.static_metacall)
return 0;
- d.static_metacall(0, cl, idx, argv);
+ d.static_metacall(nullptr, cl, idx, argv);
return -1;
}
@@ -599,7 +599,7 @@ static bool methodMatch(const QMetaObject *m, int handle,
* \internal
* helper function for indexOf{Method,Slot,Signal}, returns the relative index of the method within
* the baseObject
-* \a MethodType might be MethodSignal or MethodSlot, or 0 to match everything.
+* \a MethodType might be MethodSignal or MethodSlot, or \nullptr to match everything.
*/
template<int MethodType>
static inline int indexOfMethodRelative(const QMetaObject **baseObject,
@@ -691,7 +691,7 @@ static void argumentTypesFromString(const char *str, const char *end,
QByteArray QMetaObjectPrivate::decodeMethodSignature(
const char *signature, QArgumentTypeArray &types)
{
- Q_ASSERT(signature != 0);
+ Q_ASSERT(signature != nullptr);
const char *lparens = strchr(signature, '(');
if (!lparens)
return QByteArray();
@@ -731,7 +731,7 @@ int QMetaObject::indexOfSignal(const char *signal) const
\internal
Same as QMetaObject::indexOfSignal, but the result is the local offset to the base object.
- \a baseObject will be adjusted to the enclosing QMetaObject, or 0 if the signal is not found
+ \a baseObject will be adjusted to the enclosing QMetaObject, or \nullptr if the signal is not found
*/
int QMetaObjectPrivate::indexOfSignalRelative(const QMetaObject **baseObject,
const QByteArray &name, int argc,
@@ -844,7 +844,7 @@ int QMetaObjectPrivate::indexOfConstructor(const QMetaObject *m, const QByteArra
*/
int QMetaObjectPrivate::absoluteSignalCount(const QMetaObject *m)
{
- Q_ASSERT(m != 0);
+ Q_ASSERT(m != nullptr);
int n = priv(m->d.data)->signalCount;
for (m = m->d.superdata; m; m = m->d.superdata)
n += priv(m->d.data)->signalCount;
@@ -881,7 +881,7 @@ QMetaMethod QMetaObjectPrivate::signal(const QMetaObject *m, int signal_index)
QMetaMethod result;
if (signal_index < 0)
return result;
- Q_ASSERT(m != 0);
+ Q_ASSERT(m != nullptr);
int i = signal_index;
i -= signalOffset(m);
if (i < 0 && m->d.superdata)
@@ -1031,7 +1031,7 @@ int QMetaObject::indexOfProperty(const char *name) const
QAbstractDynamicMetaObject *me =
const_cast<QAbstractDynamicMetaObject *>(static_cast<const QAbstractDynamicMetaObject *>(this));
- return me->createProperty(name, 0);
+ return me->createProperty(name, nullptr);
}
return -1;
@@ -1145,7 +1145,7 @@ QMetaProperty QMetaObject::property(int index) const
if (!result.menum.isValid()) {
const char *enum_name = type;
const char *scope_name = objectClassName(this);
- char *scope_buffer = 0;
+ char *scope_buffer = nullptr;
const char *colon = strrchr(enum_name, ':');
// ':' will always appear in pairs
@@ -1159,7 +1159,7 @@ QMetaProperty QMetaObject::property(int index) const
enum_name = colon+1;
}
- const QMetaObject *scope = 0;
+ const QMetaObject *scope = nullptr;
if (qstrcmp(scope_name, "Qt") == 0)
scope = &QObject::staticQtMetaObject;
else
@@ -1542,14 +1542,14 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *
return false;
}
- QCoreApplication::postEvent(object, new QMetaCallEvent(slot, 0, -1, 1));
+ QCoreApplication::postEvent(object, new QMetaCallEvent(slot, nullptr, -1, 1));
} else if (type == Qt::BlockingQueuedConnection) {
#if QT_CONFIG(thread)
if (currentThread == objectThread)
qWarning("QMetaObject::invokeMethod: Dead lock detected");
QSemaphore semaphore;
- QCoreApplication::postEvent(object, new QMetaCallEvent(slot, 0, -1, argv, &semaphore));
+ QCoreApplication::postEvent(object, new QMetaCallEvent(slot, nullptr, -1, argv, &semaphore));
semaphore.acquire();
#endif // QT_CONFIG(thread)
} else {
@@ -1988,7 +1988,7 @@ QList<QByteArray> QMetaMethod::parameterNames() const
const char *QMetaMethod::typeName() const
{
if (!mobj)
- return 0;
+ return nullptr;
return QMetaMethodPrivate::get(this)->rawReturnTypeName();
}
@@ -2020,7 +2020,7 @@ const char *QMetaMethod::typeName() const
const char *QMetaMethod::tag() const
{
if (!mobj)
- return 0;
+ return nullptr;
return QMetaMethodPrivate::get(this)->tag().constData();
}
@@ -2303,7 +2303,7 @@ bool QMetaMethod::invoke(QObject *object,
return false;
}
- QScopedPointer<QMetaCallEvent> event(new QMetaCallEvent(idx_offset, idx_relative, callFunction, 0, -1, paramCount));
+ QScopedPointer<QMetaCallEvent> event(new QMetaCallEvent(idx_offset, idx_relative, callFunction, nullptr, -1, paramCount));
int *types = event->types();
void **args = event->args();
@@ -2340,7 +2340,7 @@ bool QMetaMethod::invoke(QObject *object,
QSemaphore semaphore;
QCoreApplication::postEvent(object, new QMetaCallEvent(idx_offset, idx_relative, callFunction,
- 0, -1, param, &semaphore));
+ nullptr, -1, param, &semaphore));
semaphore.acquire();
#endif // QT_CONFIG(thread)
}
@@ -2563,7 +2563,7 @@ bool QMetaMethod::invokeOnGadget(void* gadget, QGenericReturnArgument returnValu
const char *QMetaEnum::name() const
{
if (!mobj)
- return 0;
+ return nullptr;
return rawStringData(mobj, mobj->d.data[handle]);
}
@@ -2582,7 +2582,7 @@ const char *QMetaEnum::name() const
const char *QMetaEnum::enumName() const
{
if (!mobj)
- return 0;
+ return nullptr;
const bool rev8p = priv(mobj->d.data)->revision >= 8;
if (rev8p)
return rawStringData(mobj, mobj->d.data[handle + 1]);
@@ -2610,13 +2610,13 @@ int QMetaEnum::keyCount() const
const char *QMetaEnum::key(int index) const
{
if (!mobj)
- return 0;
+ return nullptr;
const int offset = priv(mobj->d.data)->revision >= 8 ? 3 : 2;
int count = mobj->d.data[handle + offset];
int data = mobj->d.data[handle + offset + 1];
if (index >= 0 && index < count)
return rawStringData(mobj, mobj->d.data[data + 2*index]);
- return 0;
+ return nullptr;
}
/*!
@@ -2679,7 +2679,7 @@ bool QMetaEnum::isScoped() const
*/
const char *QMetaEnum::scope() const
{
- return mobj ? objectClassName(mobj) : 0;
+ return mobj ? objectClassName(mobj) : nullptr;
}
/*!
@@ -2695,7 +2695,7 @@ const char *QMetaEnum::scope() const
*/
int QMetaEnum::keyToValue(const char *key, bool *ok) const
{
- if (ok != 0)
+ if (ok != nullptr)
*ok = false;
if (!mobj || !key)
return -1;
@@ -2715,7 +2715,7 @@ int QMetaEnum::keyToValue(const char *key, bool *ok) const
const QByteArray className = stringData(mobj, priv(mobj->d.data)->className);
if ((!scope || (className.size() == int(scope) && strncmp(qualified_key, className.constData(), scope) == 0))
&& strcmp(key, rawStringData(mobj, mobj->d.data[data + 2*i])) == 0) {
- if (ok != 0)
+ if (ok != nullptr)
*ok = true;
return mobj->d.data[data + 2*i + 1];
}
@@ -2734,14 +2734,14 @@ int QMetaEnum::keyToValue(const char *key, bool *ok) const
const char* QMetaEnum::valueToKey(int value) const
{
if (!mobj)
- return 0;
+ return nullptr;
const int offset = priv(mobj->d.data)->revision >= 8 ? 3 : 2;
int count = mobj->d.data[handle + offset];
int data = mobj->d.data[handle + offset + 1];
for (int i = 0; i < count; ++i)
if (value == (int)mobj->d.data[data + 2*i + 1])
return rawStringData(mobj, mobj->d.data[data + 2*i]);
- return 0;
+ return nullptr;
}
/*!
@@ -2756,11 +2756,11 @@ const char* QMetaEnum::valueToKey(int value) const
*/
int QMetaEnum::keysToValue(const char *keys, bool *ok) const
{
- if (ok != 0)
+ if (ok != nullptr)
*ok = false;
if (!mobj || !keys)
return -1;
- if (ok != 0)
+ if (ok != nullptr)
*ok = true;
const QString keysString = QString::fromLatin1(keys);
const QVector<QStringRef> splitKeys = keysString.splitRef(QLatin1Char('|'));
@@ -2793,7 +2793,7 @@ int QMetaEnum::keysToValue(const char *keys, bool *ok) const
}
}
if (i < 0) {
- if (ok != 0)
+ if (ok != nullptr)
*ok = false;
value |= -1;
}
@@ -2896,7 +2896,7 @@ static QByteArray qualifiedName(const QMetaEnum &e)
\internal
*/
QMetaProperty::QMetaProperty()
- : mobj(0), handle(0), idx(0)
+ : mobj(nullptr), handle(0), idx(0)
{
}
@@ -2909,7 +2909,7 @@ QMetaProperty::QMetaProperty()
const char *QMetaProperty::name() const
{
if (!mobj)
- return 0;
+ return nullptr;
int handle = priv(mobj->d.data)->propertyData + 3*idx;
return rawStringData(mobj, mobj->d.data[handle]);
}
@@ -2922,7 +2922,7 @@ const char *QMetaProperty::name() const
const char *QMetaProperty::typeName() const
{
if (!mobj)
- return 0;
+ return nullptr;
int handle = priv(mobj->d.data)->propertyData + 3*idx;
return rawTypeNameFromTypeInfo(mobj, mobj->d.data[handle + 1]);
}
@@ -2982,7 +2982,7 @@ int QMetaProperty::userType() const
if (type == QMetaType::UnknownType) {
type = registerPropertyType();
if (type == QMetaType::UnknownType)
- return QVariant::Int; // Match behavior of QMetaType::type()
+ return QMetaType::Int; // Match behavior of QMetaType::type()
}
return type;
}
@@ -3100,7 +3100,7 @@ QVariant QMetaProperty::read(const QObject *object) const
if (!object || !mobj)
return QVariant();
- uint t = QVariant::Int;
+ uint t = QMetaType::Int;
if (isEnumType()) {
/*
try to create a QVariant that can be converted to this enum
@@ -3112,7 +3112,7 @@ QVariant QMetaProperty::read(const QObject *object) const
t = enumMetaTypeId;
} else {
int handle = priv(mobj->d.data)->propertyData + 3*idx;
- const char *typeName = 0;
+ const char *typeName = nullptr;
Q_ASSERT(priv(mobj->d.data)->revision >= 7);
uint typeInfo = mobj->d.data[handle + 1];
if (!(typeInfo & IsUnresolvedType))
@@ -3138,11 +3138,11 @@ QVariant QMetaProperty::read(const QObject *object) const
// changed: result stored directly in value
int status = -1;
QVariant value;
- void *argv[] = { 0, &value, &status };
+ void *argv[] = { nullptr, &value, &status };
if (t == QMetaType::QVariant) {
argv[0] = &value;
} else {
- value = QVariant(t, (void*)0);
+ value = QVariant(t, (void*)nullptr);
argv[0] = value.data();
}
if (priv(mobj->d.data)->flags & PropertyAccessInStaticMetaCall && mobj->d.static_metacall) {
@@ -3177,9 +3177,9 @@ bool QMetaProperty::write(QObject *object, const QVariant &value) const
return false;
QVariant v = value;
- uint t = QVariant::Invalid;
+ uint t = QMetaType::UnknownType;
if (isEnumType()) {
- if (v.type() == QVariant::String) {
+ if (v.userType() == QMetaType::QString) {
bool ok;
if (isFlagType())
v = QVariant(menum.keysToValue(value.toByteArray(), &ok));
@@ -3187,16 +3187,16 @@ bool QMetaProperty::write(QObject *object, const QVariant &value) const
v = QVariant(menum.keyToValue(value.toByteArray(), &ok));
if (!ok)
return false;
- } else if (v.type() != QVariant::Int && v.type() != QVariant::UInt) {
+ } else if (v.userType() != QMetaType::Int && v.userType() != QMetaType::UInt) {
int enumMetaTypeId = QMetaType::type(qualifiedName(menum));
if ((enumMetaTypeId == QMetaType::UnknownType) || (v.userType() != enumMetaTypeId) || !v.constData())
return false;
v = QVariant(*reinterpret_cast<const int *>(v.constData()));
}
- v.convert(QVariant::Int);
+ v.convert(QMetaType::Int);
} else {
int handle = priv(mobj->d.data)->propertyData + 3*idx;
- const char *typeName = 0;
+ const char *typeName = nullptr;
Q_ASSERT(priv(mobj->d.data)->revision >= 7);
uint typeInfo = mobj->d.data[handle + 1];
if (!(typeInfo & IsUnresolvedType))
@@ -3213,7 +3213,7 @@ bool QMetaProperty::write(QObject *object, const QVariant &value) const
if (!value.isValid()) {
if (isResettable())
return reset(object);
- v = QVariant(t, 0);
+ v = QVariant(t, nullptr);
} else if (!v.convert(t)) {
return false;
}
@@ -3229,7 +3229,7 @@ bool QMetaProperty::write(QObject *object, const QVariant &value) const
// the flags variable is used by the declarative module to implement
// interception of property writes.
int flags = 0;
- void *argv[] = { 0, &v, &status, &flags };
+ void *argv[] = { nullptr, &v, &status, &flags };
if (t == QMetaType::QVariant)
argv[0] = &v;
else
@@ -3254,7 +3254,7 @@ bool QMetaProperty::reset(QObject *object) const
{
if (!object || !mobj || !isResettable())
return false;
- void *argv[] = { 0 };
+ void *argv[] = { nullptr };
if (priv(mobj->d.data)->flags & PropertyAccessInStaticMetaCall && mobj->d.static_metacall)
mobj->d.static_metacall(object, QMetaObject::ResetProperty, idx, argv);
else
@@ -3573,6 +3573,21 @@ bool QMetaProperty::isFinal() const
}
/*!
+ \since 5.15
+ Returns \c true if the property is required; otherwise returns \c false.
+
+ A property is final if the \c{Q_PROPERTY()}'s \c REQUIRED attribute
+ is set.
+*/
+bool QMetaProperty::isRequired() const
+{
+ if (!mobj)
+ return false;
+ int flags = mobj->d.data[handle + 2];
+ return flags & Required;
+}
+
+/*!
\obsolete
Returns \c true if the property is editable for the given \a object;
@@ -3638,7 +3653,7 @@ bool QMetaProperty::isEditable(const QObject *object) const
const char *QMetaClassInfo::name() const
{
if (!mobj)
- return 0;
+ return nullptr;
return rawStringData(mobj, mobj->d.data[handle]);
}
@@ -3650,7 +3665,7 @@ const char *QMetaClassInfo::name() const
const char* QMetaClassInfo::value() const
{
if (!mobj)
- return 0;
+ return nullptr;
return rawStringData(mobj, mobj->d.data[handle + 1]);
}
diff --git a/src/corelib/kernel/qmetaobject.h b/src/corelib/kernel/qmetaobject.h
index fcd92afd89..beb85becae 100644
--- a/src/corelib/kernel/qmetaobject.h
+++ b/src/corelib/kernel/qmetaobject.h
@@ -266,6 +266,7 @@ public:
bool isUser(const QObject *obj = nullptr) const;
bool isConstant() const;
bool isFinal() const;
+ bool isRequired() const;
bool isFlagType() const;
bool isEnumType() const;
diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h
index 56e3d6cb44..277109dac4 100644
--- a/src/corelib/kernel/qmetaobject_p.h
+++ b/src/corelib/kernel/qmetaobject_p.h
@@ -85,7 +85,8 @@ enum PropertyFlags {
User = 0x00100000,
ResolveUser = 0x00200000,
Notify = 0x00400000,
- Revisioned = 0x00800000
+ Revisioned = 0x00800000,
+ Required = 0x01000000,
};
enum MethodFlags {
diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp
index f77c4ce32f..4ecc340787 100644
--- a/src/corelib/kernel/qmetaobjectbuilder.cpp
+++ b/src/corelib/kernel/qmetaobjectbuilder.cpp
@@ -210,7 +210,7 @@ public:
: flags(0)
{
superClass = &QObject::staticMetaObject;
- staticMetacallFunction = 0;
+ staticMetacallFunction = nullptr;
}
bool hasRevisionedProperties() const;
@@ -749,7 +749,7 @@ void QMetaObjectBuilder::addMetaObject
Q_ASSERT(priv(prototype->d.data)->revision >= 2);
const auto *objects = prototype->d.relatedMetaObjects;
if (objects) {
- while (*objects != 0) {
+ while (*objects != nullptr) {
addRelatedMetaObject(*objects);
++objects;
}
@@ -831,7 +831,7 @@ const QMetaObject *QMetaObjectBuilder::relatedMetaObject(int index) const
if (index >= 0 && index < d->relatedMetaObjects.size())
return d->relatedMetaObjects[index];
else
- return 0;
+ return nullptr;
}
/*!
@@ -1196,8 +1196,8 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
ALIGN(size, int);
if (buf) {
if (!relocatable) meta->d.superdata = d->superClass;
- meta->d.relatedMetaObjects = 0;
- meta->d.extradata = 0;
+ meta->d.relatedMetaObjects = nullptr;
+ meta->d.extradata = nullptr;
meta->d.static_metacall = d->staticMetacallFunction;
}
@@ -1494,7 +1494,7 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
*/
QMetaObject *QMetaObjectBuilder::toMetaObject() const
{
- int size = buildMetaObject(d, 0, 0, false);
+ int size = buildMetaObject(d, nullptr, 0, false);
char *buf = reinterpret_cast<char *>(malloc(size));
memset(buf, 0, size);
buildMetaObject(d, buf, size, false);
@@ -1517,7 +1517,7 @@ QMetaObject *QMetaObjectBuilder::toMetaObject() const
*/
QByteArray QMetaObjectBuilder::toRelocatableData(bool *ok) const
{
- int size = buildMetaObject(d, 0, 0, true);
+ int size = buildMetaObject(d, nullptr, 0, true);
if (size == -1) {
if (ok) *ok = false;
return QByteArray();
@@ -1555,9 +1555,9 @@ void QMetaObjectBuilder::fromRelocatableData(QMetaObject *output,
output->d.superdata = superclass;
output->d.stringdata = reinterpret_cast<const QByteArrayData *>(buf + stringdataOffset);
output->d.data = reinterpret_cast<const uint *>(buf + dataOffset);
- output->d.extradata = 0;
- output->d.relatedMetaObjects = 0;
- output->d.static_metacall = 0;
+ output->d.extradata = nullptr;
+ output->d.relatedMetaObjects = nullptr;
+ output->d.static_metacall = nullptr;
}
/*!
@@ -1720,14 +1720,14 @@ void QMetaObjectBuilder::deserialize
d->enumerators.clear();
d->constructors.clear();
d->relatedMetaObjects.clear();
- d->staticMetacallFunction = 0;
+ d->staticMetacallFunction = nullptr;
// Read the class and super class names.
stream >> d->className;
stream >> name;
if (name.isEmpty()) {
- d->superClass = 0;
- } else if ((cl = resolveClassName(references, name)) != 0) {
+ d->superClass = nullptr;
+ } else if ((cl = resolveClassName(references, name)) != nullptr) {
d->superClass = cl;
} else {
stream.setStatus(QDataStream::ReadCorruptData);
@@ -1877,7 +1877,7 @@ QMetaMethodBuilderPrivate *QMetaMethodBuilder::d_func() const
else if (_mobj && -_index >= 1 && -_index <= int(_mobj->d->constructors.size()))
return &(_mobj->d->constructors[(-_index) - 1]);
else
- return 0;
+ return nullptr;
}
/*!
@@ -2116,7 +2116,7 @@ QMetaPropertyBuilderPrivate *QMetaPropertyBuilder::d_func() const
if (_mobj && _index >= 0 && _index < int(_mobj->d->properties.size()))
return &(_mobj->d->properties[_index]);
else
- return 0;
+ return nullptr;
}
/*!
@@ -2588,7 +2588,7 @@ QMetaEnumBuilderPrivate *QMetaEnumBuilder::d_func() const
if (_mobj && _index >= 0 && _index < int(_mobj->d->enumerators.size()))
return &(_mobj->d->enumerators[_index]);
else
- return 0;
+ return nullptr;
}
/*!
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index 356a675517..a2b7fec5cd 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -252,6 +252,7 @@ struct DefinedTypesFilter {
\value QPolygon QPolygon
\value QPolygonF QPolygonF
\value QColor QColor
+ \value QColorSpace QColorSpace
\value QSizeF QSizeF
\value QRectF QRectF
\value QLine QLine
@@ -456,7 +457,7 @@ struct DefinedTypesFilter {
\deprecated
Constructs a value of the given type which is a copy of \a copy.
- The default value for \a copy is 0.
+ The default value for \a copy is \nullptr.
Deprecated, use the static function QMetaType::create(int type,
const void *copy) instead.
@@ -506,6 +507,31 @@ struct DefinedTypesFilter {
Destructs this object.
*/
+/*!
+ \fn template<typename T> QMetaType QMetaType::fromType()
+ \since 5.15
+
+ Returns the QMetaType corresponding to the type in the template parameter.
+*/
+
+/*! \fn bool operator==(const QMetaType &a, const QMetaType &b)
+ \since 5.15
+ \relates QMetaType
+ \overload
+
+ Returns \c true if the QMetaType \a a represents the same type
+ as the QMetaType \a b, otherwise returns \c false.
+*/
+
+/*! \fn bool operator!=(const QMetaType &a, const QMetaType &c)
+ \since 5.15
+ \relates QMetaType
+ \overload
+
+ Returns \c true if the QMetaType \a a represents a difference type
+ than the QMetaType \a b, otherwise returns \c false.
+*/
+
#define QT_ADD_STATIC_METATYPE(MetaTypeName, MetaTypeId, RealName) \
{ #RealName, sizeof(#RealName) - 1, MetaTypeId },
@@ -930,7 +956,7 @@ constexpr MetaTypeOffsets<QtPrivate::Indexes<QMetaType::HighestInternalId + 1>::
pointer if no matching type was found. The returned pointer must not be
deleted.
- \sa type(), isRegistered(), Type
+ \sa type(), isRegistered(), Type, name()
*/
const char *QMetaType::typeName(int typeId)
{
@@ -950,6 +976,20 @@ const char *QMetaType::typeName(int typeId)
#undef QT_METATYPE_TYPEID_TYPENAME_CONVERTER
}
+/*!
+ \since 5.15
+
+ Returns the type name associated with this QMetaType, or a null
+ pointer if no matching type was found. The returned pointer must not be
+ deleted.
+
+ \sa typeName()
+*/
+QByteArray QMetaType::name() const
+{
+ return QMetaType::typeName(m_typeId);
+}
+
/*
Similar to QMetaType::type(), but only looks in the static set of types.
*/
@@ -1113,8 +1153,8 @@ static int registerNormalizedType(const NS(QByteArray) &normalizedTypeName,
QCustomTypeInfo inf;
inf.typeName = normalizedTypeName;
#ifndef QT_NO_DATASTREAM
- inf.loadOp = 0;
- inf.saveOp = 0;
+ inf.loadOp = nullptr;
+ inf.saveOp = nullptr;
#endif
inf.alias = -1;
inf.typedConstructor = typedConstructor;
@@ -1955,7 +1995,7 @@ public:
return Q_LIKELY(qMetaTypeWidgetsHelper)
? qMetaTypeWidgetsHelper[type - QMetaType::FirstWidgetsType].metaObject
: nullptr;
- return 0;
+ return nullptr;
}
};
@@ -2214,6 +2254,8 @@ QMetaType QMetaType::typeInfo(const int type)
\since 5.0
Constructs a QMetaType object that contains all information about type \a typeId.
+
+ \note: The default parameter was added in Qt 5.15
*/
QMetaType::QMetaType(const int typeId)
: m_typeId(typeId)
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
index d13fdeb642..59ec8de0e9 100644
--- a/src/corelib/kernel/qmetatype.h
+++ b/src/corelib/kernel/qmetatype.h
@@ -175,6 +175,7 @@ inline Q_DECL_CONSTEXPR int qMetaTypeId();
F(QVector4D, 84, QVector4D) \
F(QQuaternion, 85, QQuaternion) \
F(QPolygonF, 86, QPolygonF) \
+ F(QColorSpace, 87, QColorSpace) \
#define QT_FOR_EACH_STATIC_WIDGETS_CLASS(F)\
@@ -437,7 +438,7 @@ public:
FirstCoreType = Bool,
LastCoreType = QCborMap,
FirstGuiType = QFont,
- LastGuiType = QPolygonF,
+ LastGuiType = QColorSpace,
FirstWidgetsType = QSizePolicy,
LastWidgetsType = QSizePolicy,
HighestInternalId = LastWidgetsType,
@@ -472,12 +473,12 @@ public:
QIcon = 69, QImage = 70, QPolygon = 71, QRegion = 72, QBitmap = 73,
QCursor = 74, QKeySequence = 75, QPen = 76, QTextLength = 77, QTextFormat = 78,
QMatrix = 79, QTransform = 80, QMatrix4x4 = 81, QVector2D = 82,
- QVector3D = 83, QVector4D = 84, QQuaternion = 85, QPolygonF = 86,
+ QVector3D = 83, QVector4D = 84, QQuaternion = 85, QPolygonF = 86, QColorSpace = 87,
// Widget types
QSizePolicy = 121,
LastCoreType = QCborMap,
- LastGuiType = QPolygonF,
+ LastGuiType = QColorSpace,
User = 1024
};
#endif
@@ -572,7 +573,7 @@ public:
static bool load(QDataStream &stream, int type, void *data);
#endif
- explicit QMetaType(const int type); // ### Qt6: drop const
+ explicit QMetaType(const int type = QMetaType::UnknownType); // ### Qt6: drop const
inline ~QMetaType();
inline bool isValid() const;
@@ -581,12 +582,24 @@ public:
inline int sizeOf() const;
inline TypeFlags flags() const;
inline const QMetaObject *metaObject() const;
+ QT_PREPEND_NAMESPACE(QByteArray) name() const;
inline void *create(const void *copy = nullptr) const;
inline void destroy(void *data) const;
inline void *construct(void *where, const void *copy = nullptr) const;
inline void destruct(void *data) const;
+ template<typename T>
+ static QMetaType fromType()
+ { return QMetaType(qMetaTypeId<T>()); }
+
+ friend bool operator==(const QMetaType &a, const QMetaType &b)
+ { return a.m_typeId == b.m_typeId; }
+
+ friend bool operator!=(const QMetaType &a, const QMetaType &b)
+ { return a.m_typeId != b.m_typeId; }
+
+
public:
template<typename T>
static bool registerComparators()
@@ -1284,9 +1297,12 @@ public:
{ IteratorOwner<typename T::const_iterator>::assign(iterator,
static_cast<const T*>(container)->find(*static_cast<const typename T::key_type*>(p))); }
+ QT_WARNING_PUSH
+ QT_WARNING_DISABLE_DEPRECATED // Hits on the deprecated QHash::iterator::operator--()
template<class T>
static void advanceImpl(void **p, int step)
{ std::advance(*static_cast<typename T::const_iterator*>(*p), step); }
+ QT_WARNING_POP
template<class T>
static void beginImpl(const void *container, void **iterator)
diff --git a/src/corelib/kernel/qmimedata.cpp b/src/corelib/kernel/qmimedata.cpp
index 9a98db21d3..fca258c9e3 100644
--- a/src/corelib/kernel/qmimedata.cpp
+++ b/src/corelib/kernel/qmimedata.cpp
@@ -70,7 +70,7 @@ public:
void setData(const QString &format, const QVariant &data);
QVariant getData(const QString &format) const;
- QVariant retrieveTypedData(const QString &format, QVariant::Type type) const;
+ QVariant retrieveTypedData(const QString &format, QMetaType::Type type) const;
QVector<QMimeDataStruct> dataList;
};
@@ -108,23 +108,23 @@ QVariant QMimeDataPrivate::getData(const QString &format) const
return data;
}
-QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QVariant::Type type) const
+QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QMetaType::Type type) const
{
Q_Q(const QMimeData);
- QVariant data = q->retrieveData(format, type);
+ QVariant data = q->retrieveData(format, QVariant::Type(type));
// Text data requested: fallback to URL data if available
if (format == QLatin1String("text/plain") && !data.isValid()) {
- data = retrieveTypedData(textUriListLiteral(), QVariant::List);
- if (data.type() == QVariant::Url) {
+ data = retrieveTypedData(textUriListLiteral(), QMetaType::QVariantList);
+ if (data.userType() == QMetaType::QUrl) {
data = QVariant(data.toUrl().toDisplayString());
- } else if (data.type() == QVariant::List) {
+ } else if (data.userType() == QMetaType::QVariantList) {
QString text;
int numUrls = 0;
const QList<QVariant> list = data.toList();
for (int i = 0; i < list.size(); ++i) {
- if (list.at(i).type() == QVariant::Url) {
+ if (list.at(i).userType() == QMetaType::QUrl) {
text += list.at(i).toUrl().toDisplayString() + QLatin1Char('\n');
++numUrls;
}
@@ -135,26 +135,26 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QVariant::Ty
}
}
- if (data.type() == type || !data.isValid())
+ if (data.userType() == type || !data.isValid())
return data;
// provide more conversion possiblities than just what QVariant provides
// URLs can be lists as well...
- if ((type == QVariant::Url && data.type() == QVariant::List)
- || (type == QVariant::List && data.type() == QVariant::Url))
+ if ((type == QMetaType::QUrl && data.userType() == QMetaType::QVariantList)
+ || (type == QMetaType::QVariantList && data.userType() == QMetaType::QUrl))
return data;
// images and pixmaps are interchangeable
- if ((type == QVariant::Pixmap && data.type() == QVariant::Image)
- || (type == QVariant::Image && data.type() == QVariant::Pixmap))
+ if ((type == QMetaType::QPixmap && data.userType() == QMetaType::QImage)
+ || (type == QMetaType::QImage && data.userType() == QMetaType::QPixmap))
return data;
- if (data.type() == QVariant::ByteArray) {
+ if (data.userType() == QMetaType::QByteArray) {
// see if we can convert to the requested type
switch(type) {
#if QT_CONFIG(textcodec)
- case QVariant::String: {
+ case QMetaType::QString: {
const QByteArray ba = data.toByteArray();
QTextCodec *codec = QTextCodec::codecForName("utf-8");
if (format == QLatin1String("text/html"))
@@ -162,17 +162,17 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QVariant::Ty
return codec->toUnicode(ba);
}
#endif // textcodec
- case QVariant::Color: {
+ case QMetaType::QColor: {
QVariant newData = data;
- newData.convert(QVariant::Color);
+ newData.convert(QMetaType::QColor);
return newData;
}
- case QVariant::List: {
+ case QMetaType::QVariantList: {
if (format != QLatin1String("text/uri-list"))
break;
Q_FALLTHROUGH();
}
- case QVariant::Url: {
+ case QMetaType::QUrl: {
QByteArray ba = data.toByteArray();
// Qt 3.x will send text/uri-list with a trailing
// null-terminator (that is *not* sent for any other
@@ -193,23 +193,23 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QVariant::Ty
break;
}
- } else if (type == QVariant::ByteArray) {
+ } else if (type == QMetaType::QByteArray) {
// try to convert to bytearray
- switch(data.type()) {
- case QVariant::ByteArray:
- case QVariant::Color:
+ switch (data.userType()) {
+ case QMetaType::QByteArray:
+ case QMetaType::QColor:
return data.toByteArray();
- case QVariant::String:
+ case QMetaType::QString:
return data.toString().toUtf8();
- case QVariant::Url:
+ case QMetaType::QUrl:
return data.toUrl().toEncoded();
- case QVariant::List: {
+ case QMetaType::QVariantList: {
// has to be list of URLs
QByteArray result;
QList<QVariant> list = data.toList();
for (int i = 0; i < list.size(); ++i) {
- if (list.at(i).type() == QVariant::Url) {
+ if (list.at(i).userType() == QMetaType::QUrl) {
result += list.at(i).toUrl().toEncoded();
result += "\r\n";
}
@@ -319,7 +319,7 @@ QVariant QMimeDataPrivate::retrieveTypedData(const QString &format, QVariant::Ty
Constructs a new MIME data object with no data in it.
*/
QMimeData::QMimeData()
- : QObject(*new QMimeDataPrivate, 0)
+ : QObject(*new QMimeDataPrivate, nullptr)
{
}
@@ -340,14 +340,14 @@ QMimeData::~QMimeData()
QList<QUrl> QMimeData::urls() const
{
Q_D(const QMimeData);
- QVariant data = d->retrieveTypedData(textUriListLiteral(), QVariant::List);
+ QVariant data = d->retrieveTypedData(textUriListLiteral(), QMetaType::QVariantList);
QList<QUrl> urls;
- if (data.type() == QVariant::Url)
+ if (data.userType() == QMetaType::QUrl)
urls.append(data.toUrl());
- else if (data.type() == QVariant::List) {
+ else if (data.userType() == QMetaType::QVariantList) {
QList<QVariant> list = data.toList();
for (int i = 0; i < list.size(); ++i) {
- if (list.at(i).type() == QVariant::Url)
+ if (list.at(i).userType() == QMetaType::QUrl)
urls.append(list.at(i).toUrl());
}
}
@@ -400,11 +400,11 @@ bool QMimeData::hasUrls() const
QString QMimeData::text() const
{
Q_D(const QMimeData);
- QVariant utf8Text = d->retrieveTypedData(textPlainUtf8Literal(), QVariant::String);
+ QVariant utf8Text = d->retrieveTypedData(textPlainUtf8Literal(), QMetaType::QString);
if (!utf8Text.isNull())
return utf8Text.toString();
- QVariant data = d->retrieveTypedData(textPlainLiteral(), QVariant::String);
+ QVariant data = d->retrieveTypedData(textPlainLiteral(), QMetaType::QString);
return data.toString();
}
@@ -440,7 +440,7 @@ bool QMimeData::hasText() const
QString QMimeData::html() const
{
Q_D(const QMimeData);
- QVariant data = d->retrieveTypedData(textHtmlLiteral(), QVariant::String);
+ QVariant data = d->retrieveTypedData(textHtmlLiteral(), QMetaType::QString);
return data.toString();
}
@@ -482,7 +482,7 @@ bool QMimeData::hasHtml() const
QVariant QMimeData::imageData() const
{
Q_D(const QMimeData);
- return d->retrieveTypedData(applicationXQtImageLiteral(), QVariant::Image);
+ return d->retrieveTypedData(applicationXQtImageLiteral(), QMetaType::QImage);
}
/*!
@@ -529,7 +529,7 @@ bool QMimeData::hasImage() const
QVariant QMimeData::colorData() const
{
Q_D(const QMimeData);
- return d->retrieveTypedData(applicationXColorLiteral(), QVariant::Color);
+ return d->retrieveTypedData(applicationXColorLiteral(), QMetaType::QColor);
}
/*!
@@ -564,7 +564,7 @@ bool QMimeData::hasColor() const
QByteArray QMimeData::data(const QString &mimeType) const
{
Q_D(const QMimeData);
- QVariant data = d->retrieveTypedData(mimeType, QVariant::ByteArray);
+ QVariant data = d->retrieveTypedData(mimeType, QMetaType::QByteArray);
return data.toByteArray();
}
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index e2e133ac28..a51b794604 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -109,7 +109,7 @@ static int *queuedConnectionTypes(const QList<QByteArray> &typeNames)
"(Make sure '%s' is registered using qRegisterMetaType().)",
typeName.constData(), typeName.constData());
delete [] types;
- return 0;
+ return nullptr;
}
}
types[typeNames.count()] = 0;
@@ -133,7 +133,7 @@ static int *queuedConnectionTypes(const QArgumentType *argumentTypes, int argc)
qWarning("QObject::connect: Cannot queue arguments of type '%s'\n"
"(Make sure '%s' is registered using qRegisterMetaType().)",
type.name().constData(), type.name().constData());
- return 0;
+ return nullptr;
}
}
types[argc] = 0;
@@ -160,13 +160,13 @@ extern "C" Q_CORE_EXPORT void qt_removeObject(QObject *)
{}
#endif
-void (*QAbstractDeclarativeData::destroyed)(QAbstractDeclarativeData *, QObject *) = 0;
-void (*QAbstractDeclarativeData::destroyed_qml1)(QAbstractDeclarativeData *, QObject *) = 0;
-void (*QAbstractDeclarativeData::parentChanged)(QAbstractDeclarativeData *, QObject *, QObject *) = 0;
-void (*QAbstractDeclarativeData::signalEmitted)(QAbstractDeclarativeData *, QObject *, int, void **) = 0;
-int (*QAbstractDeclarativeData::receivers)(QAbstractDeclarativeData *, const QObject *, int) = 0;
-bool (*QAbstractDeclarativeData::isSignalConnected)(QAbstractDeclarativeData *, const QObject *, int) = 0;
-void (*QAbstractDeclarativeData::setWidgetParent)(QObject *, QObject *) = 0;
+void (*QAbstractDeclarativeData::destroyed)(QAbstractDeclarativeData *, QObject *) = nullptr;
+void (*QAbstractDeclarativeData::destroyed_qml1)(QAbstractDeclarativeData *, QObject *) = nullptr;
+void (*QAbstractDeclarativeData::parentChanged)(QAbstractDeclarativeData *, QObject *, QObject *) = nullptr;
+void (*QAbstractDeclarativeData::signalEmitted)(QAbstractDeclarativeData *, QObject *, int, void **) = nullptr;
+int (*QAbstractDeclarativeData::receivers)(QAbstractDeclarativeData *, const QObject *, int) = nullptr;
+bool (*QAbstractDeclarativeData::isSignalConnected)(QAbstractDeclarativeData *, const QObject *, int) = nullptr;
+void (*QAbstractDeclarativeData::setWidgetParent)(QObject *, QObject *) = nullptr;
/*!
\fn QObjectData::QObjectData()
@@ -182,7 +182,7 @@ QMetaObject *QObjectData::dynamicMetaObject() const
}
QObjectPrivate::QObjectPrivate(int version)
- : threadData(0), currentChildBeingDeleted(0)
+ : threadData(nullptr), currentChildBeingDeleted(nullptr)
{
#ifdef QT_BUILD_INTERNAL
// Don't check the version parameter in internal builds.
@@ -195,8 +195,8 @@ QObjectPrivate::QObjectPrivate(int version)
#endif
// QObjectData initialization
- q_ptr = 0;
- parent = 0; // no parent yet. It is set by setParent()
+ q_ptr = nullptr;
+ parent = nullptr; // no parent yet. It is set by setParent()
isWidget = false; // assume not a widget object
blockSig = false; // not blocking signals
wasDeleted = false; // double-delete catcher
@@ -204,19 +204,20 @@ QObjectPrivate::QObjectPrivate(int version)
sendChildEvents = true; // if we should send ChildAdded and ChildRemoved events to parent
receiveChildEvents = true;
postedEvents = 0;
- extraData = 0;
- metaObject = 0;
+ extraData = nullptr;
+ metaObject = nullptr;
isWindow = false;
deleteLaterCalled = false;
}
QObjectPrivate::~QObjectPrivate()
{
+ auto thisThreadData = threadData.loadRelaxed();
if (extraData && !extraData->runningTimers.isEmpty()) {
- if (Q_LIKELY(threadData->thread.loadAcquire() == QThread::currentThread())) {
+ if (Q_LIKELY(thisThreadData->thread.loadAcquire() == QThread::currentThread())) {
// unregister pending timers
- if (threadData->hasEventDispatcher())
- threadData->eventDispatcher.loadRelaxed()->unregisterTimers(q_ptr);
+ if (thisThreadData->hasEventDispatcher())
+ thisThreadData->eventDispatcher.loadRelaxed()->unregisterTimers(q_ptr);
// release the timer ids back to the pool
for (int i = 0; i < extraData->runningTimers.size(); ++i)
@@ -229,7 +230,7 @@ QObjectPrivate::~QObjectPrivate()
if (postedEvents)
QCoreApplication::removePostedEvents(q_ptr, 0);
- threadData->deref();
+ thisThreadData->deref();
if (metaObject) metaObject->objectDestroyed(q_ptr);
@@ -906,30 +907,8 @@ static bool check_parent_thread(QObject *parent,
*/
QObject::QObject(QObject *parent)
- : d_ptr(new QObjectPrivate)
+ : QObject(*new QObjectPrivate, parent)
{
- Q_ASSERT_X(this != parent, Q_FUNC_INFO, "Cannot parent a QObject to itself");
-
- Q_D(QObject);
- d_ptr->q_ptr = this;
- d->threadData = (parent && !parent->thread()) ? parent->d_func()->threadData : QThreadData::current();
- d->threadData->ref();
- if (parent) {
- QT_TRY {
- if (!check_parent_thread(parent, parent ? parent->d_func()->threadData : 0, d->threadData))
- parent = 0;
- setParent(parent);
- } QT_CATCH(...) {
- d->threadData->deref();
- QT_RETHROW;
- }
- }
-#if QT_VERSION < 0x60000
- qt_addObject(this);
-#endif
- if (Q_UNLIKELY(qtHookData[QHooks::AddQObject]))
- reinterpret_cast<QHooks::AddQObjectCallback>(qtHookData[QHooks::AddQObject])(this);
- Q_TRACE(QObject_ctor, this);
}
/*!
@@ -942,12 +921,13 @@ QObject::QObject(QObjectPrivate &dd, QObject *parent)
Q_D(QObject);
d_ptr->q_ptr = this;
- d->threadData = (parent && !parent->thread()) ? parent->d_func()->threadData : QThreadData::current();
- d->threadData->ref();
+ auto threadData = (parent && !parent->thread()) ? parent->d_func()->threadData.loadRelaxed() : QThreadData::current();
+ threadData->ref();
+ d->threadData.storeRelaxed(threadData);
if (parent) {
QT_TRY {
- if (!check_parent_thread(parent, parent ? parent->d_func()->threadData : 0, d->threadData))
- parent = 0;
+ if (!check_parent_thread(parent, parent ? parent->d_func()->threadData.loadRelaxed() : nullptr, threadData))
+ parent = nullptr;
if (d->isWidget) {
if (parent) {
d->parent = parent;
@@ -958,7 +938,7 @@ QObject::QObject(QObjectPrivate &dd, QObject *parent)
setParent(parent);
}
} QT_CATCH(...) {
- d->threadData->deref();
+ threadData->deref();
QT_RETHROW;
}
}
@@ -1115,7 +1095,7 @@ QObject::~QObject()
Q_TRACE(QObject_dtor, this);
if (d->parent) // remove it from parent object
- d->setParent_helper(0);
+ d->setParent_helper(nullptr);
}
QObjectPrivate::Connection::~Connection()
@@ -1342,7 +1322,7 @@ bool QObject::event(QEvent *e)
case QEvent::ThreadChange: {
Q_D(QObject);
- QThreadData *threadData = d->threadData;
+ QThreadData *threadData = d->threadData.loadRelaxed();
QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher.loadRelaxed();
if (eventDispatcher) {
QList<QAbstractEventDispatcher::TimerInfo> timers = eventDispatcher->registeredTimers(this);
@@ -1509,7 +1489,7 @@ bool QObject::blockSignals(bool block) noexcept
*/
QThread *QObject::thread() const
{
- return d_func()->threadData->thread.loadAcquire();
+ return d_func()->threadData.loadRelaxed()->thread.loadAcquire();
}
/*!
@@ -1556,12 +1536,12 @@ void QObject::moveToThread(QThread *targetThread)
{
Q_D(QObject);
- if (d->threadData->thread.loadAcquire() == targetThread) {
+ if (d->threadData.loadRelaxed()->thread.loadAcquire() == targetThread) {
// object is already in this thread
return;
}
- if (d->parent != 0) {
+ if (d->parent != nullptr) {
qWarning("QObject::moveToThread: Cannot move objects with a parent");
return;
}
@@ -1572,13 +1552,14 @@ void QObject::moveToThread(QThread *targetThread)
QThreadData *currentData = QThreadData::current();
QThreadData *targetData = targetThread ? QThreadData::get2(targetThread) : nullptr;
- if (d->threadData->thread.loadAcquire() == 0 && currentData == targetData) {
+ QThreadData *thisThreadData = d->threadData.loadRelaxed();
+ if (!thisThreadData->thread.loadAcquire() && currentData == targetData) {
// one exception to the rule: we allow moving objects with no thread affinity to the current thread
currentData = d->threadData;
- } else if (d->threadData != currentData) {
+ } else if (thisThreadData != currentData) {
qWarning("QObject::moveToThread: Current thread (%p) is not the object's thread (%p).\n"
"Cannot move to target thread (%p)\n",
- currentData->thread.loadRelaxed(), d->threadData->thread.loadRelaxed(), targetData ? targetData->thread.loadRelaxed() : nullptr);
+ currentData->thread.loadRelaxed(), thisThreadData->thread.loadRelaxed(), targetData ? targetData->thread.loadRelaxed() : nullptr);
#ifdef Q_OS_MAC
qWarning("You might be loading two sets of Qt binaries into the same process. "
@@ -1637,7 +1618,7 @@ void QObjectPrivate::setThreadData_helper(QThreadData *currentData, QThreadData
if (pe.receiver == q) {
// move this post event to the targetList
targetData->postEventList.addEvent(pe);
- const_cast<QPostEvent &>(pe).event = 0;
+ const_cast<QPostEvent &>(pe).event = nullptr;
++eventsMoved;
}
}
@@ -1675,8 +1656,10 @@ void QObjectPrivate::setThreadData_helper(QThreadData *currentData, QThreadData
// set new thread data
targetData->ref();
- threadData->deref();
- threadData = targetData;
+ threadData.loadRelaxed()->deref();
+
+ // synchronizes with loadAcquire e.g. in QCoreApplication::postEvent
+ threadData.storeRelease(targetData);
for (int i = 0; i < children.size(); ++i) {
QObject *child = children.at(i);
@@ -1688,7 +1671,7 @@ void QObjectPrivate::_q_reregisterTimers(void *pointer)
{
Q_Q(QObject);
QList<QAbstractEventDispatcher::TimerInfo> *timerList = reinterpret_cast<QList<QAbstractEventDispatcher::TimerInfo> *>(pointer);
- QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher.loadRelaxed();
+ QAbstractEventDispatcher *eventDispatcher = threadData.loadRelaxed()->eventDispatcher.loadRelaxed();
for (int i = 0; i < timerList->size(); ++i) {
const QAbstractEventDispatcher::TimerInfo &ti = timerList->at(i);
eventDispatcher->registerTimer(ti.timerId, ti.interval, ti.timerType, q);
@@ -1746,7 +1729,9 @@ int QObject::startTimer(int interval, Qt::TimerType timerType)
qWarning("QObject::startTimer: Timers cannot have negative intervals");
return 0;
}
- if (Q_UNLIKELY(!d->threadData->hasEventDispatcher())) {
+
+ auto thisThreadData = d->threadData.loadRelaxed();
+ if (Q_UNLIKELY(!thisThreadData->hasEventDispatcher())) {
qWarning("QObject::startTimer: Timers can only be used with threads started with QThread");
return 0;
}
@@ -1754,7 +1739,7 @@ int QObject::startTimer(int interval, Qt::TimerType timerType)
qWarning("QObject::startTimer: Timers cannot be started from another thread");
return 0;
}
- int timerId = d->threadData->eventDispatcher.loadRelaxed()->registerTimer(interval, timerType, this);
+ int timerId = thisThreadData->eventDispatcher.loadRelaxed()->registerTimer(interval, timerType, this);
if (!d->extraData)
d->extraData = new QObjectPrivate::ExtraData;
d->extraData->runningTimers.append(timerId);
@@ -1828,8 +1813,9 @@ void QObject::killTimer(int id)
return;
}
- if (d->threadData->hasEventDispatcher())
- d->threadData->eventDispatcher.loadRelaxed()->unregisterTimer(id);
+ auto thisThreadData = d->threadData.loadRelaxed();
+ if (thisThreadData->hasEventDispatcher())
+ thisThreadData->eventDispatcher.loadRelaxed()->unregisterTimer(id);
d->extraData->runningTimers.remove(at);
QAbstractEventDispatcherPrivate::releaseTimerId(id);
@@ -2079,7 +2065,7 @@ void qt_qFindChildren_helper(const QObject *parent, const QRegularExpression &re
QObject *qt_qFindChild_helper(const QObject *parent, const QString &name, const QMetaObject &mo, Qt::FindChildOptions options)
{
if (!parent)
- return 0;
+ return nullptr;
const QObjectList &children = parent->children();
QObject *obj;
int i;
@@ -2095,7 +2081,7 @@ QObject *qt_qFindChild_helper(const QObject *parent, const QString &name, const
return obj;
}
}
- return 0;
+ return nullptr;
}
/*!
@@ -2123,7 +2109,7 @@ void QObjectPrivate::deleteChildren()
delete currentChildBeingDeleted;
}
children.clear();
- currentChildBeingDeleted = 0;
+ currentChildBeingDeleted = nullptr;
isDeletingChildren = false;
}
@@ -2157,7 +2143,9 @@ void QObjectPrivate::setParent_helper(QObject *o)
// cleared our entry in parentD->children.
} else {
const int index = parentD->children.indexOf(q);
- if (parentD->isDeletingChildren) {
+ if (index < 0) {
+ // we're probably recursing into setParent() from a ChildRemoved event, don't do anything
+ } else if (parentD->isDeletingChildren) {
parentD->children[index] = 0;
} else {
parentD->children.removeAt(index);
@@ -2173,7 +2161,7 @@ void QObjectPrivate::setParent_helper(QObject *o)
// object hierarchies are constrained to a single thread
if (threadData != parent->d_func()->threadData) {
qWarning("QObject::setParent: Cannot set parent, new parent is in a different thread");
- parent = 0;
+ parent = nullptr;
return;
}
parent->d_func()->children.append(q);
@@ -2244,7 +2232,7 @@ void QObject::installEventFilter(QObject *obj)
d->extraData = new QObjectPrivate::ExtraData;
// clean up unused items in the list
- d->extraData->eventFilters.removeAll((QObject*)0);
+ d->extraData->eventFilters.removeAll((QObject*)nullptr);
d->extraData->eventFilters.removeAll(obj);
d->extraData->eventFilters.prepend(obj);
}
@@ -2268,7 +2256,7 @@ void QObject::removeEventFilter(QObject *obj)
if (d->extraData) {
for (int i = 0; i < d->extraData->eventFilters.count(); ++i) {
if (d->extraData->eventFilters.at(i) == obj)
- d->extraData->eventFilters[i] = 0;
+ d->extraData->eventFilters[i] = nullptr;
}
}
}
@@ -2391,7 +2379,7 @@ void QObject::deleteLater()
const char *qFlagLocation(const char *method)
{
QThreadData *currentThreadData = QThreadData::current(false);
- if (currentThreadData != 0)
+ if (currentThreadData != nullptr)
currentThreadData->flaggedSignatures.store(method);
return method;
}
@@ -2410,7 +2398,7 @@ static const char * extract_location(const char *member)
if (*location != '\0')
return location;
}
- return 0;
+ return nullptr;
}
static bool check_signal_macro(const QObject *sender, const char *signal,
@@ -2449,7 +2437,7 @@ static void err_method_notfound(const QObject *object,
case QSIGNAL_CODE: type = "signal"; break;
}
const char *loc = extract_location(method);
- if (strchr(method,')') == 0) // common typing mistake
+ if (strchr(method,')') == nullptr) // common typing mistake
qWarning("QObject::%s: Parentheses expected, %s %s::%s%s%s",
func, type, object->metaObject()->className(), method+1,
loc ? " in ": "", loc ? loc : "");
@@ -2509,7 +2497,7 @@ QObject *QObject::sender() const
return cd->currentSender->sender;
}
- return 0;
+ return nullptr;
}
/*!
@@ -2688,7 +2676,7 @@ void QMetaObjectPrivate::memberIndexes(const QObject *obj,
return;
const QMetaObject *m = obj->metaObject();
// Check that member is member of obj class
- while (m != 0 && m != member.mobj)
+ while (m != nullptr && m != member.mobj)
m = m->d.superdata;
if (!m)
return;
@@ -2805,12 +2793,12 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
(signal && *signal) ? signal+1 : "(nullptr)",
receiver ? receiver->metaObject()->className() : "(nullptr)",
(method && *method) ? method+1 : "(nullptr)");
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
}
QByteArray tmp_signal_name;
if (!check_signal_macro(sender, signal, "connect", "bind"))
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
const QMetaObject *smeta = sender->metaObject();
const char *signal_arg = signal;
++signal; //skip code
@@ -2833,7 +2821,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
if (signal_index < 0) {
err_method_notfound(sender, signal_arg, "connect");
err_info_about_objects("connect", sender, receiver);
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
}
signal_index = QMetaObjectPrivate::originalClone(smeta, signal_index);
signal_index += QMetaObjectPrivate::signalOffset(smeta);
@@ -2842,7 +2830,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
int membcode = extract_code(method);
if (!check_method_code(membcode, receiver, method, "connect"))
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
const char *method_arg = method;
++method; // skip code
@@ -2885,7 +2873,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
if (method_index_relative < 0) {
err_method_notfound(receiver, method_arg, "connect");
err_info_about_objects("connect", sender, receiver);
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
}
if (!QMetaObjectPrivate::checkConnectArgs(signalTypes.size(), signalTypes.constData(),
@@ -2894,13 +2882,13 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const char *sign
"\n %s::%s --> %s::%s",
sender->metaObject()->className(), signal,
receiver->metaObject()->className(), method);
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
}
- int *types = 0;
+ int *types = nullptr;
if ((type == Qt::QueuedConnection)
&& !(types = queuedConnectionTypes(signalTypes.constData(), signalTypes.size()))) {
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
}
#ifndef QT_NO_DEBUG
@@ -2946,7 +2934,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho
signal.methodSignature().constData(),
receiver ? receiver->metaObject()->className() : "(nullptr)",
method.methodSignature().constData() );
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
}
int signal_index;
@@ -2962,12 +2950,12 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho
if (signal_index == -1) {
qWarning("QObject::connect: Can't find signal %s on instance of class %s",
signal.methodSignature().constData(), smeta->className());
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
}
if (method_index == -1) {
qWarning("QObject::connect: Can't find method %s on instance of class %s",
method.methodSignature().constData(), rmeta->className());
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
}
if (!QMetaObject::checkConnectArgs(signal.methodSignature().constData(), method.methodSignature().constData())) {
@@ -2975,19 +2963,19 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho
"\n %s::%s --> %s::%s",
smeta->className(), signal.methodSignature().constData(),
rmeta->className(), method.methodSignature().constData());
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
}
- int *types = 0;
+ int *types = nullptr;
if ((type == Qt::QueuedConnection)
&& !(types = queuedConnectionTypes(signal.parameterTypes())))
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
#ifndef QT_NO_DEBUG
check_and_warn_compat(smeta, signal, rmeta, method);
#endif
QMetaObject::Connection handle = QMetaObject::Connection(QMetaObjectPrivate::connect(
- sender, signal_index, signal.enclosingMetaObject(), receiver, method_index, 0, type, types));
+ sender, signal_index, signal.enclosingMetaObject(), receiver, method_index, nullptr, type, types));
return handle;
}
@@ -3142,7 +3130,7 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
}
if (!method) {
- res |= QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, -1, 0);
+ res |= QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, -1, nullptr);
} else {
const QMetaObject *rmeta = receiver->metaObject();
do {
@@ -3153,7 +3141,7 @@ bool QObject::disconnect(const QObject *sender, const char *signal,
rmeta = rmeta->superClass();
if (method_index < 0)
break;
- res |= QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, method_index, 0);
+ res |= QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, method_index, nullptr);
method_found = true;
} while ((rmeta = rmeta->superClass()));
}
@@ -3254,7 +3242,7 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal,
return false;
}
- if (!QMetaObjectPrivate::disconnect(sender, signal_index, signal.mobj, receiver, method_index, 0))
+ if (!QMetaObjectPrivate::disconnect(sender, signal_index, signal.mobj, receiver, method_index, nullptr))
return false;
if (!signal.isValid()) {
@@ -3393,7 +3381,7 @@ QMetaObject::Connection QMetaObject::connect(const QObject *sender, int signal_i
signal_index = methodIndexToSignalIndex(&smeta, signal_index);
return Connection(QMetaObjectPrivate::connect(sender, signal_index, smeta,
receiver, method_index,
- 0, //FIXME, we could speed this connection up by computing the relative index
+ nullptr, //FIXME, we could speed this connection up by computing the relative index
type, types));
}
@@ -3469,7 +3457,7 @@ bool QMetaObject::disconnect(const QObject *sender, int signal_index,
const QMetaObject *smeta = sender->metaObject();
signal_index = methodIndexToSignalIndex(&smeta, signal_index);
return QMetaObjectPrivate::disconnect(sender, signal_index, smeta,
- receiver, method_index, 0);
+ receiver, method_index, nullptr);
}
/*!
@@ -3485,7 +3473,7 @@ bool QMetaObject::disconnectOne(const QObject *sender, int signal_index,
const QMetaObject *smeta = sender->metaObject();
signal_index = methodIndexToSignalIndex(&smeta, signal_index);
return QMetaObjectPrivate::disconnect(sender, signal_index, smeta,
- receiver, method_index, 0,
+ receiver, method_index, nullptr,
QMetaObjectPrivate::DisconnectOne);
}
@@ -3694,7 +3682,7 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect
argumentTypes = queuedConnectionTypes(m.parameterTypes());
if (!argumentTypes) // cannot queue arguments
argumentTypes = &DIRECT_CONNECTION_ONLY;
- if (!c->argumentTypes.testAndSetOrdered(0, argumentTypes)) {
+ if (!c->argumentTypes.testAndSetOrdered(nullptr, argumentTypes)) {
if (argumentTypes != &DIRECT_CONNECTION_ONLY)
delete [] argumentTypes;
argumentTypes = c->argumentTypes.loadRelaxed();
@@ -3794,7 +3782,7 @@ void doActivate(QObject *sender, int signal_index, void **argv)
list = &signalVector->at(-1);
Qt::HANDLE currentThreadId = QThread::currentThreadId();
- bool inSenderThread = currentThreadId == QObjectPrivate::get(sender)->threadData->threadId.loadRelaxed();
+ bool inSenderThread = currentThreadId == QObjectPrivate::get(sender)->threadData.loadRelaxed()->threadId.loadRelaxed();
// We need to check against the highest connection id to ensure that signals added
// during the signal emission are not emitted in this emission.
@@ -4305,10 +4293,10 @@ QObjectUserData* QObject::userData(uint id) const
{
Q_D(const QObject);
if (!d->extraData)
- return 0;
+ return nullptr;
if ((int)id < d->extraData->userData.size())
return d->extraData->userData.at(id);
- return 0;
+ return nullptr;
}
#endif // QT_NO_USERDATA
@@ -4964,7 +4952,7 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa
if (!senderMetaObject) {
qWarning("QObject::connect: signal not found in %s", sender->metaObject()->className());
slotObj->destroyIfLastRef();
- return QMetaObject::Connection(0);
+ return QMetaObject::Connection(nullptr);
}
signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject);
return QObjectPrivate::connectImpl(sender, signal_index, receiver, slot, slotObj, type, types, senderMetaObject);
@@ -5190,7 +5178,7 @@ QMetaObject::Connection QObjectPrivate::connect(const QObject *sender, int signa
const QMetaObject *senderMetaObject = sender->metaObject();
signal_index = methodIndexToSignalIndex(&senderMetaObject, signal_index);
- return QObjectPrivate::connectImpl(sender, signal_index, sender, /*slot*/0, slotObj, type, /*types*/0, senderMetaObject);
+ return QObjectPrivate::connectImpl(sender, signal_index, sender, /*slot*/nullptr, slotObj, type, /*types*/nullptr, senderMetaObject);
}
/*!
@@ -5247,7 +5235,7 @@ QMetaObject::Connection& QMetaObject::Connection::operator=(const QMetaObject::C
Creates a Connection instance.
*/
-QMetaObject::Connection::Connection() : d_ptr(0) {}
+QMetaObject::Connection::Connection() : d_ptr(nullptr) {}
/*!
Destructor for QMetaObject::Connection.
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
index feafcaf323..838a9aa8c5 100644
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -374,7 +374,12 @@ public:
}
public:
ExtraData *extraData; // extra data set by the user
- QThreadData *threadData; // id of the thread that owns the object
+ // This atomic requires acquire/release semantics in a few places,
+ // e.g. QObject::moveToThread must synchronize with QCoreApplication::postEvent,
+ // because postEvent is thread-safe.
+ // However, most of the code paths involving QObject are only reentrant and
+ // not thread-safe, so synchronization should not be necessary there.
+ QAtomicPointer<QThreadData> threadData; // id of the thread that owns the object
using ConnectionDataPointer = QExplicitlySharedDataPointer<ConnectionData>;
QAtomicPointer<ConnectionData> connections;
diff --git a/src/corelib/kernel/qobjectcleanuphandler.cpp b/src/corelib/kernel/qobjectcleanuphandler.cpp
index b6c62af4b3..8bf0e1fcab 100644
--- a/src/corelib/kernel/qobjectcleanuphandler.cpp
+++ b/src/corelib/kernel/qobjectcleanuphandler.cpp
@@ -94,7 +94,7 @@ QObjectCleanupHandler::~QObjectCleanupHandler()
QObject *QObjectCleanupHandler::add(QObject* object)
{
if (!object)
- return 0;
+ return nullptr;
connect(object, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)));
cleanupObjects.insert(0, object);
diff --git a/src/corelib/kernel/qsharedmemory.cpp b/src/corelib/kernel/qsharedmemory.cpp
index 39f3002394..2d65e0bbe4 100644
--- a/src/corelib/kernel/qsharedmemory.cpp
+++ b/src/corelib/kernel/qsharedmemory.cpp
@@ -441,7 +441,7 @@ bool QSharedMemory::attach(AccessMode mode)
bool QSharedMemory::isAttached() const
{
Q_D(const QSharedMemory);
- return (0 != d->memory);
+ return (nullptr != d->memory);
}
/*!
diff --git a/src/corelib/kernel/qsharedmemory_systemv.cpp b/src/corelib/kernel/qsharedmemory_systemv.cpp
index fea4a65b5c..0ba5f65641 100644
--- a/src/corelib/kernel/qsharedmemory_systemv.cpp
+++ b/src/corelib/kernel/qsharedmemory_systemv.cpp
@@ -182,9 +182,9 @@ bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode)
}
// grab the memory
- memory = shmat(id, 0, (mode == QSharedMemory::ReadOnly ? SHM_RDONLY : 0));
+ memory = shmat(id, nullptr, (mode == QSharedMemory::ReadOnly ? SHM_RDONLY : 0));
if ((void*) - 1 == memory) {
- memory = 0;
+ memory = nullptr;
setErrorString(QLatin1String("QSharedMemory::attach (shmat)"));
return false;
}
@@ -216,7 +216,7 @@ bool QSharedMemoryPrivate::detach()
}
return false;
}
- memory = 0;
+ memory = nullptr;
size = 0;
// Get the number of current attachments
diff --git a/src/corelib/kernel/qsharedmemory_unix.cpp b/src/corelib/kernel/qsharedmemory_unix.cpp
index f6d7e78441..bc0f3b03ca 100644
--- a/src/corelib/kernel/qsharedmemory_unix.cpp
+++ b/src/corelib/kernel/qsharedmemory_unix.cpp
@@ -68,7 +68,7 @@ QSharedMemoryPrivate::QSharedMemoryPrivate() :
#ifndef QT_NO_QOBJECT
QObjectPrivate(),
#endif
- memory(0), size(0), error(QSharedMemory::NoError),
+ memory(nullptr), size(0), error(QSharedMemory::NoError),
#ifndef QT_NO_SYSTEMSEMAPHORE
systemSemaphore(QString()), lockedByMe(false),
#endif
diff --git a/src/corelib/kernel/qsignalmapper.cpp b/src/corelib/kernel/qsignalmapper.cpp
index 24b174972f..dc0dfe8f40 100644
--- a/src/corelib/kernel/qsignalmapper.cpp
+++ b/src/corelib/kernel/qsignalmapper.cpp
@@ -53,11 +53,36 @@ public:
Q_Q(QSignalMapper);
q->removeMappings(q->sender());
}
+
+ template <class Signal, class Container>
+ void emitMappedValue(QObject *sender, Signal signal, const Container &mappedValues)
+ {
+ Q_Q(QSignalMapper);
+
+ auto it = mappedValues.find(sender);
+ if (it != mappedValues.end()) {
+#if QT_DEPRECATED_SINCE(5, 15)
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+ Q_EMIT q->mapped(*it);
+QT_WARNING_POP
+#endif
+ Q_EMIT (q->*signal)(*it);
+ }
+ }
+
+ void emitMappedValues(QObject *sender)
+ {
+ emitMappedValue(sender, &QSignalMapper::mappedInt, intHash);
+ emitMappedValue(sender, &QSignalMapper::mappedString, stringHash);
+ emitMappedValue(sender, &QSignalMapper::mappedWidget, widgetHash);
+ emitMappedValue(sender, &QSignalMapper::mappedObject, objectHash);
+ }
+
QHash<QObject *, int> intHash;
QHash<QObject *, QString> stringHash;
QHash<QObject *, QWidget*> widgetHash;
QHash<QObject *, QObject*> objectHash;
-
};
/*!
@@ -74,11 +99,12 @@ public:
use lambdas for passing custom parameters to slots. This is less
costly and will simplify the code.
- The class supports the mapping of particular strings or integers
- with particular objects using setMapping(). The objects' signals
- can then be connected to the map() slot which will emit the
- mapped() signal with the string or integer associated with the
- original signalling object. Mappings can be removed later using
+ The class supports the mapping of particular strings, integers,
+ objects and widgets with particular objects using setMapping().
+ The objects' signals can then be connected to the map() slot which
+ will emit a signal (it could be mappedInt(), mappedString(),
+ mappedWidget() and mappedObject()) with a value associated with
+ the original signalling object. Mappings can be removed later using
removeMappings().
Example: Suppose we want to create a custom widget that contains
@@ -106,8 +132,8 @@ public:
created. We connect each button's \c clicked() signal to the
signal mapper's map() slot, and create a mapping in the signal
mapper from each button to the button's text. Finally we connect
- the signal mapper's mapped() signal to the custom widget's \c
- clicked() signal. When the user clicks a button, the custom
+ the signal mapper's mappedString() signal to the custom widget's
+ \c clicked() signal. When the user clicks a button, the custom
widget will emit a single \c clicked() signal whose argument is
the text of the button the user clicked.
@@ -137,7 +163,7 @@ QSignalMapper::~QSignalMapper()
/*!
Adds a mapping so that when map() is signalled from the given \a
- sender, the signal mapped(\a id) is emitted.
+ sender, the signal mappedInt(\a id) is emitted.
There may be at most one integer ID for each sender.
@@ -152,7 +178,7 @@ void QSignalMapper::setMapping(QObject *sender, int id)
/*!
Adds a mapping so that when map() is signalled from the \a sender,
- the signal mapped(\a text ) is emitted.
+ the signal mappedString(\a text ) is emitted.
There may be at most one text for each sender.
*/
@@ -165,7 +191,7 @@ void QSignalMapper::setMapping(QObject *sender, const QString &text)
/*!
Adds a mapping so that when map() is signalled from the \a sender,
- the signal mapped(\a widget ) is emitted.
+ the signal mappedWidget(\a widget ) is emitted.
There may be at most one widget for each sender.
*/
@@ -178,7 +204,7 @@ void QSignalMapper::setMapping(QObject *sender, QWidget *widget)
/*!
Adds a mapping so that when map() is signalled from the \a sender,
- the signal mapped(\a object ) is emitted.
+ the signal mappedObject(\a object ) is emitted.
There may be at most one object for each sender.
*/
@@ -259,20 +285,14 @@ void QSignalMapper::map() { map(sender()); }
*/
void QSignalMapper::map(QObject *sender)
{
- Q_D(QSignalMapper);
- if (d->intHash.contains(sender))
- emit mapped(d->intHash.value(sender));
- if (d->stringHash.contains(sender))
- emit mapped(d->stringHash.value(sender));
- if (d->widgetHash.contains(sender))
- emit mapped(d->widgetHash.value(sender));
- if (d->objectHash.contains(sender))
- emit mapped(d->objectHash.value(sender));
+ d_func()->emitMappedValues(sender);
}
-
+#if QT_DEPRECATED_SINCE(5, 15)
/*!
\fn void QSignalMapper::mapped(int i)
+ \obsolete
+ \overload
This signal is emitted when map() is signalled from an object that
has an integer mapping set. The object's mapped integer is passed
@@ -283,6 +303,8 @@ void QSignalMapper::map(QObject *sender)
/*!
\fn void QSignalMapper::mapped(const QString &text)
+ \obsolete
+ \overload
This signal is emitted when map() is signalled from an object that
has a string mapping set. The object's mapped string is passed in
@@ -293,6 +315,8 @@ void QSignalMapper::map(QObject *sender)
/*!
\fn void QSignalMapper::mapped(QWidget *widget)
+ \obsolete
+ \overload
This signal is emitted when map() is signalled from an object that
has a widget mapping set. The object's mapped widget is passed in
@@ -303,6 +327,53 @@ void QSignalMapper::map(QObject *sender)
/*!
\fn void QSignalMapper::mapped(QObject *object)
+ \obsolete
+ \overload
+
+ This signal is emitted when map() is signalled from an object that
+ has an object mapping set. The object provided by the map is passed in
+ \a object.
+
+ \sa setMapping()
+*/
+#endif
+
+/*!
+ \fn void QSignalMapper::mappedInt(int i)
+ \since 5.15
+
+ This signal is emitted when map() is signalled from an object that
+ has an integer mapping set. The object's mapped integer is passed
+ in \a i.
+
+ \sa setMapping()
+*/
+
+/*!
+ \fn void QSignalMapper::mappedString(const QString &text)
+ \since 5.15
+
+ This signal is emitted when map() is signalled from an object that
+ has a string mapping set. The object's mapped string is passed in
+ \a text.
+
+ \sa setMapping()
+*/
+
+/*!
+ \fn void QSignalMapper::mappedWidget(QWidget *widget)
+ \since 5.15
+
+ This signal is emitted when map() is signalled from an object that
+ has a widget mapping set. The object's mapped widget is passed in
+ \a widget.
+
+ \sa setMapping()
+*/
+
+/*!
+ \fn void QSignalMapper::mappedObject(QObject *object)
+ \since 5.15
This signal is emitted when map() is signalled from an object that
has an object mapping set. The object provided by the map is passed in
diff --git a/src/corelib/kernel/qsignalmapper.h b/src/corelib/kernel/qsignalmapper.h
index 0da1e8f87d..592986e6a5 100644
--- a/src/corelib/kernel/qsignalmapper.h
+++ b/src/corelib/kernel/qsignalmapper.h
@@ -66,10 +66,20 @@ public:
QObject *mapping(QObject *object) const;
Q_SIGNALS:
+#if QT_DEPRECATED_SINCE(5, 15)
+ QT_DEPRECATED_VERSION_X_5_15("Use QSignalMapper::mappedInt(int) instead")
void mapped(int);
+ QT_DEPRECATED_VERSION_X_5_15("Use QSignalMapper::mappedString(const QString&) instead")
void mapped(const QString &);
+ QT_DEPRECATED_VERSION_X_5_15("Use QSignalMapper::mappedWidget(QWidget *) instead")
void mapped(QWidget *);
+ QT_DEPRECATED_VERSION_X_5_15("Use QSignalMapper::mappedObject(QObject *) instead")
void mapped(QObject *);
+#endif
+ void mappedInt(int);
+ void mappedString(const QString &);
+ void mappedWidget(QWidget *);
+ void mappedObject(QObject *);
public Q_SLOTS:
void map();
diff --git a/src/corelib/kernel/qsocketnotifier.cpp b/src/corelib/kernel/qsocketnotifier.cpp
index 2a246b1204..78269ee605 100644
--- a/src/corelib/kernel/qsocketnotifier.cpp
+++ b/src/corelib/kernel/qsocketnotifier.cpp
@@ -147,12 +147,14 @@ QSocketNotifier::QSocketNotifier(qintptr socket, Type type, QObject *parent)
d->sntype = type;
d->snenabled = true;
+ auto thisThreadData = d->threadData.loadRelaxed();
+
if (socket < 0)
qWarning("QSocketNotifier: Invalid socket specified");
- else if (!d->threadData->hasEventDispatcher())
+ else if (!thisThreadData->hasEventDispatcher())
qWarning("QSocketNotifier: Can only be used with threads started with QThread");
else
- d->threadData->eventDispatcher.loadRelaxed()->registerSocketNotifier(this);
+ thisThreadData->eventDispatcher.loadRelaxed()->registerSocketNotifier(this);
}
/*!
@@ -234,16 +236,19 @@ void QSocketNotifier::setEnabled(bool enable)
return;
d->snenabled = enable;
- if (!d->threadData->hasEventDispatcher()) // perhaps application/thread is shutting down
+
+ auto thisThreadData = d->threadData.loadRelaxed();
+
+ if (!thisThreadData->hasEventDispatcher()) // perhaps application/thread is shutting down
return;
if (Q_UNLIKELY(thread() != QThread::currentThread())) {
qWarning("QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread");
return;
}
if (d->snenabled)
- d->threadData->eventDispatcher.loadRelaxed()->registerSocketNotifier(this);
+ thisThreadData->eventDispatcher.loadRelaxed()->registerSocketNotifier(this);
else
- d->threadData->eventDispatcher.loadRelaxed()->unregisterSocketNotifier(this);
+ thisThreadData->eventDispatcher.loadRelaxed()->unregisterSocketNotifier(this);
}
diff --git a/src/corelib/kernel/qtestsupport_core.cpp b/src/corelib/kernel/qtestsupport_core.cpp
index 7bd81ed498..8498f7f025 100644
--- a/src/corelib/kernel/qtestsupport_core.cpp
+++ b/src/corelib/kernel/qtestsupport_core.cpp
@@ -55,7 +55,7 @@ Q_CORE_EXPORT void QTestPrivate::qSleep(int ms)
Sleep(uint(ms));
#else
struct timespec ts = { time_t(ms / 1000), (ms % 1000) * 1000 * 1000 };
- nanosleep(&ts, NULL);
+ nanosleep(&ts, nullptr);
#endif
}
diff --git a/src/corelib/kernel/qtimer.cpp b/src/corelib/kernel/qtimer.cpp
index 4d8778ecf5..25ce0c032f 100644
--- a/src/corelib/kernel/qtimer.cpp
+++ b/src/corelib/kernel/qtimer.cpp
@@ -277,7 +277,7 @@ protected:
};
QSingleShotTimer::QSingleShotTimer(int msec, Qt::TimerType timerType, const QObject *r, const char *member)
- : QObject(QAbstractEventDispatcher::instance()), hasValidReceiver(true), slotObj(0)
+ : QObject(QAbstractEventDispatcher::instance()), hasValidReceiver(true), slotObj(nullptr)
{
timerId = startTimer(msec, timerType);
connect(this, SIGNAL(timeout()), r, member);
@@ -290,7 +290,7 @@ QSingleShotTimer::QSingleShotTimer(int msec, Qt::TimerType timerType, const QObj
if (r && thread() != r->thread()) {
// Avoid leaking the QSingleShotTimer instance in case the application exits before the timer fires
connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &QObject::deleteLater);
- setParent(0);
+ setParent(nullptr);
moveToThread(r->thread());
}
}
@@ -316,7 +316,7 @@ void QSingleShotTimer::timerEvent(QTimerEvent *)
if (Q_LIKELY(!receiver.isNull() || !hasValidReceiver)) {
// We allocate only the return type - we previously checked the function had
// no arguments.
- void *args[1] = { 0 };
+ void *args[1] = { nullptr };
slotObj->call(const_cast<QObject*>(receiver.data()), args);
}
} else {
diff --git a/src/corelib/kernel/qtimerinfo_unix.cpp b/src/corelib/kernel/qtimerinfo_unix.cpp
index 39010c19cb..b425ca3dcb 100644
--- a/src/corelib/kernel/qtimerinfo_unix.cpp
+++ b/src/corelib/kernel/qtimerinfo_unix.cpp
@@ -83,7 +83,7 @@ QTimerInfoList::QTimerInfoList()
}
#endif
- firstTimerInfo = 0;
+ firstTimerInfo = nullptr;
}
timespec QTimerInfoList::updateCurrentTime()
@@ -389,7 +389,7 @@ bool QTimerInfoList::timerWait(timespec &tm)
repairTimersIfNeeded();
// Find first waiting timer not already active
- QTimerInfo *t = 0;
+ QTimerInfo *t = nullptr;
for (QTimerInfoList::const_iterator it = constBegin(); it != constEnd(); ++it) {
if (!(*it)->activateRef) {
t = *it;
@@ -450,7 +450,7 @@ void QTimerInfoList::registerTimer(int timerId, int interval, Qt::TimerType time
t->interval = interval;
t->timerType = timerType;
t->obj = object;
- t->activateRef = 0;
+ t->activateRef = nullptr;
timespec expected = updateCurrentTime() + interval;
@@ -514,9 +514,9 @@ bool QTimerInfoList::unregisterTimer(int timerId)
// found it
removeAt(i);
if (t == firstTimerInfo)
- firstTimerInfo = 0;
+ firstTimerInfo = nullptr;
if (t->activateRef)
- *(t->activateRef) = 0;
+ *(t->activateRef) = nullptr;
delete t;
return true;
}
@@ -535,9 +535,9 @@ bool QTimerInfoList::unregisterTimers(QObject *object)
// object found
removeAt(i);
if (t == firstTimerInfo)
- firstTimerInfo = 0;
+ firstTimerInfo = nullptr;
if (t->activateRef)
- *(t->activateRef) = 0;
+ *(t->activateRef) = nullptr;
delete t;
// move back one so that we don't skip the new current item
--i;
@@ -571,7 +571,7 @@ int QTimerInfoList::activateTimers()
return 0; // nothing to do
int n_act = 0, maxCount = 0;
- firstTimerInfo = 0;
+ firstTimerInfo = nullptr;
timespec currentTime = updateCurrentTime();
// qDebug() << "Thread" << QThread::currentThreadId() << "woken up at" << currentTime;
@@ -643,11 +643,11 @@ int QTimerInfoList::activateTimers()
QCoreApplication::sendEvent(currentTimerInfo->obj, &e);
if (currentTimerInfo)
- currentTimerInfo->activateRef = 0;
+ currentTimerInfo->activateRef = nullptr;
}
}
- firstTimerInfo = 0;
+ firstTimerInfo = nullptr;
// qDebug() << "Thread" << QThread::currentThreadId() << "activated" << n_act << "timers";
return n_act;
}
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index ddb96ecad6..93d75feafa 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -289,8 +289,8 @@ public:
#if defined(QT_USE_MMAP)
used_mmap(0),
#endif
- unmapPointer(0), unmapLength(0), resource(0),
- messageArray(0), offsetArray(0), contextArray(0), numerusRulesArray(0),
+ unmapPointer(nullptr), unmapLength(0), resource(nullptr),
+ messageArray(nullptr), offsetArray(nullptr), contextArray(nullptr), numerusRulesArray(nullptr),
messageLength(0), offsetLength(0), contextLength(0), numerusRulesLength(0) {}
#if defined(QT_USE_MMAP)
@@ -539,7 +539,7 @@ bool QTranslatorPrivate::do_load(const QString &realname, const QString &directo
ok = true;
} else {
delete resource;
- resource = 0;
+ resource = nullptr;
}
}
@@ -610,8 +610,8 @@ bool QTranslatorPrivate::do_load(const QString &realname, const QString &directo
delete [] unmapPointer;
delete d->resource;
- d->resource = 0;
- d->unmapPointer = 0;
+ d->resource = nullptr;
+ d->unmapPointer = nullptr;
d->unmapLength = 0;
return false;
@@ -874,10 +874,10 @@ bool QTranslatorPrivate::do_load(const uchar *data, qsizetype len, const QString
}
if (!ok) {
- messageArray = 0;
- contextArray = 0;
- offsetArray = 0;
- numerusRulesArray = 0;
+ messageArray = nullptr;
+ contextArray = nullptr;
+ offsetArray = nullptr;
+ numerusRulesArray = nullptr;
messageLength = 0;
contextLength = 0;
offsetLength = 0;
@@ -890,7 +890,7 @@ bool QTranslatorPrivate::do_load(const uchar *data, qsizetype len, const QString
static QString getMessage(const uchar *m, const uchar *end, const char *context,
const char *sourceText, const char *comment, uint numerus)
{
- const uchar *tn = 0;
+ const uchar *tn = nullptr;
uint tn_length = 0;
const uint sourceTextLen = uint(strlen(sourceText));
const uint contextLen = uint(strlen(context));
@@ -957,11 +957,11 @@ end:
QString QTranslatorPrivate::do_translate(const char *context, const char *sourceText,
const char *comment, int n) const
{
- if (context == 0)
+ if (context == nullptr)
context = "";
- if (sourceText == 0)
+ if (sourceText == nullptr)
sourceText = "";
- if (comment == 0)
+ if (comment == nullptr)
comment = "";
uint numerus = 0;
@@ -1076,13 +1076,13 @@ void QTranslatorPrivate::clear()
}
delete resource;
- resource = 0;
- unmapPointer = 0;
+ resource = nullptr;
+ unmapPointer = nullptr;
unmapLength = 0;
- messageArray = 0;
- contextArray = 0;
- offsetArray = 0;
- numerusRulesArray = 0;
+ messageArray = nullptr;
+ contextArray = nullptr;
+ offsetArray = nullptr;
+ numerusRulesArray = nullptr;
messageLength = 0;
contextLength = 0;
offsetLength = 0;
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp
index a1e1c71d12..3be9a02248 100644
--- a/src/corelib/kernel/qvariant.cpp
+++ b/src/corelib/kernel/qvariant.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Copyright (C) 2018 Intel Corporation.
** Copyright (C) 2015 Olivier Goffart <ogoffart@woboq.com>
** Contact: https://www.qt.io/licensing/
@@ -168,7 +168,7 @@ static qlonglong qMetaTypeNumber(const QVariant::Private *d)
return qlonglong(d->data.l);
case QMetaType::Float:
return qRound64(d->data.f);
- case QVariant::Double:
+ case QMetaType::Double:
return qRound64(d->data.d);
#ifndef QT_BOOTSTRAPPED
case QMetaType::QJsonValue:
@@ -184,9 +184,9 @@ static qlonglong qMetaTypeNumber(const QVariant::Private *d)
static qulonglong qMetaTypeUNumber(const QVariant::Private *d)
{
switch (d->type) {
- case QVariant::UInt:
+ case QMetaType::UInt:
return d->data.u;
- case QVariant::ULongLong:
+ case QMetaType::ULongLong:
return d->data.ull;
case QMetaType::UChar:
return d->data.uc;
@@ -204,13 +204,13 @@ static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok)
*ok = true;
switch (uint(d->type)) {
- case QVariant::String:
+ case QMetaType::QString:
return v_cast<QString>(d)->toLongLong(ok);
- case QVariant::Char:
+ case QMetaType::QChar:
return v_cast<QChar>(d)->unicode();
- case QVariant::ByteArray:
+ case QMetaType::QByteArray:
return v_cast<QByteArray>(d)->toLongLong(ok);
- case QVariant::Bool:
+ case QMetaType::Bool:
return qlonglong(d->data.b);
#ifndef QT_BOOTSTRAPPED
case QMetaType::QCborValue:
@@ -222,8 +222,8 @@ static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok)
break;
Q_FALLTHROUGH();
#endif
- case QVariant::Double:
- case QVariant::Int:
+ case QMetaType::Double:
+ case QMetaType::Int:
case QMetaType::Char:
case QMetaType::SChar:
case QMetaType::Short:
@@ -231,8 +231,8 @@ static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok)
case QMetaType::Float:
case QMetaType::LongLong:
return qMetaTypeNumber(d);
- case QVariant::ULongLong:
- case QVariant::UInt:
+ case QMetaType::ULongLong:
+ case QMetaType::UInt:
case QMetaType::UChar:
case QMetaType::UShort:
case QMetaType::ULong:
@@ -262,12 +262,12 @@ static qreal qConvertToRealNumber(const QVariant::Private *d, bool *ok)
{
*ok = true;
switch (uint(d->type)) {
- case QVariant::Double:
+ case QMetaType::Double:
return qreal(d->data.d);
case QMetaType::Float:
return qreal(d->data.f);
- case QVariant::ULongLong:
- case QVariant::UInt:
+ case QMetaType::ULongLong:
+ case QMetaType::UInt:
case QMetaType::UChar:
case QMetaType::UShort:
case QMetaType::ULong:
@@ -289,13 +289,13 @@ static qulonglong qConvertToUnsignedNumber(const QVariant::Private *d, bool *ok)
*ok = true;
switch (uint(d->type)) {
- case QVariant::String:
+ case QMetaType::QString:
return v_cast<QString>(d)->toULongLong(ok);
- case QVariant::Char:
+ case QMetaType::QChar:
return v_cast<QChar>(d)->unicode();
- case QVariant::ByteArray:
+ case QMetaType::QByteArray:
return v_cast<QByteArray>(d)->toULongLong(ok);
- case QVariant::Bool:
+ case QMetaType::Bool:
return qulonglong(d->data.b);
#ifndef QT_BOOTSTRAPPED
case QMetaType::QCborValue:
@@ -309,8 +309,8 @@ static qulonglong qConvertToUnsignedNumber(const QVariant::Private *d, bool *ok)
break;
Q_FALLTHROUGH();
#endif
- case QVariant::Double:
- case QVariant::Int:
+ case QMetaType::Double:
+ case QMetaType::Int:
case QMetaType::Char:
case QMetaType::SChar:
case QMetaType::Short:
@@ -318,8 +318,8 @@ static qulonglong qConvertToUnsignedNumber(const QVariant::Private *d, bool *ok)
case QMetaType::Float:
case QMetaType::LongLong:
return qulonglong(qMetaTypeNumber(d));
- case QVariant::ULongLong:
- case QVariant::UInt:
+ case QMetaType::ULongLong:
+ case QMetaType::UInt:
case QMetaType::UChar:
case QMetaType::UShort:
case QMetaType::ULong:
@@ -406,9 +406,9 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
switch (uint(t)) {
#ifndef QT_BOOTSTRAPPED
- case QVariant::Url:
+ case QMetaType::QUrl:
switch (d->type) {
- case QVariant::String:
+ case QMetaType::QString:
*static_cast<QUrl *>(result) = QUrl(*v_cast<QString>(d));
break;
case QMetaType::QCborValue:
@@ -423,18 +423,18 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
#endif // QT_BOOTSTRAPPED
#if QT_CONFIG(itemmodel)
- case QVariant::ModelIndex:
+ case QMetaType::QModelIndex:
switch (d->type) {
- case QVariant::PersistentModelIndex:
+ case QMetaType::QPersistentModelIndex:
*static_cast<QModelIndex *>(result) = QModelIndex(*v_cast<QPersistentModelIndex>(d));
break;
default:
return false;
}
break;
- case QVariant::PersistentModelIndex:
+ case QMetaType::QPersistentModelIndex:
switch (d->type) {
- case QVariant::ModelIndex:
+ case QMetaType::QModelIndex:
*static_cast<QPersistentModelIndex *>(result) = QPersistentModelIndex(*v_cast<QModelIndex>(d));
break;
default:
@@ -442,10 +442,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
#endif // QT_CONFIG(itemmodel)
- case QVariant::String: {
+ case QMetaType::QString: {
QString *str = static_cast<QString *>(result);
switch (d->type) {
- case QVariant::Char:
+ case QMetaType::QChar:
*str = *v_cast<QChar>(d);
break;
case QMetaType::Char:
@@ -455,12 +455,12 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
case QMetaType::Short:
case QMetaType::Long:
- case QVariant::Int:
- case QVariant::LongLong:
+ case QMetaType::Int:
+ case QMetaType::LongLong:
*str = QString::number(qMetaTypeNumber(d));
break;
- case QVariant::UInt:
- case QVariant::ULongLong:
+ case QMetaType::UInt:
+ case QMetaType::ULongLong:
case QMetaType::UShort:
case QMetaType::ULong:
*str = QString::number(qMetaTypeUNumber(d));
@@ -468,32 +468,32 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
case QMetaType::Float:
*str = QString::number(d->data.f, 'g', QLocale::FloatingPointShortest);
break;
- case QVariant::Double:
+ case QMetaType::Double:
*str = QString::number(d->data.d, 'g', QLocale::FloatingPointShortest);
break;
#if QT_CONFIG(datestring)
- case QVariant::Date:
+ case QMetaType::QDate:
*str = v_cast<QDate>(d)->toString(Qt::ISODate);
break;
- case QVariant::Time:
+ case QMetaType::QTime:
*str = v_cast<QTime>(d)->toString(Qt::ISODateWithMs);
break;
- case QVariant::DateTime:
+ case QMetaType::QDateTime:
*str = v_cast<QDateTime>(d)->toString(Qt::ISODateWithMs);
break;
#endif
- case QVariant::Bool:
+ case QMetaType::Bool:
*str = d->data.b ? QStringLiteral("true") : QStringLiteral("false");
break;
- case QVariant::ByteArray:
+ case QMetaType::QByteArray:
*str = QString::fromUtf8(v_cast<QByteArray>(d)->constData());
break;
- case QVariant::StringList:
+ case QMetaType::QStringList:
if (v_cast<QStringList>(d)->count() == 1)
*str = v_cast<QStringList>(d)->at(0);
break;
#ifndef QT_BOOTSTRAPPED
- case QVariant::Url:
+ case QMetaType::QUrl:
*str = v_cast<QUrl>(d)->toString();
break;
case QMetaType::QJsonValue:
@@ -508,7 +508,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
*str = v_cast<QCborValue>(d)->toVariant().toString();
break;
#endif
- case QVariant::Uuid:
+ case QMetaType::QUuid:
*str = v_cast<QUuid>(d)->toString();
break;
case QMetaType::Nullptr:
@@ -528,11 +528,11 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
}
- case QVariant::Char: {
+ case QMetaType::QChar: {
QChar *c = static_cast<QChar *>(result);
switch (d->type) {
- case QVariant::Int:
- case QVariant::LongLong:
+ case QMetaType::Int:
+ case QMetaType::LongLong:
case QMetaType::Char:
case QMetaType::SChar:
case QMetaType::Short:
@@ -540,8 +540,8 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
case QMetaType::Float:
*c = QChar(ushort(qMetaTypeNumber(d)));
break;
- case QVariant::UInt:
- case QVariant::ULongLong:
+ case QMetaType::UInt:
+ case QMetaType::ULongLong:
case QMetaType::UChar:
case QMetaType::UShort:
case QMetaType::ULong:
@@ -553,10 +553,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
}
#ifndef QT_NO_GEOM_VARIANT
- case QVariant::Size: {
+ case QMetaType::QSize: {
QSize *s = static_cast<QSize *>(result);
switch (d->type) {
- case QVariant::SizeF:
+ case QMetaType::QSizeF:
*s = v_cast<QSizeF>(d)->toSize();
break;
default:
@@ -565,10 +565,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
}
- case QVariant::SizeF: {
+ case QMetaType::QSizeF: {
QSizeF *s = static_cast<QSizeF *>(result);
switch (d->type) {
- case QVariant::Size:
+ case QMetaType::QSize:
*s = QSizeF(*(v_cast<QSize>(d)));
break;
default:
@@ -577,10 +577,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
}
- case QVariant::Line: {
+ case QMetaType::QLine: {
QLine *s = static_cast<QLine *>(result);
switch (d->type) {
- case QVariant::LineF:
+ case QMetaType::QLineF:
*s = v_cast<QLineF>(d)->toLine();
break;
default:
@@ -589,10 +589,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
}
- case QVariant::LineF: {
+ case QMetaType::QLineF: {
QLineF *s = static_cast<QLineF *>(result);
switch (d->type) {
- case QVariant::Line:
+ case QMetaType::QLine:
*s = QLineF(*(v_cast<QLine>(d)));
break;
default:
@@ -601,27 +601,27 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
}
#endif
- case QVariant::StringList:
- if (d->type == QVariant::List) {
+ case QMetaType::QStringList:
+ if (d->type == QMetaType::QVariantList) {
QStringList *slst = static_cast<QStringList *>(result);
const QVariantList *list = v_cast<QVariantList >(d);
const int size = list->size();
slst->reserve(size);
for (int i = 0; i < size; ++i)
slst->append(list->at(i).toString());
- } else if (d->type == QVariant::String) {
+ } else if (d->type == QMetaType::QString) {
QStringList *slst = static_cast<QStringList *>(result);
*slst = QStringList(*v_cast<QString>(d));
} else {
return false;
}
break;
- case QVariant::Date: {
+ case QMetaType::QDate: {
QDate *dt = static_cast<QDate *>(result);
- if (d->type == QVariant::DateTime)
+ if (d->type == QMetaType::QDateTime)
*dt = v_cast<QDateTime>(d)->date();
#if QT_CONFIG(datestring)
- else if (d->type == QVariant::String)
+ else if (d->type == QMetaType::QString)
*dt = QDate::fromString(*v_cast<QString>(d), Qt::ISODate);
#endif
else
@@ -629,14 +629,14 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
return dt->isValid();
}
- case QVariant::Time: {
+ case QMetaType::QTime: {
QTime *t = static_cast<QTime *>(result);
switch (d->type) {
- case QVariant::DateTime:
+ case QMetaType::QDateTime:
*t = v_cast<QDateTime>(d)->time();
break;
#if QT_CONFIG(datestring)
- case QVariant::String:
+ case QMetaType::QString:
*t = QTime::fromString(*v_cast<QString>(d), Qt::ISODate);
break;
#endif
@@ -645,11 +645,11 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
return t->isValid();
}
- case QVariant::DateTime: {
+ case QMetaType::QDateTime: {
QDateTime *dt = static_cast<QDateTime *>(result);
switch (d->type) {
#if QT_CONFIG(datestring)
- case QVariant::String:
+ case QMetaType::QString:
*dt = QDateTime::fromString(*v_cast<QString>(d), Qt::ISODate);
break;
# ifndef QT_BOOTSTRAPPED
@@ -661,21 +661,21 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
# endif
#endif
- case QVariant::Date:
- *dt = QDateTime(*v_cast<QDate>(d));
+ case QMetaType::QDate:
+ *dt = v_cast<QDate>(d)->startOfDay();
break;
default:
return false;
}
return dt->isValid();
}
- case QVariant::ByteArray: {
+ case QMetaType::QByteArray: {
QByteArray *ba = static_cast<QByteArray *>(result);
switch (d->type) {
- case QVariant::String:
+ case QMetaType::QString:
*ba = v_cast<QString>(d)->toUtf8();
break;
- case QVariant::Double:
+ case QMetaType::Double:
*ba = QByteArray::number(d->data.d, 'g', QLocale::FloatingPointShortest);
break;
case QMetaType::Float:
@@ -686,22 +686,22 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
case QMetaType::UChar:
*ba = QByteArray(1, d->data.c);
break;
- case QVariant::Int:
- case QVariant::LongLong:
+ case QMetaType::Int:
+ case QMetaType::LongLong:
case QMetaType::Short:
case QMetaType::Long:
*ba = QByteArray::number(qMetaTypeNumber(d));
break;
- case QVariant::UInt:
- case QVariant::ULongLong:
+ case QMetaType::UInt:
+ case QMetaType::ULongLong:
case QMetaType::UShort:
case QMetaType::ULong:
*ba = QByteArray::number(qMetaTypeUNumber(d));
break;
- case QVariant::Bool:
+ case QMetaType::Bool:
*ba = QByteArray(d->data.b ? "true" : "false");
break;
- case QVariant::Uuid:
+ case QMetaType::QUuid:
*ba = v_cast<QUuid>(d)->toByteArray();
break;
case QMetaType::Nullptr:
@@ -741,16 +741,16 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
case QMetaType::ULong:
*static_cast<ulong *>(result) = ulong(qConvertToUnsignedNumber(d, ok));
return *ok;
- case QVariant::Int:
+ case QMetaType::Int:
*static_cast<int *>(result) = int(qConvertToNumber(d, ok));
return *ok;
- case QVariant::UInt:
+ case QMetaType::UInt:
*static_cast<uint *>(result) = uint(qConvertToUnsignedNumber(d, ok));
return *ok;
- case QVariant::LongLong:
+ case QMetaType::LongLong:
*static_cast<qlonglong *>(result) = qConvertToNumber(d, ok);
return *ok;
- case QVariant::ULongLong: {
+ case QMetaType::ULongLong: {
*static_cast<qulonglong *>(result) = qConvertToUnsignedNumber(d, ok);
return *ok;
}
@@ -763,21 +763,21 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
*static_cast<uchar *>(result) = qConvertToUnsignedNumber(d, ok);
return *ok;
}
- case QVariant::Bool: {
+ case QMetaType::Bool: {
bool *b = static_cast<bool *>(result);
switch(d->type) {
- case QVariant::ByteArray:
+ case QMetaType::QByteArray:
*b = qt_convertToBool<QByteArray, const char*>(d);
break;
- case QVariant::String:
+ case QMetaType::QString:
*b = qt_convertToBool<QString, QLatin1String>(d);
break;
- case QVariant::Char:
+ case QMetaType::QChar:
*b = !v_cast<QChar>(d)->isNull();
break;
- case QVariant::Double:
- case QVariant::Int:
- case QVariant::LongLong:
+ case QMetaType::Double:
+ case QMetaType::Int:
+ case QMetaType::LongLong:
case QMetaType::Char:
case QMetaType::SChar:
case QMetaType::Short:
@@ -785,8 +785,8 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
case QMetaType::Float:
*b = qMetaTypeNumber(d) != Q_INT64_C(0);
break;
- case QVariant::UInt:
- case QVariant::ULongLong:
+ case QMetaType::UInt:
+ case QMetaType::ULongLong:
case QMetaType::UChar:
case QMetaType::UShort:
case QMetaType::ULong:
@@ -810,31 +810,31 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
}
- case QVariant::Double: {
+ case QMetaType::Double: {
double *f = static_cast<double *>(result);
switch (d->type) {
- case QVariant::String:
+ case QMetaType::QString:
*f = v_cast<QString>(d)->toDouble(ok);
break;
- case QVariant::ByteArray:
+ case QMetaType::QByteArray:
*f = v_cast<QByteArray>(d)->toDouble(ok);
break;
- case QVariant::Bool:
+ case QMetaType::Bool:
*f = double(d->data.b);
break;
case QMetaType::Float:
*f = double(d->data.f);
break;
- case QVariant::LongLong:
- case QVariant::Int:
+ case QMetaType::LongLong:
+ case QMetaType::Int:
case QMetaType::Char:
case QMetaType::SChar:
case QMetaType::Short:
case QMetaType::Long:
*f = double(qMetaTypeNumber(d));
break;
- case QVariant::UInt:
- case QVariant::ULongLong:
+ case QMetaType::UInt:
+ case QMetaType::ULongLong:
case QMetaType::UChar:
case QMetaType::UShort:
case QMetaType::ULong:
@@ -861,28 +861,28 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
case QMetaType::Float: {
float *f = static_cast<float *>(result);
switch (d->type) {
- case QVariant::String:
+ case QMetaType::QString:
*f = v_cast<QString>(d)->toFloat(ok);
break;
- case QVariant::ByteArray:
+ case QMetaType::QByteArray:
*f = v_cast<QByteArray>(d)->toFloat(ok);
break;
- case QVariant::Bool:
+ case QMetaType::Bool:
*f = float(d->data.b);
break;
- case QVariant::Double:
+ case QMetaType::Double:
*f = float(d->data.d);
break;
- case QVariant::LongLong:
- case QVariant::Int:
+ case QMetaType::LongLong:
+ case QMetaType::Int:
case QMetaType::Char:
case QMetaType::SChar:
case QMetaType::Short:
case QMetaType::Long:
*f = float(qMetaTypeNumber(d));
break;
- case QVariant::UInt:
- case QVariant::ULongLong:
+ case QMetaType::UInt:
+ case QMetaType::ULongLong:
case QMetaType::UChar:
case QMetaType::UShort:
case QMetaType::ULong:
@@ -906,8 +906,8 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
}
- case QVariant::List:
- if (d->type == QVariant::StringList) {
+ case QMetaType::QVariantList:
+ if (d->type == QMetaType::QStringList) {
QVariantList *lst = static_cast<QVariantList *>(result);
const QStringList *slist = v_cast<QStringList>(d);
const int size = slist->size();
@@ -935,16 +935,16 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
return false;
}
break;
- case QVariant::Map:
+ case QMetaType::QVariantMap:
if (qstrcmp(QMetaType::typeName(d->type), "QMap<QString, QVariant>") == 0) {
*static_cast<QVariantMap *>(result) =
*static_cast<QMap<QString, QVariant> *>(d->data.shared->ptr);
- } else if (d->type == QVariant::Hash) {
+ } else if (d->type == QMetaType::QVariantHash) {
QVariantMap *map = static_cast<QVariantMap *>(result);
const QVariantHash *hash = v_cast<QVariantHash>(d);
const auto end = hash->end();
for (auto it = hash->begin(); it != end; ++it)
- map->insertMulti(it.key(), it.value());
+ static_cast<QMultiMap<QString, QVariant> *>(map)->insert(it.key(), it.value());
#ifndef QT_BOOTSTRAPPED
} else if (d->type == QMetaType::QCborValue) {
if (!v_cast<QCborValue>(d)->isMap())
@@ -963,16 +963,16 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
return false;
}
break;
- case QVariant::Hash:
+ case QMetaType::QVariantHash:
if (qstrcmp(QMetaType::typeName(d->type), "QHash<QString, QVariant>") == 0) {
*static_cast<QVariantHash *>(result) =
*static_cast<QHash<QString, QVariant> *>(d->data.shared->ptr);
- } else if (d->type == QVariant::Map) {
+ } else if (d->type == QMetaType::QVariantMap) {
QVariantHash *hash = static_cast<QVariantHash *>(result);
const QVariantMap *map = v_cast<QVariantMap>(d);
const auto end = map->end();
for (auto it = map->begin(); it != end; ++it)
- hash->insertMulti(it.key(), it.value());
+ static_cast<QMultiHash<QString, QVariant> *>(hash)->insert(it.key(), it.value());
#ifndef QT_BOOTSTRAPPED
} else if (d->type == QMetaType::QCborValue) {
if (!v_cast<QCborValue>(d)->isMap())
@@ -992,26 +992,26 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
}
break;
#ifndef QT_NO_GEOM_VARIANT
- case QVariant::Rect:
- if (d->type == QVariant::RectF)
+ case QMetaType::QRect:
+ if (d->type == QMetaType::QRectF)
*static_cast<QRect *>(result) = (v_cast<QRectF>(d))->toRect();
else
return false;
break;
- case QVariant::RectF:
- if (d->type == QVariant::Rect)
+ case QMetaType::QRectF:
+ if (d->type == QMetaType::QRect)
*static_cast<QRectF *>(result) = *v_cast<QRect>(d);
else
return false;
break;
- case QVariant::PointF:
- if (d->type == QVariant::Point)
+ case QMetaType::QPointF:
+ if (d->type == QMetaType::QPoint)
*static_cast<QPointF *>(result) = *v_cast<QPoint>(d);
else
return false;
break;
- case QVariant::Point:
- if (d->type == QVariant::PointF)
+ case QMetaType::QPoint:
+ if (d->type == QMetaType::QPointF)
*static_cast<QPoint *>(result) = (v_cast<QPointF>(d))->toPoint();
else
return false;
@@ -1022,12 +1022,12 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
return *ok;
}
#endif
- case QVariant::Uuid:
+ case QMetaType::QUuid:
switch (d->type) {
- case QVariant::String:
+ case QMetaType::QString:
*static_cast<QUuid *>(result) = QUuid(*v_cast<QString>(d));
break;
- case QVariant::ByteArray:
+ case QMetaType::QByteArray:
*static_cast<QUuid *>(result) = QUuid(*v_cast<QByteArray>(d));
break;
#ifndef QT_BOOTSTRAPPED
@@ -1067,7 +1067,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
case QMetaType::Nullptr:
*static_cast<QJsonValue *>(result) = QJsonValue(QJsonValue::Null);
break;
- case QVariant::Bool:
+ case QMetaType::Bool:
*static_cast<QJsonValue *>(result) = QJsonValue(d->data.b);
break;
case QMetaType::Int:
@@ -1086,19 +1086,19 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
*static_cast<QJsonValue *>(result) = QJsonValue(qConvertToRealNumber(d, ok));
Q_ASSERT(ok);
break;
- case QVariant::String:
+ case QMetaType::QString:
*static_cast<QJsonValue *>(result) = QJsonValue(*v_cast<QString>(d));
break;
- case QVariant::StringList:
+ case QMetaType::QStringList:
*static_cast<QJsonValue *>(result) = QJsonValue(QJsonArray::fromStringList(*v_cast<QStringList>(d)));
break;
- case QVariant::List:
+ case QMetaType::QVariantList:
*static_cast<QJsonValue *>(result) = QJsonValue(QJsonArray::fromVariantList(*v_cast<QVariantList>(d)));
break;
- case QVariant::Map:
+ case QMetaType::QVariantMap:
*static_cast<QJsonValue *>(result) = QJsonValue(QJsonObject::fromVariantMap(*v_cast<QVariantMap>(d)));
break;
- case QVariant::Hash:
+ case QMetaType::QVariantHash:
*static_cast<QJsonValue *>(result) = QJsonValue(QJsonObject::fromVariantHash(*v_cast<QVariantHash>(d)));
break;
case QMetaType::QJsonObject:
@@ -1128,10 +1128,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
case QMetaType::QJsonArray:
switch (d->type) {
- case QVariant::StringList:
+ case QMetaType::QStringList:
*static_cast<QJsonArray *>(result) = QJsonArray::fromStringList(*v_cast<QStringList>(d));
break;
- case QVariant::List:
+ case QMetaType::QVariantList:
*static_cast<QJsonArray *>(result) = QJsonArray::fromVariantList(*v_cast<QVariantList>(d));
break;
case QMetaType::QJsonValue:
@@ -1158,10 +1158,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
case QMetaType::QJsonObject:
switch (d->type) {
- case QVariant::Map:
+ case QMetaType::QVariantMap:
*static_cast<QJsonObject *>(result) = QJsonObject::fromVariantMap(*v_cast<QVariantMap>(d));
break;
- case QVariant::Hash:
+ case QMetaType::QVariantHash:
*static_cast<QJsonObject *>(result) = QJsonObject::fromVariantHash(*v_cast<QVariantHash>(d));
break;
case QMetaType::QJsonValue:
@@ -1197,7 +1197,7 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
case QMetaType::Nullptr:
*static_cast<QCborValue *>(result) = QCborValue(QCborValue::Null);
break;
- case QVariant::Bool:
+ case QMetaType::Bool:
*static_cast<QCborValue *>(result) = QCborValue(d->data.b);
break;
case QMetaType::Int:
@@ -1219,39 +1219,39 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
*static_cast<QCborValue *>(result) = QCborValue(qConvertToRealNumber(d, ok));
Q_ASSERT(ok);
break;
- case QVariant::String:
+ case QMetaType::QString:
*static_cast<QCborValue *>(result) = *v_cast<QString>(d);
break;
- case QVariant::StringList:
+ case QMetaType::QStringList:
*static_cast<QCborValue *>(result) = QCborArray::fromStringList(*v_cast<QStringList>(d));
break;
- case QVariant::ByteArray:
+ case QMetaType::QByteArray:
*static_cast<QCborValue *>(result) = *v_cast<QByteArray>(d);
break;
- case QVariant::Date:
- *static_cast<QCborValue *>(result) = QCborValue(QDateTime(*v_cast<QDate>(d)));
+ case QMetaType::QDate:
+ *static_cast<QCborValue *>(result) = QCborValue(v_cast<QDate>(d)->startOfDay());
break;
- case QVariant::DateTime:
+ case QMetaType::QDateTime:
*static_cast<QCborValue *>(result) = QCborValue(*v_cast<QDateTime>(d));
break;
- case QVariant::Url:
+ case QMetaType::QUrl:
*static_cast<QCborValue *>(result) = QCborValue(*v_cast<QUrl>(d));
break;
#if QT_CONFIG(regularexpression)
- case QVariant::RegularExpression:
+ case QMetaType::QRegularExpression:
*static_cast<QCborValue *>(result) = QCborValue(*v_cast<QRegularExpression>(d));
break;
#endif
- case QVariant::Uuid:
+ case QMetaType::QUuid:
*static_cast<QCborValue *>(result) = QCborValue(*v_cast<QUuid>(d));
break;
- case QVariant::List:
+ case QMetaType::QVariantList:
*static_cast<QCborValue *>(result) = QCborArray::fromVariantList(*v_cast<QVariantList>(d));
break;
- case QVariant::Map:
+ case QMetaType::QVariantMap:
*static_cast<QCborValue *>(result) = QCborMap::fromVariantMap(*v_cast<QVariantMap>(d));
break;
- case QVariant::Hash:
+ case QMetaType::QVariantHash:
*static_cast<QCborValue *>(result) = QCborMap::fromVariantHash(*v_cast<QVariantHash>(d));
break;
case QMetaType::QJsonValue:
@@ -1287,10 +1287,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
case QMetaType::QCborArray:
switch (d->type) {
- case QVariant::StringList:
+ case QMetaType::QStringList:
*static_cast<QCborArray *>(result) = QCborArray::fromStringList(*v_cast<QStringList>(d));
break;
- case QVariant::List:
+ case QMetaType::QVariantList:
*static_cast<QCborArray *>(result) = QCborArray::fromVariantList(*v_cast<QVariantList>(d));
break;
case QMetaType::QCborValue:
@@ -1317,10 +1317,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
break;
case QMetaType::QCborMap:
switch (d->type) {
- case QVariant::Map:
+ case QMetaType::QVariantMap:
*static_cast<QCborMap *>(result) = QCborMap::fromVariantMap(*v_cast<QVariantMap>(d));
break;
- case QVariant::Hash:
+ case QMetaType::QVariantHash:
*static_cast<QCborMap *>(result) = QCborMap::fromVariantHash(*v_cast<QVariantHash>(d));
break;
case QMetaType::QCborValue:
@@ -1349,10 +1349,10 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok)
default:
#ifndef QT_NO_QOBJECT
- if (d->type == QVariant::String || d->type == QVariant::ByteArray) {
+ if (d->type == QMetaType::QString || d->type == QMetaType::QByteArray) {
QMetaEnum en = metaEnumFromType(t);
if (en.isValid()) {
- QByteArray keys = (d->type == QVariant::String) ? v_cast<QString>(d)->toUtf8() : *v_cast<QByteArray>(d);
+ QByteArray keys = (d->type == QMetaType::QString) ? v_cast<QString>(d)->toUtf8() : *v_cast<QByteArray>(d);
int value = en.keysToValue(keys.constData(), ok);
if (*ok) {
switch (QMetaType::sizeOf(t)) {
@@ -1457,7 +1457,7 @@ static void customConstruct(QVariant::Private *d, const void *copy)
const uint size = type.sizeOf();
if (!size) {
qWarning("Trying to construct an instance of an invalid type, type id: %i", d->type);
- d->type = QVariant::Invalid;
+ d->type = QMetaType::UnknownType;
return;
}
@@ -1544,7 +1544,7 @@ static void customStreamDebug(QDebug dbg, const QVariant &variant) {
#ifndef QT_BOOTSTRAPPED
QMetaType::TypeFlags flags = QMetaType::typeFlags(variant.userType());
if (flags & QMetaType::PointerToQObject)
- dbg.nospace() << variant.value<QObject*>();
+ dbg.nospace() << qvariant_cast<QObject*>(variant);
#else
Q_UNUSED(dbg);
Q_UNUSED(variant);
@@ -2254,10 +2254,10 @@ QVariant::QVariant(const QRegularExpression &re)
: d(RegularExpression)
{ v_construct<QRegularExpression>(&d, re); }
#endif // QT_CONFIG(regularexpression)
-#ifndef QT_BOOTSTRAPPED
QVariant::QVariant(const QUuid &uuid)
: d(Uuid)
{ v_construct<QUuid>(&d, uuid); }
+#ifndef QT_BOOTSTRAPPED
QVariant::QVariant(const QJsonValue &jsonValue)
: d(QMetaType::QJsonValue)
{ v_construct<QJsonValue>(&d, jsonValue); }
@@ -2438,43 +2438,43 @@ QVariant::Type QVariant::nameToType(const char *name)
enum { MapFromThreeCount = 36 };
static const ushort mapIdFromQt3ToCurrent[MapFromThreeCount] =
{
- QVariant::Invalid,
- QVariant::Map,
- QVariant::List,
- QVariant::String,
- QVariant::StringList,
- QVariant::Font,
- QVariant::Pixmap,
- QVariant::Brush,
- QVariant::Rect,
- QVariant::Size,
- QVariant::Color,
- QVariant::Palette,
+ QMetaType::UnknownType,
+ QMetaType::QVariantMap,
+ QMetaType::QVariantList,
+ QMetaType::QString,
+ QMetaType::QStringList,
+ QMetaType::QFont,
+ QMetaType::QPixmap,
+ QMetaType::QBrush,
+ QMetaType::QRect,
+ QMetaType::QSize,
+ QMetaType::QColor,
+ QMetaType::QPalette,
0, // ColorGroup
- QVariant::Icon,
- QVariant::Point,
- QVariant::Image,
- QVariant::Int,
- QVariant::UInt,
- QVariant::Bool,
- QVariant::Double,
+ QMetaType::QIcon,
+ QMetaType::QPoint,
+ QMetaType::QImage,
+ QMetaType::Int,
+ QMetaType::UInt,
+ QMetaType::Bool,
+ QMetaType::Double,
0, // Buggy ByteArray, QByteArray never had id == 20
- QVariant::Polygon,
- QVariant::Region,
- QVariant::Bitmap,
- QVariant::Cursor,
- QVariant::SizePolicy,
- QVariant::Date,
- QVariant::Time,
- QVariant::DateTime,
- QVariant::ByteArray,
- QVariant::BitArray,
- QVariant::KeySequence,
- QVariant::Pen,
- QVariant::LongLong,
- QVariant::ULongLong,
+ QMetaType::QPolygon,
+ QMetaType::QRegion,
+ QMetaType::QBitmap,
+ QMetaType::QCursor,
+ QMetaType::QSizePolicy,
+ QMetaType::QDate,
+ QMetaType::QTime,
+ QMetaType::QDateTime,
+ QMetaType::QByteArray,
+ QMetaType::QBitArray,
+ QMetaType::QKeySequence,
+ QMetaType::QPen,
+ QMetaType::LongLong,
+ QMetaType::ULongLong,
#if QT_CONFIG(easingcurve)
- QVariant::EasingCurve
+ QMetaType::QEasingCurve
#endif
};
@@ -2523,7 +2523,7 @@ void QVariant::load(QDataStream &s)
return;
}
}
- create(typeId, 0);
+ create(typeId, nullptr);
d.is_null = is_null;
if (!isValid()) {
@@ -2551,7 +2551,7 @@ void QVariant::load(QDataStream &s)
*/
void QVariant::save(QDataStream &s) const
{
- quint32 typeId = type();
+ quint32 typeId = d.type >= QMetaType::User ? QMetaType::User : userType();
bool fakeUserType = false;
if (s.version() < QDataStream::Qt_4_0) {
int i;
@@ -3011,7 +3011,6 @@ QPersistentModelIndex QVariant::toPersistentModelIndex() const
}
#endif // QT_CONFIG(itemmodel)
-#ifndef QT_BOOTSTRAPPED
/*!
\since 5.0
@@ -3026,6 +3025,7 @@ QUuid QVariant::toUuid() const
return qVariantToHelper<QUuid>(d, handlerManager);
}
+#ifndef QT_BOOTSTRAPPED
/*!
\since 5.0
@@ -3294,80 +3294,80 @@ QVariantList QVariant::toList() const
}
-static const quint32 qCanConvertMatrix[QVariant::LastCoreType + 1] =
+static const quint32 qCanConvertMatrix[QMetaType::LastCoreType + 1] =
{
/*Invalid*/ 0,
-/*Bool*/ 1 << QVariant::Double | 1 << QVariant::Int | 1 << QVariant::UInt
- | 1 << QVariant::LongLong | 1 << QVariant::ULongLong | 1 << QVariant::ByteArray
- | 1 << QVariant::String | 1 << QVariant::Char,
+/*Bool*/ 1 << QMetaType::Double | 1 << QMetaType::Int | 1 << QMetaType::UInt
+ | 1 << QMetaType::LongLong | 1 << QMetaType::ULongLong | 1 << QMetaType::QByteArray
+ | 1 << QMetaType::QString | 1 << QMetaType::QChar,
-/*Int*/ 1 << QVariant::UInt | 1 << QVariant::String | 1 << QVariant::Double
- | 1 << QVariant::Bool | 1 << QVariant::LongLong | 1 << QVariant::ULongLong
- | 1 << QVariant::Char | 1 << QVariant::ByteArray | 1 << QVariant::Int,
+/*Int*/ 1 << QMetaType::UInt | 1 << QMetaType::QString | 1 << QMetaType::Double
+ | 1 << QMetaType::Bool | 1 << QMetaType::LongLong | 1 << QMetaType::ULongLong
+ | 1 << QMetaType::QChar | 1 << QMetaType::QByteArray | 1 << QMetaType::Int,
-/*UInt*/ 1 << QVariant::Int | 1 << QVariant::String | 1 << QVariant::Double
- | 1 << QVariant::Bool | 1 << QVariant::LongLong | 1 << QVariant::ULongLong
- | 1 << QVariant::Char | 1 << QVariant::ByteArray,
+/*UInt*/ 1 << QMetaType::Int | 1 << QMetaType::QString | 1 << QMetaType::Double
+ | 1 << QMetaType::Bool | 1 << QMetaType::LongLong | 1 << QMetaType::ULongLong
+ | 1 << QMetaType::QChar | 1 << QMetaType::QByteArray,
-/*LLong*/ 1 << QVariant::Int | 1 << QVariant::String | 1 << QVariant::Double
- | 1 << QVariant::Bool | 1 << QVariant::UInt | 1 << QVariant::ULongLong
- | 1 << QVariant::Char | 1 << QVariant::ByteArray,
+/*LLong*/ 1 << QMetaType::Int | 1 << QMetaType::QString | 1 << QMetaType::Double
+ | 1 << QMetaType::Bool | 1 << QMetaType::UInt | 1 << QMetaType::ULongLong
+ | 1 << QMetaType::QChar | 1 << QMetaType::QByteArray,
-/*ULlong*/ 1 << QVariant::Int | 1 << QVariant::String | 1 << QVariant::Double
- | 1 << QVariant::Bool | 1 << QVariant::UInt | 1 << QVariant::LongLong
- | 1 << QVariant::Char | 1 << QVariant::ByteArray,
+/*ULlong*/ 1 << QMetaType::Int | 1 << QMetaType::QString | 1 << QMetaType::Double
+ | 1 << QMetaType::Bool | 1 << QMetaType::UInt | 1 << QMetaType::LongLong
+ | 1 << QMetaType::QChar | 1 << QMetaType::QByteArray,
-/*double*/ 1 << QVariant::Int | 1 << QVariant::String | 1 << QVariant::ULongLong
- | 1 << QVariant::Bool | 1 << QVariant::UInt | 1 << QVariant::LongLong
- | 1 << QVariant::ByteArray,
+/*double*/ 1 << QMetaType::Int | 1 << QMetaType::QString | 1 << QMetaType::ULongLong
+ | 1 << QMetaType::Bool | 1 << QMetaType::UInt | 1 << QMetaType::LongLong
+ | 1 << QMetaType::QByteArray,
-/*QChar*/ 1 << QVariant::Int | 1 << QVariant::UInt | 1 << QVariant::LongLong
- | 1 << QVariant::ULongLong,
+/*QChar*/ 1 << QMetaType::Int | 1 << QMetaType::UInt | 1 << QMetaType::LongLong
+ | 1 << QMetaType::ULongLong,
/*QMap*/ 0,
-/*QList*/ 1 << QVariant::StringList,
+/*QList*/ 1 << QMetaType::QStringList,
-/*QString*/ 1 << QVariant::StringList | 1 << QVariant::ByteArray | 1 << QVariant::Int
- | 1 << QVariant::UInt | 1 << QVariant::Bool | 1 << QVariant::Double
- | 1 << QVariant::Date | 1 << QVariant::Time | 1 << QVariant::DateTime
- | 1 << QVariant::LongLong | 1 << QVariant::ULongLong | 1 << QVariant::Char
- | 1 << QVariant::Url | 1 << QVariant::Uuid,
+/*QString*/ 1 << QMetaType::QStringList | 1 << QMetaType::QByteArray | 1 << QMetaType::Int
+ | 1 << QMetaType::UInt | 1 << QMetaType::Bool | 1 << QMetaType::Double
+ | 1 << QMetaType::QDate | 1 << QMetaType::QTime | 1 << QMetaType::QDateTime
+ | 1 << QMetaType::LongLong | 1 << QMetaType::ULongLong | 1 << QMetaType::QChar
+ | 1 << QMetaType::QUrl | 1 << QMetaType::QUuid,
-/*QStringList*/ 1 << QVariant::List | 1 << QVariant::String,
+/*QStringList*/ 1 << QMetaType::QVariantList | 1 << QMetaType::QString,
-/*QByteArray*/ 1 << QVariant::String | 1 << QVariant::Int | 1 << QVariant::UInt | 1 << QVariant::Bool
- | 1 << QVariant::Double | 1 << QVariant::LongLong | 1 << QVariant::ULongLong
- | 1 << QVariant::Uuid,
+/*QByteArray*/ 1 << QMetaType::QString | 1 << QMetaType::Int | 1 << QMetaType::UInt | 1 << QMetaType::Bool
+ | 1 << QMetaType::Double | 1 << QMetaType::LongLong | 1 << QMetaType::ULongLong
+ | 1 << QMetaType::QUuid,
/*QBitArray*/ 0,
-/*QDate*/ 1 << QVariant::String | 1 << QVariant::DateTime,
+/*QDate*/ 1 << QMetaType::QString | 1 << QMetaType::QDateTime,
-/*QTime*/ 1 << QVariant::String | 1 << QVariant::DateTime,
+/*QTime*/ 1 << QMetaType::QString | 1 << QMetaType::QDateTime,
-/*QDateTime*/ 1 << QVariant::String | 1 << QVariant::Date,
+/*QDateTime*/ 1 << QMetaType::QString | 1 << QMetaType::QDate,
-/*QUrl*/ 1 << QVariant::String,
+/*QUrl*/ 1 << QMetaType::QString,
/*QLocale*/ 0,
-/*QRect*/ 1 << QVariant::RectF,
+/*QRect*/ 1 << QMetaType::QRectF,
-/*QRectF*/ 1 << QVariant::Rect,
+/*QRectF*/ 1 << QMetaType::QRect,
-/*QSize*/ 1 << QVariant::SizeF,
+/*QSize*/ 1 << QMetaType::QSizeF,
-/*QSizeF*/ 1 << QVariant::Size,
+/*QSizeF*/ 1 << QMetaType::QSize,
-/*QLine*/ 1 << QVariant::LineF,
+/*QLine*/ 1 << QMetaType::QLineF,
-/*QLineF*/ 1 << QVariant::Line,
+/*QLineF*/ 1 << QMetaType::QLine,
-/*QPoint*/ 1 << QVariant::PointF,
+/*QPoint*/ 1 << QMetaType::QPointF,
-/*QPointF*/ 1 << QVariant::Point,
+/*QPointF*/ 1 << QMetaType::QPoint,
/*QRegExp*/ 0,
@@ -3375,7 +3375,7 @@ static const quint32 qCanConvertMatrix[QVariant::LastCoreType + 1] =
/*QEasingCurve*/ 0,
-/*QUuid*/ 1 << QVariant::String | 1 << QVariant::ByteArray,
+/*QUuid*/ 1 << QMetaType::QString | 1 << QMetaType::QByteArray,
};
static const size_t qCanConvertMatrixMaximumTargetType = 8 * sizeof(*qCanConvertMatrix);
@@ -3829,6 +3829,7 @@ bool QVariant::convert(const int type, void *ptr) const
/*!
\fn bool QVariant::operator<(const QVariant &v) const
+ \obsolete
Compares this QVariant with \a v and returns \c true if this is less than \a v.
@@ -3838,10 +3839,15 @@ bool QVariant::convert(const int type, void *ptr) const
\warning To make this function work with a custom type registered with
qRegisterMetaType(), its comparison operator must be registered using
QMetaType::registerComparators().
+
+ This operator is deprecated as it cannot establish a total order required
+ for most use of this operator, which is the reason you cannot use QVariant
+ as the key of a QMap.
*/
/*!
\fn bool QVariant::operator<=(const QVariant &v) const
+ \obsolete
Compares this QVariant with \a v and returns \c true if this is less or equal than \a v.
@@ -3851,10 +3857,13 @@ bool QVariant::convert(const int type, void *ptr) const
\warning To make this function work with a custom type registered with
qRegisterMetaType(), its comparison operator must be registered using
QMetaType::registerComparators().
+
+ This operator is deprecated as it cannot establish a total order.
*/
/*!
\fn bool QVariant::operator>(const QVariant &v) const
+ \obsolete
Compares this QVariant with \a v and returns \c true if this is larger than \a v.
@@ -3864,10 +3873,13 @@ bool QVariant::convert(const int type, void *ptr) const
\warning To make this function work with a custom type registered with
qRegisterMetaType(), its comparison operator must be registered using
QMetaType::registerComparators().
+
+ This operator is deprecated as it cannot establish a total order.
*/
/*!
\fn bool QVariant::operator>=(const QVariant &v) const
+ \obsolete
Compares this QVariant with \a v and returns \c true if this is larger or equal than \a v.
@@ -3877,6 +3889,8 @@ bool QVariant::convert(const int type, void *ptr) const
\warning To make this function work with a custom type registered with
qRegisterMetaType(), its comparison operator must be registered using
QMetaType::registerComparators().
+
+ This operator is deprecated as it cannot establish a total order.
*/
static bool qIsNumericType(uint tp)
@@ -3901,7 +3915,7 @@ static bool qIsNumericType(uint tp)
static bool qIsFloatingPoint(uint tp)
{
- return tp == QVariant::Double || tp == QMetaType::Float;
+ return tp == QMetaType::Double || tp == QMetaType::Float;
}
static int normalizeLowerRanks(uint tp)
@@ -3913,13 +3927,13 @@ static int normalizeLowerRanks(uint tp)
Q_UINT64_C(1) << QMetaType::UChar |
Q_UINT64_C(1) << QMetaType::Short |
Q_UINT64_C(1) << QMetaType::UShort;
- return numericTypeBits & (Q_UINT64_C(1) << tp) ? QVariant::Int : tp;
+ return numericTypeBits & (Q_UINT64_C(1) << tp) ? uint(QMetaType::Int) : tp;
}
static int normalizeLong(uint tp)
{
- const uint IntType = sizeof(long) == sizeof(int) ? QVariant::Int : QVariant::LongLong;
- const uint UIntType = sizeof(ulong) == sizeof(uint) ? QVariant::UInt : QVariant::ULongLong;
+ const uint IntType = sizeof(long) == sizeof(int) ? QMetaType::Int : QMetaType::LongLong;
+ const uint UIntType = sizeof(ulong) == sizeof(uint) ? QMetaType::UInt : QMetaType::ULongLong;
return tp == QMetaType::Long ? IntType :
tp == QMetaType::ULong ? UIntType : tp;
}
@@ -3961,13 +3975,13 @@ static int numericTypePromotion(uint t1, uint t2)
// if any of the two is ULongLong, then it wins (highest rank, unsigned)
// otherwise, if one of the two is LongLong, then the other is either LongLong too or lower-ranked
// otherwise, if one of the two is UInt, then the other is either UInt too or Int
- if (t1 == QVariant::ULongLong || t2 == QVariant::ULongLong)
- return QVariant::ULongLong;
- if (t1 == QVariant::LongLong || t2 == QVariant::LongLong)
- return QVariant::LongLong;
- if (t1 == QVariant::UInt || t2 == QVariant::UInt)
- return QVariant::UInt;
- return QVariant::Int;
+ if (t1 == QMetaType::ULongLong || t2 == QMetaType::ULongLong)
+ return QMetaType::ULongLong;
+ if (t1 == QMetaType::LongLong || t2 == QMetaType::LongLong)
+ return QMetaType::LongLong;
+ if (t1 == QMetaType::UInt || t2 == QMetaType::UInt)
+ return QMetaType::UInt;
+ return QMetaType::Int;
}
static int integralCompare(uint promotedType, const QVariant::Private *d1, const QVariant::Private *d2)
@@ -3980,13 +3994,13 @@ static int integralCompare(uint promotedType, const QVariant::Private *d1, const
qlonglong l2 = qConvertToNumber(d2, &ok);
Q_ASSERT(ok);
- if (promotedType == QVariant::Int)
+ if (promotedType == QMetaType::Int)
return int(l1) < int(l2) ? -1 : int(l1) == int(l2) ? 0 : 1;
- if (promotedType == QVariant::UInt)
+ if (promotedType == QMetaType::UInt)
return uint(l1) < uint(l2) ? -1 : uint(l1) == uint(l2) ? 0 : 1;
- if (promotedType == QVariant::LongLong)
+ if (promotedType == QMetaType::LongLong)
return l1 < l2 ? -1 : l1 == l2 ? 0 : 1;
- if (promotedType == QVariant::ULongLong)
+ if (promotedType == QMetaType::ULongLong)
return qulonglong(l1) < qulonglong(l2) ? -1 : qulonglong(l1) == qulonglong(l2) ? 0 : 1;
Q_UNREACHABLE();
diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h
index c95882d48f..24657818c5 100644
--- a/src/corelib/kernel/qvariant.h
+++ b/src/corelib/kernel/qvariant.h
@@ -256,12 +256,12 @@ class Q_CORE_EXPORT QVariant
#if QT_CONFIG(regularexpression)
QVariant(const QRegularExpression &re);
#endif // QT_CONFIG(regularexpression)
-#ifndef QT_BOOTSTRAPPED
- QVariant(const QUrl &url);
#if QT_CONFIG(easingcurve)
QVariant(const QEasingCurve &easing);
#endif
QVariant(const QUuid &uuid);
+#ifndef QT_BOOTSTRAPPED
+ QVariant(const QUrl &url);
QVariant(const QJsonValue &jsonValue);
QVariant(const QJsonObject &jsonObject);
QVariant(const QJsonArray &jsonArray);
@@ -332,12 +332,12 @@ class Q_CORE_EXPORT QVariant
#if QT_CONFIG(regularexpression)
QRegularExpression toRegularExpression() const;
#endif // QT_CONFIG(regularexpression)
-#ifndef QT_BOOTSTRAPPED
- QUrl toUrl() const;
#if QT_CONFIG(easingcurve)
QEasingCurve toEasingCurve() const;
#endif
QUuid toUuid() const;
+#ifndef QT_BOOTSTRAPPED
+ QUrl toUrl() const;
QJsonValue toJsonValue() const;
QJsonObject toJsonObject() const;
QJsonArray toJsonArray() const;
@@ -463,14 +463,16 @@ class Q_CORE_EXPORT QVariant
{ return cmp(v); }
inline bool operator!=(const QVariant &v) const
{ return !cmp(v); }
- inline bool operator<(const QVariant &v) const
+#if QT_DEPRECATED_SINCE(5, 15)
+ QT_DEPRECATED inline bool operator<(const QVariant &v) const
{ return compare(v) < 0; }
- inline bool operator<=(const QVariant &v) const
+ QT_DEPRECATED inline bool operator<=(const QVariant &v) const
{ return compare(v) <= 0; }
- inline bool operator>(const QVariant &v) const
+ QT_DEPRECATED inline bool operator>(const QVariant &v) const
{ return compare(v) > 0; }
- inline bool operator>=(const QVariant &v) const
+ QT_DEPRECATED inline bool operator>=(const QVariant &v) const
{ return compare(v) >= 0; }
+#endif
protected:
friend inline bool operator==(const QVariant &, const QVariantComparisonHelper &);
@@ -777,7 +779,7 @@ namespace QtPrivate {
return QSequentialIterable(QtMetaTypePrivate::QSequentialIterableImpl(reinterpret_cast<const QByteArrayList*>(v.constData())));
}
#endif
- return QSequentialIterable(v.value<QtMetaTypePrivate::QSequentialIterableImpl>());
+ return QSequentialIterable(qvariant_cast<QtMetaTypePrivate::QSequentialIterableImpl>(v));
}
};
template<>
@@ -792,7 +794,7 @@ namespace QtPrivate {
if (typeId == qMetaTypeId<QVariantHash>()) {
return QAssociativeIterable(QtMetaTypePrivate::QAssociativeIterableImpl(reinterpret_cast<const QVariantHash*>(v.constData())));
}
- return QAssociativeIterable(v.value<QtMetaTypePrivate::QAssociativeIterableImpl>());
+ return QAssociativeIterable(qvariant_cast<QtMetaTypePrivate::QAssociativeIterableImpl>(v));
}
};
template<>
@@ -824,7 +826,7 @@ namespace QtPrivate {
QVariantHash l;
l.reserve(iter.size());
for (QAssociativeIterable::const_iterator it = iter.begin(), end = iter.end(); it != end; ++it)
- l.insertMulti(it.key().toString(), it.value());
+ static_cast<QMultiHash<QString, QVariant> &>(l).insert(it.key().toString(), it.value());
return l;
}
return QVariantValueHelper<QVariantHash>::invoke(v);
@@ -840,7 +842,7 @@ namespace QtPrivate {
QAssociativeIterable iter = QVariantValueHelperInterface<QAssociativeIterable>::invoke(v);
QVariantMap l;
for (QAssociativeIterable::const_iterator it = iter.begin(), end = iter.end(); it != end; ++it)
- l.insertMulti(it.key().toString(), it.value());
+ static_cast<QMultiMap<QString, QVariant> &>(l).insert(it.key().toString(), it.value());
return l;
}
return QVariantValueHelper<QVariantMap>::invoke(v);
@@ -855,7 +857,6 @@ namespace QtPrivate {
if (QMetaType::hasRegisteredConverterFunction(typeId, qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>()) && !(typeId == qMetaTypeId<QPair<QVariant, QVariant> >())) {
QtMetaTypePrivate::QPairVariantInterfaceImpl pi = v.value<QtMetaTypePrivate::QPairVariantInterfaceImpl>();
-
const QtMetaTypePrivate::VariantData d1 = pi.first();
QVariant v1(d1.metaTypeId, d1.data, d1.flags);
if (d1.metaTypeId == qMetaTypeId<QVariant>())
diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h
index b8b63b5e6f..94781a9957 100644
--- a/src/corelib/kernel/qvariant_p.h
+++ b/src/corelib/kernel/qvariant_p.h
@@ -362,7 +362,7 @@ class QVariantConstructor
FilteredConstructor(const QVariantConstructor &tc)
{
// ignore types that lives outside of the current library
- tc.m_x->type = QVariant::Invalid;
+ tc.m_x->type = QMetaType::UnknownType;
}
};
public:
@@ -430,7 +430,7 @@ public:
{}
~QVariantDestructor()
{
- m_d->type = QVariant::Invalid;
+ m_d->type = QMetaType::UnknownType;
m_d->is_null = true;
m_d->is_shared = false;
}
diff --git a/src/corelib/kernel/qwineventnotifier.cpp b/src/corelib/kernel/qwineventnotifier.cpp
index d2ae9668fe..db5d44b276 100644
--- a/src/corelib/kernel/qwineventnotifier.cpp
+++ b/src/corelib/kernel/qwineventnotifier.cpp
@@ -124,7 +124,7 @@ QWinEventNotifier::QWinEventNotifier(HANDLE hEvent, QObject *parent)
: QObject(*new QWinEventNotifierPrivate(hEvent, false), parent)
{
Q_D(QWinEventNotifier);
- QAbstractEventDispatcher *eventDispatcher = d->threadData->eventDispatcher.loadRelaxed();
+ QAbstractEventDispatcher *eventDispatcher = d->threadData.loadRelaxed()->eventDispatcher.loadRelaxed();
if (Q_UNLIKELY(!eventDispatcher)) {
qWarning("QWinEventNotifier: Can only be used with threads started with QThread");
return;
@@ -197,7 +197,7 @@ void QWinEventNotifier::setEnabled(bool enable)
return;
d->enabled = enable;
- QAbstractEventDispatcher *eventDispatcher = d->threadData->eventDispatcher.loadRelaxed();
+ QAbstractEventDispatcher *eventDispatcher = d->threadData.loadRelaxed()->eventDispatcher.loadRelaxed();
if (!eventDispatcher) { // perhaps application is shutting down
if (!enable && d->waitHandle != nullptr)
d->unregisterWaitObject();
@@ -256,7 +256,7 @@ void QWinEventNotifierPrivate::unregisterWaitObject()
static void CALLBACK wfsoCallback(void *context, BOOLEAN /*ignore*/)
{
QWinEventNotifierPrivate *nd = reinterpret_cast<QWinEventNotifierPrivate *>(context);
- QAbstractEventDispatcher *eventDispatcher = nd->threadData->eventDispatcher.loadRelaxed();
+ QAbstractEventDispatcher *eventDispatcher = nd->threadData.loadRelaxed()->eventDispatcher.loadRelaxed();
// Happens when Q(Core)Application is destroyed before QWinEventNotifier.
// https://bugreports.qt.io/browse/QTBUG-70214
diff --git a/src/corelib/mimetypes/mime/generate.bat b/src/corelib/mimetypes/mime/generate.bat
new file mode 100644
index 0000000000..f63fc63693
--- /dev/null
+++ b/src/corelib/mimetypes/mime/generate.bat
@@ -0,0 +1,73 @@
+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+::
+:: Copyright (C) 2019 Intel Corporation.
+:: Contact: https://www.qt.io/licensing/
+::
+:: This file is part of the tools applications of the Qt Toolkit.
+::
+:: $QT_BEGIN_LICENSE:GPL-EXCEPT$
+:: Commercial License Usage
+:: Licensees holding valid commercial Qt licenses may use this file in
+:: accordance with the commercial license agreement provided with the
+:: Software or, alternatively, in accordance with the terms contained in
+:: a written agreement between you and The Qt Company. For licensing terms
+:: and conditions see https://www.qt.io/terms-conditions. For further
+:: information use the contact form at https://www.qt.io/contact-us.
+::
+:: GNU General Public License Usage
+:: Alternatively, this file may be used under the terms of the GNU
+:: General Public License version 3 as published by the Free Software
+:: Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+:: included in the packaging of this file. Please review the following
+:: information to ensure the GNU General Public License requirements will
+:: be met: https://www.gnu.org/licenses/gpl-3.0.html.
+::
+:: $QT_END_LICENSE$
+::
+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+@echo off
+setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
+set me=%~dp0
+
+:: Check if certain tools are in PATH
+for %%C in (gzip.exe zstd.exe perl.exe) do set %%C=%%~$PATH:C
+
+:: If perl is in PATH, just let it do everything
+if not "%perl.exe%" == "" goto PuntToPerl
+
+set COMPRESS=
+set MACRO=MIME_DATABASE_IS_UNCOMPRESSED
+if not "%gzip.exe%" == "" (
+ set COMPRESS=gzip -9
+ set MACRO=MIME_DATABASE_IS_GZIP
+)
+
+:: Check if zstd support was enabled
+if /i "%~1" == "--zstd" (
+ shift
+ if not "%zstd.exe%" == "" (
+ set COMPRESS=zstd -19
+ set MACRO=MIME_DATABASE_IS_ZSTD
+ )
+)
+
+if not "%COMPRESS%" == "" goto CompressedCommon
+
+:: No Compression and no Perl
+:: Just hex-dump with Powershell
+powershell -ExecutionPolicy Bypass %me%hexdump.ps1 %1 %1
+exit /b %errorlevel%
+
+:CompressedCommon
+:: Compress to a temporary file, then hex-dump using Powershell
+echo #define %MACRO%
+set tempfile=generate%RANDOM%.tmp
+%COMPRESS% < %1 > %tempfile%
+powershell -ExecutionPolicy Bypass %me%hexdump.ps1 %tempfile% %1
+del %tempfile%
+exit /b %errorlevel%
+
+:PuntToPerl
+perl %me%generate.pl %*
+exit /b %errorlevel%
diff --git a/src/corelib/mimetypes/mime/generate.pl b/src/corelib/mimetypes/mime/generate.pl
new file mode 100644
index 0000000000..0f87d61f8e
--- /dev/null
+++ b/src/corelib/mimetypes/mime/generate.pl
@@ -0,0 +1,113 @@
+#!/usr/bin/perl
+#############################################################################
+##
+## Copyright (C) 2019 Intel Corporation.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is the build configuration utility of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+use strict;
+use warnings;
+use Config;
+local $/; # Enable "slurp" mode
+
+sub checkCommand($) {
+ use File::Spec::Functions;
+ my $cmd = $_[0] . $Config{_exe};
+ for my $path (path()) {
+ return 1 if -x catfile($path, $cmd);
+ }
+ return 0;
+}
+
+my $data;
+my $compress;
+my $macro;
+my $zlib = eval 'use Compress::Zlib; use IO::Compress::Gzip; return 1;';
+my $fname = shift @ARGV;
+
+if ($zlib) {
+ # Prefer internal zlib support (useful on Windows where gzip.exe isn't
+ # always presnet)
+ $macro = "MIME_DATABASE_IS_GZIP";
+} elsif (checkCommand("gzip")) {
+ # No builtin support for compression (old Perl?)
+ $compress = "gzip -c9";
+ $macro = "MIME_DATABASE_IS_GZIP";
+}
+
+# Check if Qt is being built with zstd support
+if ($fname eq "--zstd") {
+ $fname = shift @ARGV;
+ if (checkCommand("zstd")) {
+ $compress = "zstd -cq19 --single-thread";
+ $macro = "MIME_DATABASE_IS_ZSTD";
+ }
+}
+
+# Check if xml (from xmlstarlet) is in $PATH
+my $cmd;
+if (checkCommand("xml")) {
+ # Minify the data before compressing
+ $cmd = "xml sel -D -B -t -c / $fname";
+ $cmd .= "| $compress" if $compress;
+} elsif ($compress) {
+ $cmd = "$compress < $fname"
+}
+if ($cmd) {
+ # Run the command and read everything
+ open CMD, "$cmd |";
+ $data = <CMD>;
+ close CMD;
+ die("Failed to run $cmd") if ($? >> 8);
+} else {
+ # No command, just read the file
+ open F, "<$fname";
+ $data = <F>;
+ close F;
+}
+
+# Do we need to compress with zlib?
+if (!$compress && $zlib) {
+ $data = eval q{
+ use Compress::Zlib;
+ use IO::Compress::Gzip qw(gzip);
+ my $compressed;
+ gzip \$data => \$compressed,
+ Minimal => 1,
+ Level => Z_BEST_COMPRESSION;
+ return $compressed;
+ };
+}
+
+# Now print as hex
+printf "#define %s\n", $macro if $macro;
+printf "static const unsigned char mimetype_database[] = {";
+my $i = 0;
+map {
+ printf "\n " if $i++ % 12 == 0;
+ printf "0x%02x, ", ord $_
+} split //, $data;
+printf "\n};\n";
+printf "static constexpr size_t MimeTypeDatabaseOriginalSize = %d;\n",
+ (stat $fname)[7];
diff --git a/src/corelib/mimetypes/mime/hexdump.ps1 b/src/corelib/mimetypes/mime/hexdump.ps1
new file mode 100644
index 0000000000..25ce8138fa
--- /dev/null
+++ b/src/corelib/mimetypes/mime/hexdump.ps1
@@ -0,0 +1,43 @@
+#############################################################################
+##
+## Copyright (C) 2019 Intel Corporation.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is the build configuration utility of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+param([String]$path, [String]$orig)
+
+"static const unsigned char mimetype_database[] = {"
+ForEach ($byte in Get-Content -Encoding byte -ReadCount 16 -path $path) {
+# if (($byte -eq 0).count -ne 16) {
+ $hex = $byte | Foreach-Object {
+ " 0x" + ("{0:x}" -f $_).PadLeft( 2, "0" ) + ","
+ }
+ " $hex"
+# }
+}
+"};"
+
+$file = Get-Childitem -file $orig
+"static constexpr size_t MimeTypeDatabaseOriginalSize = " + $file.length + ";"
diff --git a/src/corelib/mimetypes/mimetypes.pri b/src/corelib/mimetypes/mimetypes.pri
index 62bbe348e4..8cbe7b69ae 100644
--- a/src/corelib/mimetypes/mimetypes.pri
+++ b/src/corelib/mimetypes/mimetypes.pri
@@ -21,5 +21,32 @@ qtConfig(mimetype) {
mimetypes/qmimeglobpattern.cpp \
mimetypes/qmimeprovider.cpp
- qtConfig(mimetype-database): RESOURCES += mimetypes/mimetypes.qrc
+ MIME_DATABASE = mimetypes/mime/packages/freedesktop.org.xml
+ OTHER_FILES += $$MIME_DATABASE
+
+ qtConfig(mimetype-database) {
+ outpath = .rcc
+ debug_and_release {
+ CONFIG(debug, debug|release): outpath = .rcc/debug
+ else: outpath = .rcc/release
+ }
+
+ mimedb.depends = $$PWD/mime/generate.pl
+ equals(MAKEFILE_GENERATOR, MSVC.NET)|equals(MAKEFILE_GENERATOR, MSBUILD)|isEmpty(QMAKE_SH) {
+ mimedb.commands = cmd /c $$shell_path($$PWD/mime/generate.bat)
+ mimedb.depends += $$PWD/mime/generate.bat $$PWD/mime/hexdump.ps1
+ } else {
+ mimedb.commands = perl $${mimedb.depends}
+ }
+
+ qtConfig(zstd): mimedb.commands += --zstd
+ mimedb.commands += ${QMAKE_FILE_IN} > ${QMAKE_FILE_OUT}
+
+ mimedb.output = $$outpath/qmimeprovider_database.cpp
+ mimedb.input = MIME_DATABASE
+ mimedb.variable_out = INCLUDED_SOURCES
+ QMAKE_EXTRA_COMPILERS += mimedb
+ INCLUDEPATH += $$outpath
+ unset(outpath)
+ }
}
diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp
index 24a7a35ea5..10b2190966 100644
--- a/src/corelib/mimetypes/qmimedatabase.cpp
+++ b/src/corelib/mimetypes/qmimedatabase.cpp
@@ -102,13 +102,18 @@ void QMimeDatabasePrivate::loadProviders()
const auto fdoIterator = std::find_if(mimeDirs.constBegin(), mimeDirs.constEnd(), [](const QString &mimeDir) -> bool {
return QFileInfo::exists(mimeDir + QStringLiteral("/packages/freedesktop.org.xml")); }
);
- if (fdoIterator == mimeDirs.constEnd())
- mimeDirs.prepend(QLatin1String(":/qt-project.org/qmime"));
//qDebug() << "mime dirs:" << mimeDirs;
Providers currentProviders;
std::swap(m_providers, currentProviders);
- m_providers.reserve(mimeDirs.size());
+
+ if (QMimeXMLProvider::InternalDatabaseAvailable && fdoIterator == mimeDirs.constEnd()) {
+ m_providers.reserve(mimeDirs.size() + 1);
+ m_providers.push_back(Providers::value_type(new QMimeXMLProvider(this, QMimeXMLProvider::InternalDatabase)));
+ } else {
+ m_providers.reserve(mimeDirs.size());
+ }
+
for (const QString &mimeDir : qAsConst(mimeDirs)) {
const QString cacheFile = mimeDir + QStringLiteral("/mime.cache");
QFileInfo fileInfo(cacheFile);
@@ -487,7 +492,7 @@ QMimeDatabase::QMimeDatabase() :
*/
QMimeDatabase::~QMimeDatabase()
{
- d = 0;
+ d = nullptr;
}
/*!
diff --git a/src/corelib/mimetypes/qmimeprovider.cpp b/src/corelib/mimetypes/qmimeprovider.cpp
index a3a6b9615c..4aee772366 100644
--- a/src/corelib/mimetypes/qmimeprovider.cpp
+++ b/src/corelib/mimetypes/qmimeprovider.cpp
@@ -1,7 +1,8 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2015 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
+** Copyright (C) 2018 The Qt Company Ltd.
+** Copyright (C) 2018 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
+** Copyright (C) 2019 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -45,6 +46,7 @@
#include "qmimemagicrulematcher_p.h"
#include <QXmlStreamReader>
+#include <QBuffer>
#include <QDir>
#include <QFile>
#include <QByteArrayMatcher>
@@ -52,12 +54,33 @@
#include <QDateTime>
#include <QtEndian>
-static void initResources()
-{
#if QT_CONFIG(mimetype_database)
- Q_INIT_RESOURCE(mimetypes);
+# if defined(Q_CC_MSVC)
+# pragma section(".qtmimedatabase", read, shared)
+__declspec(allocate(".qtmimedatabase")) __declspec(align(4096))
+# elif defined(Q_OS_DARWIN)
+__attribute__((section("__TEXT,.qtmimedatabase"), aligned(4096)))
+# elif (defined(Q_OF_ELF) || defined(Q_OS_WIN)) && defined(Q_CC_GNU)
+__attribute__((section(".qtmimedatabase"), aligned(4096)))
+# endif
+
+# include "qmimeprovider_database.cpp"
+
+# ifdef MIME_DATABASE_IS_ZSTD
+# if !QT_CONFIG(zstd)
+# error "MIME database is zstd but no support compiled in!"
+# endif
+# include <zstd.h>
+# endif
+# ifdef MIME_DATABASE_IS_GZIP
+# ifdef QT_NO_COMPRESS
+# error "MIME database is zlib but no support compiled in!"
+# endif
+# define ZLIB_CONST
+# include <zconf.h>
+# include <zlib.h>
+# endif
#endif
-}
QT_BEGIN_NAMESPACE
@@ -130,7 +153,7 @@ bool QMimeBinaryProvider::CacheFile::reload()
if (file.isOpen()) {
file.close();
}
- data = 0;
+ data = nullptr;
return load();
}
@@ -306,7 +329,7 @@ bool QMimeBinaryProvider::matchMagicRule(QMimeBinaryProvider::CacheFile *cacheFi
const int valueLength = cacheFile->getUint32(off + 12);
const int valueOffset = cacheFile->getUint32(off + 16);
const int maskOffset = cacheFile->getUint32(off + 20);
- const char *mask = maskOffset ? cacheFile->getCharStar(maskOffset) : NULL;
+ const char *mask = maskOffset ? cacheFile->getCharStar(maskOffset) : nullptr;
if (!QMimeMagicRule::matchSubstring(dataPtr, dataSize, rangeStart, rangeLength, valueLength, cacheFile->getCharStar(valueOffset), mask))
continue;
@@ -597,10 +620,55 @@ void QMimeBinaryProvider::loadGenericIcon(QMimeTypePrivate &data)
////
+#if QT_CONFIG(mimetype_database)
+static QString internalMimeFileName()
+{
+ return QStringLiteral("<internal MIME data>");
+}
+
+QMimeXMLProvider::QMimeXMLProvider(QMimeDatabasePrivate *db, InternalDatabaseEnum)
+ : QMimeProviderBase(db, internalMimeFileName())
+{
+ Q_STATIC_ASSERT_X(sizeof(mimetype_database), "Bundled MIME database is empty");
+ Q_STATIC_ASSERT_X(sizeof(mimetype_database) <= MimeTypeDatabaseOriginalSize,
+ "Compressed MIME database is larger than the original size");
+ Q_STATIC_ASSERT_X(MimeTypeDatabaseOriginalSize <= 16*1024*1024,
+ "Bundled MIME database is too big");
+ const char *data = reinterpret_cast<const char *>(mimetype_database);
+ qsizetype size = MimeTypeDatabaseOriginalSize;
+
+#ifdef MIME_DATABASE_IS_ZSTD
+ // uncompress with libzstd
+ std::unique_ptr<char []> uncompressed(new char[size]);
+ size = ZSTD_decompress(uncompressed.get(), size, mimetype_database, sizeof(mimetype_database));
+ Q_ASSERT(!ZSTD_isError(size));
+ data = uncompressed.get();
+#elif defined(MIME_DATABASE_IS_GZIP)
+ std::unique_ptr<char []> uncompressed(new char[size]);
+ z_stream zs = {};
+ zs.next_in = mimetype_database;
+ zs.avail_in = sizeof(mimetype_database);
+ zs.next_out = reinterpret_cast<Bytef *>(uncompressed.get());
+ zs.avail_out = size;
+
+ int res = inflateInit2(&zs, MAX_WBITS | 32);
+ Q_ASSERT(res == Z_OK);
+ res = inflate(&zs, Z_FINISH);
+ Q_ASSERT(res == Z_STREAM_END);
+ res = inflateEnd(&zs);
+ Q_ASSERT(res == Z_OK);
+
+ data = uncompressed.get();
+ size = zs.total_out;
+#endif
+
+ load(data, size);
+}
+#endif
+
QMimeXMLProvider::QMimeXMLProvider(QMimeDatabasePrivate *db, const QString &directory)
: QMimeProviderBase(db, directory)
{
- initResources();
ensureLoaded();
}
@@ -692,6 +760,19 @@ bool QMimeXMLProvider::load(const QString &fileName, QString *errorMessage)
return parser.parse(&file, fileName, errorMessage);
}
+#if QT_CONFIG(mimetype_database)
+void QMimeXMLProvider::load(const char *data, qsizetype len)
+{
+ QBuffer buffer;
+ buffer.setData(QByteArray::fromRawData(data, len));
+ buffer.open(QIODevice::ReadOnly);
+ QString errorMessage;
+ QMimeTypeParser parser(*this);
+ if (!parser.parse(&buffer, internalMimeFileName(), &errorMessage))
+ qWarning("QMimeDatabase: Error loading internal MIME data\n%s", qPrintable(errorMessage));
+}
+#endif
+
void QMimeXMLProvider::addGlobPattern(const QMimeGlobPattern &glob)
{
m_mimeTypeGlobs.addGlob(glob);
diff --git a/src/corelib/mimetypes/qmimeprovider_p.h b/src/corelib/mimetypes/qmimeprovider_p.h
index b6268210c0..0629df8a95 100644
--- a/src/corelib/mimetypes/qmimeprovider_p.h
+++ b/src/corelib/mimetypes/qmimeprovider_p.h
@@ -132,6 +132,16 @@ private:
class QMimeXMLProvider : public QMimeProviderBase
{
public:
+ enum InternalDatabaseEnum { InternalDatabase };
+#if QT_CONFIG(mimetype_database)
+ enum : bool { InternalDatabaseAvailable = true };
+ QMimeXMLProvider(QMimeDatabasePrivate *db, InternalDatabaseEnum);
+#else
+ enum : bool { InternalDatabaseAvailable = false };
+ QMimeXMLProvider(QMimeDatabasePrivate *db, InternalDatabaseEnum)
+ : QMimeProviderBase(db, QString())
+ { Q_UNREACHABLE() };
+#endif
QMimeXMLProvider(QMimeDatabasePrivate *db, const QString &directory);
~QMimeXMLProvider();
@@ -156,6 +166,7 @@ public:
private:
void load(const QString &fileName);
+ void load(const char *data, qsizetype len);
typedef QHash<QString, QMimeType> NameMimeTypeMap;
NameMimeTypeMap m_nameMimeTypeMap;
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp
index 18f10c9b43..14de8db1c6 100644
--- a/src/corelib/plugin/qfactoryloader.cpp
+++ b/src/corelib/plugin/qfactoryloader.cpp
@@ -212,7 +212,7 @@ void QFactoryLoader::update()
QStringList(QLatin1String("libplugins_%1_*.so").arg(d->suffix)),
#endif
QDir::Files);
- QLibraryPrivate *library = 0;
+ QLibraryPrivate *library = nullptr;
for (int j = 0; j < plugins.count(); ++j) {
QString fileName = QDir::cleanPath(path + QLatin1Char('/') + plugins.at(j));
@@ -383,7 +383,7 @@ QObject *QFactoryLoader::instance(int index) const
{
Q_D(const QFactoryLoader);
if (index < 0)
- return 0;
+ return nullptr;
#if QT_CONFIG(library)
QMutexLocker lock(&d->mutex);
@@ -399,7 +399,7 @@ QObject *QFactoryLoader::instance(int index) const
return obj;
}
}
- return 0;
+ return nullptr;
}
index -= d->libraryList.size();
lock.unlock();
@@ -416,7 +416,7 @@ QObject *QFactoryLoader::instance(int index) const
--index;
}
- return 0;
+ return nullptr;
}
QMultiMap<int, QString> QFactoryLoader::keyMap() const
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index eeaa3c18ec..b3a95d4f26 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -256,7 +256,7 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
qsizetype fdlen = qMin(file.size(), MaxMemoryMapSize);
const char *filedata = reinterpret_cast<char *>(file.map(0, fdlen));
- if (filedata == 0) {
+ if (filedata == nullptr) {
// Try reading the data into memory instead (up to 64 MB).
data = file.read(64 * 1024 * 1024);
filedata = data.constData();
@@ -387,12 +387,12 @@ private:
};
static QBasicMutex qt_library_mutex;
-static QLibraryStore *qt_library_data = 0;
+static QLibraryStore *qt_library_data = nullptr;
static bool qt_library_data_once;
QLibraryStore::~QLibraryStore()
{
- qt_library_data = 0;
+ qt_library_data = nullptr;
}
inline void QLibraryStore::cleanup()
@@ -459,7 +459,7 @@ inline QLibraryPrivate *QLibraryStore::findOrCreate(const QString &fileName, con
QLibraryStore *data = instance();
// check if this library is already loaded
- QLibraryPrivate *lib = 0;
+ QLibraryPrivate *lib = nullptr;
if (Q_LIKELY(data)) {
lib = data->libraryMap.value(fileName);
if (lib)
@@ -498,7 +498,7 @@ inline void QLibraryStore::releaseLibrary(QLibraryPrivate *lib)
}
QLibraryPrivate::QLibraryPrivate(const QString &canonicalFileName, const QString &version, QLibrary::LoadHints loadHints)
- : pHnd(0), fileName(canonicalFileName), fullVersion(version), instance(0),
+ : pHnd(nullptr), fileName(canonicalFileName), fullVersion(version), instance(nullptr),
libraryRefCount(0), libraryUnloadCount(0), pluginState(MightBeAPlugin)
{
loadHintsInt.storeRelaxed(loadHints);
@@ -528,7 +528,7 @@ void QLibraryPrivate::mergeLoadHints(QLibrary::LoadHints lh)
QFunctionPointer QLibraryPrivate::resolve(const char *symbol)
{
if (!pHnd)
- return 0;
+ return nullptr;
return resolve_sys(symbol);
}
@@ -584,12 +584,12 @@ bool QLibraryPrivate::unload(UnloadFlag flag)
//when the library is unloaded, we release the reference on it so that 'this'
//can get deleted
libraryRefCount.deref();
- pHnd = 0;
- instance = 0;
+ pHnd = nullptr;
+ instance = nullptr;
}
}
- return (pHnd == 0);
+ return (pHnd == nullptr);
}
void QLibraryPrivate::release()
@@ -847,7 +847,7 @@ bool QLibrary::isLoaded() const
Constructs a library with the given \a parent.
*/
QLibrary::QLibrary(QObject *parent)
- :QObject(parent), d(0), did_load(false)
+ :QObject(parent), d(nullptr), did_load(false)
{
}
@@ -862,7 +862,7 @@ QLibrary::QLibrary(QObject *parent)
".dylib" on \macos and iOS, and ".dll" on Windows. (See \l{fileName}.)
*/
QLibrary::QLibrary(const QString& fileName, QObject *parent)
- :QObject(parent), d(0), did_load(false)
+ :QObject(parent), d(nullptr), did_load(false)
{
setFileName(fileName);
}
@@ -879,7 +879,7 @@ QLibrary::QLibrary(const QString& fileName, QObject *parent)
".dylib" on \macos and iOS, and ".dll" on Windows. (See \l{fileName}.)
*/
QLibrary::QLibrary(const QString& fileName, int verNum, QObject *parent)
- :QObject(parent), d(0), did_load(false)
+ :QObject(parent), d(nullptr), did_load(false)
{
setFileNameAndVersion(fileName, verNum);
}
@@ -895,7 +895,7 @@ QLibrary::QLibrary(const QString& fileName, int verNum, QObject *parent)
".dylib" on \macos and iOS, and ".dll" on Windows. (See \l{fileName}.)
*/
QLibrary::QLibrary(const QString& fileName, const QString &version, QObject *parent)
- :QObject(parent), d(0), did_load(false)
+ :QObject(parent), d(nullptr), did_load(false)
{
setFileNameAndVersion(fileName, version);
}
@@ -942,7 +942,7 @@ void QLibrary::setFileName(const QString &fileName)
if (d) {
lh = d->loadHints();
d->release();
- d = 0;
+ d = nullptr;
did_load = false;
}
d = QLibraryPrivate::findOrCreate(fileName, QString(), lh);
@@ -970,7 +970,7 @@ void QLibrary::setFileNameAndVersion(const QString &fileName, int verNum)
if (d) {
lh = d->loadHints();
d->release();
- d = 0;
+ d = nullptr;
did_load = false;
}
d = QLibraryPrivate::findOrCreate(fileName, verNum >= 0 ? QString::number(verNum) : QString(), lh);
@@ -991,7 +991,7 @@ void QLibrary::setFileNameAndVersion(const QString &fileName, const QString &ver
if (d) {
lh = d->loadHints();
d->release();
- d = 0;
+ d = nullptr;
did_load = false;
}
d = QLibraryPrivate::findOrCreate(fileName, version, lh);
@@ -1020,7 +1020,7 @@ void QLibrary::setFileNameAndVersion(const QString &fileName, const QString &ver
QFunctionPointer QLibrary::resolve(const char *symbol)
{
if (!isLoaded() && !load())
- return 0;
+ return nullptr;
return d->resolve(symbol);
}
diff --git a/src/corelib/plugin/qlibrary_p.h b/src/corelib/plugin/qlibrary_p.h
index db5afac98e..a58547a2c3 100644
--- a/src/corelib/plugin/qlibrary_p.h
+++ b/src/corelib/plugin/qlibrary_p.h
@@ -96,7 +96,7 @@ public:
void setLoadHints(QLibrary::LoadHints lh);
static QLibraryPrivate *findOrCreate(const QString &fileName, const QString &version = QString(),
- QLibrary::LoadHints loadHints = nullptr);
+ QLibrary::LoadHints loadHints = { });
static QStringList suffixes_sys(const QString &fullVersion);
static QStringList prefixes_sys();
diff --git a/src/corelib/plugin/qlibrary_unix.cpp b/src/corelib/plugin/qlibrary_unix.cpp
index 135b82cd37..4a092abb3e 100644
--- a/src/corelib/plugin/qlibrary_unix.cpp
+++ b/src/corelib/plugin/qlibrary_unix.cpp
@@ -279,7 +279,7 @@ bool QLibraryPrivate::load_sys()
qualifiedFileName = attempt;
errorString.clear();
}
- return (pHnd != 0);
+ return (pHnd != nullptr);
}
bool QLibraryPrivate::unload_sys()
diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp
index dac8502dae..f34578ea81 100644
--- a/src/corelib/plugin/qpluginloader.cpp
+++ b/src/corelib/plugin/qpluginloader.cpp
@@ -136,7 +136,7 @@ QT_BEGIN_NAMESPACE
Constructs a plugin loader with the given \a parent.
*/
QPluginLoader::QPluginLoader(QObject *parent)
- : QObject(parent), d(0), did_load(false)
+ : QObject(parent), d(nullptr), did_load(false)
{
}
@@ -152,7 +152,7 @@ QPluginLoader::QPluginLoader(QObject *parent)
\sa setFileName()
*/
QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent)
- : QObject(parent), d(0), did_load(false)
+ : QObject(parent), d(nullptr), did_load(false)
{
setFileName(fileName);
setLoadHints(QLibrary::PreventUnloadHint);
@@ -195,7 +195,7 @@ QPluginLoader::~QPluginLoader()
QObject *QPluginLoader::instance()
{
if (!isLoaded() && !load())
- return 0;
+ return nullptr;
if (!d->inst && d->instance)
d->inst = d->instance();
return d->inst.data();
@@ -363,7 +363,7 @@ void QPluginLoader::setFileName(const QString &fileName)
if (d) {
lh = d->loadHints();
d->release();
- d = 0;
+ d = nullptr;
did_load = false;
}
diff --git a/src/corelib/serialization/qbinaryjson.cpp b/src/corelib/serialization/qbinaryjson.cpp
new file mode 100644
index 0000000000..3d359f0998
--- /dev/null
+++ b/src/corelib/serialization/qbinaryjson.cpp
@@ -0,0 +1,415 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qbinaryjson_p.h"
+
+#include <qjsonobject.h>
+#include <qjsonarray.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace QBinaryJsonPrivate {
+
+static Q_CONSTEXPR Base emptyArray = {
+ { qle_uint(sizeof(Base)) },
+ { 0 },
+ { qle_uint(0) }
+};
+
+static Q_CONSTEXPR Base emptyObject = {
+ { qle_uint(sizeof(Base)) },
+ { qToLittleEndian(1U) },
+ { qle_uint(0) }
+};
+
+void MutableData::compact()
+{
+ Q_STATIC_ASSERT(sizeof(Value) == sizeof(offset));
+
+ Base *base = header->root();
+ int reserve = 0;
+ if (base->is_object) {
+ auto *o = static_cast<Object *>(base);
+ for (uint i = 0; i < o->length; ++i)
+ reserve += o->entryAt(i)->usedStorage(o);
+ } else {
+ auto *a = static_cast<Array *>(base);
+ for (uint i = 0; i < a->length; ++i)
+ reserve += a->at(i)->usedStorage(a);
+ }
+
+ uint size = sizeof(Base) + reserve + base->length * sizeof(offset);
+ uint alloc = sizeof(Header) + size;
+ auto *h = reinterpret_cast<Header *>(malloc(alloc));
+ Q_CHECK_PTR(h);
+ h->tag = QJsonDocument::BinaryFormatTag;
+ h->version = 1;
+ Base *b = h->root();
+ b->size = size;
+ b->is_object = header->root()->is_object;
+ b->length = base->length;
+ b->tableOffset = reserve + sizeof(Array);
+
+ uint offset = sizeof(Base);
+ if (b->is_object) {
+ const auto *o = static_cast<const Object *>(base);
+ auto *no = static_cast<Object *>(b);
+
+ for (uint i = 0; i < o->length; ++i) {
+ no->table()[i] = offset;
+
+ const Entry *e = o->entryAt(i);
+ Entry *ne = no->entryAt(i);
+ uint s = e->size();
+ memcpy(ne, e, s);
+ offset += s;
+ uint dataSize = e->value.usedStorage(o);
+ if (dataSize) {
+ memcpy(reinterpret_cast<char *>(no) + offset, e->value.data(o), dataSize);
+ ne->value.value = offset;
+ offset += dataSize;
+ }
+ }
+ } else {
+ const auto *a = static_cast<const Array *>(base);
+ auto *na = static_cast<Array *>(b);
+
+ for (uint i = 0; i < a->length; ++i) {
+ const Value *v = a->at(i);
+ Value *nv = na->at(i);
+ *nv = *v;
+ uint dataSize = v->usedStorage(a);
+ if (dataSize) {
+ memcpy(reinterpret_cast<char *>(na) + offset, v->data(a), dataSize);
+ nv->value = offset;
+ offset += dataSize;
+ }
+ }
+ }
+ Q_ASSERT(offset == uint(b->tableOffset));
+
+ free(header);
+ header = h;
+ this->alloc = alloc;
+ compactionCounter = 0;
+}
+
+bool ConstData::isValid() const
+{
+ if (header->tag != QJsonDocument::BinaryFormatTag || header->version != 1U)
+ return false;
+
+ const Base *root = header->root();
+ const uint maxSize = alloc - sizeof(Header);
+ return root->is_object
+ ? static_cast<const Object *>(root)->isValid(maxSize)
+ : static_cast<const Array *>(root)->isValid(maxSize);
+}
+
+QJsonDocument ConstData::toJsonDocument() const
+{
+ const Base *root = header->root();
+ return root->is_object
+ ? QJsonDocument(static_cast<const Object *>(root)->toJsonObject())
+ : QJsonDocument(static_cast<const Array *>(root)->toJsonArray());
+}
+
+uint Base::reserveSpace(uint dataSize, uint posInTable, uint numItems, bool replace)
+{
+ Q_ASSERT(posInTable <= length);
+ if (size + dataSize >= Value::MaxSize) {
+ qWarning("QJson: Document too large to store in data structure %d %d %d",
+ uint(size), dataSize, Value::MaxSize);
+ return 0;
+ }
+
+ offset off = tableOffset;
+ // move table to new position
+ if (replace) {
+ memmove(reinterpret_cast<char *>(table()) + dataSize, table(), length * sizeof(offset));
+ } else {
+ memmove(reinterpret_cast<char *>(table() + posInTable + numItems) + dataSize,
+ table() + posInTable, (length - posInTable) * sizeof(offset));
+ memmove(reinterpret_cast<char *>(table()) + dataSize, table(), posInTable * sizeof(offset));
+ }
+ tableOffset += dataSize;
+ for (uint i = 0; i < numItems; ++i)
+ table()[posInTable + i] = off;
+ size += dataSize;
+ if (!replace) {
+ length += numItems;
+ size += numItems * sizeof(offset);
+ }
+ return off;
+}
+
+uint Object::indexOf(QStringView key, bool *exists) const
+{
+ uint min = 0;
+ uint n = length;
+ while (n > 0) {
+ uint half = n >> 1;
+ uint middle = min + half;
+ if (*entryAt(middle) >= key) {
+ n = half;
+ } else {
+ min = middle + 1;
+ n -= half + 1;
+ }
+ }
+ if (min < length && *entryAt(min) == key) {
+ *exists = true;
+ return min;
+ }
+ *exists = false;
+ return min;
+}
+
+QJsonObject Object::toJsonObject() const
+{
+ QJsonObject object;
+ for (uint i = 0; i < length; ++i) {
+ const Entry *e = entryAt(i);
+ object.insert(e->key(), e->value.toJsonValue(this));
+ }
+ return object;
+}
+
+bool Object::isValid(uint maxSize) const
+{
+ if (size > maxSize || tableOffset + length * sizeof(offset) > size)
+ return false;
+
+ QString lastKey;
+ for (uint i = 0; i < length; ++i) {
+ if (table()[i] + sizeof(Entry) >= tableOffset)
+ return false;
+ const Entry *e = entryAt(i);
+ if (!e->isValid(tableOffset - table()[i]))
+ return false;
+ const QString key = e->key();
+ if (key < lastKey)
+ return false;
+ if (!e->value.isValid(this))
+ return false;
+ lastKey = key;
+ }
+ return true;
+}
+
+QJsonArray Array::toJsonArray() const
+{
+ QJsonArray array;
+ const offset *values = table();
+ for (uint i = 0; i < length; ++i)
+ array.append(reinterpret_cast<const Value *>(values + i)->toJsonValue(this));
+ return array;
+}
+
+bool Array::isValid(uint maxSize) const
+{
+ if (size > maxSize || tableOffset + length * sizeof(offset) > size)
+ return false;
+
+ const offset *values = table();
+ for (uint i = 0; i < length; ++i) {
+ if (!reinterpret_cast<const Value *>(values + i)->isValid(this))
+ return false;
+ }
+ return true;
+}
+
+uint Value::usedStorage(const Base *b) const
+{
+ uint s = 0;
+ switch (type) {
+ case QJsonValue::Double:
+ if (!latinOrIntValue)
+ s = sizeof(double);
+ break;
+ case QJsonValue::String: {
+ const char *d = data(b);
+ s = latinOrIntValue
+ ? (sizeof(ushort)
+ + qFromLittleEndian(*reinterpret_cast<const ushort *>(d)))
+ : (sizeof(int)
+ + sizeof(ushort) * qFromLittleEndian(*reinterpret_cast<const int *>(d)));
+ break;
+ }
+ case QJsonValue::Array:
+ case QJsonValue::Object:
+ s = base(b)->size;
+ break;
+ case QJsonValue::Null:
+ case QJsonValue::Bool:
+ default:
+ break;
+ }
+ return alignedSize(s);
+}
+
+QJsonValue Value::toJsonValue(const Base *b) const
+{
+ switch (type) {
+ case QJsonValue::Null:
+ return QJsonValue(QJsonValue::Null);
+ case QJsonValue::Bool:
+ return QJsonValue(toBoolean());
+ case QJsonValue::Double:
+ return QJsonValue(toDouble(b));
+ case QJsonValue::String:
+ return QJsonValue(toString(b));
+ case QJsonValue::Array:
+ return static_cast<const Array *>(base(b))->toJsonArray();
+ case QJsonValue::Object:
+ return static_cast<const Object *>(base(b))->toJsonObject();
+ case QJsonValue::Undefined:
+ return QJsonValue(QJsonValue::Undefined);
+ }
+ Q_UNREACHABLE();
+ return QJsonValue(QJsonValue::Undefined);
+}
+
+inline bool isValidValueOffset(uint offset, uint tableOffset)
+{
+ return offset >= sizeof(Base)
+ && offset + sizeof(uint) <= tableOffset;
+}
+
+bool Value::isValid(const Base *b) const
+{
+ switch (type) {
+ case QJsonValue::Null:
+ case QJsonValue::Bool:
+ return true;
+ case QJsonValue::Double:
+ return latinOrIntValue || isValidValueOffset(value, b->tableOffset);
+ case QJsonValue::String:
+ if (!isValidValueOffset(value, b->tableOffset))
+ return false;
+ if (latinOrIntValue)
+ return asLatin1String(b).isValid(b->tableOffset - value);
+ return asString(b).isValid(b->tableOffset - value);
+ case QJsonValue::Array:
+ return isValidValueOffset(value, b->tableOffset)
+ && static_cast<const Array *>(base(b))->isValid(b->tableOffset - value);
+ case QJsonValue::Object:
+ return isValidValueOffset(value, b->tableOffset)
+ && static_cast<const Object *>(base(b))->isValid(b->tableOffset - value);
+ default:
+ return false;
+ }
+}
+
+uint Value::requiredStorage(const QBinaryJsonValue &v, bool *compressed)
+{
+ *compressed = false;
+ switch (v.type()) {
+ case QJsonValue::Double:
+ if (QBinaryJsonPrivate::compressedNumber(v.toDouble()) != INT_MAX) {
+ *compressed = true;
+ return 0;
+ }
+ return sizeof(double);
+ case QJsonValue::String: {
+ QString s = v.toString();
+ *compressed = QBinaryJsonPrivate::useCompressed(s);
+ return QBinaryJsonPrivate::qStringSize(s, *compressed);
+ }
+ case QJsonValue::Array:
+ case QJsonValue::Object:
+ return v.base ? uint(v.base->size) : sizeof(QBinaryJsonPrivate::Base);
+ case QJsonValue::Undefined:
+ case QJsonValue::Null:
+ case QJsonValue::Bool:
+ break;
+ }
+ return 0;
+}
+
+uint Value::valueToStore(const QBinaryJsonValue &v, uint offset)
+{
+ switch (v.type()) {
+ case QJsonValue::Undefined:
+ case QJsonValue::Null:
+ break;
+ case QJsonValue::Bool:
+ return v.toBool();
+ case QJsonValue::Double: {
+ int c = QBinaryJsonPrivate::compressedNumber(v.toDouble());
+ if (c != INT_MAX)
+ return c;
+ }
+ Q_FALLTHROUGH();
+ case QJsonValue::String:
+ case QJsonValue::Array:
+ case QJsonValue::Object:
+ return offset;
+ }
+ return 0;
+}
+
+void Value::copyData(const QBinaryJsonValue &v, char *dest, bool compressed)
+{
+ switch (v.type()) {
+ case QJsonValue::Double:
+ if (!compressed)
+ qToLittleEndian(v.toDouble(), dest);
+ break;
+ case QJsonValue::String: {
+ const QString str = v.toString();
+ QBinaryJsonPrivate::copyString(dest, str, compressed);
+ break;
+ }
+ case QJsonValue::Array:
+ case QJsonValue::Object: {
+ const QBinaryJsonPrivate::Base *b = v.base;
+ if (!b)
+ b = (v.type() == QJsonValue::Array ? &emptyArray : &emptyObject);
+ memcpy(dest, b, b->size);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+} // namespace QBinaryJsonPrivate
+
+QT_END_NAMESPACE
diff --git a/src/corelib/serialization/qbinaryjson_p.h b/src/corelib/serialization/qbinaryjson_p.h
new file mode 100644
index 0000000000..132c36f227
--- /dev/null
+++ b/src/corelib/serialization/qbinaryjson_p.h
@@ -0,0 +1,617 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2016 Intel Corporation.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QBINARYJSON_P_H
+#define QBINARYJSON_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <private/qbinaryjsonvalue_p.h>
+#include <private/qendian_p.h>
+
+#include <qjsondocument.h>
+
+#include <limits>
+
+QT_REQUIRE_CONFIG(binaryjson);
+
+QT_BEGIN_NAMESPACE
+
+// in qstring.cpp
+void qt_to_latin1_unchecked(uchar *dst, const ushort *uc, qsizetype len);
+void qt_from_latin1(ushort *dst, const char *str, size_t size) noexcept;
+
+/*
+ This defines a binary data structure for Json data. The data structure is optimised for fast reading
+ and minimum allocations. The whole data structure can be mmap'ed and used directly.
+
+ In most cases the binary structure is not as space efficient as a utf8 encoded text representation, but
+ much faster to access.
+
+ The size requirements are:
+
+ String:
+ Latin1 data: 2 bytes header + string.length()
+ Full Unicode: 4 bytes header + 2*(string.length())
+
+ Values: 4 bytes + size of data (size can be 0 for some data)
+ bool: 0 bytes
+ double: 8 bytes (0 if integer with less than 27bits)
+ string: see above
+ array: size of array
+ object: size of object
+ Array: 12 bytes + 4*length + size of Value data
+ Object: 12 bytes + 8*length + size of Key Strings + size of Value data
+
+ For an example such as
+
+ { // object: 12 + 5*8 = 52
+ "firstName": "John", // key 12, value 8 = 20
+ "lastName" : "Smith", // key 12, value 8 = 20
+ "age" : 25, // key 8, value 0 = 8
+ "address" : // key 12, object below = 140
+ { // object: 12 + 4*8
+ "streetAddress": "21 2nd Street", // key 16, value 16
+ "city" : "New York", // key 8, value 12
+ "state" : "NY", // key 8, value 4
+ "postalCode" : "10021" // key 12, value 8
+ }, // object total: 128
+ "phoneNumber": // key: 16, value array below = 172
+ [ // array: 12 + 2*4 + values below: 156
+ { // object 12 + 2*8
+ "type" : "home", // key 8, value 8
+ "number": "212 555-1234" // key 8, value 16
+ }, // object total: 68
+ { // object 12 + 2*8
+ "type" : "fax", // key 8, value 8
+ "number": "646 555-4567" // key 8, value 16
+ } // object total: 68
+ ] // array total: 156
+ } // great total: 412 bytes
+
+ The uncompressed text file used roughly 500 bytes, so in this case we end up using about
+ the same space as the text representation.
+
+ Other measurements have shown a slightly bigger binary size than a compact text
+ representation where all possible whitespace was stripped out.
+*/
+namespace QBinaryJsonPrivate {
+
+class Array;
+class Object;
+class Value;
+class Entry;
+
+template<typename T>
+using q_littleendian = QLEInteger<T>;
+
+using qle_short = q_littleendian<short>;
+using qle_ushort = q_littleendian<unsigned short>;
+using qle_int = q_littleendian<int>;
+using qle_uint = q_littleendian<unsigned int>;
+
+template<int pos, int width>
+using qle_bitfield = QLEIntegerBitfield<uint, pos, width>;
+
+template<int pos, int width>
+using qle_signedbitfield = QLEIntegerBitfield<int, pos, width>;
+
+using offset = qle_uint;
+
+// round the size up to the next 4 byte boundary
+inline uint alignedSize(uint size) { return (size + 3) & ~3; }
+
+const int MaxLatin1Length = 0x7fff;
+
+static inline bool useCompressed(QStringView s)
+{
+ if (s.length() > MaxLatin1Length)
+ return false;
+ return QtPrivate::isLatin1(s);
+}
+
+static inline bool useCompressed(QLatin1String s)
+{
+ return s.size() <= MaxLatin1Length;
+}
+
+static inline uint qStringSize(const QString &string, bool compress)
+{
+ uint l = 2 + string.size();
+ if (!compress)
+ l *= 2;
+ return alignedSize(l);
+}
+
+// returns INT_MAX if it can't compress it into 28 bits
+static inline int compressedNumber(double d)
+{
+ // this relies on details of how ieee floats are represented
+ const int exponent_off = 52;
+ const quint64 fraction_mask = 0x000fffffffffffffULL;
+ const quint64 exponent_mask = 0x7ff0000000000000ULL;
+
+ quint64 val;
+ memcpy (&val, &d, sizeof(double));
+ int exp = (int)((val & exponent_mask) >> exponent_off) - 1023;
+ if (exp < 0 || exp > 25)
+ return std::numeric_limits<int>::max();
+
+ quint64 non_int = val & (fraction_mask >> exp);
+ if (non_int)
+ return std::numeric_limits<int>::max();
+
+ bool neg = (val >> 63) != 0;
+ val &= fraction_mask;
+ val |= ((quint64)1 << 52);
+ int res = (int)(val >> (52 - exp));
+ return neg ? -res : res;
+}
+
+class Latin1String;
+
+class String
+{
+public:
+ explicit String(const char *data) : d(reinterpret_cast<const Data *>(data)) {}
+
+ struct Data {
+ qle_uint length;
+ qle_ushort utf16[1];
+ };
+ const Data *d;
+
+ uint byteSize() const { return sizeof(uint) + sizeof(ushort) * d->length; }
+ bool isValid(uint maxSize) const
+ {
+ // Check byteSize() <= maxSize, avoiding integer overflow
+ return maxSize >= sizeof(uint)
+ && uint(d->length) <= (maxSize - sizeof(uint)) / sizeof(ushort);
+ }
+
+ static void copy(char *dest, QStringView str)
+ {
+ Data *data = reinterpret_cast<Data *>(dest);
+ data->length = str.length();
+ qToLittleEndian<quint16>(str.utf16(), str.length(), data->utf16);
+ fillTrailingZeros(data);
+ }
+
+ static void fillTrailingZeros(Data *data)
+ {
+ if (data->length & 1)
+ data->utf16[data->length] = 0;
+ }
+
+ bool operator ==(QStringView str) const
+ {
+ int slen = str.length();
+ int l = d->length;
+ if (slen != l)
+ return false;
+ const auto *s = reinterpret_cast<const ushort *>(str.utf16());
+ const qle_ushort *a = d->utf16;
+ const ushort *b = s;
+ while (l-- && *a == *b)
+ a++,b++;
+ return (l == -1);
+ }
+
+ bool operator ==(const String &str) const
+ {
+ if (d->length != str.d->length)
+ return false;
+ return !memcmp(d->utf16, str.d->utf16, d->length * sizeof(ushort));
+ }
+
+ QString toString() const
+ {
+#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+ return QString(reinterpret_cast<const QChar *>(d->utf16), d->length);
+#else
+ const uint l = d->length;
+ QString str(l, Qt::Uninitialized);
+ QChar *ch = str.data();
+ for (uint i = 0; i < l; ++i)
+ ch[i] = QChar(d->utf16[i]);
+ return str;
+#endif
+ }
+};
+
+class Latin1String
+{
+public:
+ explicit Latin1String(const char *data) : d(reinterpret_cast<const Data *>(data)) {}
+
+ struct Data {
+ qle_ushort length;
+ char latin1[1];
+ };
+ const Data *d;
+
+ uint byteSize() const { return sizeof(ushort) + sizeof(char) * (d->length); }
+ bool isValid(uint maxSize) const { return byteSize() <= maxSize; }
+
+ static void copy(char *dest, QStringView src)
+ {
+ Data *data = reinterpret_cast<Data *>(dest);
+ data->length = src.length();
+ auto *l = reinterpret_cast<uchar *>(data->latin1);
+ const auto *uc = reinterpret_cast<const ushort *>(src.utf16());
+ qt_to_latin1_unchecked(l, uc, data->length);
+
+ for (uint len = data->length; quintptr(l + len) & 0x3; ++len)
+ l[len] = 0;
+ }
+
+ QLatin1String toQLatin1String() const noexcept { return QLatin1String(d->latin1, d->length); }
+ QString toString() const { return QString::fromLatin1(d->latin1, d->length); }
+};
+
+static inline void copyString(char *dest, QStringView str, bool compress)
+{
+ if (compress)
+ Latin1String::copy(dest, str);
+ else
+ String::copy(dest, str);
+}
+
+/*
+ Base is the base class for both Object and Array. Both classes work more or less the same way.
+ The class starts with a header (defined by the struct below), then followed by data (the data for
+ values in the Array case and Entry's (see below) for objects.
+
+ After the data a table follows (tableOffset points to it) containing Value objects for Arrays, and
+ offsets from the beginning of the object to Entry's in the case of Object.
+
+ Entry's in the Object's table are lexicographically sorted by key in the table(). This allows the usage
+ of a binary search over the keys in an Object.
+ */
+class Base
+{
+public:
+ qle_uint size;
+ union {
+ uint _dummy;
+ qle_bitfield<0, 1> is_object;
+ qle_bitfield<1, 31> length;
+ };
+ offset tableOffset;
+ // content follows here
+
+ bool isObject() const { return !!is_object; }
+ bool isArray() const { return !isObject(); }
+
+ offset *table()
+ {
+ return reinterpret_cast<offset *>(reinterpret_cast<char *>(this) + tableOffset);
+ }
+
+ const offset *table() const
+ {
+ return reinterpret_cast<const offset *>(reinterpret_cast<const char *>(this) + tableOffset);
+ }
+
+ uint reserveSpace(uint dataSize, uint posInTable, uint numItems, bool replace);
+};
+
+class Object : public Base
+{
+public:
+ const Entry *entryAt(uint i) const
+ {
+ return reinterpret_cast<const Entry *>(reinterpret_cast<const char *>(this) + table()[i]);
+ }
+
+ Entry *entryAt(uint i)
+ {
+ return reinterpret_cast<Entry *>(reinterpret_cast<char *>(this) + table()[i]);
+ }
+
+ uint indexOf(QStringView key, bool *exists) const;
+ QJsonObject toJsonObject() const;
+ bool isValid(uint maxSize) const;
+};
+
+class Array : public Base
+{
+public:
+ const Value *at(uint i) const { return reinterpret_cast<const Value *>(table() + i); }
+ Value *at(uint i) { return reinterpret_cast<Value *>(table() + i); }
+
+ QJsonArray toJsonArray() const;
+ bool isValid(uint maxSize) const;
+};
+
+class Value
+{
+public:
+ enum {
+ MaxSize = (1 << 27) - 1
+ };
+ union {
+ uint _dummy;
+ qle_bitfield<0, 3> type;
+ qle_bitfield<3, 1> latinOrIntValue;
+ qle_bitfield<4, 1> latinKey;
+ qle_bitfield<5, 27> value;
+ qle_signedbitfield<5, 27> int_value;
+ };
+
+ inline const char *data(const Base *b) const
+ {
+ return reinterpret_cast<const char *>(b) + value;
+ }
+
+ uint usedStorage(const Base *b) const;
+
+ bool toBoolean() const
+ {
+ Q_ASSERT(type == QJsonValue::Bool);
+ return value != 0;
+ }
+
+ double toDouble(const Base *b) const
+ {
+ Q_ASSERT(type == QJsonValue::Double);
+ if (latinOrIntValue)
+ return int_value;
+
+ auto i = qFromLittleEndian<quint64>(reinterpret_cast<const uchar *>(b) + value);
+ double d;
+ memcpy(&d, &i, sizeof(double));
+ return d;
+ }
+
+ QString toString(const Base *b) const
+ {
+ return latinOrIntValue
+ ? asLatin1String(b).toString()
+ : asString(b).toString();
+ }
+
+ String asString(const Base *b) const
+ {
+ Q_ASSERT(type == QJsonValue::String && !latinOrIntValue);
+ return String(data(b));
+ }
+
+ Latin1String asLatin1String(const Base *b) const
+ {
+ Q_ASSERT(type == QJsonValue::String && latinOrIntValue);
+ return Latin1String(data(b));
+ }
+
+ const Base *base(const Base *b) const
+ {
+ Q_ASSERT(type == QJsonValue::Array || type == QJsonValue::Object);
+ return reinterpret_cast<const Base *>(data(b));
+ }
+
+ QJsonValue toJsonValue(const Base *b) const;
+ bool isValid(const Base *b) const;
+
+ static uint requiredStorage(const QBinaryJsonValue &v, bool *compressed);
+ static uint valueToStore(const QBinaryJsonValue &v, uint offset);
+ static void copyData(const QBinaryJsonValue &v, char *dest, bool compressed);
+};
+
+class Entry {
+public:
+ Value value;
+ // key
+ // value data follows key
+
+ uint size() const
+ {
+ uint s = sizeof(Entry);
+ if (value.latinKey)
+ s += shallowLatin1Key().byteSize();
+ else
+ s += shallowKey().byteSize();
+ return alignedSize(s);
+ }
+
+ uint usedStorage(Base *b) const
+ {
+ return size() + value.usedStorage(b);
+ }
+
+ String shallowKey() const
+ {
+ Q_ASSERT(!value.latinKey);
+ return String(reinterpret_cast<const char *>(this) + sizeof(Entry));
+ }
+
+ Latin1String shallowLatin1Key() const
+ {
+ Q_ASSERT(value.latinKey);
+ return Latin1String(reinterpret_cast<const char *>(this) + sizeof(Entry));
+ }
+
+ QString key() const
+ {
+ return value.latinKey
+ ? shallowLatin1Key().toString()
+ : shallowKey().toString();
+ }
+
+ bool isValid(uint maxSize) const
+ {
+ if (maxSize < sizeof(Entry))
+ return false;
+ maxSize -= sizeof(Entry);
+ return value.latinKey
+ ? shallowLatin1Key().isValid(maxSize)
+ : shallowKey().isValid(maxSize);
+ }
+
+ bool operator ==(QStringView key) const
+ {
+ return value.latinKey
+ ? (shallowLatin1Key().toQLatin1String() == key)
+ : (shallowKey() == key);
+ }
+
+ bool operator >=(QStringView key) const
+ {
+ return value.latinKey
+ ? (shallowLatin1Key().toQLatin1String() >= key)
+ : (shallowKey().toString() >= key);
+ }
+};
+
+class Header {
+public:
+ qle_uint tag; // 'qbjs'
+ qle_uint version; // 1
+ Base *root() { return reinterpret_cast<Base *>(this + 1); }
+ const Base *root() const { return reinterpret_cast<const Base *>(this + 1); }
+};
+
+class ConstData
+{
+ Q_DISABLE_COPY_MOVE(ConstData)
+public:
+ const uint alloc;
+ union {
+ const char *rawData;
+ const Header *header;
+ };
+
+ ConstData(const char *raw, uint a) : alloc(a), rawData(raw) {}
+ bool isValid() const;
+ QJsonDocument toJsonDocument() const;
+};
+
+class MutableData
+{
+ Q_DISABLE_COPY_MOVE(MutableData)
+public:
+ QAtomicInt ref;
+ uint alloc;
+ union {
+ char *rawData;
+ Header *header;
+ };
+ uint compactionCounter : 31;
+
+ MutableData(char *raw, uint a)
+ : alloc(a), rawData(raw), compactionCounter(0)
+ {
+ }
+
+ MutableData(uint reserved, QJsonValue::Type valueType)
+ : rawData(nullptr), compactionCounter(0)
+ {
+ Q_ASSERT(valueType == QJsonValue::Array || valueType == QJsonValue::Object);
+
+ alloc = sizeof(Header) + sizeof(Base) + reserved + sizeof(offset);
+ header = reinterpret_cast<Header *>(malloc(alloc));
+ Q_CHECK_PTR(header);
+ header->tag = QJsonDocument::BinaryFormatTag;
+ header->version = 1;
+ Base *b = header->root();
+ b->size = sizeof(Base);
+ b->is_object = (valueType == QJsonValue::Object);
+ b->tableOffset = sizeof(Base);
+ b->length = 0;
+ }
+
+ ~MutableData()
+ {
+ free(rawData);
+ }
+
+ MutableData *clone(const Base *b, uint reserve = 0)
+ {
+ uint size = sizeof(Header) + b->size;
+ if (b == header->root() && ref.loadRelaxed() == 1 && alloc >= size + reserve)
+ return this;
+
+ if (reserve) {
+ if (reserve < 128)
+ reserve = 128;
+ size = qMax(size + reserve, qMin(size *2, uint(Value::MaxSize)));
+ if (size > Value::MaxSize) {
+ qWarning("QJson: Document too large to store in data structure");
+ return nullptr;
+ }
+ }
+ char *raw = reinterpret_cast<char *>(malloc(size));
+ Q_CHECK_PTR(raw);
+ memcpy(raw + sizeof(Header), b, b->size);
+ auto *h = reinterpret_cast<Header *>(raw);
+ h->tag = QJsonDocument::BinaryFormatTag;
+ h->version = 1;
+ auto *d = new MutableData(raw, size);
+ d->compactionCounter = (b == header->root()) ? compactionCounter : 0;
+ return d;
+ }
+
+ char *takeRawData(uint *size)
+ {
+ *size = alloc;
+ char *result = rawData;
+ rawData = nullptr;
+ alloc = 0;
+ return result;
+ }
+
+ void compact();
+};
+
+} // namespace QBinaryJsonPrivate
+
+Q_DECLARE_TYPEINFO(QBinaryJsonPrivate::Value, Q_PRIMITIVE_TYPE);
+
+QT_END_NAMESPACE
+
+#endif // QBINARYJSON_P_H
diff --git a/src/corelib/serialization/qbinaryjsonarray.cpp b/src/corelib/serialization/qbinaryjsonarray.cpp
new file mode 100644
index 0000000000..68937fe17d
--- /dev/null
+++ b/src/corelib/serialization/qbinaryjsonarray.cpp
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qbinaryjsonarray_p.h"
+#include "qbinaryjson_p.h"
+
+#include <qjsonarray.h>
+
+QT_BEGIN_NAMESPACE
+
+QBinaryJsonArray::~QBinaryJsonArray()
+{
+ if (d && !d->ref.deref())
+ delete d;
+}
+
+QBinaryJsonArray QBinaryJsonArray::fromJsonArray(const QJsonArray &array)
+{
+ QBinaryJsonArray binary;
+ for (const QJsonValue &value : array)
+ binary.append(QBinaryJsonValue::fromJsonValue(value));
+ if (binary.d) // We want to compact it as it is a root item now
+ binary.d->compactionCounter++;
+ binary.compact();
+ return binary;
+}
+
+void QBinaryJsonArray::append(const QBinaryJsonValue &value)
+{
+ const uint i = a ? a->length : 0;
+
+ bool compressed;
+ uint valueSize = QBinaryJsonPrivate::Value::requiredStorage(value, &compressed);
+
+ if (!detach(valueSize + sizeof(QBinaryJsonPrivate::Value)))
+ return;
+
+ if (!a->length)
+ a->tableOffset = sizeof(QBinaryJsonPrivate::Array);
+
+ uint valueOffset = a->reserveSpace(valueSize, i, 1, false);
+ if (!valueOffset)
+ return;
+
+ QBinaryJsonPrivate::Value *v = a->at(i);
+ v->type = (value.t == QJsonValue::Undefined ? QJsonValue::Null : value.t);
+ v->latinOrIntValue = compressed;
+ v->latinKey = false;
+ v->value = QBinaryJsonPrivate::Value::valueToStore(value, valueOffset);
+ if (valueSize) {
+ QBinaryJsonPrivate::Value::copyData(value, reinterpret_cast<char *>(a) + valueOffset,
+ compressed);
+ }
+}
+
+char *QBinaryJsonArray::takeRawData(uint *size)
+{
+ if (d)
+ return d->takeRawData(size);
+ *size = 0;
+ return nullptr;
+}
+
+bool QBinaryJsonArray::detach(uint reserve)
+{
+ if (!d) {
+ if (reserve >= QBinaryJsonPrivate::Value::MaxSize) {
+ qWarning("QBinaryJson: Document too large to store in data structure");
+ return false;
+ }
+ d = new QBinaryJsonPrivate::MutableData(reserve, QJsonValue::Array);
+ a = static_cast<QBinaryJsonPrivate::Array *>(d->header->root());
+ d->ref.ref();
+ return true;
+ }
+ if (reserve == 0 && d->ref.loadRelaxed() == 1)
+ return true;
+
+ QBinaryJsonPrivate::MutableData *x = d->clone(a, reserve);
+ if (!x)
+ return false;
+ x->ref.ref();
+ if (!d->ref.deref())
+ delete d;
+ d = x;
+ a = static_cast<QBinaryJsonPrivate::Array *>(d->header->root());
+ return true;
+}
+
+void QBinaryJsonArray::compact()
+{
+ if (!d || !d->compactionCounter)
+ return;
+
+ detach();
+ d->compact();
+ a = static_cast<QBinaryJsonPrivate::Array *>(d->header->root());
+}
+
+QT_END_NAMESPACE
+
diff --git a/src/corelib/serialization/qbinaryjsonarray_p.h b/src/corelib/serialization/qbinaryjsonarray_p.h
new file mode 100644
index 0000000000..2bb8fed387
--- /dev/null
+++ b/src/corelib/serialization/qbinaryjsonarray_p.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QBINARYJSONARRAY_P_H
+#define QBINARYJSONARRAY_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qbinaryjsonvalue_p.h"
+
+QT_REQUIRE_CONFIG(binaryjson);
+
+QT_BEGIN_NAMESPACE
+
+class QBinaryJsonArray
+{
+ Q_DISABLE_COPY(QBinaryJsonArray)
+public:
+ QBinaryJsonArray() = default;
+ ~QBinaryJsonArray();
+
+ QBinaryJsonArray(QBinaryJsonArray &&other) noexcept
+ : d(other.d),
+ a(other.a)
+ {
+ other.d = nullptr;
+ other.a = nullptr;
+ }
+
+ QBinaryJsonArray &operator =(QBinaryJsonArray &&other) noexcept
+ {
+ qSwap(d, other.d);
+ qSwap(a, other.a);
+ return *this;
+ }
+
+ static QBinaryJsonArray fromJsonArray(const QJsonArray &array);
+ char *takeRawData(uint *size);
+
+private:
+ friend class QBinaryJsonValue;
+
+ void append(const QBinaryJsonValue &value);
+ void compact();
+ bool detach(uint reserve = 0);
+
+ QBinaryJsonPrivate::MutableData *d = nullptr;
+ QBinaryJsonPrivate::Array *a = nullptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QBINARYJSONARRAY_P_H
diff --git a/src/corelib/serialization/qbinaryjsonobject.cpp b/src/corelib/serialization/qbinaryjsonobject.cpp
new file mode 100644
index 0000000000..3186ab6087
--- /dev/null
+++ b/src/corelib/serialization/qbinaryjsonobject.cpp
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qbinaryjsonobject_p.h"
+#include "qbinaryjson_p.h"
+
+#include <qjsonobject.h>
+
+QT_BEGIN_NAMESPACE
+
+QBinaryJsonObject::~QBinaryJsonObject()
+{
+ if (d && !d->ref.deref())
+ delete d;
+}
+
+QBinaryJsonObject QBinaryJsonObject::fromJsonObject(const QJsonObject &object)
+{
+ QBinaryJsonObject binary;
+ for (auto it = object.begin(), end = object.end(); it != end; ++it)
+ binary.insert(it.key(), QBinaryJsonValue::fromJsonValue(it.value()));
+ if (binary.d) // We want to compact it as it is a root item now
+ binary.d->compactionCounter++;
+ binary.compact();
+ return binary;
+}
+
+void QBinaryJsonObject::insert(const QString &key, const QBinaryJsonValue &value)
+{
+ bool latinOrIntValue;
+ uint valueSize = QBinaryJsonPrivate::Value::requiredStorage(value, &latinOrIntValue);
+
+ bool latinKey = QBinaryJsonPrivate::useCompressed(key);
+ uint valueOffset = sizeof(QBinaryJsonPrivate::Entry)
+ + QBinaryJsonPrivate::qStringSize(key, latinKey);
+ uint requiredSize = valueOffset + valueSize;
+
+ if (!detach(requiredSize + sizeof(QBinaryJsonPrivate::offset))) // offset for the new index entry
+ return;
+
+ if (!o->length)
+ o->tableOffset = sizeof(QBinaryJsonPrivate::Object);
+
+ bool keyExists = false;
+ uint pos = o->indexOf(key, &keyExists);
+ if (keyExists)
+ ++d->compactionCounter;
+
+ uint off = o->reserveSpace(requiredSize, pos, 1, keyExists);
+ if (!off)
+ return;
+
+ QBinaryJsonPrivate::Entry *e = o->entryAt(pos);
+ e->value.type = value.t;
+ e->value.latinKey = latinKey;
+ e->value.latinOrIntValue = latinOrIntValue;
+ e->value.value = QBinaryJsonPrivate::Value::valueToStore(
+ value, reinterpret_cast<char *>(e) - reinterpret_cast<char *>(o) + valueOffset);
+ QBinaryJsonPrivate::copyString(reinterpret_cast<char *>(e + 1), key, latinKey);
+ if (valueSize) {
+ QBinaryJsonPrivate::Value::copyData(value, reinterpret_cast<char *>(e) + valueOffset,
+ latinOrIntValue);
+ }
+
+ if (d->compactionCounter > 32U && d->compactionCounter >= unsigned(o->length) / 2U)
+ compact();
+}
+
+char *QBinaryJsonObject::takeRawData(uint *size) const
+{
+ if (d)
+ return d->takeRawData(size);
+ *size = 0;
+ return nullptr;
+}
+
+bool QBinaryJsonObject::detach(uint reserve)
+{
+ if (!d) {
+ if (reserve >= QBinaryJsonPrivate::Value::MaxSize) {
+ qWarning("QBinaryJson: Document too large to store in data structure");
+ return false;
+ }
+ d = new QBinaryJsonPrivate::MutableData(reserve, QJsonValue::Object);
+ o = static_cast<QBinaryJsonPrivate::Object *>(d->header->root());
+ d->ref.ref();
+ return true;
+ }
+ if (reserve == 0 && d->ref.loadRelaxed() == 1)
+ return true;
+
+ QBinaryJsonPrivate::MutableData *x = d->clone(o, reserve);
+ if (!x)
+ return false;
+ x->ref.ref();
+ if (!d->ref.deref())
+ delete d;
+ d = x;
+ o = static_cast<QBinaryJsonPrivate::Object *>(d->header->root());
+ return true;
+}
+
+void QBinaryJsonObject::compact()
+{
+ if (!d || !d->compactionCounter)
+ return;
+
+ detach();
+ d->compact();
+ o = static_cast<QBinaryJsonPrivate::Object *>(d->header->root());
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/serialization/qbinaryjsonobject_p.h b/src/corelib/serialization/qbinaryjsonobject_p.h
new file mode 100644
index 0000000000..c0991ac339
--- /dev/null
+++ b/src/corelib/serialization/qbinaryjsonobject_p.h
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QBINARYJSONOBJECT_H
+#define QBINARYJSONOBJECT_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qbinaryjsonvalue_p.h"
+
+QT_REQUIRE_CONFIG(binaryjson);
+
+QT_BEGIN_NAMESPACE
+
+class QBinaryJsonObject
+{
+ Q_DISABLE_COPY(QBinaryJsonObject)
+public:
+ QBinaryJsonObject() = default;
+ ~QBinaryJsonObject();
+
+ QBinaryJsonObject(QBinaryJsonObject &&other) noexcept
+ : d(other.d), o(other.o)
+ {
+ other.d = nullptr;
+ other.o = nullptr;
+ }
+
+ QBinaryJsonObject &operator =(QBinaryJsonObject &&other) noexcept
+ {
+ qSwap(d, other.d);
+ qSwap(o, other.o);
+ return *this;
+ }
+
+ static QBinaryJsonObject fromJsonObject(const QJsonObject &object);
+ char *takeRawData(uint *size) const;
+
+private:
+ friend class QBinaryJsonValue;
+
+ void insert(const QString &key, const QBinaryJsonValue &value);
+ bool detach(uint reserve = 0);
+ void compact();
+
+ QBinaryJsonPrivate::MutableData *d = nullptr;
+ QBinaryJsonPrivate::Object *o = nullptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QBINARYJSONOBJECT_P_H
diff --git a/src/corelib/serialization/qbinaryjsonvalue.cpp b/src/corelib/serialization/qbinaryjsonvalue.cpp
new file mode 100644
index 0000000000..5e3a01ad38
--- /dev/null
+++ b/src/corelib/serialization/qbinaryjsonvalue.cpp
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qbinaryjsonobject_p.h"
+#include "qbinaryjsonvalue_p.h"
+#include "qbinaryjsonarray_p.h"
+#include "qbinaryjson_p.h"
+
+#include <qjsonarray.h>
+#include <qjsonobject.h>
+
+QT_BEGIN_NAMESPACE
+
+QBinaryJsonValue::QBinaryJsonValue(QBinaryJsonPrivate::MutableData *data,
+ QBinaryJsonPrivate::Base *parent,
+ const QBinaryJsonPrivate::Value &v)
+ : t(QJsonValue::Type(uint(v.type)))
+{
+ switch (t) {
+ case QJsonValue::Undefined:
+ case QJsonValue::Null:
+ dbl = 0;
+ break;
+ case QJsonValue::Bool:
+ b = v.toBoolean();
+ break;
+ case QJsonValue::Double:
+ dbl = v.toDouble(parent);
+ break;
+ case QJsonValue::String: {
+ QString s = v.toString(parent);
+ stringData = s.data_ptr();
+ stringData->ref.ref();
+ break;
+ }
+ case QJsonValue::Array:
+ case QJsonValue::Object:
+ d = data;
+ base = v.base(parent);
+ break;
+ }
+ if (d)
+ d->ref.ref();
+}
+
+QBinaryJsonValue::QBinaryJsonValue(QString string)
+ : stringData(*reinterpret_cast<QStringData **>(&string)), t(QJsonValue::String)
+{
+ stringData->ref.ref();
+}
+
+QBinaryJsonValue::QBinaryJsonValue(const QBinaryJsonArray &a)
+ : base(a.a), d(a.d), t(QJsonValue::Array)
+{
+ if (d)
+ d->ref.ref();
+}
+
+QBinaryJsonValue::QBinaryJsonValue(const QBinaryJsonObject &o)
+ : base(o.o), d(o.d), t(QJsonValue::Object)
+{
+ if (d)
+ d->ref.ref();
+}
+
+QBinaryJsonValue::~QBinaryJsonValue()
+{
+ if (t == QJsonValue::String && stringData && !stringData->ref.deref())
+ free(stringData);
+
+ if (d && !d->ref.deref())
+ delete d;
+}
+
+QBinaryJsonValue QBinaryJsonValue::fromJsonValue(const QJsonValue &json)
+{
+ switch (json.type()) {
+ case QJsonValue::Bool:
+ return QBinaryJsonValue(json.toBool());
+ case QJsonValue::Double:
+ return QBinaryJsonValue(json.toDouble());
+ case QJsonValue::String:
+ return QBinaryJsonValue(json.toString());
+ case QJsonValue::Array:
+ return QBinaryJsonArray::fromJsonArray(json.toArray());
+ case QJsonValue::Object:
+ return QBinaryJsonObject::fromJsonObject(json.toObject());
+ case QJsonValue::Null:
+ return QBinaryJsonValue(QJsonValue::Null);
+ case QJsonValue::Undefined:
+ return QBinaryJsonValue(QJsonValue::Undefined);
+ }
+ Q_UNREACHABLE();
+ return QBinaryJsonValue(QJsonValue::Null);
+}
+
+QString QBinaryJsonValue::toString() const
+{
+ if (t != QJsonValue::String)
+ return QString();
+ stringData->ref.ref(); // the constructor below doesn't add a ref.
+ QStringDataPtr holder = { stringData };
+ return QString(holder);
+}
+
+void QBinaryJsonValue::detach()
+{
+ if (!d)
+ return;
+
+ QBinaryJsonPrivate::MutableData *x = d->clone(base);
+ x->ref.ref();
+ if (!d->ref.deref())
+ delete d;
+ d = x;
+ base = static_cast<QBinaryJsonPrivate::Object *>(d->header->root());
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/serialization/qbinaryjsonvalue_p.h b/src/corelib/serialization/qbinaryjsonvalue_p.h
new file mode 100644
index 0000000000..498fc62ecd
--- /dev/null
+++ b/src/corelib/serialization/qbinaryjsonvalue_p.h
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QBINARYJSONVALUE_P_H
+#define QBINARYJSONVALUE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qglobal.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qjsonvalue.h>
+
+QT_REQUIRE_CONFIG(binaryjson);
+
+QT_BEGIN_NAMESPACE
+
+class QBinaryJsonArray;
+class QBinaryJsonObject;
+
+namespace QBinaryJsonPrivate {
+class ConstData;
+class MutableData;
+class Base;
+class Value;
+class Object;
+class Array;
+}
+
+class Q_CORE_EXPORT QBinaryJsonValue
+{
+ Q_DISABLE_COPY(QBinaryJsonValue)
+public:
+ explicit QBinaryJsonValue(QJsonValue::Type type) : ui(0), t(type) {}
+ explicit QBinaryJsonValue(bool b) : b(b), t(QJsonValue::Bool) {}
+ explicit QBinaryJsonValue(double n) : dbl(n), t(QJsonValue::Double) {}
+ explicit QBinaryJsonValue(QString s);
+ QBinaryJsonValue(const QBinaryJsonArray &a);
+ QBinaryJsonValue(const QBinaryJsonObject &o);
+
+ ~QBinaryJsonValue();
+
+ QBinaryJsonValue(QBinaryJsonValue &&other) noexcept
+ : ui(other.ui),
+ d(other.d),
+ t(other.t)
+ {
+ other.ui = 0;
+ other.d = nullptr;
+ other.t = QJsonValue::Null;
+ }
+
+ QBinaryJsonValue &operator =(QBinaryJsonValue &&other) noexcept
+ {
+ qSwap(ui, other.ui);
+ qSwap(d, other.d);
+ qSwap(t, other.t);
+ return *this;
+ }
+
+ static QBinaryJsonValue fromJsonValue(const QJsonValue &json);
+ QJsonValue::Type type() const { return t; }
+ bool toBool() const { return (t == QJsonValue::Bool) && b; }
+ double toDouble() const { return (t == QJsonValue::Double) ? dbl : 0; }
+ QString toString() const;
+
+private:
+ friend class QBinaryJsonPrivate::Value;
+ friend class QBinaryJsonArray;
+ friend class QBinaryJsonObject;
+
+ QBinaryJsonValue(QBinaryJsonPrivate::MutableData *d, QBinaryJsonPrivate::Base *parent,
+ const QBinaryJsonPrivate::Value &v);
+
+ void detach();
+
+ union {
+ quint64 ui;
+ bool b;
+ double dbl;
+ QStringData *stringData;
+ const QBinaryJsonPrivate::Base *base;
+ };
+ QBinaryJsonPrivate::MutableData *d = nullptr; // needed for Objects and Arrays
+ QJsonValue::Type t = QJsonValue::Null;
+};
+
+QT_END_NAMESPACE
+
+#endif // QBINARYJSONVALUE_P_H
diff --git a/src/corelib/serialization/qcborcommon.cpp b/src/corelib/serialization/qcborcommon.cpp
new file mode 100644
index 0000000000..37fb198744
--- /dev/null
+++ b/src/corelib/serialization/qcborcommon.cpp
@@ -0,0 +1,328 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Intel Corporation.
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#define CBOR_NO_ENCODER_API
+#define CBOR_NO_PARSER_API
+#include "qcborcommon_p.h"
+
+#include <QtCore/qdatastream.h>
+
+QT_BEGIN_NAMESPACE
+
+#include <cborerrorstrings.c>
+
+/*!
+ \headerfile <QtCborCommon>
+
+ \brief The <QtCborCommon> header contains definitions common to both the
+ streaming classes (QCborStreamReader and QCborStreamWriter) and to
+ QCborValue.
+ */
+
+/*!
+ \enum QCborSimpleType
+ \relates <QtCborCommon>
+
+ This enum contains the possible "Simple Types" for CBOR. Simple Types range
+ from 0 to 255 and are types that carry no further value.
+
+ The following values are currently known:
+
+ \value False A "false" boolean.
+ \value True A "true" boolean.
+ \value Null Absence of value (null).
+ \value Undefined Missing or deleted value, usually an error.
+
+ Qt CBOR API supports encoding and decoding any Simple Type, whether one of
+ those above or any other value.
+
+ Applications should only use further values if a corresponding specification
+ has been published, otherwise interpretation and validation by the remote
+ may fail. Values 24 to 31 are reserved and must not be used.
+
+ The current authoritative list is maintained by IANA in the
+ \l{https://www.iana.org/assignments/cbor-simple-values/cbor-simple-values.xml}{Simple
+ Values registry}.
+
+ \sa QCborStreamWriter::append(QCborSimpleType), QCborStreamReader::isSimpleType(),
+ QCborStreamReader::toSimpleType(), QCborValue::isSimpleType(), QCborValue::toSimpleType()
+ */
+
+#if !defined(QT_NO_DATASTREAM)
+QDataStream &operator<<(QDataStream &ds, QCborSimpleType st)
+{
+ return ds << quint8(st);
+}
+
+QDataStream &operator>>(QDataStream &ds, QCborSimpleType &st)
+{
+ quint8 v;
+ ds >> v;
+ st = QCborSimpleType(v);
+ return ds;
+}
+#endif
+
+/*!
+ \enum QCborTag
+ \relates <QtCborCommon>
+
+ This enum contains no enumeration and is used only to provide type-safe
+ access to a CBOR tag.
+
+ CBOR tags are 64-bit numbers that are attached to generic CBOR types to
+ provide further semantic meaning. QCborTag may be constructed from an
+ enumeration found in QCborKnownTags or directly by providing the numeric
+ representation.
+
+ For example, the following creates a QCborValue containing a byte array
+ tagged with a tag 2.
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 0
+
+ \sa QCborKnownTags, QCborStreamWriter::append(QCborTag),
+ QCborStreamReader::isTag(), QCborStreamReader::toTag(),
+ QCborValue::isTag(), QCborValue::tag()
+ */
+
+/*!
+ \enum QCborKnownTags
+ \relates <QtCborCommon>
+
+ This enum contains a list of CBOR tags, known at the time of the Qt
+ implementation. This list is not meant to be complete and contains only
+ tags that are either backed by an RFC or specifically used by the Qt
+ implementation.
+
+ The authoritative list is maintained by IANA in the
+ \l{https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml}{CBOR tag
+ registry}.
+
+ \value DateTimeString A date and time string, formatted according to RFC 3339, as refined
+ by RFC 4287. It is the same format as Qt::ISODate and
+ Qt::ISODateWithMs.
+ \value UnixTime_t A numerical representation of seconds elapsed since
+ 1970-01-01T00:00Z.
+ \value PositiveBignum A positive number of arbitrary length, encoded as a byte array in
+ network byte order. For example, the number 2\sup{64} is represented by
+ a byte array containing the byte value 0x01 followed by 8 zero bytes.
+ \value NegativeBignum A negative number of arbirary length, encoded as the absolute value
+ of that number, minus one. For example, a byte array containing
+ byte value 0x02 followed by 8 zero bytes represents the number
+ -2\sup{65} - 1.
+ \value Decimal A decimal fraction, encoded as an array of two integers: the first
+ is the exponent of the power of 10, the second the integral
+ mantissa. The value 273.15 would be encoded as array \c{[-2, 27315]}.
+ \value Bigfloat Similar to Decimal, but the exponent is a power of 2 instead.
+ \value COSE_Encrypt0 An \c Encrypt0 map as specified by \l{https://tools.ietf.org/html/rfc8152}{RFC 8152}
+ (CBOR Object Signing and Encryption).
+ \value COSE_Mac0 A \c Mac0 map as specified by \l{https://tools.ietf.org/html/rfc8152}{RFC 8152}
+ (CBOR Object Signing and Encryption).
+ \value COSE_Sign1 A \c Sign1 map as specified by \l{https://tools.ietf.org/html/rfc8152}{RFC 8152}
+ (CBOR Object Signing and Encryption).
+ \value ExpectedBase64url Indicates that the byte array should be encoded using Base64url
+ if the stream is converted to JSON.
+ \value ExpectedBase64 Indicates that the byte array should be encoded using Base64
+ if the stream is converted to JSON.
+ \value ExpectedBase16 Indicates that the byte array should be encoded using Base16 (hex)
+ if the stream is converted to JSON.
+ \value EncodedCbor Indicates that the byte array contains a CBOR stream.
+ \value Url Indicates that the string contains a URL.
+ \value Base64url Indicates that the string contains data encoded using Base64url.
+ \value Base64 Indicates that the string contains data encoded using Base64.
+ \value RegularExpression Indicates that the string contains a Perl-Compatible Regular
+ Expression pattern.
+ \value MimeMessage Indicates that the string contains a MIME message (according to
+ \l{https://tools.ietf.org/html/rfc2045}){RFC 2045}.
+ \value Uuid Indicates that the byte array contains a UUID.
+ \value COSE_Encrypt An \c Encrypt map as specified by \l{https://tools.ietf.org/html/rfc8152}{RFC 8152}
+ (CBOR Object Signing and Encryption).
+ \value COSE_Mac A \c Mac map as specified by \l{https://tools.ietf.org/html/rfc8152}{RFC 8152}
+ (CBOR Object Signing and Encryption).
+ \value COSE_Sign A \c Sign map as specified by \l{https://tools.ietf.org/html/rfc8152}{RFC 8152}
+ (CBOR Object Signing and Encryption).
+ \value Signature No change in interpretation; this tag can be used as the outermost
+ tag in a CBOR stream as the file header.
+
+ The following tags are interpreted by QCborValue during decoding and will
+ produce objects with extended Qt types, and it will use those tags when
+ encoding the same extended types.
+
+ \value DateTimeString \l QDateTime
+ \value UnixTime_t \l QDateTime (only in decoding)
+ \value Url \l QUrl
+ \value Uuid \l QUuid
+
+ Additionally, if a QCborValue containing a QByteArray is tagged using one of
+ \c ExpectedBase64url, \c ExpectedBase64 or \c ExpectedBase16, QCborValue
+ will use the expected encoding when converting to JSON (see
+ QCborValue::toJsonValue).
+
+ \sa QCborTag, QCborStreamWriter::append(QCborTag),
+ QCborStreamReader::isTag(), QCborStreamReader::toTag(),
+ QCborValue::isTag(), QCborValue::tag()
+ */
+
+/*!
+ \class QCborError
+ \inmodule QtCore
+ \relates <QtCborCommon>
+ \reentrant
+ \since 5.12
+
+ \brief The QCborError class holds the error condition found while parsing or
+ validating a CBOR stream.
+
+ \sa QCborStreamReader, QCborValue, QCborParserError
+ */
+
+/*!
+ \enum QCborError::Code
+
+ This enum contains the possible error condition codes.
+
+ \value NoError No error was detected.
+ \value UnknownError An unknown error occurred and no further details are available.
+ \value AdvancePastEnd QCborStreamReader::next() was called but there are no more elements in
+ the current context.
+ \value InputOutputError An I/O error with the QIODevice occurred.
+ \value GarbageAtEnd Data was found in the input stream after the last element.
+ \value EndOfFile The end of the input stream was unexpectedly reached while processing an
+ element.
+ \value UnexpectedBreak The CBOR stream contains a Break where it is not allowed (data is
+ corrupt and the error is not recoverable).
+ \value UnknownType The CBOR stream contains an unknown/unparseable Type (data is corrupt
+ and the and the error is not recoverable).
+ \value IllegalType The CBOR stream contains a known type in a position it is not allowed
+ to exist (data is corrupt and the error is not recoverable).
+ \value IllegalNumber The CBOR stream appears to be encoding a number larger than 64-bit
+ (data is corrupt and the error is not recoverable).
+ \value IllegalSimpleType The CBOR stream contains a Simple Type encoded incorrectly (data is
+ corrupt and the error is not recoverable).
+ \value InvalidUtf8String The CBOR stream contains a text string that does not decode properly
+ as UTF-8 (data is corrupt and the error is not recoverable).
+ \value DataTooLarge CBOR string, map or array is too big and cannot be parsed by Qt
+ (internal limitation, but the error is not recoverable).
+ \value NestingTooDeep Too many levels of arrays or maps encountered while processing the
+ input (internal limitation, but the error is not recoverable).
+ \value UnsupportedType The CBOR stream contains a known type that the implementation does not
+ support (internal limitation, but the error is not recoverable).
+ */
+
+/*!
+ \variable QCborError::c
+ \internal
+ */
+
+/*!
+ \fn QCborError::operator Code() const
+
+ Returns the error code that this QCborError object stores.
+ */
+
+/*!
+ Returns a text string that matches the error code in this QCborError object.
+
+ Note: the string is not translated. Applications whose interface allow users
+ to parse CBOR streams need to provide their own, translated strings.
+
+ \sa QCborError::Code
+ */
+QString QCborError::toString() const
+{
+ switch (c) {
+ case NoError:
+ Q_STATIC_ASSERT(int(NoError) == int(CborNoError));
+ return QString();
+
+ case UnknownError:
+ Q_STATIC_ASSERT(int(UnknownError) == int(CborUnknownError));
+ return QStringLiteral("Unknown error");
+ case AdvancePastEnd:
+ Q_STATIC_ASSERT(int(AdvancePastEnd) == int(CborErrorAdvancePastEOF));
+ return QStringLiteral("Read past end of buffer (more bytes needed)");
+ case InputOutputError:
+ Q_STATIC_ASSERT(int(InputOutputError) == int(CborErrorIO));
+ return QStringLiteral("Input/Output error");
+ case GarbageAtEnd:
+ Q_STATIC_ASSERT(int(GarbageAtEnd) == int(CborErrorGarbageAtEnd));
+ return QStringLiteral("Data found after the end of the stream");
+ case EndOfFile:
+ Q_STATIC_ASSERT(int(EndOfFile) == int(CborErrorUnexpectedEOF));
+ return QStringLiteral("Unexpected end of input data (more bytes needed)");
+ case UnexpectedBreak:
+ Q_STATIC_ASSERT(int(UnexpectedBreak) == int(CborErrorUnexpectedBreak));
+ return QStringLiteral("Invalid CBOR stream: unexpected 'break' byte");
+ case UnknownType:
+ Q_STATIC_ASSERT(int(UnknownType) == int(CborErrorUnknownType));
+ return QStringLiteral("Invalid CBOR stream: unknown type");
+ case IllegalType:
+ Q_STATIC_ASSERT(int(IllegalType) == int(CborErrorIllegalType));
+ return QStringLiteral("Invalid CBOR stream: illegal type found");
+ case IllegalNumber:
+ Q_STATIC_ASSERT(int(IllegalNumber) == int(CborErrorIllegalNumber));
+ return QStringLiteral("Invalid CBOR stream: illegal number encoding (future extension)");
+ case IllegalSimpleType:
+ Q_STATIC_ASSERT(int(IllegalSimpleType) == int(CborErrorIllegalSimpleType));
+ return QStringLiteral("Invalid CBOR stream: illegal simple type");
+ case InvalidUtf8String:
+ Q_STATIC_ASSERT(int(InvalidUtf8String) == int(CborErrorInvalidUtf8TextString));
+ return QStringLiteral("Invalid CBOR stream: invalid UTF-8 text string");
+ case DataTooLarge:
+ Q_STATIC_ASSERT(int(DataTooLarge) == int(CborErrorDataTooLarge));
+ return QStringLiteral("Internal limitation: data set too large");
+ case NestingTooDeep:
+ Q_STATIC_ASSERT(int(NestingTooDeep) == int(CborErrorNestingTooDeep));
+ return QStringLiteral("Internal limitation: data nesting too deep");
+ case UnsupportedType:
+ Q_STATIC_ASSERT(int(UnsupportedType) == int(CborErrorUnsupportedType));
+ return QStringLiteral("Internal limitation: unsupported type");
+ }
+
+ // get the error string from TinyCBOR
+ CborError err = CborError(int(c));
+ return QString::fromLatin1(cbor_error_string(err));
+}
+
+QT_END_NAMESPACE
+
+#ifndef QT_BOOTSTRAPPED
+#include "moc_qcborcommon.cpp"
+#endif
diff --git a/src/corelib/serialization/qcborcommon.h b/src/corelib/serialization/qcborcommon.h
index 3dfe50cd09..bec46399ce 100644
--- a/src/corelib/serialization/qcborcommon.h
+++ b/src/corelib/serialization/qcborcommon.h
@@ -148,6 +148,8 @@ inline uint qHash(QCborTag tag, uint seed = 0)
return qHash(quint64(tag), seed);
}
+enum class QCborNegativeInteger : quint64 {};
+
QT_END_NAMESPACE
Q_DECLARE_METATYPE(QCborTag)
diff --git a/src/corelib/serialization/qcborcommon_p.h b/src/corelib/serialization/qcborcommon_p.h
new file mode 100644
index 0000000000..9b7f4b7099
--- /dev/null
+++ b/src/corelib/serialization/qcborcommon_p.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Intel Corporation.
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCBORCOMMON_P_H
+#define QCBORCOMMON_P_H
+
+#include "qcborcommon.h"
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+QT_BEGIN_NAMESPACE
+
+#ifdef QT_NO_DEBUG
+# define NDEBUG 1
+#endif
+#undef assert
+#define assert Q_ASSERT
+
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_GCC("-Wunused-function")
+QT_WARNING_DISABLE_CLANG("-Wunused-function")
+QT_WARNING_DISABLE_CLANG("-Wundefined-internal")
+
+#define CBOR_NO_VALIDATION_API 1
+#define CBOR_NO_PRETTY_API 1
+#define CBOR_API static inline
+#define CBOR_PRIVATE_API static inline
+#define CBOR_INLINE_API static inline
+
+#include <cbor.h>
+
+QT_WARNING_POP
+
+Q_DECLARE_TYPEINFO(CborValue, Q_PRIMITIVE_TYPE);
+
+QT_END_NAMESPACE
+
+#endif // QCBORCOMMON_P_H
diff --git a/src/corelib/serialization/qcborstream.h b/src/corelib/serialization/qcborstream.h
index 7a451e63ac..f2b88820cd 100644
--- a/src/corelib/serialization/qcborstream.h
+++ b/src/corelib/serialization/qcborstream.h
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2019 The Qt Company Ltd.
** Copyright (C) 2018 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
@@ -40,228 +41,17 @@
#ifndef QCBORSTREAM_H
#define QCBORSTREAM_H
-#include <QtCore/qbytearray.h>
-#include <QtCore/qcborcommon.h>
-#include <QtCore/qfloat16.h>
-#include <QtCore/qscopedpointer.h>
-#include <QtCore/qstring.h>
-#include <QtCore/qstringview.h>
+#include <QtCore/qglobal.h>
-// See qcborcommon.h for why we check
-#if defined(QT_X11_DEFINES_FOUND)
-# undef True
-# undef False
+#if QT_CONFIG(cborstreamreader)
+#include <QtCore/qcborstreamreader.h>
#endif
-QT_BEGIN_NAMESPACE
-
-class QIODevice;
-
-enum class QCborNegativeInteger : quint64 {};
-
-class QCborStreamWriterPrivate;
-class Q_CORE_EXPORT QCborStreamWriter
-{
-public:
- explicit QCborStreamWriter(QIODevice *device);
- explicit QCborStreamWriter(QByteArray *data);
- ~QCborStreamWriter();
- Q_DISABLE_COPY(QCborStreamWriter)
-
- void setDevice(QIODevice *device);
- QIODevice *device() const;
-
- void append(quint64 u);
- void append(qint64 i);
- void append(QCborNegativeInteger n);
- void append(const QByteArray &ba) { appendByteString(ba.constData(), ba.size()); }
- void append(QLatin1String str);
- void append(QStringView str);
- void append(QCborTag tag);
- void append(QCborKnownTags tag) { append(QCborTag(tag)); }
- void append(QCborSimpleType st);
- void append(std::nullptr_t) { append(QCborSimpleType::Null); }
- void append(qfloat16 f);
- void append(float f);
- void append(double d);
-
- void appendByteString(const char *data, qsizetype len);
- void appendTextString(const char *utf8, qsizetype len);
-
- // convenience
- void append(bool b) { append(b ? QCborSimpleType::True : QCborSimpleType::False); }
- void appendNull() { append(QCborSimpleType::Null); }
- void appendUndefined() { append(QCborSimpleType::Undefined); }
-
-#ifndef Q_QDOC
- // overloads to make normal code not complain
- void append(int i) { append(qint64(i)); }
- void append(uint u) { append(quint64(u)); }
+#if QT_CONFIG(cborstreamwriter)
+#include <QtCore/qcborstreamwriter.h>
#endif
-#ifndef QT_NO_CAST_FROM_ASCII
- void append(const char *str, qsizetype size = -1)
- { appendTextString(str, (str && size == -1) ? int(strlen(str)) : size); }
-#endif
-
- void startArray();
- void startArray(quint64 count);
- bool endArray();
- void startMap();
- void startMap(quint64 count);
- bool endMap();
-
- // no API for encoding chunked strings
-
-private:
- QScopedPointer<QCborStreamWriterPrivate> d;
-};
-
-class QCborStreamReaderPrivate;
-class Q_CORE_EXPORT QCborStreamReader
-{
- Q_GADGET
-public:
- enum Type : quint8 {
- UnsignedInteger = 0x00,
- NegativeInteger = 0x20,
- ByteString = 0x40,
- ByteArray = ByteString,
- TextString = 0x60,
- String = TextString,
- Array = 0x80,
- Map = 0xa0,
- Tag = 0xc0,
- SimpleType = 0xe0,
- HalfFloat = 0xf9,
- Float16 = HalfFloat,
- Float = 0xfa,
- Double = 0xfb,
-
- Invalid = 0xff
- };
- Q_ENUM(Type)
-
- enum StringResultCode {
- EndOfString = 0,
- Ok = 1,
- Error = -1
- };
- template <typename Container> struct StringResult {
- Container data;
- StringResultCode status = Error;
- };
- Q_ENUM(StringResultCode)
-
- QCborStreamReader();
- QCborStreamReader(const char *data, qsizetype len);
- QCborStreamReader(const quint8 *data, qsizetype len);
- explicit QCborStreamReader(const QByteArray &data);
- explicit QCborStreamReader(QIODevice *device);
- ~QCborStreamReader();
- Q_DISABLE_COPY(QCborStreamReader)
-
- void setDevice(QIODevice *device);
- QIODevice *device() const;
- void addData(const QByteArray &data);
- void addData(const char *data, qsizetype len);
- void addData(const quint8 *data, qsizetype len)
- { addData(reinterpret_cast<const char *>(data), len); }
- void reparse();
- void clear();
- void reset();
-
- QCborError lastError();
-
- qint64 currentOffset() const;
-
- bool isValid() const { return !isInvalid(); }
-
- int containerDepth() const;
- QCborStreamReader::Type parentContainerType() const;
- bool hasNext() const noexcept Q_DECL_PURE_FUNCTION;
- bool next(int maxRecursion = 10000);
-
- Type type() const { return QCborStreamReader::Type(type_); }
- bool isUnsignedInteger() const { return type() == UnsignedInteger; }
- bool isNegativeInteger() const { return type() == NegativeInteger; }
- bool isInteger() const { return quint8(type()) <= quint8(NegativeInteger); }
- bool isByteArray() const { return type() == ByteArray; }
- bool isString() const { return type() == String; }
- bool isArray() const { return type() == Array; }
- bool isMap() const { return type() == Map; }
- bool isTag() const { return type() == Tag; }
- bool isSimpleType() const { return type() == SimpleType; }
- bool isFloat16() const { return type() == Float16; }
- bool isFloat() const { return type() == Float; }
- bool isDouble() const { return type() == Double; }
- bool isInvalid() const { return type() == Invalid; }
-
- bool isSimpleType(QCborSimpleType st) const { return isSimpleType() && toSimpleType() == st; }
- bool isFalse() const { return isSimpleType(QCborSimpleType::False); }
- bool isTrue() const { return isSimpleType(QCborSimpleType::True); }
- bool isBool() const { return isFalse() || isTrue(); }
- bool isNull() const { return isSimpleType(QCborSimpleType::Null); }
- bool isUndefined() const { return isSimpleType(QCborSimpleType::Undefined); }
-
- bool isLengthKnown() const noexcept Q_DECL_PURE_FUNCTION;
- quint64 length() const;
-
- bool isContainer() const { return isMap() || isArray(); }
- bool enterContainer() { Q_ASSERT(isContainer()); return _enterContainer_helper(); }
- bool leaveContainer();
-
- StringResult<QString> readString() { Q_ASSERT(isString()); return _readString_helper(); }
- StringResult<QByteArray> readByteArray(){ Q_ASSERT(isByteArray()); return _readByteArray_helper(); }
- qsizetype currentStringChunkSize() const{ Q_ASSERT(isString() || isByteArray()); return _currentStringChunkSize(); }
- StringResult<qsizetype> readStringChunk(char *ptr, qsizetype maxlen);
-
- bool toBool() const { Q_ASSERT(isBool()); return value64 - int(QCborSimpleType::False); }
- QCborTag toTag() const { Q_ASSERT(isTag()); return QCborTag(value64); }
- quint64 toUnsignedInteger() const { Q_ASSERT(isUnsignedInteger()); return value64; }
- QCborNegativeInteger toNegativeInteger() const { Q_ASSERT(isNegativeInteger()); return QCborNegativeInteger(value64 + 1); }
- QCborSimpleType toSimpleType() const{ Q_ASSERT(isSimpleType()); return QCborSimpleType(value64); }
- qfloat16 toFloat16() const { Q_ASSERT(isFloat16()); return _toFloatingPoint<qfloat16>(); }
- float toFloat() const { Q_ASSERT(isFloat()); return _toFloatingPoint<float>(); }
- double toDouble() const { Q_ASSERT(isDouble()); return _toFloatingPoint<double>(); }
-
- qint64 toInteger() const
- {
- Q_ASSERT(isInteger());
- qint64 v = qint64(value64);
- if (isNegativeInteger())
- return -v - 1;
- return v;
- }
-
-private:
- void preparse();
- bool _enterContainer_helper();
- StringResult<QString> _readString_helper();
- StringResult<QByteArray> _readByteArray_helper();
- qsizetype _currentStringChunkSize() const;
-
- template <typename FP> FP _toFloatingPoint() const noexcept
- {
- using UIntFP = typename QIntegerForSizeof<FP>::Unsigned;
- UIntFP u = UIntFP(value64);
- FP f;
- memcpy(static_cast<void *>(&f), &u, sizeof(f));
- return f;
- }
-
- friend QCborStreamReaderPrivate;
- friend class QCborContainerPrivate;
- quint64 value64;
- QScopedPointer<QCborStreamReaderPrivate> d;
- quint8 type_;
- quint8 reserved[3] = {};
-};
+QT_BEGIN_NAMESPACE
QT_END_NAMESPACE
-#if defined(QT_X11_DEFINES_FOUND)
-# define True 1
-# define False 0
-#endif
-
#endif // QCBORSTREAM_H
diff --git a/src/corelib/serialization/qcborstream.cpp b/src/corelib/serialization/qcborstreamreader.cpp
index c598eee213..c983436606 100644
--- a/src/corelib/serialization/qcborstream.cpp
+++ b/src/corelib/serialization/qcborstreamreader.cpp
@@ -37,84 +37,46 @@
**
****************************************************************************/
-#include "qcborstream.h"
+#include "qcborstreamreader.h"
+
+#define CBOR_NO_ENCODER_API
+#include <private/qcborcommon_p.h>
#include <private/qnumeric_p.h>
#include <private/qutfcodec_p.h>
-#include <qbuffer.h>
#include <qdebug.h>
#include <qstack.h>
-#include <qdatastream.h>
QT_BEGIN_NAMESPACE
-#ifdef QT_NO_DEBUG
-# define NDEBUG 1
-#endif
-#undef assert
-#define assert Q_ASSERT
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_GCC("-Wunused-function")
-QT_WARNING_DISABLE_CLANG("-Wunused-function")
-QT_WARNING_DISABLE_CLANG("-Wundefined-internal")
-QT_WARNING_DISABLE_MSVC(4334) // '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
-
-#define CBOR_ENCODER_NO_CHECK_USER
-
-#define CBOR_NO_VALIDATION_API 1
-#define CBOR_NO_PRETTY_API 1
-#define CBOR_API static inline
-#define CBOR_PRIVATE_API static inline
-#define CBOR_INLINE_API static inline
-
-#include <cbor.h>
-
-static CborError qt_cbor_encoder_write_callback(void *token, const void *data, size_t len, CborEncoderAppendType);
static bool qt_cbor_decoder_can_read(void *token, size_t len);
static void qt_cbor_decoder_advance(void *token, size_t len);
static void *qt_cbor_decoder_read(void *token, void *userptr, size_t offset, size_t len);
static CborError qt_cbor_decoder_transfer_string(void *token, const void **userptr, size_t offset, size_t len);
-#define CBOR_ENCODER_WRITER_CONTROL 1
-#define CBOR_ENCODER_WRITE_FUNCTION qt_cbor_encoder_write_callback
-
#define CBOR_PARSER_READER_CONTROL 1
#define CBOR_PARSER_CAN_READ_BYTES_FUNCTION qt_cbor_decoder_can_read
#define CBOR_PARSER_ADVANCE_BYTES_FUNCTION qt_cbor_decoder_advance
#define CBOR_PARSER_TRANSFER_STRING_FUNCTION qt_cbor_decoder_transfer_string
#define CBOR_PARSER_READ_BYTES_FUNCTION qt_cbor_decoder_read
-#include "../3rdparty/tinycbor/src/cborencoder.c"
-#include "../3rdparty/tinycbor/src/cborerrorstrings.c"
-#include "../3rdparty/tinycbor/src/cborparser.c"
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_MSVC(4334) // '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
+
+#include <cborparser.c>
+
+QT_WARNING_POP
-// silence compilers that complain about this being a static function declared
-// but never defined
-static CborError cbor_encoder_close_container_checked(CborEncoder*, const CborEncoder*)
-{
- Q_UNREACHABLE();
- return CborErrorInternalError;
-}
static CborError _cbor_value_dup_string(const CborValue *, void **, size_t *, CborValue *)
{
Q_UNREACHABLE();
return CborErrorInternalError;
}
-static CborError cbor_value_get_half_float_as_float(const CborValue *, float *)
-{
- Q_UNREACHABLE();
- return CborErrorInternalError;
-}
-static CborError cbor_encode_float_as_half_float(CborEncoder *, float)
+static CborError Q_DECL_UNUSED cbor_value_get_half_float_as_float(const CborValue *, float *)
{
Q_UNREACHABLE();
return CborErrorInternalError;
}
-QT_WARNING_POP
-
-Q_DECLARE_TYPEINFO(CborEncoder, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(CborValue, Q_PRIMITIVE_TYPE);
// confirm our constants match TinyCBOR's
Q_STATIC_ASSERT(int(QCborStreamReader::UnsignedInteger) == CborIntegerType);
@@ -130,1195 +92,6 @@ Q_STATIC_ASSERT(int(QCborStreamReader::Double) == CborDoubleType);
Q_STATIC_ASSERT(int(QCborStreamReader::Invalid) == CborInvalidType);
/*!
- \headerfile <QtCborCommon>
-
- \brief The <QtCborCommon> header contains definitions common to both the
- streaming classes (QCborStreamReader and QCborStreamWriter) and to
- QCborValue.
- */
-
-/*!
- \enum QCborSimpleType
- \relates <QtCborCommon>
-
- This enum contains the possible "Simple Types" for CBOR. Simple Types range
- from 0 to 255 and are types that carry no further value.
-
- The following values are currently known:
-
- \value False A "false" boolean.
- \value True A "true" boolean.
- \value Null Absence of value (null).
- \value Undefined Missing or deleted value, usually an error.
-
- Qt CBOR API supports encoding and decoding any Simple Type, whether one of
- those above or any other value.
-
- Applications should only use further values if a corresponding specification
- has been published, otherwise interpretation and validation by the remote
- may fail. Values 24 to 31 are reserved and must not be used.
-
- The current authoritative list is maintained by IANA in the
- \l{https://www.iana.org/assignments/cbor-simple-values/cbor-simple-values.xml}{Simple
- Values registry}.
-
- \sa QCborStreamWriter::append(QCborSimpleType), QCborStreamReader::isSimpleType(),
- QCborStreamReader::toSimpleType(), QCborValue::isSimpleType(), QCborValue::toSimpleType()
- */
-
-Q_CORE_EXPORT const char *qt_cbor_simpletype_id(QCborSimpleType st)
-{
- switch (st) {
- case QCborSimpleType::False:
- return "False";
- case QCborSimpleType::True:
- return "True";
- case QCborSimpleType::Null:
- return "Null";
- case QCborSimpleType::Undefined:
- return "Undefined";
- }
- return nullptr;
-}
-
-#if !defined(QT_NO_DATASTREAM)
-QDataStream &operator<<(QDataStream &ds, QCborSimpleType st)
-{
- return ds << quint8(st);
-}
-
-QDataStream &operator>>(QDataStream &ds, QCborSimpleType &st)
-{
- quint8 v;
- ds >> v;
- st = QCborSimpleType(v);
- return ds;
-}
-#endif
-
-#if !defined(QT_NO_DEBUG_STREAM)
-QDebug operator<<(QDebug dbg, QCborSimpleType st)
-{
- QDebugStateSaver saver(dbg);
- const char *id = qt_cbor_simpletype_id(st);
- if (id)
- return dbg.nospace() << "QCborSimpleType::" << id;
-
- return dbg.nospace() << "QCborSimpleType(" << uint(st) << ')';
-}
-#endif
-
-/*!
- \enum QCborTag
- \relates <QtCborCommon>
-
- This enum contains no enumeration and is used only to provide type-safe
- access to a CBOR tag.
-
- CBOR tags are 64-bit numbers that are attached to generic CBOR types to
- provide further semantic meaning. QCborTag may be constructed from an
- enumeration found in QCborKnownTags or directly by providing the numeric
- representation.
-
- For example, the following creates a QCborValue containing a byte array
- tagged with a tag 2.
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 0
-
- \sa QCborKnownTags, QCborStreamWriter::append(QCborTag),
- QCborStreamReader::isTag(), QCborStreamReader::toTag(),
- QCborValue::isTag(), QCborValue::tag()
- */
-
-Q_CORE_EXPORT const char *qt_cbor_tag_id(QCborTag tag)
-{
- // Casting to QCborKnownTags's underlying type will make the comparison
- // below fail if the tag value is out of range.
- auto n = std::underlying_type<QCborKnownTags>::type(tag);
- if (QCborTag(n) == tag) {
- switch (QCborKnownTags(n)) {
- case QCborKnownTags::DateTimeString:
- return "DateTimeString";
- case QCborKnownTags::UnixTime_t:
- return "UnixTime_t";
- case QCborKnownTags::PositiveBignum:
- return "PositiveBignum";
- case QCborKnownTags::NegativeBignum:
- return "NegativeBignum";
- case QCborKnownTags::Decimal:
- return "Decimal";
- case QCborKnownTags::Bigfloat:
- return "Bigfloat";
- case QCborKnownTags::COSE_Encrypt0:
- return "COSE_Encrypt0";
- case QCborKnownTags::COSE_Mac0:
- return "COSE_Mac0";
- case QCborKnownTags::COSE_Sign1:
- return "COSE_Sign1";
- case QCborKnownTags::ExpectedBase64url:
- return "ExpectedBase64url";
- case QCborKnownTags::ExpectedBase64:
- return "ExpectedBase64";
- case QCborKnownTags::ExpectedBase16:
- return "ExpectedBase16";
- case QCborKnownTags::EncodedCbor:
- return "EncodedCbor";
- case QCborKnownTags::Url:
- return "Url";
- case QCborKnownTags::Base64url:
- return "Base64url";
- case QCborKnownTags::Base64:
- return "Base64";
- case QCborKnownTags::RegularExpression:
- return "RegularExpression";
- case QCborKnownTags::MimeMessage:
- return "MimeMessage";
- case QCborKnownTags::Uuid:
- return "Uuid";
- case QCborKnownTags::COSE_Encrypt:
- return "COSE_Encrypt";
- case QCborKnownTags::COSE_Mac:
- return "COSE_Mac";
- case QCborKnownTags::COSE_Sign:
- return "COSE_Sign";
- case QCborKnownTags::Signature:
- return "Signature";
- }
- }
- return nullptr;
-}
-
-#if !defined(QT_NO_DEBUG_STREAM)
-QDebug operator<<(QDebug dbg, QCborTag tag)
-{
- QDebugStateSaver saver(dbg);
- const char *id = qt_cbor_tag_id(tag);
- dbg.nospace() << "QCborTag(";
- if (id)
- dbg.nospace() << "QCborKnownTags::" << id;
- else
- dbg.nospace() << quint64(tag);
-
- return dbg << ')';
-}
-#endif
-
-/*!
- \enum QCborKnownTags
- \relates <QtCborCommon>
-
- This enum contains a list of CBOR tags, known at the time of the Qt
- implementation. This list is not meant to be complete and contains only
- tags that are either backed by an RFC or specifically used by the Qt
- implementation.
-
- The authoritative list is maintained by IANA in the
- \l{https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml}{CBOR tag
- registry}.
-
- \value DateTimeString A date and time string, formatted according to RFC 3339, as refined
- by RFC 4287. It is the same format as Qt::ISODate and
- Qt::ISODateWithMs.
- \value UnixTime_t A numerical representation of seconds elapsed since
- 1970-01-01T00:00Z.
- \value PositiveBignum A positive number of arbitrary length, encoded as a byte array in
- network byte order. For example, the number 2\sup{64} is represented by
- a byte array containing the byte value 0x01 followed by 8 zero bytes.
- \value NegativeBignum A negative number of arbirary length, encoded as the absolute value
- of that number, minus one. For example, a byte array containing
- byte value 0x02 followed by 8 zero bytes represents the number
- -2\sup{65} - 1.
- \value Decimal A decimal fraction, encoded as an array of two integers: the first
- is the exponent of the power of 10, the second the integral
- mantissa. The value 273.15 would be encoded as array \c{[-2, 27315]}.
- \value Bigfloat Similar to Decimal, but the exponent is a power of 2 instead.
- \value COSE_Encrypt0 An \c Encrypt0 map as specified by \l{https://tools.ietf.org/html/rfc8152}{RFC 8152}
- (CBOR Object Signing and Encryption).
- \value COSE_Mac0 A \c Mac0 map as specified by \l{https://tools.ietf.org/html/rfc8152}{RFC 8152}
- (CBOR Object Signing and Encryption).
- \value COSE_Sign1 A \c Sign1 map as specified by \l{https://tools.ietf.org/html/rfc8152}{RFC 8152}
- (CBOR Object Signing and Encryption).
- \value ExpectedBase64url Indicates that the byte array should be encoded using Base64url
- if the stream is converted to JSON.
- \value ExpectedBase64 Indicates that the byte array should be encoded using Base64
- if the stream is converted to JSON.
- \value ExpectedBase16 Indicates that the byte array should be encoded using Base16 (hex)
- if the stream is converted to JSON.
- \value EncodedCbor Indicates that the byte array contains a CBOR stream.
- \value Url Indicates that the string contains a URL.
- \value Base64url Indicates that the string contains data encoded using Base64url.
- \value Base64 Indicates that the string contains data encoded using Base64.
- \value RegularExpression Indicates that the string contains a Perl-Compatible Regular
- Expression pattern.
- \value MimeMessage Indicates that the string contains a MIME message (according to
- \l{https://tools.ietf.org/html/rfc2045}){RFC 2045}.
- \value Uuid Indicates that the byte array contains a UUID.
- \value COSE_Encrypt An \c Encrypt map as specified by \l{https://tools.ietf.org/html/rfc8152}{RFC 8152}
- (CBOR Object Signing and Encryption).
- \value COSE_Mac A \c Mac map as specified by \l{https://tools.ietf.org/html/rfc8152}{RFC 8152}
- (CBOR Object Signing and Encryption).
- \value COSE_Sign A \c Sign map as specified by \l{https://tools.ietf.org/html/rfc8152}{RFC 8152}
- (CBOR Object Signing and Encryption).
- \value Signature No change in interpretation; this tag can be used as the outermost
- tag in a CBOR stream as the file header.
-
- The following tags are interpreted by QCborValue during decoding and will
- produce objects with extended Qt types, and it will use those tags when
- encoding the same extended types.
-
- \value DateTimeString \l QDateTime
- \value UnixTime_t \l QDateTime (only in decoding)
- \value Url \l QUrl
- \value Uuid \l QUuid
-
- Additionally, if a QCborValue containing a QByteArray is tagged using one of
- \c ExpectedBase64url, \c ExpectedBase64 or \c ExpectedBase16, QCborValue
- will use the expected encoding when converting to JSON (see
- QCborValue::toJsonValue).
-
- \sa QCborTag, QCborStreamWriter::append(QCborTag),
- QCborStreamReader::isTag(), QCborStreamReader::toTag(),
- QCborValue::isTag(), QCborValue::tag()
- */
-
-#if !defined(QT_NO_DEBUG_STREAM)
-QDebug operator<<(QDebug dbg, QCborKnownTags tag)
-{
- QDebugStateSaver saver(dbg);
- const char *id = qt_cbor_tag_id(QCborTag(int(tag)));
- if (id)
- return dbg.nospace() << "QCborKnownTags::" << id;
-
- return dbg.nospace() << "QCborKnownTags(" << int(tag) << ')';
-}
-#endif
-
-/*!
- \class QCborError
- \inmodule QtCore
- \relates <QtCborCommon>
- \reentrant
- \since 5.12
-
- \brief The QCborError class holds the error condition found while parsing or
- validating a CBOR stream.
-
- \sa QCborStreamReader, QCborValue, QCborParserError
- */
-
-/*!
- \enum QCborError::Code
-
- This enum contains the possible error condition codes.
-
- \value NoError No error was detected.
- \value UnknownError An unknown error occurred and no further details are available.
- \value AdvancePastEnd QCborStreamReader::next() was called but there are no more elements in
- the current context.
- \value InputOutputError An I/O error with the QIODevice occurred.
- \value GarbageAtEnd Data was found in the input stream after the last element.
- \value EndOfFile The end of the input stream was unexpectedly reached while processing an
- element.
- \value UnexpectedBreak The CBOR stream contains a Break where it is not allowed (data is
- corrupt and the error is not recoverable).
- \value UnknownType The CBOR stream contains an unknown/unparseable Type (data is corrupt
- and the and the error is not recoverable).
- \value IllegalType The CBOR stream contains a known type in a position it is not allowed
- to exist (data is corrupt and the error is not recoverable).
- \value IllegalNumber The CBOR stream appears to be encoding a number larger than 64-bit
- (data is corrupt and the error is not recoverable).
- \value IllegalSimpleType The CBOR stream contains a Simple Type encoded incorrectly (data is
- corrupt and the error is not recoverable).
- \value InvalidUtf8String The CBOR stream contains a text string that does not decode properly
- as UTF-8 (data is corrupt and the error is not recoverable).
- \value DataTooLarge CBOR string, map or array is too big and cannot be parsed by Qt
- (internal limitation, but the error is not recoverable).
- \value NestingTooDeep Too many levels of arrays or maps encountered while processing the
- input (internal limitation, but the error is not recoverable).
- \value UnsupportedType The CBOR stream contains a known type that the implementation does not
- support (internal limitation, but the error is not recoverable).
- */
-
-// Convert from CborError to QCborError.
-//
-// Centralized in a function in case we need to make more adjustments in the
-// future.
-static QCborError fromCborError(CborError err)
-{
- return { QCborError::Code(int(err)) };
-}
-
-// Convert to CborError from QCborError.
-//
-// Centralized in a function in case we need to make more adjustments in the
-// future.
-static CborError toCborError(QCborError c)
-{
- return CborError(int(c.c));
-}
-
-/*!
- \variable QCborError::c
- \internal
- */
-
-/*!
- \fn QCborError::operator Code() const
-
- Returns the error code that this QCborError object stores.
- */
-
-/*!
- Returns a text string that matches the error code in this QCborError object.
-
- Note: the string is not translated. Applications whose interface allow users
- to parse CBOR streams need to provide their own, translated strings.
-
- \sa QCborError::Code
- */
-QString QCborError::toString() const
-{
- switch (c) {
- case NoError:
- Q_STATIC_ASSERT(int(NoError) == int(CborNoError));
- return QString();
-
- case UnknownError:
- Q_STATIC_ASSERT(int(UnknownError) == int(CborUnknownError));
- return QStringLiteral("Unknown error");
- case AdvancePastEnd:
- Q_STATIC_ASSERT(int(AdvancePastEnd) == int(CborErrorAdvancePastEOF));
- return QStringLiteral("Read past end of buffer (more bytes needed)");
- case InputOutputError:
- Q_STATIC_ASSERT(int(InputOutputError) == int(CborErrorIO));
- return QStringLiteral("Input/Output error");
- case GarbageAtEnd:
- Q_STATIC_ASSERT(int(GarbageAtEnd) == int(CborErrorGarbageAtEnd));
- return QStringLiteral("Data found after the end of the stream");
- case EndOfFile:
- Q_STATIC_ASSERT(int(EndOfFile) == int(CborErrorUnexpectedEOF));
- return QStringLiteral("Unexpected end of input data (more bytes needed)");
- case UnexpectedBreak:
- Q_STATIC_ASSERT(int(UnexpectedBreak) == int(CborErrorUnexpectedBreak));
- return QStringLiteral("Invalid CBOR stream: unexpected 'break' byte");
- case UnknownType:
- Q_STATIC_ASSERT(int(UnknownType) == int(CborErrorUnknownType));
- return QStringLiteral("Invalid CBOR stream: unknown type");
- case IllegalType:
- Q_STATIC_ASSERT(int(IllegalType) == int(CborErrorIllegalType));
- return QStringLiteral("Invalid CBOR stream: illegal type found");
- case IllegalNumber:
- Q_STATIC_ASSERT(int(IllegalNumber) == int(CborErrorIllegalNumber));
- return QStringLiteral("Invalid CBOR stream: illegal number encoding (future extension)");
- case IllegalSimpleType:
- Q_STATIC_ASSERT(int(IllegalSimpleType) == int(CborErrorIllegalSimpleType));
- return QStringLiteral("Invalid CBOR stream: illegal simple type");
- case InvalidUtf8String:
- Q_STATIC_ASSERT(int(InvalidUtf8String) == int(CborErrorInvalidUtf8TextString));
- return QStringLiteral("Invalid CBOR stream: invalid UTF-8 text string");
- case DataTooLarge:
- Q_STATIC_ASSERT(int(DataTooLarge) == int(CborErrorDataTooLarge));
- return QStringLiteral("Internal limitation: data set too large");
- case NestingTooDeep:
- Q_STATIC_ASSERT(int(NestingTooDeep) == int(CborErrorNestingTooDeep));
- return QStringLiteral("Internal limitation: data nesting too deep");
- case UnsupportedType:
- Q_STATIC_ASSERT(int(UnsupportedType) == int(CborErrorUnsupportedType));
- return QStringLiteral("Internal limitation: unsupported type");
- }
-
- // get the error string from TinyCBOR
- CborError err = toCborError(*this);
- return QString::fromLatin1(cbor_error_string(err));
-}
-
-/*!
- \class QCborStreamWriter
- \inmodule QtCore
- \ingroup cbor
- \reentrant
- \since 5.12
-
- \brief The QCborStreamWriter class is a simple CBOR encoder operating on a
- one-way stream.
-
- This class can be used to quickly encode a stream of CBOR content directly
- to either a QByteArray or QIODevice. CBOR is the Concise Binary Object
- Representation, a very compact form of binary data encoding that is
- compatible with JSON. It was created by the IETF Constrained RESTful
- Environments (CoRE) WG, which has used it in many new RFCs. It is meant to
- be used alongside the \l{https://tools.ietf.org/html/rfc7252}{CoAP
- protocol}.
-
- QCborStreamWriter provides a StAX-like API, similar to that of
- \l{QXmlStreamWriter}. It is rather low-level and requires a bit of knowledge
- of CBOR encoding. For a simpler API, see \l{QCborValue} and especially the
- encoding function QCborValue::toCbor().
-
- The typical use of QCborStreamWriter is to create the object on the target
- QByteArray or QIODevice, then call one of the append() overloads with the
- desired type to be encoded. To create arrays and maps, QCborStreamWriter
- provides startArray() and startMap() overloads, which must be terminated by
- the corresponding endArray() and endMap() functions.
-
- The following example encodes the equivalent of this JSON content:
-
- \div{class="pre"}
- {
- "label": "journald",
- "autoDetect": false,
- "condition": "libs.journald",
- "output": [ "privateFeature" ]
- }
- \enddiv
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 1
-
- \section1 CBOR support
-
- QCborStreamWriter supports all CBOR features required to create canonical
- and strict streams. It implements almost all of the features specified in
- \l {https://tools.ietf.org/html/rfc7049}{RFC 7049}.
-
- The following table lists the CBOR features that QCborStreamWriter supports.
-
- \table
- \header \li Feature \li Support
- \row \li Unsigned numbers \li Yes (full range)
- \row \li Negative numbers \li Yes (full range)
- \row \li Byte strings \li Yes
- \row \li Text strings \li Yes
- \row \li Chunked strings \li No
- \row \li Tags \li Yes (arbitrary)
- \row \li Booleans \li Yes
- \row \li Null \li Yes
- \row \li Undefined \li Yes
- \row \li Arbitrary simple values \li Yes
- \row \li Half-precision float (16-bit) \li Yes
- \row \li Single-precision float (32-bit) \li Yes
- \row \li Double-precision float (64-bit) \li Yes
- \row \li Infinities and NaN floating point \li Yes
- \row \li Determinate-length arrays and maps \li Yes
- \row \li Indeterminate-length arrays and maps \li Yes
- \row \li Map key types other than strings and integers \li Yes (arbitrary)
- \endtable
-
- \section2 Canonical CBOR encoding
-
- Canonical CBOR encoding is defined by
- \l{https://tools.ietf.org/html/rfc7049#section-3.9}{Section 3.9 of RFC
- 7049}. Canonical encoding is not a requirement for Qt's CBOR decoding
- functionality, but it may be required for some protocols. In particular,
- protocols that require the ability to reproduce the same stream identically
- may require this.
-
- In order to be considered "canonical", a CBOR stream must meet the
- following requirements:
-
- \list
- \li Integers must be as small as possible. QCborStreamWriter always
- does this (no user action is required and it is not possible
- to write overlong integers).
- \li Array, map and string lengths must be as short as possible. As
- above, QCborStreamWriter automatically does this.
- \li Arrays, maps and strings must use explicit length. QCborStreamWriter
- always does this for strings; for arrays and maps, be sure to call
- startArray() and startMap() overloads with explicit length.
- \li Keys in every map must be sorted in ascending order. QCborStreamWriter
- offers no help in this item: the developer must ensure that before
- calling append() for the map pairs.
- \li Floating point values should be as small as possible. QCborStreamWriter
- will not convert floating point values; it is up to the developer
- to perform this check prior to calling append() (see those functions'
- examples).
- \endlist
-
- \section2 Strict CBOR mode
-
- Strict mode is defined by
- \l{https://tools.ietf.org/html/rfc7049#section-3.10}{Section 3.10 of RFC
- 7049}. As for Canonical encoding above, QCborStreamWriter makes it possible
- to create strict CBOR streams, but does not require them or validate that
- the output is so.
-
- \list
- \li Keys in a map must be unique. QCborStreamWriter performs no validation
- of map keys.
- \li Tags may be required to be paired only with the correct types,
- according to their specification. QCborStreamWriter performs no
- validation of tag usage.
- \li Text Strings must be properly-encoded UTF-8. QCborStreamWriter always
- writes proper UTF-8 for strings added with append(), but performs no
- validation for strings added with appendTextString().
- \endlist
-
- \section2 Invalid CBOR stream
-
- It is also possible to misuse QCborStreamWriter and produce invalid CBOR
- streams that will fail to be decoded by a receiver. The following actions
- will produce invalid streams:
-
- \list
- \li Append a tag and not append the corresponding tagged value
- (QCborStreamWriter produces no diagnostic).
- \li Append too many or too few items to an array or map with explicit
- length (endMap() and endArray() will return false and
- QCborStreamWriter will log with qWarning()).
- \endlist
-
- \sa QCborStreamReader, QCborValue, QXmlStreamWriter
- */
-
-class QCborStreamWriterPrivate
-{
-public:
- static Q_CONSTEXPR quint64 IndefiniteLength = (std::numeric_limits<quint64>::max)();
-
- QIODevice *device;
- CborEncoder encoder;
- QStack<CborEncoder> containerStack;
- bool deleteDevice = false;
-
- QCborStreamWriterPrivate(QIODevice *device)
- : device(device)
- {
- cbor_encoder_init_writer(&encoder, qt_cbor_encoder_write_callback, this);
- }
-
- ~QCborStreamWriterPrivate()
- {
- if (deleteDevice)
- delete device;
- }
-
- template <typename... Args> void executeAppend(CborError (*f)(CborEncoder *, Args...), Args... args)
- {
- f(&encoder, std::forward<Args>(args)...);
- }
-
- void createContainer(CborError (*f)(CborEncoder *, CborEncoder *, size_t), quint64 len = IndefiniteLength)
- {
- Q_STATIC_ASSERT(size_t(IndefiniteLength) == CborIndefiniteLength);
- if (sizeof(len) != sizeof(size_t) && len != IndefiniteLength) {
- if (Q_UNLIKELY(len >= CborIndefiniteLength)) {
- // TinyCBOR can't do this in 32-bit mode
- qWarning("QCborStreamWriter: container of size %llu is too big for a 32-bit build; "
- "will use indeterminate length instead", len);
- len = CborIndefiniteLength;
- }
- }
-
- containerStack.push(encoder);
- f(&containerStack.top(), &encoder, len);
- }
-
- bool closeContainer()
- {
- if (containerStack.isEmpty()) {
- qWarning("QCborStreamWriter: closing map or array that wasn't open");
- return false;
- }
-
- CborEncoder container = containerStack.pop();
- CborError err = cbor_encoder_close_container(&container, &encoder);
- encoder = container;
-
- if (Q_UNLIKELY(err)) {
- if (err == CborErrorTooFewItems)
- qWarning("QCborStreamWriter: not enough items added to array or map");
- else if (err == CborErrorTooManyItems)
- qWarning("QCborStreamWriter: too many items added to array or map");
- return false;
- }
-
- return true;
- }
-};
-
-static CborError qt_cbor_encoder_write_callback(void *self, const void *data, size_t len, CborEncoderAppendType)
-{
- auto that = static_cast<QCborStreamWriterPrivate *>(self);
- if (!that->device)
- return CborNoError;
- qint64 written = that->device->write(static_cast<const char *>(data), len);
- return (written == qsizetype(len) ? CborNoError : CborErrorIO);
-}
-
-/*!
- Creates a QCborStreamWriter object that will write the stream to \a device.
- The device must be opened before the first append() call is made. This
- constructor can be used with any class that derives from QIODevice, such as
- QFile, QProcess or QTcpSocket.
-
- QCborStreamWriter has no buffering, so every append() call will result in
- one or more calls to the device's \l {QIODevice::}{write()} method.
-
- The following example writes an empty map to a file:
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 2
-
- QCborStreamWriter does not take ownership of \a device.
-
- \sa device(), setDevice()
- */
-QCborStreamWriter::QCborStreamWriter(QIODevice *device)
- : d(new QCborStreamWriterPrivate(device))
-{
-}
-
-/*!
- Creates a QCborStreamWriter object that will append the stream to \a data.
- All streaming is done immediately to the byte array, without the need for
- flushing any buffers.
-
- The following example writes a number to a byte array then returns
- it.
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 3
-
- QCborStreamWriter does not take ownership of \a data.
- */
-QCborStreamWriter::QCborStreamWriter(QByteArray *data)
- : d(new QCborStreamWriterPrivate(new QBuffer(data)))
-{
- d->deleteDevice = true;
- d->device->open(QIODevice::WriteOnly | QIODevice::Unbuffered);
-}
-
-/*!
- Destroys this QCborStreamWriter object and frees any resources associated.
-
- QCborStreamWriter does not perform error checking to see if all required
- items were written to the stream prior to the object being destroyed. It is
- the programmer's responsibility to ensure that it was done.
- */
-QCborStreamWriter::~QCborStreamWriter()
-{
-}
-
-/*!
- Replaces the device or byte array that this QCborStreamWriter object is
- writing to with \a device.
-
- \sa device()
- */
-void QCborStreamWriter::setDevice(QIODevice *device)
-{
- if (d->deleteDevice)
- delete d->device;
- d->device = device;
- d->deleteDevice = false;
-}
-
-/*!
- Returns the QIODevice that this QCborStreamWriter object is writing to. The
- device must have previously been set with either the constructor or with
- setDevice().
-
- If this object was created by writing to a QByteArray, this function will
- return an internal instance of QBuffer, which is owned by QCborStreamWriter.
-
- \sa setDevice()
- */
-QIODevice *QCborStreamWriter::device() const
-{
- return d->device;
-}
-
-/*!
- \overload
-
- Appends the 64-bit unsigned value \a u to the CBOR stream, creating a CBOR
- Unsigned Integer value. In the following example, we write the values 0,
- 2\sup{32} and \c UINT64_MAX:
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 4
-
- \sa QCborStreamReader::isUnsignedInteger(), QCborStreamReader::toUnsignedInteger()
- */
-void QCborStreamWriter::append(quint64 u)
-{
- d->executeAppend(cbor_encode_uint, uint64_t(u));
-}
-
-/*!
- \overload
-
- Appends the 64-bit signed value \a i to the CBOR stream. This will create
- either a CBOR Unsigned Integer or CBOR NegativeInteger value based on the
- sign of the parameter. In the following example, we write the values 0, -1,
- 2\sup{32} and \c INT64_MAX:
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 5
-
- \sa QCborStreamReader::isInteger(), QCborStreamReader::toInteger()
- */
-void QCborStreamWriter::append(qint64 i)
-{
- d->executeAppend(cbor_encode_int, int64_t(i));
-}
-
-/*!
- \overload
-
- Appends the 64-bit negative value \a n to the CBOR stream.
- QCborNegativeInteger is a 64-bit enum that holds the absolute value of the
- negative number we want to write. If n is zero, the value written will be
- equivalent to 2\sup{64} (that is, -18,446,744,073,709,551,616).
-
- In the following example, we write the values -1, -2\sup{32} and INT64_MIN:
- \snippet code/src_corelib_serialization_qcborstream.cpp 6
-
- Note how this function can be used to encode numbers that cannot fit a
- standard computer's 64-bit signed integer like \l qint64. That is, if \a n
- is larger than \c{std::numeric_limits<qint64>::max()} or is 0, this will
- represent a negative number smaller than
- \c{std::numeric_limits<qint64>::min()}.
-
- \sa QCborStreamReader::isNegativeInteger(), QCborStreamReader::toNegativeInteger()
- */
-void QCborStreamWriter::append(QCborNegativeInteger n)
-{
- d->executeAppend(cbor_encode_negative_int, uint64_t(n));
-}
-
-/*!
- \fn void QCborStreamWriter::append(const QByteArray &ba)
- \overload
-
- Appends the byte array \a ba to the stream, creating a CBOR Byte String
- value. QCborStreamWriter will attempt to write the entire string in one
- chunk.
-
- The following example will load and append the contents of a file to the
- stream:
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 7
-
- As the example shows, unlike JSON, CBOR requires no escaping for binary
- content.
-
- \sa appendByteString(), QCborStreamReader::isByteArray(),
- QCborStreamReader::readByteArray()
- */
-
-/*!
- \overload
-
- Appends the text string \a str to the stream, creating a CBOR Text String
- value. QCborStreamWriter will attempt to write the entire string in one
- chunk.
-
- The following example appends a simple string to the stream:
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 8
-
- \b{Performance note}: CBOR requires that all Text Strings be encoded in
- UTF-8, so this function will iterate over the characters in the string to
- determine whether the contents are US-ASCII or not. If the string is found
- to contain characters outside of US-ASCII, it will allocate memory and
- convert to UTF-8. If this check is unnecessary, use appendTextString()
- instead.
-
- \sa QCborStreamReader::isString(), QCborStreamReader::readString()
- */
-void QCborStreamWriter::append(QLatin1String str)
-{
- // We've got Latin-1 but CBOR wants UTF-8, so check if the string is the
- // common subset (US-ASCII).
- if (QtPrivate::isAscii(str)) {
- // it is plain US-ASCII
- appendTextString(str.latin1(), str.size());
- } else {
- // non-ASCII, so we need a pass-through UTF-16
- append(QString(str));
- }
-}
-
-/*!
- \overload
-
- Appends the text string \a str to the stream, creating a CBOR Text String
- value. QCborStreamWriter will attempt to write the entire string in one
- chunk.
-
- The following example writes an arbitrary QString to the stream:
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 9
-
- \sa QCborStreamReader::isString(), QCborStreamReader::readString()
- */
-void QCborStreamWriter::append(QStringView str)
-{
- QByteArray utf8 = str.toUtf8();
- appendTextString(utf8.constData(), utf8.size());
-}
-
-/*!
- \overload
-
- Appends the CBOR tag \a tag to the stream, creating a CBOR Tag value. All
- tags must be followed by another type which they provide meaning for.
-
- In the following example, we append a CBOR Tag 36 (Regular Expression) and a
- QRegularExpression's pattern to the stream:
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 10
-
- \sa QCborStreamReader::isTag(), QCborStreamReader::toTag()
- */
-void QCborStreamWriter::append(QCborTag tag)
-{
- d->executeAppend(cbor_encode_tag, CborTag(tag));
-}
-
-/*!
- \fn void QCborStreamWriter::append(QCborKnownTags tag)
- \overload
-
- Appends the CBOR tag \a tag to the stream, creating a CBOR Tag value. All
- tags must be followed by another type which they provide meaning for.
-
- In the following example, we append a CBOR Tag 1 (Unix \c time_t) and an
- integer representing the current time to the stream, obtained using the \c
- time() function:
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 11
-
- \sa QCborStreamReader::isTag(), QCborStreamReader::toTag()
- */
-
-/*!
- \overload
-
- Appends the CBOR simple type \a st to the stream, creating a CBOR Simple
- Type value. In the following example, we write the simple type for Null as
- well as for type 32, which Qt has no support for.
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 12
-
- \note Using Simple Types for which there is no specification can lead to
- validation errors by the remote receiver. In addition, simple type values 24
- through 31 (inclusive) are reserved and must not be used.
-
- \sa QCborStreamReader::isSimpleType(), QCborStreamReader::toSimpleType()
- */
-void QCborStreamWriter::append(QCborSimpleType st)
-{
- d->executeAppend(cbor_encode_simple_value, uint8_t(st));
-}
-
-/*!
- \overload
-
- Appends the floating point number \a f to the stream, creating a CBOR 16-bit
- Half-Precision Floating Point value. The following code can be used to convert
- a C++ \tt float to \c qfloat16 if there's no loss of precision and append it, or
- instead append the \tt float.
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 13
-
- \sa QCborStreamReader::isFloat16(), QCborStreamReader::toFloat16()
- */
-void QCborStreamWriter::append(qfloat16 f)
-{
- d->executeAppend(cbor_encode_half_float, static_cast<const void *>(&f));
-}
-
-/*!
- \overload
-
- Appends the floating point number \a f to the stream, creating a CBOR 32-bit
- Single-Precision Floating Point value. The following code can be used to convert
- a C++ \tt double to \tt float if there's no loss of precision and append it, or
- instead append the \tt double.
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 14
-
- \sa QCborStreamReader::isFloat(), QCborStreamReader::toFloat()
- */
-void QCborStreamWriter::append(float f)
-{
- d->executeAppend(cbor_encode_float, f);
-}
-
-/*!
- \overload
-
- Appends the floating point number \a d to the stream, creating a CBOR 64-bit
- Double-Precision Floating Point value. QCborStreamWriter always appends the
- number as-is, performing no check for whether the number is the canonical
- form for NaN, an infinite, whether it is denormal or if it could be written
- with a shorter format.
-
- The following code performs all those checks, except for the denormal one,
- which is expected to be taken into account by the system FPU or floating
- point emulation directly.
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 15
-
- Determining if a double can be converted to an integral with no loss of
- precision is left as an exercise to the reader.
-
- \sa QCborStreamReader::isDouble(), QCborStreamReader::toDouble()
- */
-void QCborStreamWriter::append(double d)
-{
- this->d->executeAppend(cbor_encode_double, d);
-}
-
-/*!
- Appends \a len bytes of data starting from \a data to the stream, creating a
- CBOR Byte String value. QCborStreamWriter will attempt to write the entire
- string in one chunk.
-
- Unlike the QByteArray overload of append(), this function is not limited by
- QByteArray's size limits. However, note that neither
- QCborStreamReader::readByteArray() nor QCborValue support reading CBOR
- streams with byte arrays larger than 2 GB.
-
- \sa append(), appendTextString(),
- QCborStreamReader::isByteArray(), QCborStreamReader::readByteArray()
- */
-void QCborStreamWriter::appendByteString(const char *data, qsizetype len)
-{
- d->executeAppend(cbor_encode_byte_string, reinterpret_cast<const uint8_t *>(data), size_t(len));
-}
-
-/*!
- Appends \a len bytes of text starting from \a utf8 to the stream, creating a
- CBOR Text String value. QCborStreamWriter will attempt to write the entire
- string in one chunk.
-
- The string pointed to by \a utf8 is expected to be properly encoded UTF-8.
- QCborStreamWriter performs no validation that this is the case.
-
- Unlike the QLatin1String overload of append(), this function is not limited
- to 2 GB. However, note that neither QCborStreamReader::readString() nor
- QCborValue support reading CBOR streams with text strings larger than 2 GB.
-
- \sa append(QLatin1String), append(QStringView),
- QCborStreamReader::isString(), QCborStreamReader::readString()
- */
-void QCborStreamWriter::appendTextString(const char *utf8, qsizetype len)
-{
- d->executeAppend(cbor_encode_text_string, utf8, size_t(len));
-}
-
-/*!
- \fn void QCborStreamWriter::append(const char *str, qsizetype size)
- \overload
-
- Appends \a size bytes of text starting from \a str to the stream, creating a
- CBOR Text String value. QCborStreamWriter will attempt to write the entire
- string in one chunk. If \a size is -1, this function will write \c strlen(\a
- str) bytes.
-
- The string pointed to by \a str is expected to be properly encoded UTF-8.
- QCborStreamWriter performs no validation that this is the case.
-
- Unlike the QLatin1String overload of append(), this function is not limited
- to 2 GB. However, note that neither QCborStreamReader nor QCborValue support
- reading CBOR streams with text strings larger than 2 GB.
-
- \sa append(QLatin1String), append(QStringView),
- QCborStreamReader::isString(), QCborStreamReader::readString()
- */
-
-/*!
- \fn void QCborStreamWriter::append(bool b)
- \overload
-
- Appends the boolean value \a b to the stream, creating either a CBOR False
- value or a CBOR True value. This function is equivalent to (and implemented
- as):
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 16
-
- \sa appendNull(), appendUndefined(),
- QCborStreamReader::isBool(), QCborStreamReader::toBool()
- */
-
-/*!
- \fn void QCborStreamWriter::append(std::nullptr_t)
- \overload
-
- Appends a CBOR Null value to the stream. This function is equivalent to (and
- implemented as): The parameter is ignored.
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 17
-
- \sa appendNull(), append(QCborSimpleType), QCborStreamReader::isNull()
- */
-
-/*!
- \fn void QCborStreamWriter::appendNull()
-
- Appends a CBOR Null value to the stream. This function is equivalent to (and
- implemented as):
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 18
-
- \sa append(std::nullptr_t), append(QCborSimpleType), QCborStreamReader::isNull()
- */
-
-/*!
- \fn void QCborStreamWriter::appendUndefined()
-
- Appends a CBOR Undefined value to the stream. This function is equivalent to (and
- implemented as):
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 19
-
- \sa append(QCborSimpleType), QCborStreamReader::isUndefined()
- */
-
-/*!
- Starts a CBOR Array with indeterminate length in the CBOR stream. Each
- startArray() call must be paired with one endArray() call and the current
- CBOR element extends until the end of the array.
-
- The array created by this function has no explicit length. Instead, its
- length is implied by the elements contained in it. Note, however, that use
- of indeterminate-length arrays is not compliant with canonical CBOR encoding.
-
- The following example appends elements from the linked list of strings
- passed as input:
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 20
-
- \sa startArray(quint64), endArray(), startMap(), QCborStreamReader::isArray(),
- QCborStreamReader::isLengthKnown()
- */
-void QCborStreamWriter::startArray()
-{
- d->createContainer(cbor_encoder_create_array);
-}
-
-/*!
- \overload
-
- Starts a CBOR Array with explicit length of \a count items in the CBOR
- stream. Each startArray call must be paired with one endArray() call and the
- current CBOR element extends until the end of the array.
-
- The array created by this function has an explicit length and therefore
- exactly \a count items must be added to the CBOR stream. Adding fewer or
- more items will result in failure during endArray() and the CBOR stream will
- be corrupt. However, explicit-length arrays are required by canonical CBOR
- encoding.
-
- The following example appends all strings found in the \l QStringList passed as input:
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 21
-
- \b{Size limitations}: The parameter to this function is quint64, which would
- seem to allow up to 2\sup{64}-1 elements in the array. However, both
- QCborStreamWriter and QCborStreamReader are currently limited to 2\sup{32}-2
- items on 32-bit systems and 2\sup{64}-2 items on 64-bit ones. Also note that
- QCborArray is currently limited to 2\sup{27} elements in any platform.
-
- \sa startArray(), endArray(), startMap(), QCborStreamReader::isArray(),
- QCborStreamReader::isLengthKnown()
- */
-void QCborStreamWriter::startArray(quint64 count)
-{
- d->createContainer(cbor_encoder_create_array, count);
-}
-
-/*!
- Terminates the array started by either overload of startArray() and returns
- true if the correct number of elements was added to the array. This function
- must be called for every startArray() used.
-
- A return of false indicates error in the application and an unrecoverable
- error in this stream. QCborStreamWriter also writes a warning using
- qWarning() if that happens.
-
- Calling this function when the current container is not an array is also an
- error, though QCborStreamWriter cannot currently detect this condition.
-
- \sa startArray(), startArray(quint64), endMap()
- */
-bool QCborStreamWriter::endArray()
-{
- return d->closeContainer();
-}
-
-/*!
- Starts a CBOR Map with indeterminate length in the CBOR stream. Each
- startMap() call must be paired with one endMap() call and the current CBOR
- element extends until the end of the map.
-
- The map created by this function has no explicit length. Instead, its length
- is implied by the elements contained in it. Note, however, that use of
- indeterminate-length maps is not compliant with canonical CBOR encoding
- (canonical encoding also requires keys to be unique and in sorted order).
-
- The following example appends elements from the linked list of int and
- string pairs passed as input:
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 22
-
- \sa startMap(quint64), endMap(), startArray(), QCborStreamReader::isMap(),
- QCborStreamReader::isLengthKnown()
- */
-void QCborStreamWriter::startMap()
-{
- d->createContainer(cbor_encoder_create_map);
-}
-
-/*!
- \overload
-
- Starts a CBOR Map with explicit length of \a count items in the CBOR
- stream. Each startMap call must be paired with one endMap() call and the
- current CBOR element extends until the end of the map.
-
- The map created by this function has an explicit length and therefore
- exactly \a count pairs of items must be added to the CBOR stream. Adding
- fewer or more items will result in failure during endMap() and the CBOR
- stream will be corrupt. However, explicit-length map are required by
- canonical CBOR encoding.
-
- The following example appends all strings found in the \l QMap passed as input:
-
- \snippet code/src_corelib_serialization_qcborstream.cpp 23
-
- \b{Size limitations}: The parameter to this function is quint64, which would
- seem to allow up to 2\sup{64}-1 pairs in the map. However, both
- QCborStreamWriter and QCborStreamReader are currently limited to 2\sup{31}-1
- items on 32-bit systems and 2\sup{63}-1 items on 64-bit ones. Also note that
- QCborMap is currently limited to 2\sup{26} elements in any platform.
-
- \sa startMap(), endMap(), startArray(), QCborStreamReader::isMap(),
- QCborStreamReader::isLengthKnown()
- */
-void QCborStreamWriter::startMap(quint64 count)
-{
- d->createContainer(cbor_encoder_create_map, count);
-}
-
-/*!
- Terminates the map started by either overload of startMap() and returns
- true if the correct number of elements was added to the array. This function
- must be called for every startMap() used.
-
- A return of false indicates error in the application and an unrecoverable
- error in this stream. QCborStreamWriter also writes a warning using
- qWarning() if that happens.
-
- Calling this function when the current container is not a map is also an
- error, though QCborStreamWriter cannot currently detect this condition.
-
- \sa startMap(), startMap(quint64), endArray()
- */
-bool QCborStreamWriter::endMap()
-{
- return d->closeContainer();
-}
-
-/*!
\class QCborStreamReader
\inmodule QtCore
\ingroup cbor
@@ -1868,7 +641,7 @@ public:
if (err != CborErrorUnexpectedEOF)
corrupt = true;
- lastError = fromCborError(err);
+ lastError = QCborError { QCborError::Code(int(err)) };
}
void updateBufferAfterString(qsizetype offset, qsizetype size)
@@ -2757,5 +1530,4 @@ QCborStreamReader::readStringChunk(char *ptr, qsizetype maxlen)
QT_END_NAMESPACE
-#include "moc_qcborcommon.cpp"
-#include "moc_qcborstream.cpp"
+#include "moc_qcborstreamreader.cpp"
diff --git a/src/corelib/serialization/qcborstreamreader.h b/src/corelib/serialization/qcborstreamreader.h
new file mode 100644
index 0000000000..6d5feccfcf
--- /dev/null
+++ b/src/corelib/serialization/qcborstreamreader.h
@@ -0,0 +1,210 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Intel Corporation.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCBORSTREAMREADER_H
+#define QCBORSTREAMREADER_H
+
+#include <QtCore/qbytearray.h>
+#include <QtCore/qcborcommon.h>
+#include <QtCore/qfloat16.h>
+#include <QtCore/qscopedpointer.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qstringview.h>
+
+QT_REQUIRE_CONFIG(cborstreamreader);
+
+// See qcborcommon.h for why we check
+#if defined(QT_X11_DEFINES_FOUND)
+# undef True
+# undef False
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QIODevice;
+
+class QCborStreamReaderPrivate;
+class Q_CORE_EXPORT QCborStreamReader
+{
+ Q_GADGET
+public:
+ enum Type : quint8 {
+ UnsignedInteger = 0x00,
+ NegativeInteger = 0x20,
+ ByteString = 0x40,
+ ByteArray = ByteString,
+ TextString = 0x60,
+ String = TextString,
+ Array = 0x80,
+ Map = 0xa0,
+ Tag = 0xc0,
+ SimpleType = 0xe0,
+ HalfFloat = 0xf9,
+ Float16 = HalfFloat,
+ Float = 0xfa,
+ Double = 0xfb,
+
+ Invalid = 0xff
+ };
+ Q_ENUM(Type)
+
+ enum StringResultCode {
+ EndOfString = 0,
+ Ok = 1,
+ Error = -1
+ };
+ template <typename Container> struct StringResult {
+ Container data;
+ StringResultCode status = Error;
+ };
+ Q_ENUM(StringResultCode)
+
+ QCborStreamReader();
+ QCborStreamReader(const char *data, qsizetype len);
+ QCborStreamReader(const quint8 *data, qsizetype len);
+ explicit QCborStreamReader(const QByteArray &data);
+ explicit QCborStreamReader(QIODevice *device);
+ ~QCborStreamReader();
+ Q_DISABLE_COPY(QCborStreamReader)
+
+ void setDevice(QIODevice *device);
+ QIODevice *device() const;
+ void addData(const QByteArray &data);
+ void addData(const char *data, qsizetype len);
+ void addData(const quint8 *data, qsizetype len)
+ { addData(reinterpret_cast<const char *>(data), len); }
+ void reparse();
+ void clear();
+ void reset();
+
+ QCborError lastError();
+
+ qint64 currentOffset() const;
+
+ bool isValid() const { return !isInvalid(); }
+
+ int containerDepth() const;
+ QCborStreamReader::Type parentContainerType() const;
+ bool hasNext() const noexcept Q_DECL_PURE_FUNCTION;
+ bool next(int maxRecursion = 10000);
+
+ Type type() const { return QCborStreamReader::Type(type_); }
+ bool isUnsignedInteger() const { return type() == UnsignedInteger; }
+ bool isNegativeInteger() const { return type() == NegativeInteger; }
+ bool isInteger() const { return quint8(type()) <= quint8(NegativeInteger); }
+ bool isByteArray() const { return type() == ByteArray; }
+ bool isString() const { return type() == String; }
+ bool isArray() const { return type() == Array; }
+ bool isMap() const { return type() == Map; }
+ bool isTag() const { return type() == Tag; }
+ bool isSimpleType() const { return type() == SimpleType; }
+ bool isFloat16() const { return type() == Float16; }
+ bool isFloat() const { return type() == Float; }
+ bool isDouble() const { return type() == Double; }
+ bool isInvalid() const { return type() == Invalid; }
+
+ bool isSimpleType(QCborSimpleType st) const { return isSimpleType() && toSimpleType() == st; }
+ bool isFalse() const { return isSimpleType(QCborSimpleType::False); }
+ bool isTrue() const { return isSimpleType(QCborSimpleType::True); }
+ bool isBool() const { return isFalse() || isTrue(); }
+ bool isNull() const { return isSimpleType(QCborSimpleType::Null); }
+ bool isUndefined() const { return isSimpleType(QCborSimpleType::Undefined); }
+
+ bool isLengthKnown() const noexcept Q_DECL_PURE_FUNCTION;
+ quint64 length() const;
+
+ bool isContainer() const { return isMap() || isArray(); }
+ bool enterContainer() { Q_ASSERT(isContainer()); return _enterContainer_helper(); }
+ bool leaveContainer();
+
+ StringResult<QString> readString() { Q_ASSERT(isString()); return _readString_helper(); }
+ StringResult<QByteArray> readByteArray(){ Q_ASSERT(isByteArray()); return _readByteArray_helper(); }
+ qsizetype currentStringChunkSize() const{ Q_ASSERT(isString() || isByteArray()); return _currentStringChunkSize(); }
+ StringResult<qsizetype> readStringChunk(char *ptr, qsizetype maxlen);
+
+ bool toBool() const { Q_ASSERT(isBool()); return value64 - int(QCborSimpleType::False); }
+ QCborTag toTag() const { Q_ASSERT(isTag()); return QCborTag(value64); }
+ quint64 toUnsignedInteger() const { Q_ASSERT(isUnsignedInteger()); return value64; }
+ QCborNegativeInteger toNegativeInteger() const { Q_ASSERT(isNegativeInteger()); return QCborNegativeInteger(value64 + 1); }
+ QCborSimpleType toSimpleType() const{ Q_ASSERT(isSimpleType()); return QCborSimpleType(value64); }
+ qfloat16 toFloat16() const { Q_ASSERT(isFloat16()); return _toFloatingPoint<qfloat16>(); }
+ float toFloat() const { Q_ASSERT(isFloat()); return _toFloatingPoint<float>(); }
+ double toDouble() const { Q_ASSERT(isDouble()); return _toFloatingPoint<double>(); }
+
+ qint64 toInteger() const
+ {
+ Q_ASSERT(isInteger());
+ qint64 v = qint64(value64);
+ if (isNegativeInteger())
+ return -v - 1;
+ return v;
+ }
+
+private:
+ void preparse();
+ bool _enterContainer_helper();
+ StringResult<QString> _readString_helper();
+ StringResult<QByteArray> _readByteArray_helper();
+ qsizetype _currentStringChunkSize() const;
+
+ template <typename FP> FP _toFloatingPoint() const noexcept
+ {
+ using UIntFP = typename QIntegerForSizeof<FP>::Unsigned;
+ UIntFP u = UIntFP(value64);
+ FP f;
+ memcpy(static_cast<void *>(&f), &u, sizeof(f));
+ return f;
+ }
+
+ friend QCborStreamReaderPrivate;
+ friend class QCborContainerPrivate;
+ quint64 value64;
+ QScopedPointer<QCborStreamReaderPrivate> d;
+ quint8 type_;
+ quint8 reserved[3] = {};
+};
+
+QT_END_NAMESPACE
+
+#if defined(QT_X11_DEFINES_FOUND)
+# define True 1
+# define False 0
+#endif
+
+#endif // QCBORSTREAMREADER_H
diff --git a/src/corelib/serialization/qcborstreamwriter.cpp b/src/corelib/serialization/qcborstreamwriter.cpp
new file mode 100644
index 0000000000..9d78785416
--- /dev/null
+++ b/src/corelib/serialization/qcborstreamwriter.cpp
@@ -0,0 +1,868 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Intel Corporation.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qcborstreamwriter.h"
+
+#define CBOR_NO_PARSER_API
+#include <private/qcborcommon_p.h>
+
+#include <private/qnumeric_p.h>
+#include <qbuffer.h>
+#include <qdebug.h>
+#include <qstack.h>
+
+QT_BEGIN_NAMESPACE
+
+static CborError qt_cbor_encoder_write_callback(void *token, const void *data, size_t len, CborEncoderAppendType);
+#define CBOR_ENCODER_WRITER_CONTROL 1
+#define CBOR_ENCODER_WRITE_FUNCTION qt_cbor_encoder_write_callback
+#define CBOR_ENCODER_NO_CHECK_USER
+
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_MSVC(4334) // '<<': result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?)
+
+#include <cborencoder.c>
+
+QT_WARNING_POP
+
+// silence compilers that complain about this being a static function declared
+// but never defined
+static CborError Q_DECL_UNUSED cbor_encoder_close_container_checked(CborEncoder*, const CborEncoder*)
+{
+ Q_UNREACHABLE();
+ return CborErrorInternalError;
+}
+
+static CborError Q_DECL_UNUSED cbor_encode_float_as_half_float(CborEncoder *, float)
+{
+ Q_UNREACHABLE();
+ return CborErrorInternalError;
+}
+
+Q_DECLARE_TYPEINFO(CborEncoder, Q_PRIMITIVE_TYPE);
+
+/*!
+ \class QCborStreamWriter
+ \inmodule QtCore
+ \ingroup cbor
+ \reentrant
+ \since 5.12
+
+ \brief The QCborStreamWriter class is a simple CBOR encoder operating on a
+ one-way stream.
+
+ This class can be used to quickly encode a stream of CBOR content directly
+ to either a QByteArray or QIODevice. CBOR is the Concise Binary Object
+ Representation, a very compact form of binary data encoding that is
+ compatible with JSON. It was created by the IETF Constrained RESTful
+ Environments (CoRE) WG, which has used it in many new RFCs. It is meant to
+ be used alongside the \l{https://tools.ietf.org/html/rfc7252}{CoAP
+ protocol}.
+
+ QCborStreamWriter provides a StAX-like API, similar to that of
+ \l{QXmlStreamWriter}. It is rather low-level and requires a bit of knowledge
+ of CBOR encoding. For a simpler API, see \l{QCborValue} and especially the
+ encoding function QCborValue::toCbor().
+
+ The typical use of QCborStreamWriter is to create the object on the target
+ QByteArray or QIODevice, then call one of the append() overloads with the
+ desired type to be encoded. To create arrays and maps, QCborStreamWriter
+ provides startArray() and startMap() overloads, which must be terminated by
+ the corresponding endArray() and endMap() functions.
+
+ The following example encodes the equivalent of this JSON content:
+
+ \div{class="pre"}
+ {
+ "label": "journald",
+ "autoDetect": false,
+ "condition": "libs.journald",
+ "output": [ "privateFeature" ]
+ }
+ \enddiv
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 1
+
+ \section1 CBOR support
+
+ QCborStreamWriter supports all CBOR features required to create canonical
+ and strict streams. It implements almost all of the features specified in
+ \l {https://tools.ietf.org/html/rfc7049}{RFC 7049}.
+
+ The following table lists the CBOR features that QCborStreamWriter supports.
+
+ \table
+ \header \li Feature \li Support
+ \row \li Unsigned numbers \li Yes (full range)
+ \row \li Negative numbers \li Yes (full range)
+ \row \li Byte strings \li Yes
+ \row \li Text strings \li Yes
+ \row \li Chunked strings \li No
+ \row \li Tags \li Yes (arbitrary)
+ \row \li Booleans \li Yes
+ \row \li Null \li Yes
+ \row \li Undefined \li Yes
+ \row \li Arbitrary simple values \li Yes
+ \row \li Half-precision float (16-bit) \li Yes
+ \row \li Single-precision float (32-bit) \li Yes
+ \row \li Double-precision float (64-bit) \li Yes
+ \row \li Infinities and NaN floating point \li Yes
+ \row \li Determinate-length arrays and maps \li Yes
+ \row \li Indeterminate-length arrays and maps \li Yes
+ \row \li Map key types other than strings and integers \li Yes (arbitrary)
+ \endtable
+
+ \section2 Canonical CBOR encoding
+
+ Canonical CBOR encoding is defined by
+ \l{https://tools.ietf.org/html/rfc7049#section-3.9}{Section 3.9 of RFC
+ 7049}. Canonical encoding is not a requirement for Qt's CBOR decoding
+ functionality, but it may be required for some protocols. In particular,
+ protocols that require the ability to reproduce the same stream identically
+ may require this.
+
+ In order to be considered "canonical", a CBOR stream must meet the
+ following requirements:
+
+ \list
+ \li Integers must be as small as possible. QCborStreamWriter always
+ does this (no user action is required and it is not possible
+ to write overlong integers).
+ \li Array, map and string lengths must be as short as possible. As
+ above, QCborStreamWriter automatically does this.
+ \li Arrays, maps and strings must use explicit length. QCborStreamWriter
+ always does this for strings; for arrays and maps, be sure to call
+ startArray() and startMap() overloads with explicit length.
+ \li Keys in every map must be sorted in ascending order. QCborStreamWriter
+ offers no help in this item: the developer must ensure that before
+ calling append() for the map pairs.
+ \li Floating point values should be as small as possible. QCborStreamWriter
+ will not convert floating point values; it is up to the developer
+ to perform this check prior to calling append() (see those functions'
+ examples).
+ \endlist
+
+ \section2 Strict CBOR mode
+
+ Strict mode is defined by
+ \l{https://tools.ietf.org/html/rfc7049#section-3.10}{Section 3.10 of RFC
+ 7049}. As for Canonical encoding above, QCborStreamWriter makes it possible
+ to create strict CBOR streams, but does not require them or validate that
+ the output is so.
+
+ \list
+ \li Keys in a map must be unique. QCborStreamWriter performs no validation
+ of map keys.
+ \li Tags may be required to be paired only with the correct types,
+ according to their specification. QCborStreamWriter performs no
+ validation of tag usage.
+ \li Text Strings must be properly-encoded UTF-8. QCborStreamWriter always
+ writes proper UTF-8 for strings added with append(), but performs no
+ validation for strings added with appendTextString().
+ \endlist
+
+ \section2 Invalid CBOR stream
+
+ It is also possible to misuse QCborStreamWriter and produce invalid CBOR
+ streams that will fail to be decoded by a receiver. The following actions
+ will produce invalid streams:
+
+ \list
+ \li Append a tag and not append the corresponding tagged value
+ (QCborStreamWriter produces no diagnostic).
+ \li Append too many or too few items to an array or map with explicit
+ length (endMap() and endArray() will return false and
+ QCborStreamWriter will log with qWarning()).
+ \endlist
+
+ \sa QCborStreamReader, QCborValue, QXmlStreamWriter
+ */
+
+class QCborStreamWriterPrivate
+{
+public:
+ static Q_CONSTEXPR quint64 IndefiniteLength = (std::numeric_limits<quint64>::max)();
+
+ QIODevice *device;
+ CborEncoder encoder;
+ QStack<CborEncoder> containerStack;
+ bool deleteDevice = false;
+
+ QCborStreamWriterPrivate(QIODevice *device)
+ : device(device)
+ {
+ cbor_encoder_init_writer(&encoder, qt_cbor_encoder_write_callback, this);
+ }
+
+ ~QCborStreamWriterPrivate()
+ {
+ if (deleteDevice)
+ delete device;
+ }
+
+ template <typename... Args> void executeAppend(CborError (*f)(CborEncoder *, Args...), Args... args)
+ {
+ f(&encoder, std::forward<Args>(args)...);
+ }
+
+ void createContainer(CborError (*f)(CborEncoder *, CborEncoder *, size_t), quint64 len = IndefiniteLength)
+ {
+ Q_STATIC_ASSERT(size_t(IndefiniteLength) == CborIndefiniteLength);
+ if (sizeof(len) != sizeof(size_t) && len != IndefiniteLength) {
+ if (Q_UNLIKELY(len >= CborIndefiniteLength)) {
+ // TinyCBOR can't do this in 32-bit mode
+ qWarning("QCborStreamWriter: container of size %llu is too big for a 32-bit build; "
+ "will use indeterminate length instead", len);
+ len = CborIndefiniteLength;
+ }
+ }
+
+ containerStack.push(encoder);
+ f(&containerStack.top(), &encoder, len);
+ }
+
+ bool closeContainer()
+ {
+ if (containerStack.isEmpty()) {
+ qWarning("QCborStreamWriter: closing map or array that wasn't open");
+ return false;
+ }
+
+ CborEncoder container = containerStack.pop();
+ CborError err = cbor_encoder_close_container(&container, &encoder);
+ encoder = container;
+
+ if (Q_UNLIKELY(err)) {
+ if (err == CborErrorTooFewItems)
+ qWarning("QCborStreamWriter: not enough items added to array or map");
+ else if (err == CborErrorTooManyItems)
+ qWarning("QCborStreamWriter: too many items added to array or map");
+ return false;
+ }
+
+ return true;
+ }
+};
+
+static CborError qt_cbor_encoder_write_callback(void *self, const void *data, size_t len, CborEncoderAppendType)
+{
+ auto that = static_cast<QCborStreamWriterPrivate *>(self);
+ if (!that->device)
+ return CborNoError;
+ qint64 written = that->device->write(static_cast<const char *>(data), len);
+ return (written == qsizetype(len) ? CborNoError : CborErrorIO);
+}
+
+/*!
+ Creates a QCborStreamWriter object that will write the stream to \a device.
+ The device must be opened before the first append() call is made. This
+ constructor can be used with any class that derives from QIODevice, such as
+ QFile, QProcess or QTcpSocket.
+
+ QCborStreamWriter has no buffering, so every append() call will result in
+ one or more calls to the device's \l {QIODevice::}{write()} method.
+
+ The following example writes an empty map to a file:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 2
+
+ QCborStreamWriter does not take ownership of \a device.
+
+ \sa device(), setDevice()
+ */
+QCborStreamWriter::QCborStreamWriter(QIODevice *device)
+ : d(new QCborStreamWriterPrivate(device))
+{
+}
+
+/*!
+ Creates a QCborStreamWriter object that will append the stream to \a data.
+ All streaming is done immediately to the byte array, without the need for
+ flushing any buffers.
+
+ The following example writes a number to a byte array then returns
+ it.
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 3
+
+ QCborStreamWriter does not take ownership of \a data.
+ */
+QCborStreamWriter::QCborStreamWriter(QByteArray *data)
+ : d(new QCborStreamWriterPrivate(new QBuffer(data)))
+{
+ d->deleteDevice = true;
+ d->device->open(QIODevice::WriteOnly | QIODevice::Unbuffered);
+}
+
+/*!
+ Destroys this QCborStreamWriter object and frees any resources associated.
+
+ QCborStreamWriter does not perform error checking to see if all required
+ items were written to the stream prior to the object being destroyed. It is
+ the programmer's responsibility to ensure that it was done.
+ */
+QCborStreamWriter::~QCborStreamWriter()
+{
+}
+
+/*!
+ Replaces the device or byte array that this QCborStreamWriter object is
+ writing to with \a device.
+
+ \sa device()
+ */
+void QCborStreamWriter::setDevice(QIODevice *device)
+{
+ if (d->deleteDevice)
+ delete d->device;
+ d->device = device;
+ d->deleteDevice = false;
+}
+
+/*!
+ Returns the QIODevice that this QCborStreamWriter object is writing to. The
+ device must have previously been set with either the constructor or with
+ setDevice().
+
+ If this object was created by writing to a QByteArray, this function will
+ return an internal instance of QBuffer, which is owned by QCborStreamWriter.
+
+ \sa setDevice()
+ */
+QIODevice *QCborStreamWriter::device() const
+{
+ return d->device;
+}
+
+/*!
+ \overload
+
+ Appends the 64-bit unsigned value \a u to the CBOR stream, creating a CBOR
+ Unsigned Integer value. In the following example, we write the values 0,
+ 2\sup{32} and \c UINT64_MAX:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 4
+
+ \sa QCborStreamReader::isUnsignedInteger(), QCborStreamReader::toUnsignedInteger()
+ */
+void QCborStreamWriter::append(quint64 u)
+{
+ d->executeAppend(cbor_encode_uint, uint64_t(u));
+}
+
+/*!
+ \overload
+
+ Appends the 64-bit signed value \a i to the CBOR stream. This will create
+ either a CBOR Unsigned Integer or CBOR NegativeInteger value based on the
+ sign of the parameter. In the following example, we write the values 0, -1,
+ 2\sup{32} and \c INT64_MAX:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 5
+
+ \sa QCborStreamReader::isInteger(), QCborStreamReader::toInteger()
+ */
+void QCborStreamWriter::append(qint64 i)
+{
+ d->executeAppend(cbor_encode_int, int64_t(i));
+}
+
+/*!
+ \overload
+
+ Appends the 64-bit negative value \a n to the CBOR stream.
+ QCborNegativeInteger is a 64-bit enum that holds the absolute value of the
+ negative number we want to write. If n is zero, the value written will be
+ equivalent to 2\sup{64} (that is, -18,446,744,073,709,551,616).
+
+ In the following example, we write the values -1, -2\sup{32} and INT64_MIN:
+ \snippet code/src_corelib_serialization_qcborstream.cpp 6
+
+ Note how this function can be used to encode numbers that cannot fit a
+ standard computer's 64-bit signed integer like \l qint64. That is, if \a n
+ is larger than \c{std::numeric_limits<qint64>::max()} or is 0, this will
+ represent a negative number smaller than
+ \c{std::numeric_limits<qint64>::min()}.
+
+ \sa QCborStreamReader::isNegativeInteger(), QCborStreamReader::toNegativeInteger()
+ */
+void QCborStreamWriter::append(QCborNegativeInteger n)
+{
+ d->executeAppend(cbor_encode_negative_int, uint64_t(n));
+}
+
+/*!
+ \fn void QCborStreamWriter::append(const QByteArray &ba)
+ \overload
+
+ Appends the byte array \a ba to the stream, creating a CBOR Byte String
+ value. QCborStreamWriter will attempt to write the entire string in one
+ chunk.
+
+ The following example will load and append the contents of a file to the
+ stream:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 7
+
+ As the example shows, unlike JSON, CBOR requires no escaping for binary
+ content.
+
+ \sa appendByteString(), QCborStreamReader::isByteArray(),
+ QCborStreamReader::readByteArray()
+ */
+
+/*!
+ \overload
+
+ Appends the text string \a str to the stream, creating a CBOR Text String
+ value. QCborStreamWriter will attempt to write the entire string in one
+ chunk.
+
+ The following example appends a simple string to the stream:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 8
+
+ \b{Performance note}: CBOR requires that all Text Strings be encoded in
+ UTF-8, so this function will iterate over the characters in the string to
+ determine whether the contents are US-ASCII or not. If the string is found
+ to contain characters outside of US-ASCII, it will allocate memory and
+ convert to UTF-8. If this check is unnecessary, use appendTextString()
+ instead.
+
+ \sa QCborStreamReader::isString(), QCborStreamReader::readString()
+ */
+void QCborStreamWriter::append(QLatin1String str)
+{
+ // We've got Latin-1 but CBOR wants UTF-8, so check if the string is the
+ // common subset (US-ASCII).
+ if (QtPrivate::isAscii(str)) {
+ // it is plain US-ASCII
+ appendTextString(str.latin1(), str.size());
+ } else {
+ // non-ASCII, so we need a pass-through UTF-16
+ append(QString(str));
+ }
+}
+
+/*!
+ \overload
+
+ Appends the text string \a str to the stream, creating a CBOR Text String
+ value. QCborStreamWriter will attempt to write the entire string in one
+ chunk.
+
+ The following example writes an arbitrary QString to the stream:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 9
+
+ \sa QCborStreamReader::isString(), QCborStreamReader::readString()
+ */
+void QCborStreamWriter::append(QStringView str)
+{
+ QByteArray utf8 = str.toUtf8();
+ appendTextString(utf8.constData(), utf8.size());
+}
+
+/*!
+ \overload
+
+ Appends the CBOR tag \a tag to the stream, creating a CBOR Tag value. All
+ tags must be followed by another type which they provide meaning for.
+
+ In the following example, we append a CBOR Tag 36 (Regular Expression) and a
+ QRegularExpression's pattern to the stream:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 10
+
+ \sa QCborStreamReader::isTag(), QCborStreamReader::toTag()
+ */
+void QCborStreamWriter::append(QCborTag tag)
+{
+ d->executeAppend(cbor_encode_tag, CborTag(tag));
+}
+
+/*!
+ \fn void QCborStreamWriter::append(QCborKnownTags tag)
+ \overload
+
+ Appends the CBOR tag \a tag to the stream, creating a CBOR Tag value. All
+ tags must be followed by another type which they provide meaning for.
+
+ In the following example, we append a CBOR Tag 1 (Unix \c time_t) and an
+ integer representing the current time to the stream, obtained using the \c
+ time() function:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 11
+
+ \sa QCborStreamReader::isTag(), QCborStreamReader::toTag()
+ */
+
+/*!
+ \overload
+
+ Appends the CBOR simple type \a st to the stream, creating a CBOR Simple
+ Type value. In the following example, we write the simple type for Null as
+ well as for type 32, which Qt has no support for.
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 12
+
+ \note Using Simple Types for which there is no specification can lead to
+ validation errors by the remote receiver. In addition, simple type values 24
+ through 31 (inclusive) are reserved and must not be used.
+
+ \sa QCborStreamReader::isSimpleType(), QCborStreamReader::toSimpleType()
+ */
+void QCborStreamWriter::append(QCborSimpleType st)
+{
+ d->executeAppend(cbor_encode_simple_value, uint8_t(st));
+}
+
+#ifndef QT_BOOTSTRAPPED
+/*!
+ \overload
+
+ Appends the floating point number \a f to the stream, creating a CBOR 16-bit
+ Half-Precision Floating Point value. The following code can be used to convert
+ a C++ \tt float to \c qfloat16 if there's no loss of precision and append it, or
+ instead append the \tt float.
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 13
+
+ \sa QCborStreamReader::isFloat16(), QCborStreamReader::toFloat16()
+ */
+void QCborStreamWriter::append(qfloat16 f)
+{
+ d->executeAppend(cbor_encode_half_float, static_cast<const void *>(&f));
+}
+#endif // QT_BOOTSTRAPPED
+
+/*!
+ \overload
+
+ Appends the floating point number \a f to the stream, creating a CBOR 32-bit
+ Single-Precision Floating Point value. The following code can be used to convert
+ a C++ \tt double to \tt float if there's no loss of precision and append it, or
+ instead append the \tt double.
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 14
+
+ \sa QCborStreamReader::isFloat(), QCborStreamReader::toFloat()
+ */
+void QCborStreamWriter::append(float f)
+{
+ d->executeAppend(cbor_encode_float, f);
+}
+
+/*!
+ \overload
+
+ Appends the floating point number \a d to the stream, creating a CBOR 64-bit
+ Double-Precision Floating Point value. QCborStreamWriter always appends the
+ number as-is, performing no check for whether the number is the canonical
+ form for NaN, an infinite, whether it is denormal or if it could be written
+ with a shorter format.
+
+ The following code performs all those checks, except for the denormal one,
+ which is expected to be taken into account by the system FPU or floating
+ point emulation directly.
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 15
+
+ Determining if a double can be converted to an integral with no loss of
+ precision is left as an exercise to the reader.
+
+ \sa QCborStreamReader::isDouble(), QCborStreamReader::toDouble()
+ */
+void QCborStreamWriter::append(double d)
+{
+ this->d->executeAppend(cbor_encode_double, d);
+}
+
+/*!
+ Appends \a len bytes of data starting from \a data to the stream, creating a
+ CBOR Byte String value. QCborStreamWriter will attempt to write the entire
+ string in one chunk.
+
+ Unlike the QByteArray overload of append(), this function is not limited by
+ QByteArray's size limits. However, note that neither
+ QCborStreamReader::readByteArray() nor QCborValue support reading CBOR
+ streams with byte arrays larger than 2 GB.
+
+ \sa append(), appendTextString(),
+ QCborStreamReader::isByteArray(), QCborStreamReader::readByteArray()
+ */
+void QCborStreamWriter::appendByteString(const char *data, qsizetype len)
+{
+ d->executeAppend(cbor_encode_byte_string, reinterpret_cast<const uint8_t *>(data), size_t(len));
+}
+
+/*!
+ Appends \a len bytes of text starting from \a utf8 to the stream, creating a
+ CBOR Text String value. QCborStreamWriter will attempt to write the entire
+ string in one chunk.
+
+ The string pointed to by \a utf8 is expected to be properly encoded UTF-8.
+ QCborStreamWriter performs no validation that this is the case.
+
+ Unlike the QLatin1String overload of append(), this function is not limited
+ to 2 GB. However, note that neither QCborStreamReader::readString() nor
+ QCborValue support reading CBOR streams with text strings larger than 2 GB.
+
+ \sa append(QLatin1String), append(QStringView),
+ QCborStreamReader::isString(), QCborStreamReader::readString()
+ */
+void QCborStreamWriter::appendTextString(const char *utf8, qsizetype len)
+{
+ d->executeAppend(cbor_encode_text_string, utf8, size_t(len));
+}
+
+/*!
+ \fn void QCborStreamWriter::append(const char *str, qsizetype size)
+ \overload
+
+ Appends \a size bytes of text starting from \a str to the stream, creating a
+ CBOR Text String value. QCborStreamWriter will attempt to write the entire
+ string in one chunk. If \a size is -1, this function will write \c strlen(\a
+ str) bytes.
+
+ The string pointed to by \a str is expected to be properly encoded UTF-8.
+ QCborStreamWriter performs no validation that this is the case.
+
+ Unlike the QLatin1String overload of append(), this function is not limited
+ to 2 GB. However, note that neither QCborStreamReader nor QCborValue support
+ reading CBOR streams with text strings larger than 2 GB.
+
+ \sa append(QLatin1String), append(QStringView),
+ QCborStreamReader::isString(), QCborStreamReader::readString()
+ */
+
+/*!
+ \fn void QCborStreamWriter::append(bool b)
+ \overload
+
+ Appends the boolean value \a b to the stream, creating either a CBOR False
+ value or a CBOR True value. This function is equivalent to (and implemented
+ as):
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 16
+
+ \sa appendNull(), appendUndefined(),
+ QCborStreamReader::isBool(), QCborStreamReader::toBool()
+ */
+
+/*!
+ \fn void QCborStreamWriter::append(std::nullptr_t)
+ \overload
+
+ Appends a CBOR Null value to the stream. This function is equivalent to (and
+ implemented as): The parameter is ignored.
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 17
+
+ \sa appendNull(), append(QCborSimpleType), QCborStreamReader::isNull()
+ */
+
+/*!
+ \fn void QCborStreamWriter::appendNull()
+
+ Appends a CBOR Null value to the stream. This function is equivalent to (and
+ implemented as):
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 18
+
+ \sa append(std::nullptr_t), append(QCborSimpleType), QCborStreamReader::isNull()
+ */
+
+/*!
+ \fn void QCborStreamWriter::appendUndefined()
+
+ Appends a CBOR Undefined value to the stream. This function is equivalent to (and
+ implemented as):
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 19
+
+ \sa append(QCborSimpleType), QCborStreamReader::isUndefined()
+ */
+
+/*!
+ Starts a CBOR Array with indeterminate length in the CBOR stream. Each
+ startArray() call must be paired with one endArray() call and the current
+ CBOR element extends until the end of the array.
+
+ The array created by this function has no explicit length. Instead, its
+ length is implied by the elements contained in it. Note, however, that use
+ of indeterminate-length arrays is not compliant with canonical CBOR encoding.
+
+ The following example appends elements from the linked list of strings
+ passed as input:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 20
+
+ \sa startArray(quint64), endArray(), startMap(), QCborStreamReader::isArray(),
+ QCborStreamReader::isLengthKnown()
+ */
+void QCborStreamWriter::startArray()
+{
+ d->createContainer(cbor_encoder_create_array);
+}
+
+/*!
+ \overload
+
+ Starts a CBOR Array with explicit length of \a count items in the CBOR
+ stream. Each startArray call must be paired with one endArray() call and the
+ current CBOR element extends until the end of the array.
+
+ The array created by this function has an explicit length and therefore
+ exactly \a count items must be added to the CBOR stream. Adding fewer or
+ more items will result in failure during endArray() and the CBOR stream will
+ be corrupt. However, explicit-length arrays are required by canonical CBOR
+ encoding.
+
+ The following example appends all strings found in the \l QStringList passed as input:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 21
+
+ \b{Size limitations}: The parameter to this function is quint64, which would
+ seem to allow up to 2\sup{64}-1 elements in the array. However, both
+ QCborStreamWriter and QCborStreamReader are currently limited to 2\sup{32}-2
+ items on 32-bit systems and 2\sup{64}-2 items on 64-bit ones. Also note that
+ QCborArray is currently limited to 2\sup{27} elements in any platform.
+
+ \sa startArray(), endArray(), startMap(), QCborStreamReader::isArray(),
+ QCborStreamReader::isLengthKnown()
+ */
+void QCborStreamWriter::startArray(quint64 count)
+{
+ d->createContainer(cbor_encoder_create_array, count);
+}
+
+/*!
+ Terminates the array started by either overload of startArray() and returns
+ true if the correct number of elements was added to the array. This function
+ must be called for every startArray() used.
+
+ A return of false indicates error in the application and an unrecoverable
+ error in this stream. QCborStreamWriter also writes a warning using
+ qWarning() if that happens.
+
+ Calling this function when the current container is not an array is also an
+ error, though QCborStreamWriter cannot currently detect this condition.
+
+ \sa startArray(), startArray(quint64), endMap()
+ */
+bool QCborStreamWriter::endArray()
+{
+ return d->closeContainer();
+}
+
+/*!
+ Starts a CBOR Map with indeterminate length in the CBOR stream. Each
+ startMap() call must be paired with one endMap() call and the current CBOR
+ element extends until the end of the map.
+
+ The map created by this function has no explicit length. Instead, its length
+ is implied by the elements contained in it. Note, however, that use of
+ indeterminate-length maps is not compliant with canonical CBOR encoding
+ (canonical encoding also requires keys to be unique and in sorted order).
+
+ The following example appends elements from the linked list of int and
+ string pairs passed as input:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 22
+
+ \sa startMap(quint64), endMap(), startArray(), QCborStreamReader::isMap(),
+ QCborStreamReader::isLengthKnown()
+ */
+void QCborStreamWriter::startMap()
+{
+ d->createContainer(cbor_encoder_create_map);
+}
+
+/*!
+ \overload
+
+ Starts a CBOR Map with explicit length of \a count items in the CBOR
+ stream. Each startMap call must be paired with one endMap() call and the
+ current CBOR element extends until the end of the map.
+
+ The map created by this function has an explicit length and therefore
+ exactly \a count pairs of items must be added to the CBOR stream. Adding
+ fewer or more items will result in failure during endMap() and the CBOR
+ stream will be corrupt. However, explicit-length map are required by
+ canonical CBOR encoding.
+
+ The following example appends all strings found in the \l QMap passed as input:
+
+ \snippet code/src_corelib_serialization_qcborstream.cpp 23
+
+ \b{Size limitations}: The parameter to this function is quint64, which would
+ seem to allow up to 2\sup{64}-1 pairs in the map. However, both
+ QCborStreamWriter and QCborStreamReader are currently limited to 2\sup{31}-1
+ items on 32-bit systems and 2\sup{63}-1 items on 64-bit ones. Also note that
+ QCborMap is currently limited to 2\sup{26} elements in any platform.
+
+ \sa startMap(), endMap(), startArray(), QCborStreamReader::isMap(),
+ QCborStreamReader::isLengthKnown()
+ */
+void QCborStreamWriter::startMap(quint64 count)
+{
+ d->createContainer(cbor_encoder_create_map, count);
+}
+
+/*!
+ Terminates the map started by either overload of startMap() and returns
+ true if the correct number of elements was added to the array. This function
+ must be called for every startMap() used.
+
+ A return of false indicates error in the application and an unrecoverable
+ error in this stream. QCborStreamWriter also writes a warning using
+ qWarning() if that happens.
+
+ Calling this function when the current container is not a map is also an
+ error, though QCborStreamWriter cannot currently detect this condition.
+
+ \sa startMap(), startMap(quint64), endArray()
+ */
+bool QCborStreamWriter::endMap()
+{
+ return d->closeContainer();
+}
+
+QT_END_NAMESPACE
diff --git a/src/corelib/serialization/qcborstreamwriter.h b/src/corelib/serialization/qcborstreamwriter.h
new file mode 100644
index 0000000000..f8c94ceb93
--- /dev/null
+++ b/src/corelib/serialization/qcborstreamwriter.h
@@ -0,0 +1,130 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Intel Corporation.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QCBORSTREAMWRITER_H
+#define QCBORSTREAMWRITER_H
+
+#include <QtCore/qbytearray.h>
+#include <QtCore/qcborcommon.h>
+#include <QtCore/qscopedpointer.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qstringview.h>
+#ifndef QT_BOOTSTRAPPED
+#include <QtCore/qfloat16.h>
+#endif
+
+QT_REQUIRE_CONFIG(cborstreamwriter);
+
+// See qcborcommon.h for why we check
+#if defined(QT_X11_DEFINES_FOUND)
+# undef True
+# undef False
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QIODevice;
+
+class QCborStreamWriterPrivate;
+class Q_CORE_EXPORT QCborStreamWriter
+{
+public:
+ explicit QCborStreamWriter(QIODevice *device);
+ explicit QCborStreamWriter(QByteArray *data);
+ ~QCborStreamWriter();
+ Q_DISABLE_COPY(QCborStreamWriter)
+
+ void setDevice(QIODevice *device);
+ QIODevice *device() const;
+
+ void append(quint64 u);
+ void append(qint64 i);
+ void append(QCborNegativeInteger n);
+ void append(const QByteArray &ba) { appendByteString(ba.constData(), ba.size()); }
+ void append(QLatin1String str);
+ void append(QStringView str);
+ void append(QCborTag tag);
+ void append(QCborKnownTags tag) { append(QCborTag(tag)); }
+ void append(QCborSimpleType st);
+ void append(std::nullptr_t) { append(QCborSimpleType::Null); }
+#ifndef QT_BOOTSTRAPPED
+ void append(qfloat16 f);
+#endif
+ void append(float f);
+ void append(double d);
+
+ void appendByteString(const char *data, qsizetype len);
+ void appendTextString(const char *utf8, qsizetype len);
+
+ // convenience
+ void append(bool b) { append(b ? QCborSimpleType::True : QCborSimpleType::False); }
+ void appendNull() { append(QCborSimpleType::Null); }
+ void appendUndefined() { append(QCborSimpleType::Undefined); }
+
+#ifndef Q_QDOC
+ // overloads to make normal code not complain
+ void append(int i) { append(qint64(i)); }
+ void append(uint u) { append(quint64(u)); }
+#endif
+#ifndef QT_NO_CAST_FROM_ASCII
+ void append(const char *str, qsizetype size = -1)
+ { appendTextString(str, (str && size == -1) ? int(strlen(str)) : size); }
+#endif
+
+ void startArray();
+ void startArray(quint64 count);
+ bool endArray();
+ void startMap();
+ void startMap(quint64 count);
+ bool endMap();
+
+ // no API for encoding chunked strings
+
+private:
+ QScopedPointer<QCborStreamWriterPrivate> d;
+};
+
+QT_END_NAMESPACE
+
+#if defined(QT_X11_DEFINES_FOUND)
+# define True 1
+# define False 0
+#endif
+
+#endif // QCBORSTREAMWRITER_H
diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp
index 4052bfa22e..db2840704c 100644
--- a/src/corelib/serialization/qcborvalue.cpp
+++ b/src/corelib/serialization/qcborvalue.cpp
@@ -42,7 +42,14 @@
#include "qdatastream.h"
#include "qcborarray.h"
#include "qcbormap.h"
-#include "qcborstream.h"
+
+#if QT_CONFIG(cborstreamreader)
+#include "qcborstreamreader.h"
+#endif
+
+#if QT_CONFIG(cborstreamwriter)
+#include "qcborstreamwriter.h"
+#endif
#include <qendian.h>
#include <qlocale.h>
@@ -795,6 +802,7 @@ static QCborValue::Type convertToExtendedType(QCborContainerPrivate *d)
break;
}
+#ifndef QT_BOOTSTRAPPED
case qint64(QCborKnownTags::Url):
if (e.type == QCborValue::String) {
if (b) {
@@ -808,13 +816,16 @@ static QCborValue::Type convertToExtendedType(QCborContainerPrivate *d)
return QCborValue::Url;
}
break;
+#endif // QT_BOOTSTRAPPED
+#if QT_CONFIG(regularexpression)
case quint64(QCborKnownTags::RegularExpression):
if (e.type == QCborValue::String) {
// no normalization is necessary
return QCborValue::RegularExpression;
}
break;
+#endif // QT_CONFIG(regularexpression)
case qint64(QCborKnownTags::Uuid):
if (e.type == QCborValue::ByteArray) {
@@ -833,15 +844,20 @@ static QCborValue::Type convertToExtendedType(QCborContainerPrivate *d)
return QCborValue::Tag;
}
+#if QT_CONFIG(cborstreamreader)
// in qcborstream.cpp
extern void qt_cbor_stream_set_error(QCborStreamReaderPrivate *d, QCborError error);
+#endif
+#if QT_CONFIG(cborstreamwriter)
static void writeDoubleToCbor(QCborStreamWriter &writer, double d, QCborValue::EncodingOptions opt)
{
if (qt_is_nan(d)) {
- if (opt & QCborValue::UseFloat16) {
+ if (opt & QCborValue::UseFloat) {
+#ifndef QT_BOOTSTRAPPED
if ((opt & QCborValue::UseFloat16) == QCborValue::UseFloat16)
return writer.append(std::numeric_limits<qfloat16>::quiet_NaN());
+#endif
return writer.append(std::numeric_limits<float>::quiet_NaN());
}
return writer.append(qt_qnan());
@@ -858,15 +874,17 @@ static void writeDoubleToCbor(QCborStreamWriter &writer, double d, QCborValue::E
}
}
- if (opt & QCborValue::UseFloat16) {
+ if (opt & QCborValue::UseFloat) {
float f = float(d);
if (f == d) {
// no data loss, we could use float
+#ifndef QT_BOOTSTRAPPED
if ((opt & QCborValue::UseFloat16) == QCborValue::UseFloat16) {
qfloat16 f16 = f;
if (f16 == f)
return writer.append(f16);
}
+#endif
return writer.append(f);
}
@@ -874,6 +892,7 @@ static void writeDoubleToCbor(QCborStreamWriter &writer, double d, QCborValue::E
writer.append(d);
}
+#endif // QT_CONFIG(cborstreamwriter)
static inline int typeOrder(Element e1, Element e2)
{
@@ -1296,6 +1315,7 @@ int QCborMap::compare(const QCborMap &other) const noexcept
return compareContainer(d.data(), other.d.data());
}
+#if QT_CONFIG(cborstreamwriter)
static void encodeToCbor(QCborStreamWriter &writer, const QCborContainerPrivate *d, qsizetype idx,
QCborValue::EncodingOptions opt)
{
@@ -1383,7 +1403,9 @@ static void encodeToCbor(QCborStreamWriter &writer, const QCborContainerPrivate
qWarning("QCborValue: found unknown type 0x%x", e.type);
}
}
+#endif // QT_CONFIG(cborstreamwriter)
+#if QT_CONFIG(cborstreamreader)
static inline double integerOutOfRange(const QCborStreamReader &reader)
{
Q_ASSERT(reader.isInteger());
@@ -1640,6 +1662,7 @@ void QCborContainerPrivate::decodeFromCbor(QCborStreamReader &reader)
if (reader.lastError() == QCborError::NoError)
reader.leaveContainer();
}
+#endif // QT_CONFIG(cborstreamreader)
/*!
Creates a QCborValue with byte array value \a ba. The value can later be
@@ -1774,6 +1797,7 @@ QCborValue::QCborValue(const QDateTime &dt)
container->elements[1].type = String;
}
+#ifndef QT_BOOTSTRAPPED
/*!
Creates a QCborValue object of the URL extended type and containing the
value represented by \a url. The value can later be retrieved using toUrl().
@@ -1790,6 +1814,7 @@ QCborValue::QCborValue(const QUrl &url)
t = Url;
container->elements[1].type = String;
}
+#endif
#if QT_CONFIG(regularexpression)
/*!
@@ -1943,6 +1968,7 @@ QDateTime QCborValue::toDateTime(const QDateTime &defaultValue) const
return QDateTime::fromString(byteData->asLatin1(), Qt::ISODateWithMs);
}
+#ifndef QT_BOOTSTRAPPED
/*!
Returns the URL value stored in this QCborValue, if it is of the URL
extended type. Otherwise, it returns \a defaultValue.
@@ -1963,6 +1989,7 @@ QUrl QCborValue::toUrl(const QUrl &defaultValue) const
return QUrl::fromEncoded(byteData->asByteArrayView());
}
+#endif
#if QT_CONFIG(regularexpression)
/*!
@@ -2335,6 +2362,7 @@ QCborValueRef QCborValue::operator[](qint64 key)
return { container, index };
}
+#if QT_CONFIG(cborstreamreader)
/*!
Decodes one item from the CBOR stream found in \a reader and returns the
equivalent representation. This function is recursive: if the item is a map
@@ -2449,7 +2477,9 @@ QCborValue QCborValue::fromCbor(const QByteArray &ba, QCborParserError *error)
overload of this function that accepts a QByteArray, also passing \a error,
if provided.
*/
+#endif // QT_CONFIG(cborstreamreader)
+#if QT_CONFIG(cborstreamwriter)
/*!
Encodes this QCborValue object to its CBOR representation, using the
options specified in \a opt, and return the byte array containing that
@@ -2572,6 +2602,7 @@ void QCborValueRef::toCbor(QCborStreamWriter &writer, QCborValue::EncodingOption
{
concrete().toCbor(writer, opt);
}
+#endif // QT_CONFIG(cborstreamwriter)
void QCborValueRef::assign(QCborValueRef that, const QCborValue &other)
{
@@ -2891,8 +2922,10 @@ uint qHash(const QCborValue &value, uint seed)
return qHash(value.toDouble(), seed);
case QCborValue::DateTime:
return qHash(value.toDateTime(), seed);
+#ifndef QT_BOOTSTRAPPED
case QCborValue::Url:
return qHash(value.toUrl(), seed);
+#endif
#if QT_CONFIG(regularexpression)
case QCborValue::RegularExpression:
return qHash(value.toRegularExpression(), seed);
@@ -2945,8 +2978,10 @@ static QDebug debugContents(QDebug &dbg, const QCborValue &v)
}
case QCborValue::DateTime:
return dbg << v.toDateTime();
+#ifndef QT_BOOTSTRAPPED
case QCborValue::Url:
return dbg << v.toUrl();
+#endif
#if QT_CONFIG(regularexpression)
case QCborValue::RegularExpression:
return dbg << v.toRegularExpression();
@@ -2968,6 +3003,112 @@ QDebug operator<<(QDebug dbg, const QCborValue &v)
dbg.nospace() << "QCborValue(";
return debugContents(dbg, v) << ')';
}
+
+Q_CORE_EXPORT const char *qt_cbor_simpletype_id(QCborSimpleType st)
+{
+ switch (st) {
+ case QCborSimpleType::False:
+ return "False";
+ case QCborSimpleType::True:
+ return "True";
+ case QCborSimpleType::Null:
+ return "Null";
+ case QCborSimpleType::Undefined:
+ return "Undefined";
+ }
+ return nullptr;
+}
+
+QDebug operator<<(QDebug dbg, QCborSimpleType st)
+{
+ QDebugStateSaver saver(dbg);
+ const char *id = qt_cbor_simpletype_id(st);
+ if (id)
+ return dbg.nospace() << "QCborSimpleType::" << id;
+
+ return dbg.nospace() << "QCborSimpleType(" << uint(st) << ')';
+}
+
+Q_CORE_EXPORT const char *qt_cbor_tag_id(QCborTag tag)
+{
+ // Casting to QCborKnownTags's underlying type will make the comparison
+ // below fail if the tag value is out of range.
+ auto n = std::underlying_type<QCborKnownTags>::type(tag);
+ if (QCborTag(n) == tag) {
+ switch (QCborKnownTags(n)) {
+ case QCborKnownTags::DateTimeString:
+ return "DateTimeString";
+ case QCborKnownTags::UnixTime_t:
+ return "UnixTime_t";
+ case QCborKnownTags::PositiveBignum:
+ return "PositiveBignum";
+ case QCborKnownTags::NegativeBignum:
+ return "NegativeBignum";
+ case QCborKnownTags::Decimal:
+ return "Decimal";
+ case QCborKnownTags::Bigfloat:
+ return "Bigfloat";
+ case QCborKnownTags::COSE_Encrypt0:
+ return "COSE_Encrypt0";
+ case QCborKnownTags::COSE_Mac0:
+ return "COSE_Mac0";
+ case QCborKnownTags::COSE_Sign1:
+ return "COSE_Sign1";
+ case QCborKnownTags::ExpectedBase64url:
+ return "ExpectedBase64url";
+ case QCborKnownTags::ExpectedBase64:
+ return "ExpectedBase64";
+ case QCborKnownTags::ExpectedBase16:
+ return "ExpectedBase16";
+ case QCborKnownTags::EncodedCbor:
+ return "EncodedCbor";
+ case QCborKnownTags::Url:
+ return "Url";
+ case QCborKnownTags::Base64url:
+ return "Base64url";
+ case QCborKnownTags::Base64:
+ return "Base64";
+ case QCborKnownTags::RegularExpression:
+ return "RegularExpression";
+ case QCborKnownTags::MimeMessage:
+ return "MimeMessage";
+ case QCborKnownTags::Uuid:
+ return "Uuid";
+ case QCborKnownTags::COSE_Encrypt:
+ return "COSE_Encrypt";
+ case QCborKnownTags::COSE_Mac:
+ return "COSE_Mac";
+ case QCborKnownTags::COSE_Sign:
+ return "COSE_Sign";
+ case QCborKnownTags::Signature:
+ return "Signature";
+ }
+ }
+ return nullptr;
+}
+
+QDebug operator<<(QDebug dbg, QCborTag tag)
+{
+ QDebugStateSaver saver(dbg);
+ const char *id = qt_cbor_tag_id(tag);
+ dbg.nospace() << "QCborTag(";
+ if (id)
+ dbg.nospace() << "QCborKnownTags::" << id;
+ else
+ dbg.nospace() << quint64(tag);
+
+ return dbg << ')';
+}
+
+QDebug operator<<(QDebug dbg, QCborKnownTags tag)
+{
+ QDebugStateSaver saver(dbg);
+ const char *id = qt_cbor_tag_id(QCborTag(int(tag)));
+ if (id)
+ return dbg.nospace() << "QCborKnownTags::" << id;
+
+ return dbg.nospace() << "QCborKnownTags(" << int(tag) << ')';
+}
#endif
#ifndef QT_NO_DATASTREAM
@@ -2995,4 +3136,6 @@ QT_END_NAMESPACE
#include "qcborarray.cpp"
#include "qcbormap.cpp"
+#ifndef QT_NO_QOBJECT
#include "moc_qcborvalue.cpp"
+#endif
diff --git a/src/corelib/serialization/qcborvalue.h b/src/corelib/serialization/qcborvalue.h
index dcbe7efc26..f7064ac6e1 100644
--- a/src/corelib/serialization/qcborvalue.h
+++ b/src/corelib/serialization/qcborvalue.h
@@ -71,6 +71,8 @@ class QCborStreamReader;
class QCborStreamWriter;
class QDataStream;
+namespace QJsonPrivate { class Value; }
+
struct QCborParserError
{
qint64 offset = 0;
@@ -88,7 +90,9 @@ public:
enum EncodingOption {
SortKeysInMaps = 0x01,
UseFloat = 0x02,
+#ifndef QT_BOOTSTRAPPED
UseFloat16 = UseFloat | 0x04,
+#endif
UseIntegers = 0x08,
NoTransformation = 0
@@ -161,7 +165,9 @@ public:
{}
explicit QCborValue(const QDateTime &dt);
+#ifndef QT_BOOTSTRAPPED
explicit QCborValue(const QUrl &url);
+#endif
#if QT_CONFIG(regularexpression)
explicit QCborValue(const QRegularExpression &rx);
#endif
@@ -283,20 +289,26 @@ public:
static QCborValue fromJsonValue(const QJsonValue &v);
QJsonValue toJsonValue() const;
+#if QT_CONFIG(cborstreamreader)
static QCborValue fromCbor(QCborStreamReader &reader);
static QCborValue fromCbor(const QByteArray &ba, QCborParserError *error = nullptr);
static QCborValue fromCbor(const char *data, qsizetype len, QCborParserError *error = nullptr)
{ return fromCbor(QByteArray(data, int(len)), error); }
static QCborValue fromCbor(const quint8 *data, qsizetype len, QCborParserError *error = nullptr)
{ return fromCbor(QByteArray(reinterpret_cast<const char *>(data), int(len)), error); }
+#endif // QT_CONFIG(cborstreamreader)
+#if QT_CONFIG(cborstreamwriter)
QByteArray toCbor(EncodingOptions opt = NoTransformation);
void toCbor(QCborStreamWriter &writer, EncodingOptions opt = NoTransformation);
+#endif
QString toDiagnosticNotation(DiagnosticNotationOptions opts = Compact) const;
private:
friend class QCborValueRef;
friend class QCborContainerPrivate;
+ friend class QJsonPrivate::Value;
+
qint64 n = 0;
QCborContainerPrivate *container = nullptr;
Type t = Undefined;
@@ -387,8 +399,10 @@ public:
{ return concrete().toString(defaultValue); }
QDateTime toDateTime(const QDateTime &defaultValue = {}) const
{ return concrete().toDateTime(defaultValue); }
+#ifndef QT_BOOTSTRAPPED
QUrl toUrl(const QUrl &defaultValue = {}) const
{ return concrete().toUrl(defaultValue); }
+#endif
#if QT_CONFIG(regularexpression)
QRegularExpression toRegularExpression(const QRegularExpression &defaultValue = {}) const
{ return concrete().toRegularExpression(defaultValue); }
@@ -431,9 +445,11 @@ public:
QVariant toVariant() const { return concrete().toVariant(); }
QJsonValue toJsonValue() const;
+#if QT_CONFIG(cborstreamwriter)
QByteArray toCbor(QCborValue::EncodingOptions opt = QCborValue::NoTransformation)
{ return concrete().toCbor(opt); }
void toCbor(QCborStreamWriter &writer, QCborValue::EncodingOptions opt = QCborValue::NoTransformation);
+#endif
QString toDiagnosticNotation(QCborValue::DiagnosticNotationOptions opt = QCborValue::Compact)
{ return concrete().toDiagnosticNotation(opt); }
diff --git a/src/corelib/serialization/qdatastream.cpp b/src/corelib/serialization/qdatastream.cpp
index b3330d6cea..5082a8cb0d 100644
--- a/src/corelib/serialization/qdatastream.cpp
+++ b/src/corelib/serialization/qdatastream.cpp
@@ -566,6 +566,7 @@ void QDataStream::setByteOrder(ByteOrder bo)
\value Qt_5_12 Version 18 (Qt 5.12)
\value Qt_5_13 Version 19 (Qt 5.13)
\value Qt_5_14 Same as Qt_5_13
+ \value Qt_5_15 Same as Qt_5_13
\omitvalue Qt_DefaultCompiledVersion
\sa setVersion(), version()
diff --git a/src/corelib/serialization/qdatastream.h b/src/corelib/serialization/qdatastream.h
index cfcd89333b..4d827772c8 100644
--- a/src/corelib/serialization/qdatastream.h
+++ b/src/corelib/serialization/qdatastream.h
@@ -301,7 +301,10 @@ QDataStream &readAssociativeContainer(QDataStream &s, Container &c)
c.clear();
break;
}
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
c.insertMulti(k, t);
+QT_WARNING_POP
}
return s;
@@ -321,14 +324,31 @@ template <typename Container>
QDataStream &writeAssociativeContainer(QDataStream &s, const Container &c)
{
s << quint32(c.size());
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15)
// Deserialization should occur in the reverse order.
// Otherwise, value() will return the least recently inserted
// value instead of the most recently inserted one.
auto it = c.constEnd();
auto begin = c.constBegin();
while (it != begin) {
+ QT_WARNING_PUSH
+ QT_WARNING_DISABLE_DEPRECATED
--it;
+ QT_WARNING_POP
s << it.key() << it.value();
+#else
+ auto it = c.constBegin();
+ auto end = c.constEnd();
+ while (it != end) {
+ const auto rangeStart = it++;
+ while (it != end && rangeStart.key() == it.key())
+ ++it;
+ const qint64 last = std::distance(rangeStart, it) - 1;
+ for (qint64 i = last; i >= 0; --i) {
+ auto next = std::next(rangeStart, i);
+ s << next.key() << next.value();
+ }
+#endif
}
return s;
diff --git a/src/corelib/serialization/qjson.cpp b/src/corelib/serialization/qjson.cpp
deleted file mode 100644
index 76f1eae1ce..0000000000
--- a/src/corelib/serialization/qjson.cpp
+++ /dev/null
@@ -1,451 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qjson_p.h"
-#include <qalgorithms.h>
-
-QT_BEGIN_NAMESPACE
-
-namespace QJsonPrivate
-{
-
-static Q_CONSTEXPR Base emptyArray = { { qle_uint(sizeof(Base)) }, { 0 }, { qle_uint(0) } };
-static Q_CONSTEXPR Base emptyObject = { { qle_uint(sizeof(Base)) }, { qToLittleEndian(1u) }, { qle_uint(0) } };
-
-void Data::compact()
-{
- Q_ASSERT(sizeof(Value) == sizeof(offset));
-
- if (!compactionCounter)
- return;
-
- Base *base = header->root();
- int reserve = 0;
- if (base->is_object) {
- Object *o = static_cast<Object *>(base);
- for (int i = 0; i < (int)o->length; ++i)
- reserve += o->entryAt(i)->usedStorage(o);
- } else {
- Array *a = static_cast<Array *>(base);
- for (int i = 0; i < (int)a->length; ++i)
- reserve += (*a)[i].usedStorage(a);
- }
-
- int size = sizeof(Base) + reserve + base->length*sizeof(offset);
- int alloc = sizeof(Header) + size;
- Header *h = (Header *) malloc(alloc);
- Q_CHECK_PTR(h);
- h->tag = QJsonDocument::BinaryFormatTag;
- h->version = 1;
- Base *b = h->root();
- b->size = size;
- b->is_object = header->root()->is_object;
- b->length = base->length;
- b->tableOffset = reserve + sizeof(Array);
-
- int offset = sizeof(Base);
- if (b->is_object) {
- Object *o = static_cast<Object *>(base);
- Object *no = static_cast<Object *>(b);
-
- for (int i = 0; i < (int)o->length; ++i) {
- no->table()[i] = offset;
-
- const Entry *e = o->entryAt(i);
- Entry *ne = no->entryAt(i);
- int s = e->size();
- memcpy(ne, e, s);
- offset += s;
- int dataSize = e->value.usedStorage(o);
- if (dataSize) {
- memcpy((char *)no + offset, e->value.data(o), dataSize);
- ne->value.value = offset;
- offset += dataSize;
- }
- }
- } else {
- Array *a = static_cast<Array *>(base);
- Array *na = static_cast<Array *>(b);
-
- for (int i = 0; i < (int)a->length; ++i) {
- const Value &v = (*a)[i];
- Value &nv = (*na)[i];
- nv = v;
- int dataSize = v.usedStorage(a);
- if (dataSize) {
- memcpy((char *)na + offset, v.data(a), dataSize);
- nv.value = offset;
- offset += dataSize;
- }
- }
- }
- Q_ASSERT(offset == (int)b->tableOffset);
-
- free(header);
- header = h;
- this->alloc = alloc;
- compactionCounter = 0;
-}
-
-bool Data::valid() const
-{
- if (header->tag != QJsonDocument::BinaryFormatTag || header->version != 1u)
- return false;
-
- bool res = false;
- Base *root = header->root();
- int maxSize = alloc - sizeof(Header);
- if (root->is_object)
- res = static_cast<Object *>(root)->isValid(maxSize);
- else
- res = static_cast<Array *>(root)->isValid(maxSize);
-
- return res;
-}
-
-
-int Base::reserveSpace(uint dataSize, int posInTable, uint numItems, bool replace)
-{
- Q_ASSERT(posInTable >= 0 && posInTable <= (int)length);
- if (size + dataSize >= Value::MaxSize) {
- qWarning("QJson: Document too large to store in data structure %d %d %d", (uint)size, dataSize, Value::MaxSize);
- return 0;
- }
-
- offset off = tableOffset;
- // move table to new position
- if (replace) {
- memmove((char *)(table()) + dataSize, table(), length*sizeof(offset));
- } else {
- memmove((char *)(table() + posInTable + numItems) + dataSize, table() + posInTable, (length - posInTable)*sizeof(offset));
- memmove((char *)(table()) + dataSize, table(), posInTable*sizeof(offset));
- }
- tableOffset += dataSize;
- for (int i = 0; i < (int)numItems; ++i)
- table()[posInTable + i] = off;
- size += dataSize;
- if (!replace) {
- length += numItems;
- size += numItems * sizeof(offset);
- }
- return off;
-}
-
-void Base::removeItems(int pos, int numItems)
-{
- Q_ASSERT(pos >= 0 && pos <= (int)length);
- if (pos + numItems < (int)length)
- memmove(table() + pos, table() + pos + numItems, (length - pos - numItems)*sizeof(offset));
- length -= numItems;
-}
-
-int Object::indexOf(QStringView key, bool *exists) const
-{
- int min = 0;
- int n = length;
- while (n > 0) {
- int half = n >> 1;
- int middle = min + half;
- if (*entryAt(middle) >= key) {
- n = half;
- } else {
- min = middle + 1;
- n -= half + 1;
- }
- }
- if (min < (int)length && *entryAt(min) == key) {
- *exists = true;
- return min;
- }
- *exists = false;
- return min;
-}
-
-int Object::indexOf(QLatin1String key, bool *exists) const
-{
- int min = 0;
- int n = length;
- while (n > 0) {
- int half = n >> 1;
- int middle = min + half;
- if (*entryAt(middle) >= key) {
- n = half;
- } else {
- min = middle + 1;
- n -= half + 1;
- }
- }
- if (min < (int)length && *entryAt(min) == key) {
- *exists = true;
- return min;
- }
- *exists = false;
- return min;
-}
-
-bool Object::isValid(int maxSize) const
-{
- if (size > (uint)maxSize || tableOffset + length*sizeof(offset) > size)
- return false;
-
- QString lastKey;
- for (uint i = 0; i < length; ++i) {
- offset entryOffset = table()[i];
- if (entryOffset + sizeof(Entry) >= tableOffset)
- return false;
- Entry *e = entryAt(i);
- if (!e->isValid(tableOffset - table()[i]))
- return false;
- QString key = e->key();
- if (key < lastKey)
- return false;
- if (!e->value.isValid(this))
- return false;
- lastKey = key;
- }
- return true;
-}
-
-
-
-bool Array::isValid(int maxSize) const
-{
- if (size > (uint)maxSize || tableOffset + length*sizeof(offset) > size)
- return false;
-
- for (uint i = 0; i < length; ++i) {
- if (!at(i).isValid(this))
- return false;
- }
- return true;
-}
-
-
-bool Entry::operator ==(QStringView key) const
-{
- if (value.latinKey)
- return (shallowLatin1Key() == key);
- else
- return (shallowKey() == key);
-}
-
-bool Entry::operator==(QLatin1String key) const
-{
- if (value.latinKey)
- return shallowLatin1Key() == key;
- else
- return shallowKey() == QString(key); // ### conversion to QString
-}
-
-bool Entry::operator ==(const Entry &other) const
-{
- if (value.latinKey) {
- if (other.value.latinKey)
- return shallowLatin1Key() == other.shallowLatin1Key();
- return shallowLatin1Key() == other.shallowKey();
- } else if (other.value.latinKey) {
- return shallowKey() == other.shallowLatin1Key();
- }
- return shallowKey() == other.shallowKey();
-}
-
-bool Entry::operator >=(const Entry &other) const
-{
- if (value.latinKey) {
- if (other.value.latinKey)
- return shallowLatin1Key() >= other.shallowLatin1Key();
- return shallowLatin1Key() >= other.shallowKey();
- } else if (other.value.latinKey) {
- return shallowKey() >= other.shallowLatin1Key();
- }
- return shallowKey() >= other.shallowKey();
-}
-
-
-int Value::usedStorage(const Base *b) const
-{
- int s = 0;
- switch (type) {
- case QJsonValue::Double:
- if (latinOrIntValue)
- break;
- s = sizeof(double);
- break;
- case QJsonValue::String: {
- char *d = data(b);
- if (latinOrIntValue)
- s = sizeof(ushort) + qFromLittleEndian(*(ushort *)d);
- else
- s = sizeof(int) + sizeof(ushort) * qFromLittleEndian(*(int *)d);
- break;
- }
- case QJsonValue::Array:
- case QJsonValue::Object:
- s = base(b)->size;
- break;
- case QJsonValue::Null:
- case QJsonValue::Bool:
- default:
- break;
- }
- return alignedSize(s);
-}
-
-inline bool isValidValueOffset(uint offset, uint tableOffset)
-{
- return offset >= sizeof(Base)
- && offset + sizeof(uint) <= tableOffset;
-}
-
-bool Value::isValid(const Base *b) const
-{
- switch (type) {
- case QJsonValue::Null:
- case QJsonValue::Bool:
- return true;
- case QJsonValue::Double:
- return latinOrIntValue || isValidValueOffset(value, b->tableOffset);
- case QJsonValue::String:
- if (!isValidValueOffset(value, b->tableOffset))
- return false;
- if (latinOrIntValue)
- return asLatin1String(b).isValid(b->tableOffset - value);
- return asString(b).isValid(b->tableOffset - value);
- case QJsonValue::Array:
- return isValidValueOffset(value, b->tableOffset)
- && static_cast<Array *>(base(b))->isValid(b->tableOffset - value);
- case QJsonValue::Object:
- return isValidValueOffset(value, b->tableOffset)
- && static_cast<Object *>(base(b))->isValid(b->tableOffset - value);
- default:
- return false;
- }
-}
-
-/*!
- \internal
- */
-int Value::requiredStorage(QJsonValue &v, bool *compressed)
-{
- *compressed = false;
- switch (v.t) {
- case QJsonValue::Double:
- if (QJsonPrivate::compressedNumber(v.dbl) != INT_MAX) {
- *compressed = true;
- return 0;
- }
- return sizeof(double);
- case QJsonValue::String: {
- QString s = v.toString();
- *compressed = QJsonPrivate::useCompressed(s);
- return QJsonPrivate::qStringSize(s, *compressed);
- }
- case QJsonValue::Array:
- case QJsonValue::Object:
- if (v.d && v.d->compactionCounter) {
- v.detach();
- v.d->compact();
- v.base = static_cast<QJsonPrivate::Base *>(v.d->header->root());
- }
- return v.base ? uint(v.base->size) : sizeof(QJsonPrivate::Base);
- case QJsonValue::Undefined:
- case QJsonValue::Null:
- case QJsonValue::Bool:
- break;
- }
- return 0;
-}
-
-/*!
- \internal
- */
-uint Value::valueToStore(const QJsonValue &v, uint offset)
-{
- switch (v.t) {
- case QJsonValue::Undefined:
- case QJsonValue::Null:
- break;
- case QJsonValue::Bool:
- return v.b;
- case QJsonValue::Double: {
- int c = QJsonPrivate::compressedNumber(v.dbl);
- if (c != INT_MAX)
- return c;
- }
- Q_FALLTHROUGH();
- case QJsonValue::String:
- case QJsonValue::Array:
- case QJsonValue::Object:
- return offset;
- }
- return 0;
-}
-
-/*!
- \internal
- */
-void Value::copyData(const QJsonValue &v, char *dest, bool compressed)
-{
- switch (v.t) {
- case QJsonValue::Double:
- if (!compressed) {
- qToLittleEndian(v.ui, dest);
- }
- break;
- case QJsonValue::String: {
- QString str = v.toString();
- QJsonPrivate::copyString(dest, str, compressed);
- break;
- }
- case QJsonValue::Array:
- case QJsonValue::Object: {
- const QJsonPrivate::Base *b = v.base;
- if (!b)
- b = (v.t == QJsonValue::Array ? &emptyArray : &emptyObject);
- memcpy(dest, b, b->size);
- break;
- }
- default:
- break;
- }
-}
-
-} // namespace QJsonPrivate
-
-QT_END_NAMESPACE
diff --git a/src/corelib/serialization/qjson_p.h b/src/corelib/serialization/qjson_p.h
index 7978bed7da..d2bbf928d0 100644
--- a/src/corelib/serialization/qjson_p.h
+++ b/src/corelib/serialization/qjson_p.h
@@ -52,743 +52,170 @@
// We mean it.
//
-#include <qjsonobject.h>
#include <qjsonvalue.h>
-#include <qjsondocument.h>
-#include <qjsonarray.h>
-#include <qatomic.h>
-#include <qstring.h>
-#include <qendian.h>
-#include <qnumeric.h>
-
-#include "private/qendian_p.h"
-#include "private/qsimd_p.h"
-
-#include <limits.h>
-#include <limits>
-#include <type_traits>
+#include <qcborvalue.h>
+#include <private/qcborvalue_p.h>
QT_BEGIN_NAMESPACE
-// in qstring.cpp
-void qt_to_latin1_unchecked(uchar *dst, const ushort *uc, qsizetype len);
-void qt_from_latin1(ushort *dst, const char *str, size_t size) noexcept;
-
-/*
- This defines a binary data structure for Json data. The data structure is optimised for fast reading
- and minimum allocations. The whole data structure can be mmap'ed and used directly.
-
- In most cases the binary structure is not as space efficient as a utf8 encoded text representation, but
- much faster to access.
-
- The size requirements are:
-
- String:
- Latin1 data: 2 bytes header + string.length()
- Full Unicode: 4 bytes header + 2*(string.length())
-
- Values: 4 bytes + size of data (size can be 0 for some data)
- bool: 0 bytes
- double: 8 bytes (0 if integer with less than 27bits)
- string: see above
- array: size of array
- object: size of object
- Array: 12 bytes + 4*length + size of Value data
- Object: 12 bytes + 8*length + size of Key Strings + size of Value data
-
- For an example such as
-
- { // object: 12 + 5*8 = 52
- "firstName": "John", // key 12, value 8 = 20
- "lastName" : "Smith", // key 12, value 8 = 20
- "age" : 25, // key 8, value 0 = 8
- "address" : // key 12, object below = 140
- { // object: 12 + 4*8
- "streetAddress": "21 2nd Street", // key 16, value 16
- "city" : "New York", // key 8, value 12
- "state" : "NY", // key 8, value 4
- "postalCode" : "10021" // key 12, value 8
- }, // object total: 128
- "phoneNumber": // key: 16, value array below = 172
- [ // array: 12 + 2*4 + values below: 156
- { // object 12 + 2*8
- "type" : "home", // key 8, value 8
- "number": "212 555-1234" // key 8, value 16
- }, // object total: 68
- { // object 12 + 2*8
- "type" : "fax", // key 8, value 8
- "number": "646 555-4567" // key 8, value 16
- } // object total: 68
- ] // array total: 156
- } // great total: 412 bytes
-
- The uncompressed text file used roughly 500 bytes, so in this case we end up using about
- the same space as the text representation.
-
- Other measurements have shown a slightly bigger binary size than a compact text
- representation where all possible whitespace was stripped out.
-*/
-#define Q_DECLARE_JSONPRIVATE_TYPEINFO(Class, Flags) } Q_DECLARE_TYPEINFO(QJsonPrivate::Class, Flags); namespace QJsonPrivate {
namespace QJsonPrivate {
-class Array;
-class Object;
-class Value;
-class Entry;
-
-template<typename T>
-using q_littleendian = QLEInteger<T>;
-
-typedef q_littleendian<short> qle_short;
-typedef q_littleendian<unsigned short> qle_ushort;
-typedef q_littleendian<int> qle_int;
-typedef q_littleendian<unsigned int> qle_uint;
-
-template<int pos, int width>
-using qle_bitfield = QLEIntegerBitfield<uint, pos, width>;
-
-template<int pos, int width>
-using qle_signedbitfield = QLEIntegerBitfield<int, pos, width>;
-
-typedef qle_uint offset;
-
-// round the size up to the next 4 byte boundary
-inline int alignedSize(int size) { return (size + 3) & ~3; }
-
-const int MaxLatin1Length = 0x7fff;
-
-static inline bool useCompressed(QStringView s)
-{
- if (s.length() > MaxLatin1Length)
- return false;
- return QtPrivate::isLatin1(s);
-}
-
-static inline bool useCompressed(QLatin1String s)
-{
- return s.size() <= MaxLatin1Length;
-}
-
-template <typename T>
-static inline int qStringSize(T string, bool compress)
-{
- int l = 2 + string.size();
- if (!compress)
- l *= 2;
- return alignedSize(l);
-}
-
-// returns INT_MAX if it can't compress it into 28 bits
-static inline int compressedNumber(double d)
-{
- // this relies on details of how ieee floats are represented
- const int exponent_off = 52;
- const quint64 fraction_mask = 0x000fffffffffffffull;
- const quint64 exponent_mask = 0x7ff0000000000000ull;
-
- quint64 val;
- memcpy (&val, &d, sizeof(double));
- int exp = (int)((val & exponent_mask) >> exponent_off) - 1023;
- if (exp < 0 || exp > 25)
- return INT_MAX;
-
- quint64 non_int = val & (fraction_mask >> exp);
- if (non_int)
- return INT_MAX;
-
- bool neg = (val >> 63) != 0;
- val &= fraction_mask;
- val |= ((quint64)1 << 52);
- int res = (int)(val >> (52 - exp));
- return neg ? -res : res;
-}
-
-class Latin1String;
-
-class String
-{
-public:
- explicit String(const char *data) { d = (Data *)data; }
-
- struct Data {
- qle_uint length;
- qle_ushort utf16[1];
- };
-
- Data *d;
-
- int byteSize() const { return sizeof(uint) + sizeof(ushort) * d->length; }
- bool isValid(int maxSize) const {
- // Check byteSize() <= maxSize, avoiding integer overflow
- maxSize -= sizeof(uint);
- return maxSize >= 0 && uint(d->length) <= maxSize / sizeof(ushort);
- }
-
- inline String &operator=(QStringView str)
- {
- d->length = str.length();
- qToLittleEndian<quint16>(str.utf16(), str.length(), d->utf16);
- fillTrailingZeros();
- return *this;
- }
-
- inline String &operator=(QLatin1String str)
- {
- d->length = str.size();
-#if Q_BYTE_ORDER == Q_BIG_ENDIAN
- for (int i = 0; i < str.size(); ++i)
- d->utf16[i] = str[i].unicode();
-#else
- qt_from_latin1((ushort *)d->utf16, str.data(), str.size());
-#endif
- fillTrailingZeros();
- return *this;
- }
-
- void fillTrailingZeros()
- {
- if (d->length & 1)
- d->utf16[d->length] = 0;
- }
-
- inline bool operator ==(QStringView str) const {
- int slen = str.length();
- int l = d->length;
- if (slen != l)
- return false;
- const ushort *s = (const ushort *)str.utf16();
- const qle_ushort *a = d->utf16;
- const ushort *b = s;
- while (l-- && *a == *b)
- a++,b++;
- return (l == -1);
- }
- inline bool operator !=(QStringView str) const {
- return !operator ==(str);
- }
- inline bool operator >=(QStringView str) const {
- // ###
- return toString() >= str;
- }
-
- inline bool operator<(const Latin1String &str) const;
- inline bool operator>=(const Latin1String &str) const { return !operator <(str); }
- inline bool operator ==(const Latin1String &str) const;
-
- inline bool operator ==(const String &str) const {
- if (d->length != str.d->length)
- return false;
- return !memcmp(d->utf16, str.d->utf16, d->length*sizeof(ushort));
- }
- inline bool operator<(const String &other) const;
- inline bool operator >=(const String &other) const { return !(*this < other); }
-
- inline QString toString() const {
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
- return QString((QChar *)d->utf16, d->length);
-#else
- int l = d->length;
- QString str(l, Qt::Uninitialized);
- QChar *ch = str.data();
- for (int i = 0; i < l; ++i)
- ch[i] = QChar(d->utf16[i]);
- return str;
-#endif
- }
-
-};
-
-class Latin1String
+template<typename Element, typename ElementsIterator>
+struct ObjectIterator
{
-public:
- explicit Latin1String(const char *data) { d = (Data *)data; }
-
- struct Data {
- qle_ushort length;
- char latin1[1];
- };
- Data *d;
-
- int byteSize() const { return sizeof(ushort) + sizeof(char)*(d->length); }
- bool isValid(int maxSize) const {
- return byteSize() <= maxSize;
- }
-
- inline Latin1String &operator=(QStringView str)
- {
- int len = d->length = str.length();
- uchar *l = (uchar *)d->latin1;
- const ushort *uc = (const ushort *)str.utf16();
- qt_to_latin1_unchecked(l, uc, len);
+ using pointer = Element *;
- fillTrailingZeros();
- return *this;
- }
+ struct value_type;
+ struct reference {
+ reference(Element &ref) : m_key(&ref) {}
- inline Latin1String &operator=(QLatin1String str)
- {
- int len = d->length = str.size();
- uchar *l = (uchar *)d->latin1;
- memcpy(l, str.data(), len);
+ reference() = delete;
+ ~reference() = default;
- fillTrailingZeros();
- return *this;
- }
-
- void fillTrailingZeros()
- {
- uchar *l = (uchar *)d->latin1;
- for (int len = d->length; (quintptr)(l + len) & 0x3; ++len)
- l[len] = 0;
- }
-
- QLatin1String toQLatin1String() const noexcept {
- return QLatin1String(d->latin1, d->length);
- }
+ reference(const reference &other) = default;
+ reference(reference &&other) = default;
- inline bool operator<(const String &str) const
- {
- const qle_ushort *uc = (qle_ushort *) str.d->utf16;
- if (!uc || *uc == 0)
- return false;
-
- const uchar *c = (uchar *)d->latin1;
- const uchar *e = c + qMin((int)d->length, (int)str.d->length);
-
- while (c < e) {
- if (*c != *uc)
- break;
- ++c;
- ++uc;
+ reference &operator=(const value_type &value);
+ reference &operator=(const reference &other)
+ {
+ if (m_key != other.m_key) {
+ key() = other.key();
+ value() = other.value();
+ }
+ return *this;
}
- return (c == e ? (int)d->length < (int)str.d->length : *c < *uc);
-
- }
- inline bool operator ==(const String &str) const {
- return (str == *this);
- }
- inline bool operator >=(const String &str) const {
- return !(*this < str);
- }
-
- inline QString toString() const {
- return QString::fromLatin1(d->latin1, d->length);
- }
-};
-
-#define DEF_OP(op) \
- inline bool operator op(Latin1String lhs, Latin1String rhs) noexcept \
- { \
- return lhs.toQLatin1String() op rhs.toQLatin1String(); \
- } \
- inline bool operator op(QLatin1String lhs, Latin1String rhs) noexcept \
- { \
- return lhs op rhs.toQLatin1String(); \
- } \
- inline bool operator op(Latin1String lhs, QLatin1String rhs) noexcept \
- { \
- return lhs.toQLatin1String() op rhs; \
- } \
- inline bool operator op(QStringView lhs, Latin1String rhs) noexcept \
- { \
- return lhs op rhs.toQLatin1String(); \
- } \
- inline bool operator op(Latin1String lhs, QStringView rhs) noexcept \
- { \
- return lhs.toQLatin1String() op rhs; \
- } \
- /*end*/
-DEF_OP(==)
-DEF_OP(!=)
-DEF_OP(< )
-DEF_OP(> )
-DEF_OP(<=)
-DEF_OP(>=)
-#undef DEF_OP
-
-inline bool String::operator ==(const Latin1String &str) const
-{
- if ((int)d->length != (int)str.d->length)
- return false;
- const qle_ushort *uc = d->utf16;
- const qle_ushort *e = uc + d->length;
- const uchar *c = (uchar *)str.d->latin1;
-
- while (uc < e) {
- if (*uc != *c)
- return false;
- ++uc;
- ++c;
- }
- return true;
-}
-
-inline bool String::operator <(const String &other) const
-{
- int alen = d->length;
- int blen = other.d->length;
- int l = qMin(alen, blen);
- qle_ushort *a = d->utf16;
- qle_ushort *b = other.d->utf16;
-
- while (l-- && *a == *b)
- a++,b++;
- if (l==-1)
- return (alen < blen);
- return (ushort)*a < (ushort)*b;
-}
-
-inline bool String::operator<(const Latin1String &str) const
-{
- const uchar *c = (uchar *) str.d->latin1;
- if (!c || *c == 0)
- return false;
-
- const qle_ushort *uc = d->utf16;
- const qle_ushort *e = uc + qMin((int)d->length, (int)str.d->length);
-
- while (uc < e) {
- if (*uc != *c)
- break;
- ++uc;
- ++c;
- }
- return (uc == e ? (int)d->length < (int)str.d->length : (ushort)*uc < *c);
-
-}
-template <typename T>
-static inline void copyString(char *dest, T str, bool compress)
-{
- if (compress) {
- Latin1String string(dest);
- string = str;
- } else {
- String string(dest);
- string = str;
- }
-}
+ reference &operator=(reference &&other)
+ {
+ key() = other.key();
+ value() = other.value();
+ return *this;
+ }
+ Element &key() { return *m_key; }
+ Element &value() { return *(m_key + 1); }
-/*
- Base is the base class for both Object and Array. Both classes work more or less the same way.
- The class starts with a header (defined by the struct below), then followed by data (the data for
- values in the Array case and Entry's (see below) for objects.
+ const Element &key() const { return *m_key; }
+ const Element &value() const { return *(m_key + 1); }
- After the data a table follows (tableOffset points to it) containing Value objects for Arrays, and
- offsets from the beginning of the object to Entry's in the case of Object.
- Entry's in the Object's table are lexicographically sorted by key in the table(). This allows the usage
- of a binary search over the keys in an Object.
- */
-class Base
-{
-public:
- qle_uint size;
- union {
- uint _dummy;
- qle_bitfield<0, 1> is_object;
- qle_bitfield<1, 31> length;
+ private:
+ Element *m_key;
};
- offset tableOffset;
- // content follows here
- inline bool isObject() const { return !!is_object; }
- inline bool isArray() const { return !isObject(); }
+ struct value_type {
+ value_type(reference ref) : m_key(ref.key()), m_value(ref.value()) {}
- inline offset *table() const { return (offset *) (((char *) this) + tableOffset); }
-
- int reserveSpace(uint dataSize, int posInTable, uint numItems, bool replace);
- void removeItems(int pos, int numItems);
-};
-
-class Object : public Base
-{
-public:
- Entry *entryAt(int i) const {
- return reinterpret_cast<Entry *>(((char *)this) + table()[i]);
- }
- int indexOf(QStringView key, bool *exists) const;
- int indexOf(QLatin1String key, bool *exists) const;
+ Element key() const { return m_key; }
+ Element value() const { return m_value; }
+ private:
+ Element m_key;
+ Element m_value;
+ };
- bool isValid(int maxSize) const;
-};
+ using difference_type = typename QVector<Element>::difference_type;
+ using iterator_category = std::random_access_iterator_tag;
+ ObjectIterator() = default;
+ ObjectIterator(ElementsIterator it) : it(it) {}
+ ElementsIterator elementsIterator() { return it; }
-class Array : public Base
-{
-public:
- inline Value at(int i) const;
- inline Value &operator [](int i);
+ ObjectIterator operator++(int) { ObjectIterator ret(it); it += 2; return ret; }
+ ObjectIterator &operator++() { it += 2; return *this; }
+ ObjectIterator &operator+=(difference_type n) { it += 2 * n; return *this; }
- bool isValid(int maxSize) const;
-};
+ ObjectIterator operator--(int) { ObjectIterator ret(it); it -= 2; return ret; }
+ ObjectIterator &operator--() { it -= 2; return *this; }
+ ObjectIterator &operator-=(difference_type n) { it -= 2 * n; return *this; }
+ reference operator*() const { return *it; }
+ reference operator[](int n) const { return it[n * 2]; }
-class Value
-{
-public:
- enum {
- MaxSize = (1<<27) - 1
- };
- union {
- uint _dummy;
- qle_bitfield<0, 3> type;
- qle_bitfield<3, 1> latinOrIntValue;
- qle_bitfield<4, 1> latinKey;
- qle_bitfield<5, 27> value;
- qle_signedbitfield<5, 27> int_value;
- };
+ bool operator<(ObjectIterator other) const { return it < other.it; }
+ bool operator>(ObjectIterator other) const { return it > other.it; }
+ bool operator<=(ObjectIterator other) const { return it <= other.it; }
+ bool operator>=(ObjectIterator other) const { return it >= other.it; }
- inline char *data(const Base *b) const { return ((char *)b) + value; }
- int usedStorage(const Base *b) const;
-
- bool toBoolean() const;
- double toDouble(const Base *b) const;
- QString toString(const Base *b) const;
- String asString(const Base *b) const;
- Latin1String asLatin1String(const Base *b) const;
- Base *base(const Base *b) const;
-
- bool isValid(const Base *b) const;
-
- static int requiredStorage(QJsonValue &v, bool *compressed);
- static uint valueToStore(const QJsonValue &v, uint offset);
- static void copyData(const QJsonValue &v, char *dest, bool compressed);
+private:
+ ElementsIterator it;
};
-Q_DECLARE_JSONPRIVATE_TYPEINFO(Value, Q_PRIMITIVE_TYPE)
-inline Value Array::at(int i) const
+template<typename Element, typename ElementsIterator>
+inline ObjectIterator<Element, ElementsIterator> operator+(
+ ObjectIterator<Element, ElementsIterator> a,
+ typename ObjectIterator<Element, ElementsIterator>::difference_type n)
{
- return *(Value *) (table() + i);
+ return {a.elementsIterator() + 2 * n};
}
-
-inline Value &Array::operator [](int i)
+template<typename Element, typename ElementsIterator>
+inline ObjectIterator<Element, ElementsIterator> operator+(
+ int n, ObjectIterator<Element, ElementsIterator> a)
{
- return *(Value *) (table() + i);
+ return {a.elementsIterator() + 2 * n};
}
-
-
-
-class Entry {
-public:
- Value value;
- // key
- // value data follows key
-
- uint size() const {
- int s = sizeof(Entry);
- if (value.latinKey)
- s += shallowLatin1Key().byteSize();
- else
- s += shallowKey().byteSize();
- return alignedSize(s);
- }
-
- int usedStorage(Base *b) const {
- return size() + value.usedStorage(b);
- }
-
- String shallowKey() const
- {
- Q_ASSERT(!value.latinKey);
- return String((const char *)this + sizeof(Entry));
- }
- Latin1String shallowLatin1Key() const
- {
- Q_ASSERT(value.latinKey);
- return Latin1String((const char *)this + sizeof(Entry));
- }
- QString key() const
- {
- if (value.latinKey) {
- return shallowLatin1Key().toString();
- }
- return shallowKey().toString();
- }
-
- bool isValid(int maxSize) const {
- if (maxSize < (int)sizeof(Entry))
- return false;
- maxSize -= sizeof(Entry);
- if (value.latinKey)
- return shallowLatin1Key().isValid(maxSize);
- return shallowKey().isValid(maxSize);
- }
-
- bool operator ==(QStringView key) const;
- inline bool operator !=(QStringView key) const { return !operator ==(key); }
- inline bool operator >=(QStringView key) const;
-
- bool operator==(QLatin1String key) const;
- inline bool operator!=(QLatin1String key) const { return !operator ==(key); }
- inline bool operator>=(QLatin1String key) const;
-
- bool operator ==(const Entry &other) const;
- bool operator >=(const Entry &other) const;
-};
-
-inline bool Entry::operator >=(QStringView key) const
+template<typename Element, typename ElementsIterator>
+inline ObjectIterator<Element, ElementsIterator> operator-(
+ ObjectIterator<Element, ElementsIterator> a,
+ typename ObjectIterator<Element, ElementsIterator>::difference_type n)
{
- if (value.latinKey)
- return (shallowLatin1Key() >= key);
- else
- return (shallowKey() >= key);
+ return {a.elementsIterator() - 2 * n};
}
-
-inline bool Entry::operator >=(QLatin1String key) const
+template<typename Element, typename ElementsIterator>
+inline int operator-(
+ ObjectIterator<Element, ElementsIterator> a,
+ ObjectIterator<Element, ElementsIterator> b)
{
- if (value.latinKey)
- return shallowLatin1Key() >= key;
- else
- return shallowKey() >= QString(key); // ### conversion to QString
+ return (a.elementsIterator() - b.elementsIterator()) / 2;
}
-
-inline bool operator <(QStringView key, const Entry &e)
-{ return e >= key; }
-
-inline bool operator<(QLatin1String key, const Entry &e)
-{ return e >= key; }
-
-
-class Header {
-public:
- qle_uint tag; // 'qbjs'
- qle_uint version; // 1
- Base *root() { return (Base *)(this + 1); }
-};
-
-
-inline bool Value::toBoolean() const
+template<typename Element, typename ElementsIterator>
+inline bool operator!=(
+ ObjectIterator<Element, ElementsIterator> a,
+ ObjectIterator<Element, ElementsIterator> b)
{
- Q_ASSERT(type == QJsonValue::Bool);
- return value != 0;
+ return a.elementsIterator() != b.elementsIterator();
}
-
-inline double Value::toDouble(const Base *b) const
+template<typename Element, typename ElementsIterator>
+inline bool operator==(
+ ObjectIterator<Element, ElementsIterator> a,
+ ObjectIterator<Element, ElementsIterator> b)
{
- Q_ASSERT(type == QJsonValue::Double);
- if (latinOrIntValue)
- return int_value;
-
- quint64 i = qFromLittleEndian<quint64>((const uchar *)b + value);
- double d;
- memcpy(&d, &i, sizeof(double));
- return d;
+ return a.elementsIterator() == b.elementsIterator();
}
-inline String Value::asString(const Base *b) const
-{
- Q_ASSERT(type == QJsonValue::String && !latinOrIntValue);
- return String(data(b));
-}
+using KeyIterator = ObjectIterator<QtCbor::Element, QVector<QtCbor::Element>::iterator>;
+using ConstKeyIterator = ObjectIterator<const QtCbor::Element, QVector<QtCbor::Element>::const_iterator>;
-inline Latin1String Value::asLatin1String(const Base *b) const
+template<>
+inline KeyIterator::reference &KeyIterator::reference::operator=(const KeyIterator::value_type &value)
{
- Q_ASSERT(type == QJsonValue::String && latinOrIntValue);
- return Latin1String(data(b));
+ *m_key = value.key();
+ *(m_key + 1) = value.value();
+ return *this;
}
-inline QString Value::toString(const Base *b) const
+inline void swap(KeyIterator::reference a, KeyIterator::reference b)
{
- if (latinOrIntValue)
- return asLatin1String(b).toString();
- else
- return asString(b).toString();
+ KeyIterator::value_type t = a;
+ a = b;
+ b = t;
}
-inline Base *Value::base(const Base *b) const
+class Value
{
- Q_ASSERT(type == QJsonValue::Array || type == QJsonValue::Object);
- return reinterpret_cast<Base *>(data(b));
-}
-
-class Data {
public:
- enum Validation {
- Unchecked,
- Validated,
- Invalid
- };
-
- QAtomicInt ref;
- int alloc;
- union {
- char *rawData;
- Header *header;
- };
- uint compactionCounter : 31;
- uint ownsData : 1;
+ static QCborContainerPrivate *container(const QCborValue &v) { return v.container; }
- inline Data(char *raw, int a)
- : alloc(a), rawData(raw), compactionCounter(0), ownsData(true)
+ static QJsonValue fromTrustedCbor(const QCborValue &v)
{
+ QJsonValue result;
+ result.d = v.container;
+ result.n = v.n;
+ result.t = v.t;
+ return result;
}
- inline Data(int reserved, QJsonValue::Type valueType)
- : rawData(nullptr), compactionCounter(0), ownsData(true)
- {
- Q_ASSERT(valueType == QJsonValue::Array || valueType == QJsonValue::Object);
-
- alloc = sizeof(Header) + sizeof(Base) + reserved + sizeof(offset);
- header = (Header *)malloc(alloc);
- Q_CHECK_PTR(header);
- header->tag = QJsonDocument::BinaryFormatTag;
- header->version = 1;
- Base *b = header->root();
- b->size = sizeof(Base);
- b->is_object = (valueType == QJsonValue::Object);
- b->tableOffset = sizeof(Base);
- b->length = 0;
- }
- inline ~Data()
- { if (ownsData) free(rawData); }
-
- uint offsetOf(const void *ptr) const { return (uint)(((char *)ptr - rawData)); }
-
- QJsonObject toObject(Object *o) const
- {
- return QJsonObject(const_cast<Data *>(this), o);
- }
-
- QJsonArray toArray(Array *a) const
- {
- return QJsonArray(const_cast<Data *>(this), a);
- }
-
- Data *clone(Base *b, int reserve = 0)
- {
- int size = sizeof(Header) + b->size;
- if (b == header->root() && ref.loadRelaxed() == 1 && alloc >= size + reserve)
- return this;
-
- if (reserve) {
- if (reserve < 128)
- reserve = 128;
- size = qMax(size + reserve, qMin(size *2, (int)Value::MaxSize));
- if (size > Value::MaxSize) {
- qWarning("QJson: Document too large to store in data structure");
- return nullptr;
- }
- }
- char *raw = (char *)malloc(size);
- Q_CHECK_PTR(raw);
- memcpy(raw + sizeof(Header), b, b->size);
- Header *h = (Header *)raw;
- h->tag = QJsonDocument::BinaryFormatTag;
- h->version = 1;
- Data *d = new Data(raw, size);
- d->compactionCounter = (b == header->root()) ? compactionCounter : 0;
- return d;
- }
-
- void compact();
- bool valid() const;
-
-private:
- Q_DISABLE_COPY_MOVE(Data)
};
-}
+} // namespace QJsonPrivate
QT_END_NAMESPACE
diff --git a/src/corelib/serialization/qjsonarray.cpp b/src/corelib/serialization/qjsonarray.cpp
index 9636ac5856..08702771a8 100644
--- a/src/corelib/serialization/qjsonarray.cpp
+++ b/src/corelib/serialization/qjsonarray.cpp
@@ -40,12 +40,16 @@
#include <qjsonobject.h>
#include <qjsonvalue.h>
#include <qjsonarray.h>
+#include <qjsondocument.h>
#include <qstringlist.h>
+#include <qcborarray.h>
#include <qvariant.h>
#include <qdebug.h>
+#include <private/qcborvalue_p.h>
+#include <private/qjson_p.h>
+
#include "qjsonwriter_p.h"
-#include "qjson_p.h"
QT_BEGIN_NAMESPACE
@@ -131,10 +135,7 @@ QT_BEGIN_NAMESPACE
/*!
Creates an empty array.
*/
-QJsonArray::QJsonArray()
- : d(nullptr), a(nullptr)
-{
-}
+QJsonArray::QJsonArray() = default;
/*!
\fn QJsonArray::QJsonArray(std::initializer_list<QJsonValue> args)
@@ -151,12 +152,10 @@ QJsonArray::QJsonArray()
/*!
\internal
*/
-QJsonArray::QJsonArray(QJsonPrivate::Data *data, QJsonPrivate::Array *array)
- : d(data), a(array)
+QJsonArray::QJsonArray(QCborContainerPrivate *array)
+ : a(array)
{
- Q_ASSERT(data);
Q_ASSERT(array);
- d->ref.ref();
}
/*!
@@ -168,17 +167,19 @@ QJsonArray::QJsonArray(QJsonPrivate::Data *data, QJsonPrivate::Array *array)
*/
void QJsonArray::initialize()
{
- d = nullptr;
a = nullptr;
}
/*!
Deletes the array.
*/
-QJsonArray::~QJsonArray()
+QJsonArray::~QJsonArray() = default;
+
+QJsonArray::QJsonArray(std::initializer_list<QJsonValue> args)
{
- if (d && !d->ref.deref())
- delete d;
+ initialize();
+ for (const auto & arg : args)
+ append(arg);
}
/*!
@@ -189,10 +190,13 @@ QJsonArray::~QJsonArray()
*/
QJsonArray::QJsonArray(const QJsonArray &other)
{
- d = other.d;
a = other.a;
- if (d)
- d->ref.ref();
+}
+
+QJsonArray::QJsonArray(QJsonArray &&other) noexcept
+ : a(other.a)
+{
+ other.a = nullptr;
}
/*!
@@ -200,15 +204,7 @@ QJsonArray::QJsonArray(const QJsonArray &other)
*/
QJsonArray &QJsonArray::operator =(const QJsonArray &other)
{
- if (d != other.d) {
- if (d && !d->ref.deref())
- delete d;
- d = other.d;
- if (d)
- d->ref.ref();
- }
a = other.a;
-
return *this;
}
@@ -282,48 +278,7 @@ QJsonArray QJsonArray::fromStringList(const QStringList &list)
*/
QJsonArray QJsonArray::fromVariantList(const QVariantList &list)
{
- QJsonArray array;
- if (list.isEmpty())
- return array;
-
- array.detach2(1024);
-
- QVector<QJsonPrivate::Value> values;
- values.resize(list.size());
- QJsonPrivate::Value *valueData = values.data();
- uint currentOffset = sizeof(QJsonPrivate::Base);
-
- for (int i = 0; i < list.size(); ++i) {
- QJsonValue val = QJsonValue::fromVariant(list.at(i));
-
- bool latinOrIntValue;
- int valueSize = QJsonPrivate::Value::requiredStorage(val, &latinOrIntValue);
-
- if (!array.detach2(valueSize))
- return QJsonArray();
-
- QJsonPrivate::Value *v = valueData + i;
- v->type = (val.t == QJsonValue::Undefined ? QJsonValue::Null : val.t);
- v->latinOrIntValue = latinOrIntValue;
- v->latinKey = false;
- v->value = QJsonPrivate::Value::valueToStore(val, currentOffset);
- if (valueSize)
- QJsonPrivate::Value::copyData(val, (char *)array.a + currentOffset, latinOrIntValue);
-
- currentOffset += valueSize;
- array.a->size = currentOffset;
- }
-
- // write table
- array.a->tableOffset = currentOffset;
- if (!array.detach2(sizeof(QJsonPrivate::offset)*values.size()))
- return QJsonArray();
- memcpy(static_cast<void *>(array.a->table()),
- static_cast<const void *>(values.constData()), values.size()*sizeof(uint));
- array.a->length = values.size();
- array.a->size = currentOffset + sizeof(QJsonPrivate::offset)*values.size();
-
- return array;
+ return QCborArray::fromVariantList(list).toJsonArray();
}
/*!
@@ -333,14 +288,7 @@ QJsonArray QJsonArray::fromVariantList(const QVariantList &list)
*/
QVariantList QJsonArray::toVariantList() const
{
- QVariantList list;
-
- if (a) {
- list.reserve(a->length);
- for (int i = 0; i < (int)a->length; ++i)
- list.append(QJsonValue(d, a, a->at(i)).toVariant());
- }
- return list;
+ return QCborArray::fromJsonArray(*this).toVariantList();
}
@@ -349,10 +297,7 @@ QVariantList QJsonArray::toVariantList() const
*/
int QJsonArray::size() const
{
- if (!d)
- return 0;
-
- return (int)a->length;
+ return a ? a->elements.size() : 0;
}
/*!
@@ -370,10 +315,7 @@ int QJsonArray::size() const
*/
bool QJsonArray::isEmpty() const
{
- if (!d)
- return true;
-
- return !a->length;
+ return a == nullptr || a->elements.isEmpty();
}
/*!
@@ -384,10 +326,10 @@ bool QJsonArray::isEmpty() const
*/
QJsonValue QJsonArray::at(int i) const
{
- if (!a || i < 0 || i >= (int)a->length)
+ if (!a || i < 0 || i >= a->elements.size())
return QJsonValue(QJsonValue::Undefined);
- return QJsonValue(d, a, a->at(i));
+ return QJsonPrivate::Value::fromTrustedCbor(a->valueAt(i));
}
/*!
@@ -411,7 +353,7 @@ QJsonValue QJsonArray::first() const
*/
QJsonValue QJsonArray::last() const
{
- return at(a ? (a->length - 1) : 0);
+ return at(a ? (a->elements.size() - 1) : 0);
}
/*!
@@ -433,7 +375,7 @@ void QJsonArray::prepend(const QJsonValue &value)
*/
void QJsonArray::append(const QJsonValue &value)
{
- insert(a ? (int)a->length : 0, value);
+ insert(a ? a->elements.size() : 0, value);
}
/*!
@@ -444,14 +386,10 @@ void QJsonArray::append(const QJsonValue &value)
*/
void QJsonArray::removeAt(int i)
{
- if (!a || i < 0 || i >= (int)a->length)
+ if (!a || i < 0 || i >= a->elements.length())
return;
-
detach2();
- a->removeItems(i, 1);
- ++d->compactionCounter;
- if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(a->length) / 2u)
- compact();
+ a->removeAt(i);
}
/*! \fn void QJsonArray::removeFirst()
@@ -484,11 +422,12 @@ void QJsonArray::removeAt(int i)
*/
QJsonValue QJsonArray::takeAt(int i)
{
- if (!a || i < 0 || i >= (int)a->length)
+ if (!a || i < 0 || i >= a->elements.length())
return QJsonValue(QJsonValue::Undefined);
- QJsonValue v(d, a, a->at(i));
- removeAt(i); // detaches
+ detach2();
+ const QJsonValue v = QJsonPrivate::Value::fromTrustedCbor(a->extractAt(i));
+ a->removeAt(i);
return v;
}
@@ -501,29 +440,14 @@ QJsonValue QJsonArray::takeAt(int i)
*/
void QJsonArray::insert(int i, const QJsonValue &value)
{
- Q_ASSERT (i >= 0 && i <= (a ? (int)a->length : 0));
- QJsonValue val = value;
-
- bool compressed;
- int valueSize = QJsonPrivate::Value::requiredStorage(val, &compressed);
-
- if (!detach2(valueSize + sizeof(QJsonPrivate::Value)))
- return;
-
- if (!a->length)
- a->tableOffset = sizeof(QJsonPrivate::Array);
-
- int valueOffset = a->reserveSpace(valueSize, i, 1, false);
- if (!valueOffset)
- return;
-
- QJsonPrivate::Value &v = (*a)[i];
- v.type = (val.t == QJsonValue::Undefined ? QJsonValue::Null : val.t);
- v.latinOrIntValue = compressed;
- v.latinKey = false;
- v.value = QJsonPrivate::Value::valueToStore(val, valueOffset);
- if (valueSize)
- QJsonPrivate::Value::copyData(val, (char *)a + valueOffset, compressed);
+ if (a)
+ detach2(a->elements.length() + 1);
+ else
+ a = new QCborContainerPrivate;
+
+ Q_ASSERT (i >= 0 && i <= a->elements.length());
+ a->insertAt(i, value.type() == QJsonValue::Undefined ? QCborValue(nullptr)
+ : QCborValue::fromJsonValue(value));
}
/*!
@@ -552,33 +476,9 @@ void QJsonArray::insert(int i, const QJsonValue &value)
*/
void QJsonArray::replace(int i, const QJsonValue &value)
{
- Q_ASSERT (a && i >= 0 && i < (int)(a->length));
- QJsonValue val = value;
-
- bool compressed;
- int valueSize = QJsonPrivate::Value::requiredStorage(val, &compressed);
-
- if (!detach2(valueSize))
- return;
-
- if (!a->length)
- a->tableOffset = sizeof(QJsonPrivate::Array);
-
- int valueOffset = a->reserveSpace(valueSize, i, 1, true);
- if (!valueOffset)
- return;
-
- QJsonPrivate::Value &v = (*a)[i];
- v.type = (val.t == QJsonValue::Undefined ? QJsonValue::Null : val.t);
- v.latinOrIntValue = compressed;
- v.latinKey = false;
- v.value = QJsonPrivate::Value::valueToStore(val, valueOffset);
- if (valueSize)
- QJsonPrivate::Value::copyData(val, (char *)a + valueOffset, compressed);
-
- ++d->compactionCounter;
- if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(a->length) / 2u)
- compact();
+ Q_ASSERT (a && i >= 0 && i < a->elements.length());
+ detach2();
+ a->replaceAt(i, QCborValue::fromJsonValue(value));
}
/*!
@@ -610,7 +510,7 @@ bool QJsonArray::contains(const QJsonValue &value) const
*/
QJsonValueRef QJsonArray::operator [](int i)
{
- Q_ASSERT(a && i >= 0 && i < (int)a->length);
+ Q_ASSERT(a && i >= 0 && i < a->elements.length());
return QJsonValueRef(this, i);
}
@@ -633,14 +533,14 @@ bool QJsonArray::operator==(const QJsonArray &other) const
return true;
if (!a)
- return !other.a->length;
+ return !other.a->elements.length();
if (!other.a)
- return !a->length;
- if (a->length != other.a->length)
+ return !a->elements.length();
+ if (a->elements.length() != other.a->elements.length())
return false;
- for (int i = 0; i < (int)a->length; ++i) {
- if (QJsonValue(d, a, a->at(i)) != QJsonValue(other.d, other.a, other.a->at(i)))
+ for (int i = 0; i < a->elements.length(); ++i) {
+ if (a->valueAt(i) != other.a->valueAt(i))
return false;
}
return true;
@@ -1216,28 +1116,10 @@ void QJsonArray::detach(uint reserve)
*/
bool QJsonArray::detach2(uint reserve)
{
- if (!d) {
- if (reserve >= QJsonPrivate::Value::MaxSize) {
- qWarning("QJson: Document too large to store in data structure");
- return false;
- }
- d = new QJsonPrivate::Data(reserve, QJsonValue::Array);
- a = static_cast<QJsonPrivate::Array *>(d->header->root());
- d->ref.ref();
- return true;
- }
- if (reserve == 0 && d->ref.loadRelaxed() == 1)
+ if (!a)
return true;
-
- QJsonPrivate::Data *x = d->clone(a, reserve);
- if (!x)
- return false;
- x->ref.ref();
- if (!d->ref.deref())
- delete d;
- d = x;
- a = static_cast<QJsonPrivate::Array *>(d->header->root());
- return true;
+ a = a->detach(a.data(), reserve ? reserve : size());
+ return a;
}
/*!
@@ -1245,12 +1127,7 @@ bool QJsonArray::detach2(uint reserve)
*/
void QJsonArray::compact()
{
- if (!d || !d->compactionCounter)
- return;
-
- detach2();
- d->compact();
- a = static_cast<QJsonPrivate::Array *>(d->header->root());
+ a->compact(a->elements.size());
}
uint qHash(const QJsonArray &array, uint seed)
@@ -1267,7 +1144,7 @@ QDebug operator<<(QDebug dbg, const QJsonArray &a)
return dbg;
}
QByteArray json;
- QJsonPrivate::Writer::arrayToJson(a.a, json, 0, true);
+ QJsonPrivate::Writer::arrayToJson(a.a.data(), json, 0, true);
dbg.nospace() << "QJsonArray("
<< json.constData() // print as utf-8 string without extra quotation marks
<< ")";
diff --git a/src/corelib/serialization/qjsonarray.h b/src/corelib/serialization/qjsonarray.h
index 983a6753b5..22aa996a3e 100644
--- a/src/corelib/serialization/qjsonarray.h
+++ b/src/corelib/serialization/qjsonarray.h
@@ -42,6 +42,7 @@
#include <QtCore/qjsonvalue.h>
#include <QtCore/qiterator.h>
+#include <QtCore/qshareddata.h>
#include <initializer_list>
QT_BEGIN_NAMESPACE
@@ -56,25 +57,14 @@ class Q_CORE_EXPORT QJsonArray
public:
QJsonArray();
- QJsonArray(std::initializer_list<QJsonValue> args)
- {
- initialize();
- for (std::initializer_list<QJsonValue>::const_iterator i = args.begin(); i != args.end(); ++i)
- append(*i);
- }
+ QJsonArray(std::initializer_list<QJsonValue> args);
~QJsonArray();
QJsonArray(const QJsonArray &other);
QJsonArray &operator =(const QJsonArray &other);
- QJsonArray(QJsonArray &&other) noexcept
- : d(other.d),
- a(other.a)
- {
- other.d = nullptr;
- other.a = nullptr;
- }
+ QJsonArray(QJsonArray &&other) noexcept;
QJsonArray &operator =(QJsonArray &&other) noexcept
{
@@ -113,7 +103,6 @@ public:
void swap(QJsonArray &other) noexcept
{
- qSwap(d, other.d);
qSwap(a, other.a);
}
@@ -245,20 +234,21 @@ public:
typedef int difference_type;
private:
- friend class QJsonPrivate::Data;
friend class QJsonValue;
friend class QJsonDocument;
+ friend class QCborArray;
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonArray &);
- QJsonArray(QJsonPrivate::Data *data, QJsonPrivate::Array *array);
+ QJsonArray(QCborContainerPrivate *array);
void initialize();
void compact();
// ### Qt 6: remove me and merge with detach2
void detach(uint reserve = 0);
bool detach2(uint reserve = 0);
- QJsonPrivate::Data *d;
- QJsonPrivate::Array *a;
+ // ### Qt 6: remove
+ void *dead = nullptr;
+ QExplicitlySharedDataPointer<QCborContainerPrivate> a;
};
Q_DECLARE_SHARED_NOT_MOVABLE_UNTIL_QT6(QJsonArray)
diff --git a/src/corelib/serialization/qjsoncbor.cpp b/src/corelib/serialization/qjsoncbor.cpp
index d6a0c8c48a..ee4dd90416 100644
--- a/src/corelib/serialization/qjsoncbor.cpp
+++ b/src/corelib/serialization/qjsoncbor.cpp
@@ -42,6 +42,10 @@
#include "qcborarray.h"
#include "qcbormap.h"
+
+#include "qjsonarray.h"
+#include "qjsonobject.h"
+#include "qjsondocument.h"
#include "qjson_p.h"
#include <private/qnumeric_p.h>
@@ -149,7 +153,12 @@ static Q_NEVER_INLINE QString makeString(const QCborContainerPrivate *d, qsizety
case QCborValue::Array:
case QCborValue::Map:
+#if defined(QT_JSON_READONLY) || defined(QT_BOOTSTRAPPED)
+ qFatal("Writing JSON is disabled.");
+ return QString();
+#else
return d->valueAt(idx).toDiagnosticNotation(QCborValue::Compact);
+#endif
case QCborValue::SimpleType:
break;
@@ -181,30 +190,11 @@ static Q_NEVER_INLINE QString makeString(const QCborContainerPrivate *d, qsizety
return simpleTypeString(e.type);
}
-static QJsonValue convertToJson(const QCborContainerPrivate *d, qsizetype idx);
-
-static QJsonArray convertToJsonArray(const QCborContainerPrivate *d)
-{
- QJsonArray a;
- if (d) {
- for (qsizetype idx = 0; idx < d->elements.size(); ++idx)
- a.append(convertToJson(d, idx));
- }
- return a;
-}
-
-static QJsonObject convertToJsonObject(const QCborContainerPrivate *d)
-{
- QJsonObject o;
- if (d) {
- for (qsizetype idx = 0; idx < d->elements.size(); idx += 2)
- o.insert(makeString(d, idx), convertToJson(d, idx + 1));
- }
- return o;
-}
+QJsonValue qt_convertToJson(QCborContainerPrivate *d, qsizetype idx);
-static QJsonValue convertExtendedTypeToJson(const QCborContainerPrivate *d)
+static QJsonValue convertExtendedTypeToJson(QCborContainerPrivate *d)
{
+#ifndef QT_BUILD_QMAKE
qint64 tag = d->elements.at(0).value;
switch (tag) {
@@ -225,12 +215,36 @@ static QJsonValue convertExtendedTypeToJson(const QCborContainerPrivate *d)
return s;
}
}
+#endif
// for all other tags, ignore it and return the converted tagged item
- return convertToJson(d, 1);
+ return qt_convertToJson(d, 1);
+}
+
+// We need to do this because sub-objects may need conversion.
+static QJsonArray convertToJsonArray(QCborContainerPrivate *d)
+{
+ QJsonArray a;
+ if (d) {
+ for (qsizetype idx = 0; idx < d->elements.size(); ++idx)
+ a.append(qt_convertToJson(d, idx));
+ }
+ return a;
}
-static QJsonValue convertToJson(const QCborContainerPrivate *d, qsizetype idx)
+// We need to do this because the keys need to be sorted and converted to strings
+// and sub-objects may need recursive conversion.
+static QJsonObject convertToJsonObject(QCborContainerPrivate *d)
+{
+ QJsonObject o;
+ if (d) {
+ for (qsizetype idx = 0; idx < d->elements.size(); idx += 2)
+ o.insert(makeString(d, idx), qt_convertToJson(d, idx + 1));
+ }
+ return o;
+}
+
+QJsonValue qt_convertToJson(QCborContainerPrivate *d, qsizetype idx)
{
// encoding the container itself
if (idx == -QCborValue::Array)
@@ -248,7 +262,7 @@ static QJsonValue convertToJson(const QCborContainerPrivate *d, qsizetype idx)
const auto &e = d->elements.at(idx);
switch (e.type) {
case QCborValue::Integer:
- return qint64(e.value);
+ return QJsonPrivate::Value::fromTrustedCbor(e.value);
case QCborValue::ByteArray:
case QCborValue::String:
@@ -264,14 +278,14 @@ static QJsonValue convertToJson(const QCborContainerPrivate *d, qsizetype idx)
case QCborValue::RegularExpression:
case QCborValue::Uuid:
// recurse
- return convertToJson(e.flags & Element::IsContainer ? e.container : nullptr, -e.type);
+ return qt_convertToJson(e.flags & Element::IsContainer ? e.container : nullptr, -e.type);
case QCborValue::Null:
return QJsonValue();
case QCborValue::Undefined:
case QCborValue::Invalid:
- return QJsonValue(QJsonValue::Undefined);
+ return QJsonValue::Undefined;
case QCborValue::False:
return false;
@@ -283,7 +297,7 @@ static QJsonValue convertToJson(const QCborContainerPrivate *d, qsizetype idx)
return fpToJson(e.fpvalue());
}
- return makeString(d, idx);
+ return QJsonPrivate::Value::fromTrustedCbor(makeString(d, idx));
}
/*!
@@ -348,22 +362,22 @@ static QJsonValue convertToJson(const QCborContainerPrivate *d, qsizetype idx)
QJsonValue QCborValue::toJsonValue() const
{
if (container)
- return convertToJson(container, n < 0 ? -type() : n);
+ return qt_convertToJson(container, n < 0 ? -type() : n);
// simple values
switch (type()) {
- case Integer:
- return n;
-
- case Null:
- return QJsonValue();
-
case False:
return false;
+ case Integer:
+ return QJsonPrivate::Value::fromTrustedCbor(n);
+
case True:
return true;
+ case Null:
+ return QJsonValue();
+
case Double:
return fpToJson(fp_helper());
@@ -372,12 +386,12 @@ QJsonValue QCborValue::toJsonValue() const
case Undefined:
case Invalid:
- return QJsonValue(QJsonValue::Undefined);
+ return QJsonValue::Undefined;
case ByteArray:
case String:
// empty strings
- return QString();
+ return QJsonValue::String;
case Array:
// empty array
@@ -392,16 +406,16 @@ QJsonValue QCborValue::toJsonValue() const
case Url:
case RegularExpression:
case Uuid:
- Q_UNREACHABLE();
+ // Reachable, but invalid in Json
return QJsonValue::Undefined;
}
- return simpleTypeString(type());
+ return QJsonPrivate::Value::fromTrustedCbor(simpleTypeString(type()));
}
QJsonValue QCborValueRef::toJsonValue() const
{
- return convertToJson(d, i);
+ return qt_convertToJson(d, i);
}
/*!
@@ -540,8 +554,10 @@ QVariant QCborValue::toVariant() const
case DateTime:
return toDateTime();
+#ifndef QT_BOOTSTRAPPED
case Url:
return toUrl();
+#endif
#if QT_CONFIG(regularexpression)
case RegularExpression:
@@ -597,12 +613,13 @@ QCborValue QCborValue::fromJsonValue(const QJsonValue &v)
{
switch (v.type()) {
case QJsonValue::Bool:
- return v.b;
+ return v.toBool();
case QJsonValue::Double: {
qint64 i;
- if (convertDoubleTo(v.dbl, &i))
+ const double dbl = v.toDouble();
+ if (convertDoubleTo(dbl, &i))
return i;
- return v.dbl;
+ return dbl;
}
case QJsonValue::String:
return v.toString();
@@ -623,9 +640,9 @@ static void appendVariant(QCborContainerPrivate *d, const QVariant &variant)
// Handle strings and byte arrays directly, to avoid creating a temporary
// dummy container to hold their data.
int type = variant.userType();
- if (type == QVariant::String) {
+ if (type == QMetaType::QString) {
d->append(variant.toString());
- } else if (type == QVariant::ByteArray) {
+ } else if (type == QMetaType::QByteArray) {
QByteArray ba = variant.toByteArray();
d->appendByteData(ba.constData(), ba.size(), QCborValue::ByteArray);
} else {
@@ -686,43 +703,45 @@ static void appendVariant(QCborContainerPrivate *d, const QVariant &variant)
QCborValue QCborValue::fromVariant(const QVariant &variant)
{
switch (variant.userType()) {
- case QVariant::Invalid:
+ case QMetaType::UnknownType:
return {};
case QMetaType::Nullptr:
return nullptr;
- case QVariant::Bool:
+ case QMetaType::Bool:
return variant.toBool();
case QMetaType::Short:
case QMetaType::UShort:
- case QVariant::Int:
- case QVariant::LongLong:
- case QVariant::ULongLong:
- case QVariant::UInt:
+ case QMetaType::Int:
+ case QMetaType::LongLong:
+ case QMetaType::ULongLong:
+ case QMetaType::UInt:
return variant.toLongLong();
case QMetaType::Float:
- case QVariant::Double:
+ case QMetaType::Double:
return variant.toDouble();
- case QVariant::String:
+ case QMetaType::QString:
return variant.toString();
- case QVariant::StringList:
+ case QMetaType::QStringList:
return QCborArray::fromStringList(variant.toStringList());
- case QVariant::ByteArray:
+ case QMetaType::QByteArray:
return variant.toByteArray();
- case QVariant::DateTime:
+ case QMetaType::QDateTime:
return QCborValue(variant.toDateTime());
- case QVariant::Url:
+#ifndef QT_BOOTSTRAPPED
+ case QMetaType::QUrl:
return QCborValue(variant.toUrl());
- case QVariant::Uuid:
+#endif
+ case QMetaType::QUuid:
return QCborValue(variant.toUuid());
- case QVariant::List:
+ case QMetaType::QVariantList:
return QCborArray::fromVariantList(variant.toList());
- case QVariant::Map:
+ case QMetaType::QVariantMap:
return QCborMap::fromVariantMap(variant.toMap());
- case QVariant::Hash:
+ case QMetaType::QVariantHash:
return QCborMap::fromVariantHash(variant.toHash());
#ifndef QT_BOOTSTRAPPED
#if QT_CONFIG(regularexpression)
- case QVariant::RegularExpression:
+ case QMetaType::QRegularExpression:
return QCborValue(variant.toRegularExpression());
#endif
case QMetaType::QJsonValue:
@@ -738,13 +757,13 @@ QCborValue QCborValue::fromVariant(const QVariant &variant)
return QCborMap::fromJsonObject(doc.object());
}
case QMetaType::QCborValue:
- return variant.value<QCborValue>();
+ return qvariant_cast<QCborValue>(variant);
case QMetaType::QCborArray:
- return variant.value<QCborArray>();
+ return qvariant_cast<QCborArray>(variant);
case QMetaType::QCborMap:
- return variant.value<QCborMap>();
+ return qvariant_cast<QCborMap>(variant);
case QMetaType::QCborSimpleType:
- return variant.value<QCborSimpleType>();
+ return qvariant_cast<QCborSimpleType>(variant);
#endif
default:
break;
@@ -824,15 +843,9 @@ QCborArray QCborArray::fromVariantList(const QVariantList &list)
*/
QCborArray QCborArray::fromJsonArray(const QJsonArray &array)
{
- QCborArray a;
- a.detach(array.size());
- for (const QJsonValue &v : array) {
- if (v.isString())
- a.d->append(v.toString());
- else
- a.d->append(QCborValue::fromJsonValue(v));
- }
- return a;
+ QCborArray result;
+ result.d = array.a;
+ return result;
}
/*!
@@ -944,20 +957,9 @@ QCborMap QCborMap::fromVariantHash(const QVariantHash &hash)
*/
QCborMap QCborMap::fromJsonObject(const QJsonObject &obj)
{
- QCborMap m;
- m.detach(obj.size());
- QCborContainerPrivate *d = m.d.data();
-
- auto it = obj.begin();
- auto end = obj.end();
- for ( ; it != end; ++it) {
- d->append(it.key());
- if (it.value().isString())
- d->append(it.value().toString());
- else
- d->append(QCborValue::fromJsonValue(it.value()));
- }
- return m;
+ QCborMap result;
+ result.d = obj.o;
+ return result;
}
QT_END_NAMESPACE
diff --git a/src/corelib/serialization/qjsondocument.cpp b/src/corelib/serialization/qjsondocument.cpp
index 8c3818caff..0be0fc020d 100644
--- a/src/corelib/serialization/qjsondocument.cpp
+++ b/src/corelib/serialization/qjsondocument.cpp
@@ -44,11 +44,22 @@
#include <qstringlist.h>
#include <qvariant.h>
#include <qdebug.h>
+#include <qcbormap.h>
+#include <qcborarray.h>
+#include "qcborvalue_p.h"
#include "qjsonwriter_p.h"
#include "qjsonparser_p.h"
#include "qjson_p.h"
#include "qdatastream.h"
+#if QT_CONFIG(binaryjson)
+#include "qbinaryjson_p.h"
+#include "qbinaryjsonobject_p.h"
+#include "qbinaryjsonarray_p.h"
+#endif
+
+#include <private/qmemory_p.h>
+
QT_BEGIN_NAMESPACE
/*! \class QJsonDocument
@@ -80,6 +91,33 @@ QT_BEGIN_NAMESPACE
\sa {JSON Support in Qt}, {JSON Save Game Example}
*/
+
+class QJsonDocumentPrivate
+{
+ Q_DISABLE_COPY_MOVE(QJsonDocumentPrivate);
+public:
+ QJsonDocumentPrivate() = default;
+ QJsonDocumentPrivate(QCborValue data) : value(std::move(data)) {}
+ ~QJsonDocumentPrivate()
+ {
+ if (rawData)
+ free(rawData);
+ }
+
+ QCborValue value;
+ char *rawData = nullptr;
+ uint rawDataSize = 0;
+
+ void clearRawData()
+ {
+ if (rawData) {
+ free(rawData);
+ rawData = nullptr;
+ rawDataSize = 0;
+ }
+ }
+};
+
/*!
* Constructs an empty and invalid document.
*/
@@ -109,11 +147,10 @@ QJsonDocument::QJsonDocument(const QJsonArray &array)
/*!
\internal
*/
-QJsonDocument::QJsonDocument(QJsonPrivate::Data *data)
- : d(data)
+QJsonDocument::QJsonDocument(const QCborValue &data)
+ : d(qt_make_unique<QJsonDocumentPrivate>(data))
{
Q_ASSERT(d);
- d->ref.ref();
}
/*!
@@ -121,20 +158,30 @@ QJsonDocument::QJsonDocument(QJsonPrivate::Data *data)
Binary data set with fromRawData is not freed.
*/
-QJsonDocument::~QJsonDocument()
-{
- if (d && !d->ref.deref())
- delete d;
-}
+QJsonDocument::~QJsonDocument() = default;
/*!
* Creates a copy of the \a other document.
*/
QJsonDocument::QJsonDocument(const QJsonDocument &other)
{
- d = other.d;
- if (d)
- d->ref.ref();
+ if (other.d) {
+ if (!d)
+ d = qt_make_unique<QJsonDocumentPrivate>();
+ d->value = other.d->value;
+ } else {
+ d.reset();
+ }
+}
+
+QJsonDocument::QJsonDocument(QJsonDocument &&other) noexcept
+ : d(std::move(other.d))
+{
+}
+
+void QJsonDocument::swap(QJsonDocument &other) noexcept
+{
+ qSwap(d, other.d);
}
/*!
@@ -143,14 +190,17 @@ QJsonDocument::QJsonDocument(const QJsonDocument &other)
*/
QJsonDocument &QJsonDocument::operator =(const QJsonDocument &other)
{
- if (d != other.d) {
- if (d && !d->ref.deref())
- delete d;
- d = other.d;
- if (d)
- d->ref.ref();
+ if (this != &other) {
+ if (other.d) {
+ if (!d)
+ d = qt_make_unique<QJsonDocumentPrivate>();
+ else
+ d->clearRawData();
+ d->value = other.d->value;
+ } else {
+ d.reset();
+ }
}
-
return *this;
}
@@ -187,12 +237,13 @@ QJsonDocument &QJsonDocument::operator =(const QJsonDocument &other)
the application.
*/
+#if QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15)
/*!
Creates a QJsonDocument that uses the first \a size bytes from
\a data. It assumes \a data contains a binary encoded JSON document.
- The created document does not take ownership of \a data and the caller
- has to guarantee that \a data will not be deleted or modified as long as
- any QJsonDocument, QJsonObject or QJsonArray still references the data.
+ The created document does not take ownership of \a data. The data is
+ copied into a different data structure, and the original data can be
+ deleted or modified afterwards.
\a data has to be aligned to a 4 byte boundary.
@@ -202,7 +253,18 @@ QJsonDocument &QJsonDocument::operator =(const QJsonDocument &other)
Returns a QJsonDocument representing the data.
- \sa rawData(), fromBinaryData(), isNull(), DataValidation
+ \deprecated in Qt 5.15. The binary JSON encoding is only retained for backwards
+ compatibility. It is undocumented and restrictive in the maximum size of JSON
+ documents that can be encoded. Qt JSON types can be converted to Qt CBOR types,
+ which can in turn be serialized into the CBOR binary format and vice versa. The
+ CBOR format is a well-defined and less restrictive binary representation for a
+ superset of JSON.
+
+ \note Before Qt 5.15, the caller had to guarantee that \a data would not be
+ deleted or modified as long as any QJsonDocument, QJsonObject or QJsonArray
+ still referenced the data. From Qt 5.15 on, this is not necessary anymore.
+
+ \sa rawData(), fromBinaryData(), isNull(), DataValidation, QCborValue
*/
QJsonDocument QJsonDocument::fromRawData(const char *data, int size, DataValidation validation)
{
@@ -211,18 +273,15 @@ QJsonDocument QJsonDocument::fromRawData(const char *data, int size, DataValidat
return QJsonDocument();
}
- if (size < (int)(sizeof(QJsonPrivate::Header) + sizeof(QJsonPrivate::Base)))
+ if (size < 0 || uint(size) < sizeof(QBinaryJsonPrivate::Header) + sizeof(QBinaryJsonPrivate::Base))
return QJsonDocument();
- QJsonPrivate::Data *d = new QJsonPrivate::Data((char *)data, size);
- d->ownsData = false;
+ std::unique_ptr<QBinaryJsonPrivate::ConstData> binaryData
+ = qt_make_unique<QBinaryJsonPrivate::ConstData>(data, size);
- if (validation != BypassValidation && !d->valid()) {
- delete d;
- return QJsonDocument();
- }
-
- return QJsonDocument(d);
+ return (validation == BypassValidation || binaryData->isValid())
+ ? binaryData->toJsonDocument()
+ : QJsonDocument();
}
/*!
@@ -230,7 +289,16 @@ QJsonDocument QJsonDocument::fromRawData(const char *data, int size, DataValidat
\a size will contain the size of the returned data.
This method is useful to e.g. stream the JSON document
- in it's binary form to a file.
+ in its binary form to a file.
+
+ \deprecated in Qt 5.15. The binary JSON encoding is only retained for backwards
+ compatibility. It is undocumented and restrictive in the maximum size of JSON
+ documents that can be encoded. Qt JSON types can be converted to Qt CBOR types,
+ which can in turn be serialized into the CBOR binary format and vice versa. The
+ CBOR format is a well-defined and less restrictive binary representation for a
+ superset of JSON.
+
+ \sa QCborValue
*/
const char *QJsonDocument::rawData(int *size) const
{
@@ -238,7 +306,21 @@ const char *QJsonDocument::rawData(int *size) const
*size = 0;
return nullptr;
}
- *size = d->alloc;
+
+ if (!d->rawData) {
+ if (isObject()) {
+ QBinaryJsonObject o = QBinaryJsonObject::fromJsonObject(object());
+ d->rawData = o.takeRawData(&(d->rawDataSize));
+ } else {
+ QBinaryJsonArray a = QBinaryJsonArray::fromJsonArray(array());
+ d->rawData = a.takeRawData(&(d->rawDataSize));
+ }
+ }
+
+ // It would be quite miraculous if not, as we should have hit the 128MB limit then.
+ Q_ASSERT(d->rawDataSize <= uint(std::numeric_limits<int>::max()));
+
+ *size = d->rawDataSize;
return d->rawData;
}
@@ -249,38 +331,67 @@ const char *QJsonDocument::rawData(int *size) const
By default the data is validated. If the \a data is not valid, the method returns
a null document.
- \sa toBinaryData(), fromRawData(), isNull(), DataValidation
+ \deprecated in Qt 5.15. The binary JSON encoding is only retained for backwards
+ compatibility. It is undocumented and restrictive in the maximum size of JSON
+ documents that can be encoded. Qt JSON types can be converted to Qt CBOR types,
+ which can in turn be serialized into the CBOR binary format and vice versa. The
+ CBOR format is a well-defined and less restrictive binary representation for a
+ superset of JSON.
+
+ \sa toBinaryData(), fromRawData(), isNull(), DataValidation, QCborValue
*/
QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation)
{
- if (data.size() < (int)(sizeof(QJsonPrivate::Header) + sizeof(QJsonPrivate::Base)))
+ if (uint(data.size()) < sizeof(QBinaryJsonPrivate::Header) + sizeof(QBinaryJsonPrivate::Base))
return QJsonDocument();
- QJsonPrivate::Header h;
- memcpy(&h, data.constData(), sizeof(QJsonPrivate::Header));
- QJsonPrivate::Base root;
- memcpy(&root, data.constData() + sizeof(QJsonPrivate::Header), sizeof(QJsonPrivate::Base));
+ QBinaryJsonPrivate::Header h;
+ memcpy(&h, data.constData(), sizeof(QBinaryJsonPrivate::Header));
+ QBinaryJsonPrivate::Base root;
+ memcpy(&root, data.constData() + sizeof(QBinaryJsonPrivate::Header),
+ sizeof(QBinaryJsonPrivate::Base));
- // do basic checks here, so we don't try to allocate more memory than we can.
- if (h.tag != QJsonDocument::BinaryFormatTag || h.version != 1u ||
- sizeof(QJsonPrivate::Header) + root.size > (uint)data.size())
+ const uint size = sizeof(QBinaryJsonPrivate::Header) + root.size;
+ if (h.tag != QJsonDocument::BinaryFormatTag || h.version != 1U || size > uint(data.size()))
return QJsonDocument();
- const uint size = sizeof(QJsonPrivate::Header) + root.size;
- char *raw = (char *)malloc(size);
- if (!raw)
- return QJsonDocument();
+ std::unique_ptr<QBinaryJsonPrivate::ConstData> d
+ = qt_make_unique<QBinaryJsonPrivate::ConstData>(data.constData(), size);
- memcpy(raw, data.constData(), size);
- QJsonPrivate::Data *d = new QJsonPrivate::Data(raw, size);
+ return (validation == BypassValidation || d->isValid())
+ ? d->toJsonDocument()
+ : QJsonDocument();
+}
- if (validation != BypassValidation && !d->valid()) {
- delete d;
- return QJsonDocument();
- }
+/*!
+ Returns a binary representation of the document.
+
+ The binary representation is also the native format used internally in Qt,
+ and is very efficient and fast to convert to and from.
+
+ The binary format can be stored on disk and interchanged with other applications
+ or computers. fromBinaryData() can be used to convert it back into a
+ JSON document.
+
+ \deprecated in Qt 5.15. The binary JSON encoding is only retained for backwards
+ compatibility. It is undocumented and restrictive in the maximum size of JSON
+ documents that can be encoded. Qt JSON types can be converted to Qt CBOR types,
+ which can in turn be serialized into the CBOR binary format and vice versa. The
+ CBOR format is a well-defined and less restrictive binary representation for a
+ superset of JSON.
- return QJsonDocument(d);
+ \sa fromBinaryData(), QCborValue
+ */
+QByteArray QJsonDocument::toBinaryData() const
+{
+ int size = 0;
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+ const char *raw = rawData(&size);
+QT_WARNING_POP
+ return QByteArray(raw, size);
}
+#endif // QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15)
/*!
Creates a QJsonDocument from the QVariant \a variant.
@@ -293,18 +404,20 @@ QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidati
QJsonDocument QJsonDocument::fromVariant(const QVariant &variant)
{
QJsonDocument doc;
- switch (variant.type()) {
- case QVariant::Map:
+
+ switch (variant.userType()) {
+ case QMetaType::QVariantMap:
doc.setObject(QJsonObject::fromVariantMap(variant.toMap()));
break;
- case QVariant::Hash:
+ case QMetaType::QVariantHash:
doc.setObject(QJsonObject::fromVariantHash(variant.toHash()));
break;
- case QVariant::List:
+ case QMetaType::QVariantList:
doc.setArray(QJsonArray::fromVariantList(variant.toList()));
break;
- case QVariant::StringList:
- doc.setArray(QJsonArray::fromStringList(variant.toStringList()));
+ case QMetaType::QStringList:
+ doc.d = qt_make_unique<QJsonDocumentPrivate>();
+ doc.d->value = QCborArray::fromStringList(variant.toStringList());
break;
default:
break;
@@ -325,10 +438,10 @@ QVariant QJsonDocument::toVariant() const
if (!d)
return QVariant();
- if (d->header->root()->isArray())
- return QJsonArray(d, static_cast<QJsonPrivate::Array *>(d->header->root())).toVariantList();
- else
- return QJsonObject(d, static_cast<QJsonPrivate::Object *>(d->header->root())).toVariantMap();
+ QCborContainerPrivate *container = QJsonPrivate::Value::container(d->value);
+ if (d->value.isArray())
+ return QJsonArray(container).toVariantList();
+ return QJsonObject(container).toVariantMap();
}
/*!
@@ -370,10 +483,11 @@ QByteArray QJsonDocument::toJson(JsonFormat format) const
if (!d)
return json;
- if (d->header->root()->isArray())
- QJsonPrivate::Writer::arrayToJson(static_cast<QJsonPrivate::Array *>(d->header->root()), json, 0, (format == Compact));
+ const QCborContainerPrivate *container = QJsonPrivate::Value::container(d->value);
+ if (d->value.isArray())
+ QJsonPrivate::Writer::arrayToJson(container, json, 0, (format == Compact));
else
- QJsonPrivate::Writer::objectToJson(static_cast<QJsonPrivate::Object *>(d->header->root()), json, 0, (format == Compact));
+ QJsonPrivate::Writer::objectToJson(container, json, 0, (format == Compact));
return json;
}
@@ -392,7 +506,13 @@ QByteArray QJsonDocument::toJson(JsonFormat format) const
QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error)
{
QJsonPrivate::Parser parser(json.constData(), json.length());
- return parser.parse(error);
+ QJsonDocument result;
+ const QCborValue val = parser.parse(error);
+ if (val.isArray() || val.isMap()) {
+ result.d = qt_make_unique<QJsonDocumentPrivate>();
+ result.d->value = val;
+ }
+ return result;
}
/*!
@@ -407,26 +527,6 @@ bool QJsonDocument::isEmpty() const
}
/*!
- Returns a binary representation of the document.
-
- The binary representation is also the native format used internally in Qt,
- and is very efficient and fast to convert to and from.
-
- The binary format can be stored on disk and interchanged with other applications
- or computers. fromBinaryData() can be used to convert it back into a
- JSON document.
-
- \sa fromBinaryData()
- */
-QByteArray QJsonDocument::toBinaryData() const
-{
- if (!d || !d->rawData)
- return QByteArray();
-
- return QByteArray(d->rawData, d->header->root()->size + sizeof(QJsonPrivate::Header));
-}
-
-/*!
Returns \c true if the document contains an array.
\sa array(), isObject()
@@ -436,8 +536,7 @@ bool QJsonDocument::isArray() const
if (!d)
return false;
- QJsonPrivate::Header *h = (QJsonPrivate::Header *)d->rawData;
- return h->root()->isArray();
+ return d->value.isArray();
}
/*!
@@ -450,8 +549,7 @@ bool QJsonDocument::isObject() const
if (!d)
return false;
- QJsonPrivate::Header *h = (QJsonPrivate::Header *)d->rawData;
- return h->root()->isObject();
+ return d->value.isMap();
}
/*!
@@ -464,10 +562,9 @@ bool QJsonDocument::isObject() const
*/
QJsonObject QJsonDocument::object() const
{
- if (d) {
- QJsonPrivate::Base *b = d->header->root();
- if (b->isObject())
- return QJsonObject(d, static_cast<QJsonPrivate::Object *>(b));
+ if (isObject()) {
+ if (auto container = QJsonPrivate::Value::container(d->value))
+ return QJsonObject(container);
}
return QJsonObject();
}
@@ -482,10 +579,9 @@ QJsonObject QJsonDocument::object() const
*/
QJsonArray QJsonDocument::array() const
{
- if (d) {
- QJsonPrivate::Base *b = d->header->root();
- if (b->isArray())
- return QJsonArray(d, static_cast<QJsonPrivate::Array *>(b));
+ if (isArray()) {
+ if (auto container = QJsonPrivate::Value::container(d->value))
+ return QJsonArray(container);
}
return QJsonArray();
}
@@ -497,24 +593,12 @@ QJsonArray QJsonDocument::array() const
*/
void QJsonDocument::setObject(const QJsonObject &object)
{
- if (d && !d->ref.deref())
- delete d;
-
- d = object.d;
+ if (!d)
+ d = qt_make_unique<QJsonDocumentPrivate>();
+ else
+ d->clearRawData();
- if (!d) {
- d = new QJsonPrivate::Data(0, QJsonValue::Object);
- } else if (d->compactionCounter || object.o != d->header->root()) {
- QJsonObject o(object);
- if (d->compactionCounter)
- o.compact();
- else
- o.detach2();
- d = o.d;
- d->ref.ref();
- return;
- }
- d->ref.ref();
+ d->value = QCborValue::fromJsonValue(object);
}
/*!
@@ -524,24 +608,12 @@ void QJsonDocument::setObject(const QJsonObject &object)
*/
void QJsonDocument::setArray(const QJsonArray &array)
{
- if (d && !d->ref.deref())
- delete d;
-
- d = array.d;
+ if (!d)
+ d = qt_make_unique<QJsonDocumentPrivate>();
+ else
+ d->clearRawData();
- if (!d) {
- d = new QJsonPrivate::Data(0, QJsonValue::Array);
- } else if (d->compactionCounter || array.a != d->header->root()) {
- QJsonArray a(array);
- if (d->compactionCounter)
- a.compact();
- else
- a.detach2();
- d = a.d;
- d->ref.ref();
- return;
- }
- d->ref.ref();
+ d->value = QCborValue::fromJsonValue(array);
}
#if QT_STRINGVIEW_LEVEL < 2
@@ -572,7 +644,7 @@ const QJsonValue QJsonDocument::operator[](QStringView key) const
if (!isObject())
return QJsonValue(QJsonValue::Undefined);
- return object().value(key);
+ return QJsonPrivate::Value::fromTrustedCbor(d->value.toMap().value(key));
}
/*!
@@ -584,7 +656,7 @@ const QJsonValue QJsonDocument::operator[](QLatin1String key) const
if (!isObject())
return QJsonValue(QJsonValue::Undefined);
- return object().value(key);
+ return QJsonPrivate::Value::fromTrustedCbor(d->value.toMap().value(key));
}
/*!
@@ -604,7 +676,7 @@ const QJsonValue QJsonDocument::operator[](int i) const
if (!isArray())
return QJsonValue(QJsonValue::Undefined);
- return array().at(i);
+ return QJsonPrivate::Value::fromTrustedCbor(d->value.toArray().at(i));
}
/*!
@@ -612,21 +684,7 @@ const QJsonValue QJsonDocument::operator[](int i) const
*/
bool QJsonDocument::operator==(const QJsonDocument &other) const
{
- if (d == other.d)
- return true;
-
- if (!d || !other.d)
- return false;
-
- if (d->header->root()->isArray() != other.d->header->root()->isArray())
- return false;
-
- if (d->header->root()->isObject())
- return QJsonObject(d, static_cast<QJsonPrivate::Object *>(d->header->root()))
- == QJsonObject(other.d, static_cast<QJsonPrivate::Object *>(other.d->header->root()));
- else
- return QJsonArray(d, static_cast<QJsonPrivate::Array *>(d->header->root()))
- == QJsonArray(other.d, static_cast<QJsonPrivate::Array *>(other.d->header->root()));
+ return (!d) ? (!other.d) : (d->value == other.d->value);
}
/*!
@@ -658,10 +716,11 @@ QDebug operator<<(QDebug dbg, const QJsonDocument &o)
return dbg;
}
QByteArray json;
- if (o.d->header->root()->isArray())
- QJsonPrivate::Writer::arrayToJson(static_cast<QJsonPrivate::Array *>(o.d->header->root()), json, 0, true);
+ const QCborContainerPrivate *container = QJsonPrivate::Value::container(o.d->value);
+ if (o.d->value.isArray())
+ QJsonPrivate::Writer::arrayToJson(container, json, 0, true);
else
- QJsonPrivate::Writer::objectToJson(static_cast<QJsonPrivate::Object *>(o.d->header->root()), json, 0, true);
+ QJsonPrivate::Writer::objectToJson(container, json, 0, true);
dbg.nospace() << "QJsonDocument("
<< json.constData() // print as utf-8 string without extra quotation marks
<< ')';
diff --git a/src/corelib/serialization/qjsondocument.h b/src/corelib/serialization/qjsondocument.h
index a8e7485f5d..758bbfd9dd 100644
--- a/src/corelib/serialization/qjsondocument.h
+++ b/src/corelib/serialization/qjsondocument.h
@@ -41,14 +41,16 @@
#define QJSONDOCUMENT_H
#include <QtCore/qjsonvalue.h>
+#include <QtCore/qscopedpointer.h>
+
+#include <memory>
QT_BEGIN_NAMESPACE
class QDebug;
+class QCborValue;
-namespace QJsonPrivate {
- class Parser;
-}
+namespace QJsonPrivate { class Parser; }
struct Q_CORE_EXPORT QJsonParseError
{
@@ -76,6 +78,7 @@ struct Q_CORE_EXPORT QJsonParseError
ParseError error;
};
+class QJsonDocumentPrivate;
class Q_CORE_EXPORT QJsonDocument
{
public:
@@ -93,11 +96,7 @@ public:
QJsonDocument(const QJsonDocument &other);
QJsonDocument &operator =(const QJsonDocument &other);
- QJsonDocument(QJsonDocument &&other) noexcept
- : d(other.d)
- {
- other.d = nullptr;
- }
+ QJsonDocument(QJsonDocument &&other) noexcept;
QJsonDocument &operator =(QJsonDocument &&other) noexcept
{
@@ -105,21 +104,26 @@ public:
return *this;
}
- void swap(QJsonDocument &other) noexcept
- {
- qSwap(d, other.d);
- }
+ void swap(QJsonDocument &other) noexcept;
enum DataValidation {
Validate,
BypassValidation
};
+#if QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15)
+ QT_DEPRECATED_X("Use CBOR format instead")
static QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate);
+
+ QT_DEPRECATED_X("Use CBOR format instead")
const char *rawData(int *size) const;
+ QT_DEPRECATED_X("Use CBOR format instead")
static QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
+
+ QT_DEPRECATED_X("Use CBOR format instead")
QByteArray toBinaryData() const;
+#endif // QT_CONFIG(binaryjson) && QT_DEPRECATED_SINCE(5, 15)
static QJsonDocument fromVariant(const QVariant &variant);
QVariant toVariant() const;
@@ -160,13 +164,12 @@ public:
private:
friend class QJsonValue;
- friend class QJsonPrivate::Data;
friend class QJsonPrivate::Parser;
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonDocument &);
- QJsonDocument(QJsonPrivate::Data *data);
+ QJsonDocument(const QCborValue &data);
- QJsonPrivate::Data *d;
+ std::unique_ptr<QJsonDocumentPrivate> d;
};
Q_DECLARE_SHARED_NOT_MOVABLE_UNTIL_QT6(QJsonDocument)
diff --git a/src/corelib/serialization/qjsonobject.cpp b/src/corelib/serialization/qjsonobject.cpp
index 329bc4d2c9..a6987279d3 100644
--- a/src/corelib/serialization/qjsonobject.cpp
+++ b/src/corelib/serialization/qjsonobject.cpp
@@ -40,11 +40,17 @@
#include <qjsonobject.h>
#include <qjsonvalue.h>
#include <qjsonarray.h>
+#include <qjsondocument.h>
#include <qstringlist.h>
#include <qdebug.h>
#include <qvariant.h>
-#include "qjson_p.h"
+#include <qcbormap.h>
+
+#include <private/qcborvalue_p.h>
#include "qjsonwriter_p.h"
+#include "qjson_p.h"
+
+#include <algorithm>
QT_BEGIN_NAMESPACE
@@ -109,10 +115,7 @@ QT_BEGIN_NAMESPACE
\sa isEmpty()
*/
-QJsonObject::QJsonObject()
- : d(nullptr), o(nullptr)
-{
-}
+QJsonObject::QJsonObject() = default;
/*!
\fn QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)
@@ -131,12 +134,10 @@ QJsonObject::QJsonObject()
/*!
\internal
*/
-QJsonObject::QJsonObject(QJsonPrivate::Data *data, QJsonPrivate::Object *object)
- : d(data), o(object)
+QJsonObject::QJsonObject(QCborContainerPrivate *object)
+ : o(object)
{
- Q_ASSERT(d);
Q_ASSERT(o);
- d->ref.ref();
}
/*!
@@ -149,17 +150,19 @@ QJsonObject::QJsonObject(QJsonPrivate::Data *data, QJsonPrivate::Object *object)
void QJsonObject::initialize()
{
- d = nullptr;
o = nullptr;
}
/*!
Destroys the object.
*/
-QJsonObject::~QJsonObject()
+QJsonObject::~QJsonObject() = default;
+
+QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)
{
- if (d && !d->ref.deref())
- delete d;
+ initialize();
+ for (const auto &arg : args)
+ insert(arg.first, arg.second);
}
/*!
@@ -170,10 +173,13 @@ QJsonObject::~QJsonObject()
*/
QJsonObject::QJsonObject(const QJsonObject &other)
{
- d = other.d;
o = other.o;
- if (d)
- d->ref.ref();
+}
+
+QJsonObject::QJsonObject(QJsonObject &&other) noexcept
+ : o(other.o)
+{
+ other.o = nullptr;
}
/*!
@@ -181,15 +187,7 @@ QJsonObject::QJsonObject(const QJsonObject &other)
*/
QJsonObject &QJsonObject::operator =(const QJsonObject &other)
{
- if (d != other.d) {
- if (d && !d->ref.deref())
- delete d;
- d = other.d;
- if (d)
- d->ref.ref();
- }
o = other.o;
-
return *this;
}
@@ -225,55 +223,7 @@ QJsonObject &QJsonObject::operator =(const QJsonObject &other)
*/
QJsonObject QJsonObject::fromVariantMap(const QVariantMap &map)
{
- QJsonObject object;
- if (map.isEmpty())
- return object;
-
- object.detach2(1024);
-
- QVector<QJsonPrivate::offset> offsets;
- QJsonPrivate::offset currentOffset;
- currentOffset = sizeof(QJsonPrivate::Base);
-
- // the map is already sorted, so we can simply append one entry after the other and
- // write the offset table at the end
- for (QVariantMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it) {
- QString key = it.key();
- QJsonValue val = QJsonValue::fromVariant(it.value());
-
- bool latinOrIntValue;
- int valueSize = QJsonPrivate::Value::requiredStorage(val, &latinOrIntValue);
-
- bool latinKey = QJsonPrivate::useCompressed(key);
- int valueOffset = sizeof(QJsonPrivate::Entry) + QJsonPrivate::qStringSize(key, latinKey);
- int requiredSize = valueOffset + valueSize;
-
- if (!object.detach2(requiredSize + sizeof(QJsonPrivate::offset))) // offset for the new index entry
- return QJsonObject();
-
- QJsonPrivate::Entry *e = reinterpret_cast<QJsonPrivate::Entry *>(reinterpret_cast<char *>(object.o) + currentOffset);
- e->value.type = val.t;
- e->value.latinKey = latinKey;
- e->value.latinOrIntValue = latinOrIntValue;
- e->value.value = QJsonPrivate::Value::valueToStore(val, (char *)e - (char *)object.o + valueOffset);
- QJsonPrivate::copyString((char *)(e + 1), key, latinKey);
- if (valueSize)
- QJsonPrivate::Value::copyData(val, (char *)e + valueOffset, latinOrIntValue);
-
- offsets << currentOffset;
- currentOffset += requiredSize;
- object.o->size = currentOffset;
- }
-
- // write table
- object.o->tableOffset = currentOffset;
- if (!object.detach2(sizeof(QJsonPrivate::offset)*offsets.size()))
- return QJsonObject();
- memcpy(object.o->table(), offsets.constData(), offsets.size()*sizeof(uint));
- object.o->length = offsets.size();
- object.o->size = currentOffset + sizeof(QJsonPrivate::offset)*offsets.size();
-
- return object;
+ return QCborMap::fromVariantMap(map).toJsonObject();
}
/*!
@@ -285,14 +235,7 @@ QJsonObject QJsonObject::fromVariantMap(const QVariantMap &map)
*/
QVariantMap QJsonObject::toVariantMap() const
{
- QVariantMap map;
- if (o) {
- for (uint i = 0; i < o->length; ++i) {
- QJsonPrivate::Entry *e = o->entryAt(i);
- map.insert(e->key(), QJsonValue(d, o, e->value).toVariant());
- }
- }
- return map;
+ return QCborMap::fromJsonObject(*this).toVariantMap();
}
/*!
@@ -324,15 +267,7 @@ QJsonObject QJsonObject::fromVariantHash(const QVariantHash &hash)
*/
QVariantHash QJsonObject::toVariantHash() const
{
- QVariantHash hash;
- if (o) {
- hash.reserve(o->length);
- for (uint i = 0; i < o->length; ++i) {
- QJsonPrivate::Entry *e = o->entryAt(i);
- hash.insert(e->key(), QJsonValue(d, o, e->value).toVariant());
- }
- }
- return hash;
+ return QCborMap::fromJsonObject(*this).toVariantHash();
}
/*!
@@ -344,11 +279,9 @@ QStringList QJsonObject::keys() const
{
QStringList keys;
if (o) {
- keys.reserve(o->length);
- for (uint i = 0; i < o->length; ++i) {
- QJsonPrivate::Entry *e = o->entryAt(i);
- keys.append(e->key());
- }
+ keys.reserve(o->elements.length() / 2);
+ for (int i = 0, end = o->elements.length(); i < end; i += 2)
+ keys.append(o->stringAt(i));
}
return keys;
}
@@ -358,10 +291,7 @@ QStringList QJsonObject::keys() const
*/
int QJsonObject::size() const
{
- if (!d)
- return 0;
-
- return o->length;
+ return o ? o->elements.length() / 2 : 0;
}
/*!
@@ -371,10 +301,24 @@ int QJsonObject::size() const
*/
bool QJsonObject::isEmpty() const
{
- if (!d)
- return true;
+ return !o || o->elements.isEmpty();
+}
+
+template<typename String>
+static int indexOf(const QExplicitlySharedDataPointer<QCborContainerPrivate> &o,
+ String key, bool *keyExists)
+{
+ const auto begin = QJsonPrivate::ConstKeyIterator(o->elements.constBegin());
+ const auto end = QJsonPrivate::ConstKeyIterator(o->elements.constEnd());
+
+ const auto it = std::lower_bound(
+ begin, end, key,
+ [&](const QJsonPrivate::ConstKeyIterator::value_type &e, const String &key) {
+ return o->stringCompareElement(e.key(), key) < 0;
+ });
- return !o->length;
+ *keyExists = (it != end) && o->stringEqualsElement((*it).key(), key);
+ return (it - begin) * 2;
}
#if QT_STRINGVIEW_LEVEL < 2
@@ -415,14 +359,14 @@ QJsonValue QJsonObject::value(QLatin1String key) const
template <typename T>
QJsonValue QJsonObject::valueImpl(T key) const
{
- if (!d)
+ if (!o)
return QJsonValue(QJsonValue::Undefined);
bool keyExists;
- int i = o->indexOf(key, &keyExists);
+ int i = indexOf(o, key, &keyExists);
if (!keyExists)
return QJsonValue(QJsonValue::Undefined);
- return QJsonValue(d, o, o->entryAt(i)->value);
+ return QJsonPrivate::Value::fromTrustedCbor(o->valueAt(i + 1));
}
#if QT_STRINGVIEW_LEVEL < 2
@@ -497,13 +441,16 @@ QJsonValueRef QJsonObject::operator [](QLatin1String key)
template <typename T>
QJsonValueRef QJsonObject::atImpl(T key)
{
+ if (!o)
+ o = new QCborContainerPrivate;
+
bool keyExists = false;
- int index = o ? o->indexOf(key, &keyExists) : 0;
+ int index = indexOf(o, key, &keyExists);
if (!keyExists) {
- iterator i = insertAt(index, key, QJsonValue(), false);
- index = i.i;
+ o->insertAt(index, key);
+ o->insertAt(index + 1, QCborValue::fromJsonValue(QJsonValue()));
}
- return QJsonValueRef(this, index);
+ return QJsonValueRef(this, index / 2);
}
#if QT_STRINGVIEW_LEVEL < 2
@@ -550,12 +497,12 @@ QJsonObject::iterator QJsonObject::insert(QLatin1String key, const QJsonValue &v
template <typename T>
QJsonObject::iterator QJsonObject::insertImpl(T key, const QJsonValue &value)
{
- if (value.t == QJsonValue::Undefined) {
+ if (value.type() == QJsonValue::Undefined) {
remove(key);
return end();
}
bool keyExists = false;
- int pos = o ? o->indexOf(key, &keyExists) : 0;
+ int pos = o ? indexOf(o, key, &keyExists) : 0;
return insertAt(pos, key, value, keyExists);
}
@@ -565,40 +512,18 @@ QJsonObject::iterator QJsonObject::insertImpl(T key, const QJsonValue &value)
template <typename T>
QJsonObject::iterator QJsonObject::insertAt(int pos, T key, const QJsonValue &value, bool keyExists)
{
- QJsonValue val = value;
-
- bool latinOrIntValue;
- int valueSize = QJsonPrivate::Value::requiredStorage(val, &latinOrIntValue);
-
- bool latinKey = QJsonPrivate::useCompressed(key);
- int valueOffset = sizeof(QJsonPrivate::Entry) + QJsonPrivate::qStringSize(key, latinKey);
- int requiredSize = valueOffset + valueSize;
-
- if (!detach2(requiredSize + sizeof(QJsonPrivate::offset))) // offset for the new index entry
- return iterator();
-
- if (!o->length)
- o->tableOffset = sizeof(QJsonPrivate::Object);
-
- if (keyExists)
- ++d->compactionCounter;
-
- uint off = o->reserveSpace(requiredSize, pos, 1, keyExists);
- if (!off)
- return end();
-
- QJsonPrivate::Entry *e = o->entryAt(pos);
- e->value.type = val.t;
- e->value.latinKey = latinKey;
- e->value.latinOrIntValue = latinOrIntValue;
- e->value.value = QJsonPrivate::Value::valueToStore(val, (char *)e - (char *)o + valueOffset);
- QJsonPrivate::copyString((char *)(e + 1), key, latinKey);
- if (valueSize)
- QJsonPrivate::Value::copyData(val, (char *)e + valueOffset, latinOrIntValue);
-
- compactIfNeeded();
+ if (o)
+ detach2(o->elements.length() / 2 + (keyExists ? 0 : 1));
+ else
+ o = new QCborContainerPrivate;
- return iterator(this, pos);
+ if (keyExists) {
+ o->replaceAt(pos + 1, QCborValue::fromJsonValue(value));
+ } else {
+ o->insertAt(pos, key);
+ o->insertAt(pos + 1, QCborValue::fromJsonValue(value));
+ }
+ return {this, pos / 2};
}
#if QT_STRINGVIEW_LEVEL < 2
@@ -637,11 +562,11 @@ void QJsonObject::remove(QLatin1String key)
template <typename T>
void QJsonObject::removeImpl(T key)
{
- if (!d)
+ if (!o)
return;
bool keyExists;
- int index = o->indexOf(key, &keyExists);
+ int index = indexOf(o, key, &keyExists);
if (!keyExists)
return;
@@ -692,13 +617,12 @@ QJsonValue QJsonObject::takeImpl(T key)
return QJsonValue(QJsonValue::Undefined);
bool keyExists;
- int index = o->indexOf(key, &keyExists);
+ int index = indexOf(o, key, &keyExists);
if (!keyExists)
return QJsonValue(QJsonValue::Undefined);
- QJsonValue v(d, o, o->entryAt(index)->value);
+ const QJsonValue v = QJsonPrivate::Value::fromTrustedCbor(o->extractAt(index + 1));
removeAt(index);
-
return v;
}
@@ -742,7 +666,7 @@ bool QJsonObject::containsImpl(T key) const
return false;
bool keyExists;
- o->indexOf(key, &keyExists);
+ indexOf(o, key, &keyExists);
return keyExists;
}
@@ -755,16 +679,14 @@ bool QJsonObject::operator==(const QJsonObject &other) const
return true;
if (!o)
- return !other.o->length;
+ return !other.o->elements.length();
if (!other.o)
- return !o->length;
- if (o->length != other.o->length)
+ return !o->elements.length();
+ if (o->elements.length() != other.o->elements.length())
return false;
- for (uint i = 0; i < o->length; ++i) {
- QJsonPrivate::Entry *e = o->entryAt(i);
- QJsonValue v(d, o, e->value);
- if (other.value(e->key()) != v)
+ for (int i = 0, end = o->elements.length(); i < end; ++i) {
+ if (o->valueAt(i) != other.o->valueAt(i))
return false;
}
@@ -788,9 +710,8 @@ bool QJsonObject::operator!=(const QJsonObject &other) const
*/
QJsonObject::iterator QJsonObject::erase(QJsonObject::iterator it)
{
- Q_ASSERT(d && d->ref.loadRelaxed() == 1);
- if (it.o != this || it.i < 0 || it.i >= (int)o->length)
- return iterator(this, o->length);
+ if (it.o != this || it.i < 0 || it.i >= o->elements.length())
+ return {this, o->elements.length()};
int index = it.i;
@@ -839,11 +760,11 @@ template <typename T>
QJsonObject::iterator QJsonObject::findImpl(T key)
{
bool keyExists = false;
- int index = o ? o->indexOf(key, &keyExists) : 0;
+ int index = o ? indexOf(o, key, &keyExists) : 0;
if (!keyExists)
return end();
detach2();
- return iterator(this, index);
+ return {this, index / 2};
}
#if QT_STRINGVIEW_LEVEL < 2
@@ -904,10 +825,10 @@ template <typename T>
QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
{
bool keyExists = false;
- int index = o ? o->indexOf(key, &keyExists) : 0;
+ int index = o ? indexOf(o, key, &keyExists) : 0;
if (!keyExists)
return end();
- return const_iterator(this, index);
+ return {this, index / 2};
}
/*! \fn int QJsonObject::count() const
@@ -1092,6 +1013,23 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
Returns a pointer to a modifiable reference to the current item.
*/
+/*! \fn const QJsonValueRef QJsonObject::iterator::operator[](int j)
+
+ Returns a modifiable reference to the item at offset \a j from the
+ item pointed to by this iterator (the item at position \c{*this + j}).
+
+ This function is provided to make QJsonObject iterators behave like C++
+ pointers.
+
+ The return value is of type QJsonValueRef, a helper class for QJsonArray
+ and QJsonObject. When you get an object of type QJsonValueRef, you can
+ use it as if it were a reference to a QJsonValue. If you assign to it,
+ the assignment will apply to the element in the QJsonArray or QJsonObject
+ from which you got the reference.
+
+ \sa operator+()
+*/
+
/*!
\fn bool QJsonObject::iterator::operator==(const iterator &other) const
\fn bool QJsonObject::iterator::operator==(const const_iterator &other) const
@@ -1112,6 +1050,38 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\sa operator==()
*/
+/*!
+ \fn bool QJsonObject::iterator::operator<(const iterator& other) const
+ \fn bool QJsonObject::iterator::operator<(const const_iterator& other) const
+
+ Returns \c true if the item pointed to by this iterator is less than
+ the item pointed to by the \a other iterator.
+*/
+
+/*!
+ \fn bool QJsonObject::iterator::operator<=(const iterator& other) const
+ \fn bool QJsonObject::iterator::operator<=(const const_iterator& other) const
+
+ Returns \c true if the item pointed to by this iterator is less than
+ or equal to the item pointed to by the \a other iterator.
+*/
+
+/*!
+ \fn bool QJsonObject::iterator::operator>(const iterator& other) const
+ \fn bool QJsonObject::iterator::operator>(const const_iterator& other) const
+
+ Returns \c true if the item pointed to by this iterator is greater
+ than the item pointed to by the \a other iterator.
+*/
+
+/*!
+ \fn bool QJsonObject::iterator::operator>=(const iterator& other) const
+ \fn bool QJsonObject::iterator::operator>=(const const_iterator& other) const
+
+ Returns \c true if the item pointed to by this iterator is greater
+ than or equal to the item pointed to by the \a other iterator.
+*/
+
/*! \fn QJsonObject::iterator QJsonObject::iterator::operator++()
The prefix ++ operator, \c{++i}, advances the iterator to the
@@ -1185,6 +1155,12 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\sa operator+=(), operator-()
*/
+/*! \fn int QJsonObject::iterator::operator-(iterator other) const
+
+ Returns the number of items between the item pointed to by \a
+ other and the item pointed to by this iterator.
+*/
+
/*!
\class QJsonObject::const_iterator
\inmodule QtCore
@@ -1288,6 +1264,18 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
Returns a pointer to the current item.
*/
+/*! \fn const QJsonValue QJsonObject::const_iterator::operator[](int j)
+
+ Returns the item at offset \a j from the item pointed to by this iterator (the item at
+ position \c{*this + j}).
+
+ This function is provided to make QJsonObject iterators behave like C++
+ pointers.
+
+ \sa operator+()
+*/
+
+
/*! \fn bool QJsonObject::const_iterator::operator==(const const_iterator &other) const
\fn bool QJsonObject::const_iterator::operator==(const iterator &other) const
@@ -1306,6 +1294,34 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\sa operator==()
*/
+/*!
+ \fn bool QJsonObject::const_iterator::operator<(const const_iterator& other) const
+
+ Returns \c true if the item pointed to by this iterator is less than
+ the item pointed to by the \a other iterator.
+*/
+
+/*!
+ \fn bool QJsonObject::const_iterator::operator<=(const const_iterator& other) const
+
+ Returns \c true if the item pointed to by this iterator is less than
+ or equal to the item pointed to by the \a other iterator.
+*/
+
+/*!
+ \fn bool QJsonObject::const_iterator::operator>(const const_iterator& other) const
+
+ Returns \c true if the item pointed to by this iterator is greater
+ than the item pointed to by the \a other iterator.
+*/
+
+/*!
+ \fn bool QJsonObject::const_iterator::operator>=(const const_iterator& other) const
+
+ Returns \c true if the item pointed to by this iterator is greater
+ than or equal to the item pointed to by the \a other iterator.
+*/
+
/*! \fn QJsonObject::const_iterator QJsonObject::const_iterator::operator++()
The prefix ++ operator, \c{++i}, advances the iterator to the
@@ -1386,6 +1402,12 @@ QJsonObject::const_iterator QJsonObject::constFindImpl(T key) const
\sa operator+=(), operator-()
*/
+/*! \fn int QJsonObject::const_iterator::operator-(const_iterator other) const
+
+ Returns the number of items between the item pointed to by \a
+ other and the item pointed to by this iterator.
+*/
+
/*!
\internal
@@ -1399,28 +1421,10 @@ void QJsonObject::detach(uint reserve)
bool QJsonObject::detach2(uint reserve)
{
- if (!d) {
- if (reserve >= QJsonPrivate::Value::MaxSize) {
- qWarning("QJson: Document too large to store in data structure");
- return false;
- }
- d = new QJsonPrivate::Data(reserve, QJsonValue::Object);
- o = static_cast<QJsonPrivate::Object *>(d->header->root());
- d->ref.ref();
- return true;
- }
- if (reserve == 0 && d->ref.loadRelaxed() == 1)
+ if (!o)
return true;
-
- QJsonPrivate::Data *x = d->clone(o, reserve);
- if (!x)
- return false;
- x->ref.ref();
- if (!d->ref.deref())
- delete d;
- d = x;
- o = static_cast<QJsonPrivate::Object *>(d->header->root());
- return true;
+ o = QCborContainerPrivate::detach(o.data(), reserve ? reserve * 2 : o->elements.length());
+ return o;
}
/*!
@@ -1428,21 +1432,11 @@ bool QJsonObject::detach2(uint reserve)
*/
void QJsonObject::compact()
{
- if (!d || !d->compactionCounter)
+ if (!o)
return;
detach2();
- d->compact();
- o = static_cast<QJsonPrivate::Object *>(d->header->root());
-}
-
-/*!
- \internal
- */
-void QJsonObject::compactIfNeeded()
-{
- if (d->compactionCounter > 32u && d->compactionCounter >= unsigned(o->length) / 2u)
- compact();
+ o->compact(o->elements.length());
}
/*!
@@ -1450,10 +1444,8 @@ void QJsonObject::compactIfNeeded()
*/
QString QJsonObject::keyAt(int i) const
{
- Q_ASSERT(o && i >= 0 && i < (int)o->length);
-
- QJsonPrivate::Entry *e = o->entryAt(i);
- return e->key();
+ Q_ASSERT(o && i >= 0 && i * 2 < o->elements.length());
+ return o->stringAt(i * 2);
}
/*!
@@ -1461,11 +1453,9 @@ QString QJsonObject::keyAt(int i) const
*/
QJsonValue QJsonObject::valueAt(int i) const
{
- if (!o || i < 0 || i >= (int)o->length)
+ if (!o || i < 0 || 2 * i + 1 >= o->elements.length())
return QJsonValue(QJsonValue::Undefined);
-
- QJsonPrivate::Entry *e = o->entryAt(i);
- return QJsonValue(d, o, e->value);
+ return QJsonPrivate::Value::fromTrustedCbor(o->valueAt(2 * i + 1));
}
/*!
@@ -1473,13 +1463,13 @@ QJsonValue QJsonObject::valueAt(int i) const
*/
void QJsonObject::setValueAt(int i, const QJsonValue &val)
{
- Q_ASSERT(o && i >= 0 && i < (int)o->length);
-
- QJsonPrivate::Entry *e = o->entryAt(i);
- if (val.t == QJsonValue::Undefined)
- removeAt(i);
- else
- insertAt(i, e->key(), val, true);
+ Q_ASSERT(o && i >= 0 && 2 * i + 1 < o->elements.length());
+ if (val.isUndefined()) {
+ o->removeAt(2 * i + 1);
+ o->removeAt(2 * i);
+ } else {
+ o->replaceAt(2 * i + 1, QCborValue::fromJsonValue(val));
+ }
}
/*!
@@ -1488,9 +1478,8 @@ void QJsonObject::setValueAt(int i, const QJsonValue &val)
void QJsonObject::removeAt(int index)
{
detach2();
- o->removeItems(index, 1);
- ++d->compactionCounter;
- compactIfNeeded();
+ o->removeAt(index + 1);
+ o->removeAt(index);
}
uint qHash(const QJsonObject &object, uint seed)
@@ -1513,7 +1502,7 @@ QDebug operator<<(QDebug dbg, const QJsonObject &o)
return dbg;
}
QByteArray json;
- QJsonPrivate::Writer::objectToJson(o.o, json, 0, true);
+ QJsonPrivate::Writer::objectToJson(o.o.data(), json, 0, true);
dbg.nospace() << "QJsonObject("
<< json.constData() // print as utf-8 string without extra quotation marks
<< ")";
diff --git a/src/corelib/serialization/qjsonobject.h b/src/corelib/serialization/qjsonobject.h
index 05463f6f36..c31be0353d 100644
--- a/src/corelib/serialization/qjsonobject.h
+++ b/src/corelib/serialization/qjsonobject.h
@@ -43,6 +43,7 @@
#include <QtCore/qjsonvalue.h>
#include <QtCore/qiterator.h>
#include <QtCore/qpair.h>
+#include <QtCore/qshareddata.h>
#include <initializer_list>
QT_BEGIN_NAMESPACE
@@ -53,29 +54,21 @@ typedef QMap<QString, QVariant> QVariantMap;
template <class Key, class T> class QHash;
typedef QHash<QString, QVariant> QVariantHash;
+class QCborContainerPrivate;
+
class Q_CORE_EXPORT QJsonObject
{
public:
QJsonObject();
- QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)
- {
- initialize();
- for (std::initializer_list<QPair<QString, QJsonValue> >::const_iterator i = args.begin(); i != args.end(); ++i)
- insert(i->first, i->second);
- }
+ QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args);
~QJsonObject();
QJsonObject(const QJsonObject &other);
QJsonObject &operator =(const QJsonObject &other);
- QJsonObject(QJsonObject &&other) noexcept
- : d(other.d), o(other.o)
- {
- other.d = nullptr;
- other.o = nullptr;
- }
+ QJsonObject(QJsonObject &&other) noexcept;
QJsonObject &operator =(QJsonObject &&other) noexcept
{
@@ -85,7 +78,6 @@ public:
void swap(QJsonObject &other) noexcept
{
- qSwap(d, other.d);
qSwap(o, other.o);
}
@@ -154,8 +146,14 @@ public:
#else
inline QJsonValueRefPtr operator->() const { return QJsonValueRefPtr(o, i); }
#endif
+ const QJsonValueRef operator[](int j) { return QJsonValueRef(o, i + j); }
+
inline bool operator==(const iterator &other) const { return i == other.i; }
inline bool operator!=(const iterator &other) const { return i != other.i; }
+ bool operator<(const iterator& other) const { return i < other.i; }
+ bool operator<=(const iterator& other) const { return i <= other.i; }
+ bool operator>(const iterator& other) const { return i > other.i; }
+ bool operator>=(const iterator& other) const { return i >= other.i; }
inline iterator &operator++() { ++i; return *this; }
inline iterator operator++(int) { iterator r = *this; ++i; return r; }
@@ -166,10 +164,15 @@ public:
inline iterator operator-(int j) const { return operator+(-j); }
inline iterator &operator+=(int j) { i += j; return *this; }
inline iterator &operator-=(int j) { i -= j; return *this; }
+ int operator-(iterator j) const { return i - j.i; }
public:
inline bool operator==(const const_iterator &other) const { return i == other.i; }
inline bool operator!=(const const_iterator &other) const { return i != other.i; }
+ bool operator<(const const_iterator& other) const { return i < other.i; }
+ bool operator<=(const const_iterator& other) const { return i <= other.i; }
+ bool operator>(const const_iterator& other) const { return i > other.i; }
+ bool operator>=(const const_iterator& other) const { return i >= other.i; }
};
friend class iterator;
@@ -200,8 +203,14 @@ public:
#else
inline QJsonValuePtr operator->() const { return QJsonValuePtr(o->valueAt(i)); }
#endif
+ const QJsonValue operator[](int j) { return o->valueAt(i + j); }
+
inline bool operator==(const const_iterator &other) const { return i == other.i; }
inline bool operator!=(const const_iterator &other) const { return i != other.i; }
+ bool operator<(const const_iterator& other) const { return i < other.i; }
+ bool operator<=(const const_iterator& other) const { return i <= other.i; }
+ bool operator>(const const_iterator& other) const { return i > other.i; }
+ bool operator>=(const const_iterator& other) const { return i >= other.i; }
inline const_iterator &operator++() { ++i; return *this; }
inline const_iterator operator++(int) { const_iterator r = *this; ++i; return r; }
@@ -212,9 +221,14 @@ public:
inline const_iterator operator-(int j) const { return operator+(-j); }
inline const_iterator &operator+=(int j) { i += j; return *this; }
inline const_iterator &operator-=(int j) { i -= j; return *this; }
+ int operator-(const_iterator j) const { return i - j.i; }
inline bool operator==(const iterator &other) const { return i == other.i; }
inline bool operator!=(const iterator &other) const { return i != other.i; }
+ bool operator<(const iterator& other) const { return i < other.i; }
+ bool operator<=(const iterator& other) const { return i <= other.i; }
+ bool operator>(const iterator& other) const { return i > other.i; }
+ bool operator>=(const iterator& other) const { return i >= other.i; }
};
friend class const_iterator;
@@ -253,20 +267,18 @@ public:
inline bool empty() const { return isEmpty(); }
private:
- friend class QJsonPrivate::Data;
friend class QJsonValue;
friend class QJsonDocument;
friend class QJsonValueRef;
-
+ friend class QCborMap;
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonObject &);
- QJsonObject(QJsonPrivate::Data *data, QJsonPrivate::Object *object);
+ QJsonObject(QCborContainerPrivate *object);
void initialize();
// ### Qt 6: remove me and merge with detach2
void detach(uint reserve = 0);
bool detach2(uint reserve = 0);
void compact();
- void compactIfNeeded();
template <typename T> QJsonValue valueImpl(T key) const;
template <typename T> QJsonValueRef atImpl(T key);
@@ -283,8 +295,9 @@ private:
void removeAt(int i);
template <typename T> iterator insertAt(int i, T key, const QJsonValue &val, bool exists);
- QJsonPrivate::Data *d;
- QJsonPrivate::Object *o;
+ // ### Qt 6: remove
+ void *dead = nullptr;
+ QExplicitlySharedDataPointer<QCborContainerPrivate> o;
};
Q_DECLARE_SHARED_NOT_MOVABLE_UNTIL_QT6(QJsonObject)
diff --git a/src/corelib/serialization/qjsonparser.cpp b/src/corelib/serialization/qjsonparser.cpp
index cd36bd5a5b..6d0a92e094 100644
--- a/src/corelib/serialization/qjsonparser.cpp
+++ b/src/corelib/serialization/qjsonparser.cpp
@@ -45,6 +45,8 @@
#include "qjsonparser_p.h"
#include "qjson_p.h"
#include "private/qutfcodec_p.h"
+#include "private/qcborvalue_p.h"
+#include "private/qnumeric_p.h"
//#define PARSER_DEBUG
#ifdef PARSER_DEBUG
@@ -197,9 +199,32 @@ QString QJsonParseError::errorString() const
using namespace QJsonPrivate;
+class StashedContainer
+{
+ Q_DISABLE_COPY_MOVE(StashedContainer)
+public:
+ StashedContainer(QExplicitlySharedDataPointer<QCborContainerPrivate> *container,
+ QCborValue::Type type)
+ : type(type), stashed(std::move(*container)), current(container)
+ {
+ }
+
+ ~StashedContainer()
+ {
+ stashed->append(QCborContainerPrivate::makeValue(type, -1, current->take(),
+ QCborContainerPrivate::MoveContainer));
+ *current = std::move(stashed);
+ }
+
+private:
+ QCborValue::Type type;
+ QExplicitlySharedDataPointer<QCborContainerPrivate> stashed;
+ QExplicitlySharedDataPointer<QCborContainerPrivate> *current;
+};
+
Parser::Parser(const char *json, int length)
- : head(json), json(json), data(nullptr)
- , dataLength(0), current(0), nestingLevel(0)
+ : head(json), json(json)
+ , nestingLevel(0)
, lastError(QJsonParseError::NoError)
{
end = json + length;
@@ -297,34 +322,30 @@ char Parser::nextToken()
/*
JSON-text = object / array
*/
-QJsonDocument Parser::parse(QJsonParseError *error)
+QCborValue Parser::parse(QJsonParseError *error)
{
#ifdef PARSER_DEBUG
indent = 0;
qDebug(">>>>> parser begin");
#endif
- // allocate some space
- dataLength = qMax(end - json, (ptrdiff_t) 256);
- data = (char *)malloc(dataLength);
- Q_CHECK_PTR(data);
-
- // fill in Header data
- QJsonPrivate::Header *h = (QJsonPrivate::Header *)data;
- h->tag = QJsonDocument::BinaryFormatTag;
- h->version = 1u;
-
- current = sizeof(QJsonPrivate::Header);
-
eatBOM();
char token = nextToken();
+ QCborValue data;
+
DEBUG << Qt::hex << (uint)token;
if (token == BeginArray) {
+ container = new QCborContainerPrivate;
if (!parseArray())
goto error;
+ data = QCborContainerPrivate::makeValue(QCborValue::Array, -1, container.take(),
+ QCborContainerPrivate::MoveContainer);
} else if (token == BeginObject) {
+ container = new QCborContainerPrivate;
if (!parseObject())
goto error;
+ data = QCborContainerPrivate::makeValue(QCborValue::Map, -1, container.take(),
+ QCborContainerPrivate::MoveContainer);
} else {
lastError = QJsonParseError::IllegalValue;
goto error;
@@ -342,44 +363,95 @@ QJsonDocument Parser::parse(QJsonParseError *error)
error->offset = 0;
error->error = QJsonParseError::NoError;
}
- QJsonPrivate::Data *d = new QJsonPrivate::Data(data, current);
- return QJsonDocument(d);
+
+ return data;
}
error:
#ifdef PARSER_DEBUG
qDebug(">>>>> parser error");
#endif
+ container.reset();
if (error) {
error->offset = json - head;
error->error = lastError;
}
- free(data);
- return QJsonDocument();
+ return QCborValue();
}
-void Parser::ParsedObject::insert(uint offset) {
- const QJsonPrivate::Entry *newEntry = reinterpret_cast<const QJsonPrivate::Entry *>(parser->data + objectPosition + offset);
- int min = 0;
- int n = offsets.size();
- while (n > 0) {
- int half = n >> 1;
- int middle = min + half;
- if (*entryAt(middle) >= *newEntry) {
- n = half;
- } else {
- min = middle + 1;
- n -= half + 1;
+
+static void sortContainer(QCborContainerPrivate *container)
+{
+ using Forward = QJsonPrivate::KeyIterator;
+ using Reverse = std::reverse_iterator<Forward>;
+ using Value = Forward::value_type;
+
+ auto compare = [container](const Value &a, const Value &b)
+ {
+ const auto &aKey = a.key();
+ const auto &bKey = b.key();
+
+ Q_ASSERT(aKey.flags & QtCbor::Element::HasByteData);
+ Q_ASSERT(bKey.flags & QtCbor::Element::HasByteData);
+
+ const QtCbor::ByteData *aData = container->byteData(aKey);
+ const QtCbor::ByteData *bData = container->byteData(bKey);
+
+ if (!aData)
+ return bData ? -1 : 0;
+ if (!bData)
+ return 1;
+
+ // If StringIsAscii is set, we can use either the UTF-8 or the latin1 comparison
+ // for the string as ASCII is a subset of both. If nothing is set, that means UTF-8.
+
+ // We are currently missing an efficient comparison between UTF-8 and UTF-16 strings.
+ // Therefore, we need to convert the UTF-8 string if we encounter such a case.
+
+ if (aKey.flags & QtCbor::Element::StringIsAscii) {
+ if (bKey.flags & QtCbor::Element::StringIsAscii)
+ return QtPrivate::compareStrings(aData->asLatin1(), bData->asLatin1());
+ if (bKey.flags & QtCbor::Element::StringIsUtf16)
+ return QtPrivate::compareStrings(aData->asLatin1(), bData->asStringView());
+
+ return QCborContainerPrivate::compareUtf8(aData, bData->asLatin1());
}
- }
- if (min < offsets.size() && *entryAt(min) == *newEntry) {
- offsets[min] = offset;
- } else {
- offsets.insert(min, offset);
- }
+
+ if (aKey.flags & QtCbor::Element::StringIsUtf16) {
+ if (bKey.flags & QtCbor::Element::StringIsAscii)
+ return QtPrivate::compareStrings(aData->asStringView(), bData->asLatin1());
+ if (bKey.flags & QtCbor::Element::StringIsUtf16)
+ return QtPrivate::compareStrings(aData->asStringView(), bData->asStringView());
+
+ // Nasty case. a is UTF-16 and b is UTF-8
+ return QtPrivate::compareStrings(aData->asStringView(), bData->toUtf8String());
+ }
+
+ if (bKey.flags & QtCbor::Element::StringIsAscii)
+ return QCborContainerPrivate::compareUtf8(aData, bData->asLatin1());
+
+ // Nasty case. a is UTF-8 and b is UTF-16
+ if (bKey.flags & QtCbor::Element::StringIsUtf16)
+ return QtPrivate::compareStrings(aData->toUtf8String(), bData->asStringView());
+
+ return QCborContainerPrivate::compareUtf8(aData, bData->asLatin1());
+ };
+
+ std::sort(Forward(container->elements.begin()), Forward(container->elements.end()),
+ [&compare](const Value &a, const Value &b) { return compare(a, b) < 0; });
+
+ // We need to retain the _last_ value for any duplicate keys. Therefore the reverse dance here.
+ auto it = std::unique(Reverse(container->elements.end()), Reverse(container->elements.begin()),
+ [&compare](const Value &a, const Value &b) {
+ return compare(a, b) == 0;
+ }).base().elementsIterator();
+
+ // The erase from beginning is expensive but hopefully rare.
+ container->elements.erase(container->elements.begin(), it);
}
+
/*
object = begin-object [ member *( value-separator member ) ]
end-object
@@ -392,19 +464,14 @@ bool Parser::parseObject()
return false;
}
- int objectOffset = reserveSpace(sizeof(QJsonPrivate::Object));
- if (objectOffset < 0)
- return false;
- BEGIN << "parseObject pos=" << objectOffset << current << json;
-
- ParsedObject parsedObject(this, objectOffset);
+ BEGIN << "parseObject" << json;
char token = nextToken();
while (token == Quote) {
- int off = current - objectOffset;
- if (!parseMember(objectOffset))
+ if (!container)
+ container = new QCborContainerPrivate;
+ if (!parseMember())
return false;
- parsedObject.insert(off);
token = nextToken();
if (token != ValueSeparator)
break;
@@ -421,50 +488,23 @@ bool Parser::parseObject()
return false;
}
- DEBUG << "numEntries" << parsedObject.offsets.size();
- int table = objectOffset;
- // finalize the object
- if (parsedObject.offsets.size()) {
- int tableSize = parsedObject.offsets.size()*sizeof(uint);
- table = reserveSpace(tableSize);
- if (table < 0)
- return false;
-
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
- memcpy(data + table, parsedObject.offsets.constData(), tableSize);
-#else
- offset *o = (offset *)(data + table);
- for (int i = 0; i < parsedObject.offsets.size(); ++i)
- o[i] = parsedObject.offsets[i];
-
-#endif
- }
-
- QJsonPrivate::Object *o = (QJsonPrivate::Object *)(data + objectOffset);
- o->tableOffset = table - objectOffset;
- o->size = current - objectOffset;
- o->is_object = true;
- o->length = parsedObject.offsets.size();
-
- DEBUG << "current=" << current;
END;
--nestingLevel;
+
+ if (container)
+ sortContainer(container.data());
return true;
}
/*
member = string name-separator value
*/
-bool Parser::parseMember(int baseOffset)
+bool Parser::parseMember()
{
- int entryOffset = reserveSpace(sizeof(QJsonPrivate::Entry));
- if (entryOffset < 0)
- return false;
- BEGIN << "parseMember pos=" << entryOffset;
+ BEGIN << "parseMember";
- bool latin1;
- if (!parseString(&latin1))
+ if (!parseString())
return false;
char token = nextToken();
if (token != NameSeparator) {
@@ -475,56 +515,13 @@ bool Parser::parseMember(int baseOffset)
lastError = QJsonParseError::UnterminatedObject;
return false;
}
- QJsonPrivate::Value val;
- if (!parseValue(&val, baseOffset))
+ if (!parseValue())
return false;
- // finalize the entry
- QJsonPrivate::Entry *e = (QJsonPrivate::Entry *)(data + entryOffset);
- e->value = val;
- e->value.latinKey = latin1;
-
END;
return true;
}
-namespace {
- struct ValueArray {
- static const int prealloc = 128;
- ValueArray() : data(stackValues), alloc(prealloc), size(0) {}
- ~ValueArray() { if (data != stackValues) free(data); }
-
- inline bool grow() {
- alloc *= 2;
- if (data == stackValues) {
- QJsonPrivate::Value *newValues = static_cast<QJsonPrivate::Value *>(malloc(alloc*sizeof(QJsonPrivate::Value)));
- if (!newValues)
- return false;
- memcpy(newValues, data, size*sizeof(QJsonPrivate::Value));
- data = newValues;
- } else {
- void *newValues = realloc(data, alloc * sizeof(QJsonPrivate::Value));
- if (!newValues)
- return false;
- data = static_cast<QJsonPrivate::Value *>(newValues);
- }
- return true;
- }
- bool append(const QJsonPrivate::Value &v) {
- if (alloc == size && !grow())
- return false;
- data[size] = v;
- ++size;
- return true;
- }
-
- QJsonPrivate::Value stackValues[prealloc];
- QJsonPrivate::Value *data;
- int alloc;
- int size;
- };
-}
-
/*
array = begin-array [ value *( value-separator value ) ] end-array
*/
@@ -537,12 +534,6 @@ bool Parser::parseArray()
return false;
}
- int arrayOffset = reserveSpace(sizeof(QJsonPrivate::Array));
- if (arrayOffset < 0)
- return false;
-
- ValueArray values;
-
if (!eatSpace()) {
lastError = QJsonParseError::UnterminatedArray;
return false;
@@ -555,13 +546,10 @@ bool Parser::parseArray()
lastError = QJsonParseError::UnterminatedArray;
return false;
}
- QJsonPrivate::Value val;
- if (!parseValue(&val, arrayOffset))
+ if (!container)
+ container = new QCborContainerPrivate;
+ if (!parseValue())
return false;
- if (!values.append(val)) {
- lastError = QJsonParseError::DocumentTooLarge;
- return false;
- }
char token = nextToken();
if (token == EndArray)
break;
@@ -575,27 +563,11 @@ bool Parser::parseArray()
}
}
- DEBUG << "size =" << values.size;
- int table = arrayOffset;
- // finalize the object
- if (values.size) {
- int tableSize = values.size*sizeof(QJsonPrivate::Value);
- table = reserveSpace(tableSize);
- if (table < 0)
- return false;
- memcpy(data + table, values.data, tableSize);
- }
-
- QJsonPrivate::Array *a = (QJsonPrivate::Array *)(data + arrayOffset);
- a->tableOffset = table - arrayOffset;
- a->size = current - arrayOffset;
- a->is_object = false;
- a->length = values.size;
-
- DEBUG << "current=" << current;
+ DEBUG << "size =" << (container ? container->elements.length() : 0);
END;
--nestingLevel;
+
return true;
}
@@ -604,10 +576,9 @@ value = false / null / true / object / array / number / string
*/
-bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
+bool Parser::parseValue()
{
BEGIN << "parse Value" << json;
- val->_dummy = 0;
switch (*json++) {
case 'n':
@@ -618,7 +589,7 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
if (*json++ == 'u' &&
*json++ == 'l' &&
*json++ == 'l') {
- val->type = QJsonValue::Null;
+ container->append(QCborValue(QCborValue::Null));
DEBUG << "value: null";
END;
return true;
@@ -633,8 +604,7 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
if (*json++ == 'r' &&
*json++ == 'u' &&
*json++ == 'e') {
- val->type = QJsonValue::Bool;
- val->value = true;
+ container->append(QCborValue(true));
DEBUG << "value: true";
END;
return true;
@@ -650,8 +620,7 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
*json++ == 'l' &&
*json++ == 's' &&
*json++ == 'e') {
- val->type = QJsonValue::Bool;
- val->value = false;
+ container->append(QCborValue(false));
DEBUG << "value: false";
END;
return true;
@@ -659,44 +628,28 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
lastError = QJsonParseError::IllegalValue;
return false;
case Quote: {
- val->type = QJsonValue::String;
- if (current - baseOffset >= Value::MaxSize) {
- lastError = QJsonParseError::DocumentTooLarge;
+ if (!parseString())
return false;
- }
- val->value = current - baseOffset;
- bool latin1;
- if (!parseString(&latin1))
- return false;
- val->latinOrIntValue = latin1;
DEBUG << "value: string";
END;
return true;
}
- case BeginArray:
- val->type = QJsonValue::Array;
- if (current - baseOffset >= Value::MaxSize) {
- lastError = QJsonParseError::DocumentTooLarge;
- return false;
- }
- val->value = current - baseOffset;
+ case BeginArray: {
+ StashedContainer stashedContainer(&container, QCborValue::Array);
if (!parseArray())
return false;
DEBUG << "value: array";
END;
return true;
- case BeginObject:
- val->type = QJsonValue::Object;
- if (current - baseOffset >= Value::MaxSize) {
- lastError = QJsonParseError::DocumentTooLarge;
- return false;
- }
- val->value = current - baseOffset;
+ }
+ case BeginObject: {
+ StashedContainer stashedContainer(&container, QCborValue::Map);
if (!parseObject())
return false;
DEBUG << "value: object";
END;
return true;
+ }
case ValueSeparator:
// Essentially missing value, but after a colon, not after a comma
// like the other MissingObject errors.
@@ -708,7 +661,7 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
return false;
default:
--json;
- if (!parseNumber(val, baseOffset))
+ if (!parseNumber())
return false;
DEBUG << "value: number";
END;
@@ -735,10 +688,9 @@ bool Parser::parseValue(QJsonPrivate::Value *val, int baseOffset)
*/
-bool Parser::parseNumber(QJsonPrivate::Value *val, int baseOffset)
+bool Parser::parseNumber()
{
BEGIN << "parseNumber" << json;
- val->type = QJsonValue::Double;
const char *start = json;
bool isInt = true;
@@ -778,42 +730,32 @@ bool Parser::parseNumber(QJsonPrivate::Value *val, int baseOffset)
return false;
}
- QByteArray number(start, json - start);
+ const QByteArray number = QByteArray::fromRawData(start, json - start);
DEBUG << "numberstring" << number;
if (isInt) {
bool ok;
- int n = number.toInt(&ok);
- if (ok && n < (1<<25) && n > -(1<<25)) {
- val->int_value = n;
- val->latinOrIntValue = true;
+ qlonglong n = number.toLongLong(&ok);
+ if (ok) {
+ container->append(QCborValue(n));
END;
return true;
}
}
bool ok;
- union {
- quint64 ui;
- double d;
- };
- d = number.toDouble(&ok);
+ double d = number.toDouble(&ok);
if (!ok) {
lastError = QJsonParseError::IllegalNumber;
return false;
}
- int pos = reserveSpace(sizeof(double));
- if (pos < 0)
- return false;
- qToLittleEndian(ui, data + pos);
- if (current - baseOffset >= Value::MaxSize) {
- lastError = QJsonParseError::DocumentTooLarge;
- return false;
- }
- val->value = pos - baseOffset;
- val->latinOrIntValue = false;
+ qint64 n;
+ if (convertDoubleTo(d, &n))
+ container->append(QCborValue(n));
+ else
+ container->append(QCborValue(d));
END;
return true;
@@ -902,58 +844,45 @@ static inline bool scanEscapeSequence(const char *&json, const char *end, uint *
static inline bool scanUtf8Char(const char *&json, const char *end, uint *result)
{
- const uchar *&src = reinterpret_cast<const uchar *&>(json);
- const uchar *uend = reinterpret_cast<const uchar *>(end);
- uchar b = *src++;
- int res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, result, src, uend);
- if (res < 0) {
- // decoding error, backtrack the character we read above
- --json;
+ const auto *usrc = reinterpret_cast<const uchar *>(json);
+ const auto *uend = reinterpret_cast<const uchar *>(end);
+ const uchar b = *usrc++;
+ int res = QUtf8Functions::fromUtf8<QUtf8BaseTraits>(b, result, usrc, uend);
+ if (res < 0)
return false;
- }
+ json = reinterpret_cast<const char *>(usrc);
return true;
}
-bool Parser::parseString(bool *latin1)
+bool Parser::parseString()
{
- *latin1 = true;
-
const char *start = json;
- int outStart = current;
- // try to write out a latin1 string
-
- int stringPos = reserveSpace(2);
- if (stringPos < 0)
- return false;
+ // try to parse a utf-8 string without escape sequences, and note whether it's 7bit ASCII.
- BEGIN << "parse string stringPos=" << stringPos << json;
+ BEGIN << "parse string" << json;
+ bool isUtf8 = true;
+ bool isAscii = true;
while (json < end) {
uint ch = 0;
if (*json == '"')
break;
- else if (*json == '\\') {
- if (!scanEscapeSequence(json, end, &ch)) {
- lastError = QJsonParseError::IllegalEscapeSequence;
- return false;
- }
- } else {
- if (!scanUtf8Char(json, end, &ch)) {
- lastError = QJsonParseError::IllegalUTF8String;
- return false;
- }
- }
- // bail out if the string is not pure latin1 or too long to hold as a latin1string (which has only 16 bit for the length)
- if (ch > 0xff || json - start >= 0x8000) {
- *latin1 = false;
+ if (*json == '\\') {
+ isAscii = false;
+ // If we find escape sequences, we store UTF-16 as there are some
+ // escape sequences which are hard to represent in UTF-8.
+ // (plain "\\ud800" for example)
+ isUtf8 = false;
break;
}
- int pos = reserveSpace(1);
- if (pos < 0)
+ if (!scanUtf8Char(json, end, &ch)) {
+ lastError = QJsonParseError::IllegalUTF8String;
return false;
- DEBUG << " " << ch << (char)ch;
- data[pos] = (uchar)ch;
+ }
+ if (ch > 0x7f)
+ isAscii = false;
+ DEBUG << " " << ch << char(ch);
}
++json;
DEBUG << "end of string";
@@ -962,25 +891,20 @@ bool Parser::parseString(bool *latin1)
return false;
}
- // no unicode string, we are done
- if (*latin1) {
- // write string length
- *(QJsonPrivate::qle_ushort *)(data + stringPos) = ushort(current - outStart - sizeof(ushort));
- int pos = reserveSpace((4 - current) & 3);
- if (pos < 0)
- return false;
- while (pos & 3)
- data[pos++] = 0;
+ // no escape sequences, we are done
+ if (isUtf8) {
+ container->appendByteData(start, json - start - 1, QCborValue::String,
+ isAscii ? QtCbor::Element::StringIsAscii
+ : QtCbor::Element::ValueFlags {});
END;
return true;
}
- *latin1 = false;
- DEBUG << "not latin";
+ DEBUG << "has escape sequences";
json = start;
- current = outStart + sizeof(int);
+ QString ucs4;
while (json < end) {
uint ch = 0;
if (*json == '"')
@@ -997,16 +921,10 @@ bool Parser::parseString(bool *latin1)
}
}
if (QChar::requiresSurrogates(ch)) {
- int pos = reserveSpace(4);
- if (pos < 0)
- return false;
- *(QJsonPrivate::qle_ushort *)(data + pos) = QChar::highSurrogate(ch);
- *(QJsonPrivate::qle_ushort *)(data + pos + 2) = QChar::lowSurrogate(ch);
+ ucs4.append(QChar::highSurrogate(ch));
+ ucs4.append(QChar::lowSurrogate(ch));
} else {
- int pos = reserveSpace(2);
- if (pos < 0)
- return false;
- *(QJsonPrivate::qle_ushort *)(data + pos) = (ushort)ch;
+ ucs4.append(QChar(ushort(ch)));
}
}
++json;
@@ -1016,13 +934,8 @@ bool Parser::parseString(bool *latin1)
return false;
}
- // write string length
- *(QJsonPrivate::qle_int *)(data + stringPos) = (current - outStart - sizeof(int))/2;
- int pos = reserveSpace((4 - current) & 3);
- if (pos < 0)
- return false;
- while (pos & 3)
- data[pos++] = 0;
+ container->appendByteData(reinterpret_cast<const char *>(ucs4.utf16()), ucs4.size() * 2,
+ QCborValue::String, QtCbor::Element::StringIsUtf16);
END;
return true;
}
diff --git a/src/corelib/serialization/qjsonparser_p.h b/src/corelib/serialization/qjsonparser_p.h
index 379256847f..14d9705447 100644
--- a/src/corelib/serialization/qjsonparser_p.h
+++ b/src/corelib/serialization/qjsonparser_p.h
@@ -52,8 +52,8 @@
//
#include <QtCore/private/qglobal_p.h>
-#include <qjsondocument.h>
-#include <qvarlengtharray.h>
+#include <QtCore/private/qcborvalue_p.h>
+#include <QtCore/qjsondocument.h>
QT_BEGIN_NAMESPACE
@@ -64,25 +64,7 @@ class Parser
public:
Parser(const char *json, int length);
- QJsonDocument parse(QJsonParseError *error);
-
- class ParsedObject
- {
- public:
- ParsedObject(Parser *p, int pos) : parser(p), objectPosition(pos) {
- offsets.reserve(64);
- }
- void insert(uint offset);
-
- Parser *parser;
- int objectPosition;
- QVector<uint> offsets;
-
- inline QJsonPrivate::Entry *entryAt(int i) const {
- return reinterpret_cast<QJsonPrivate::Entry *>(parser->data + objectPosition + offsets[i]);
- }
- };
-
+ QCborValue parse(QJsonParseError *error);
private:
inline void eatBOM();
@@ -91,34 +73,17 @@ private:
bool parseObject();
bool parseArray();
- bool parseMember(int baseOffset);
- bool parseString(bool *latin1);
- bool parseValue(QJsonPrivate::Value *val, int baseOffset);
- bool parseNumber(QJsonPrivate::Value *val, int baseOffset);
+ bool parseMember();
+ bool parseString();
+ bool parseValue();
+ bool parseNumber();
const char *head;
const char *json;
const char *end;
- char *data;
- int dataLength;
- int current;
int nestingLevel;
QJsonParseError::ParseError lastError;
-
- inline int reserveSpace(int space) {
- if (current + space >= dataLength) {
- dataLength = 2*dataLength + space;
- char *newData = (char *)realloc(data, dataLength);
- if (!newData) {
- lastError = QJsonParseError::DocumentTooLarge;
- return -1;
- }
- data = newData;
- }
- int pos = current;
- current += space;
- return pos;
- }
+ QExplicitlySharedDataPointer<QCborContainerPrivate> container;
};
}
diff --git a/src/corelib/serialization/qjsonvalue.cpp b/src/corelib/serialization/qjsonvalue.cpp
index 5f07a6a03e..caf81c79ef 100644
--- a/src/corelib/serialization/qjsonvalue.cpp
+++ b/src/corelib/serialization/qjsonvalue.cpp
@@ -40,6 +40,7 @@
#include <qjsonobject.h>
#include <qjsonvalue.h>
#include <qjsonarray.h>
+#include <qjsondocument.h>
#include <qurl.h>
#include <quuid.h>
#include <qvariant.h>
@@ -47,10 +48,11 @@
#include <qdebug.h>
#include "qdatastream.h"
-#ifndef QT_BOOTSTRAPPED
-# include <qcborarray.h>
-# include <qcbormap.h>
-#endif
+#include <private/qnumeric_p.h>
+#include <private/qcborvalue_p.h>
+
+#include <qcborarray.h>
+#include <qcbormap.h>
#include "qjson_p.h"
@@ -112,91 +114,80 @@ QT_BEGIN_NAMESPACE
The default is to create a Null value.
*/
QJsonValue::QJsonValue(Type type)
- : ui(0), d(nullptr), t(type)
+ : d(nullptr), t(QCborValue::Undefined)
{
-}
-
-/*!
- \internal
- */
-QJsonValue::QJsonValue(QJsonPrivate::Data *data, QJsonPrivate::Base *base, const QJsonPrivate::Value &v)
- : d(nullptr)
-{
- t = (Type)(uint)v.type;
- switch (t) {
- case Undefined:
+ switch (type) {
case Null:
- dbl = 0;
+ t = QCborValue::Null;
break;
case Bool:
- b = v.toBoolean();
+ t = QCborValue::False;
break;
case Double:
- dbl = v.toDouble(base);
+ t = QCborValue::Double;
break;
- case String: {
- QString s = v.toString(base);
- stringData = s.data_ptr();
- stringData->ref.ref();
+ case String:
+ t = QCborValue::String;
break;
- }
case Array:
+ t = QCborValue::Array;
+ break;
case Object:
- d = data;
- this->base = v.base(base);
+ t = QCborValue::Map;
+ break;
+ case Undefined:
break;
}
- if (d)
- d->ref.ref();
}
/*!
Creates a value of type Bool, with value \a b.
*/
QJsonValue::QJsonValue(bool b)
- : d(nullptr), t(Bool)
+ : t(b ? QCborValue::True : QCborValue::False)
{
- this->b = b;
}
/*!
- Creates a value of type Double, with value \a n.
+ Creates a value of type Double, with value \a v.
*/
-QJsonValue::QJsonValue(double n)
- : d(nullptr), t(Double)
+QJsonValue::QJsonValue(double v)
+ : d(nullptr)
{
- this->dbl = n;
+ if (convertDoubleTo(v, &n)) {
+ t = QCborValue::Integer;
+ } else {
+ memcpy(&n, &v, sizeof(n));
+ t = QCborValue::Double;
+ }
}
/*!
\overload
- Creates a value of type Double, with value \a n.
+ Creates a value of type Double, with value \a v.
*/
-QJsonValue::QJsonValue(int n)
- : d(nullptr), t(Double)
+QJsonValue::QJsonValue(int v)
+ : n(v), t(QCborValue::Integer)
{
- this->dbl = n;
}
/*!
\overload
- Creates a value of type Double, with value \a n.
+ Creates a value of type Double, with value \a v.
NOTE: the integer limits for IEEE 754 double precision data is 2^53 (-9007199254740992 to +9007199254740992).
If you pass in values outside this range expect a loss of precision to occur.
*/
-QJsonValue::QJsonValue(qint64 n)
- : d(nullptr), t(Double)
+QJsonValue::QJsonValue(qint64 v)
+ : n(v), t(QCborValue::Integer)
{
- this->dbl = double(n);
}
/*!
Creates a value of type String, with value \a s.
*/
QJsonValue::QJsonValue(const QString &s)
- : d(nullptr), t(String)
+ : QJsonValue(QJsonPrivate::Value::fromTrustedCbor(s))
{
- stringDataFromQStringHelper(s);
}
/*!
@@ -211,71 +202,50 @@ QJsonValue::QJsonValue(const QString &s)
\since 5.3
*/
+// ### Qt6: remove
void QJsonValue::stringDataFromQStringHelper(const QString &string)
{
- stringData = *(QStringData **)(&string);
- stringData->ref.ref();
+ *this = QJsonValue(string);
}
/*!
Creates a value of type String, with value \a s.
*/
QJsonValue::QJsonValue(QLatin1String s)
- : d(nullptr), t(String)
+ : QJsonValue(QJsonPrivate::Value::fromTrustedCbor(s))
{
- // ### FIXME: Avoid creating the temp QString below
- QString str(s);
- stringDataFromQStringHelper(str);
}
/*!
Creates a value of type Array, with value \a a.
*/
QJsonValue::QJsonValue(const QJsonArray &a)
- : d(a.d), t(Array)
+ : n(-1), d(a.a), t(QCborValue::Array)
{
- base = a.a;
- if (d)
- d->ref.ref();
}
/*!
Creates a value of type Object, with value \a o.
*/
QJsonValue::QJsonValue(const QJsonObject &o)
- : d(o.d), t(Object)
+ : n(-1), d(o.o), t(QCborValue::Map)
{
- base = o.o;
- if (d)
- d->ref.ref();
}
/*!
Destroys the value.
*/
-QJsonValue::~QJsonValue()
-{
- if (t == String && stringData && !stringData->ref.deref())
- free(stringData);
-
- if (d && !d->ref.deref())
- delete d;
-}
+QJsonValue::~QJsonValue() = default;
/*!
Creates a copy of \a other.
*/
QJsonValue::QJsonValue(const QJsonValue &other)
{
+ n = other.n;
t = other.t;
d = other.d;
- ui = other.ui;
- if (d)
- d->ref.ref();
-
- if (t == String && stringData)
- stringData->ref.ref();
}
/*!
@@ -288,6 +258,23 @@ QJsonValue &QJsonValue::operator =(const QJsonValue &other)
return *this;
}
+QJsonValue::QJsonValue(QJsonValue &&other) noexcept :
+ n(other.n),
+ d(other.d),
+ t(other.t)
+{
+ other.n = 0;
+ other.d = nullptr;
+ other.t = QCborValue::Null;
+}
+
+void QJsonValue::swap(QJsonValue &other) noexcept
+{
+ qSwap(n, other.n);
+ qSwap(d, other.d);
+ qSwap(t, other.t);
+}
+
/*!
\fn QJsonValue::QJsonValue(QJsonValue &&other)
\since 5.10
@@ -460,29 +447,29 @@ QJsonValue QJsonValue::fromVariant(const QVariant &variant)
switch (variant.userType()) {
case QMetaType::Nullptr:
return QJsonValue(Null);
- case QVariant::Bool:
+ case QMetaType::Bool:
return QJsonValue(variant.toBool());
- case QVariant::Int:
+ case QMetaType::Int:
case QMetaType::Float:
- case QVariant::Double:
- case QVariant::LongLong:
- case QVariant::ULongLong:
- case QVariant::UInt:
+ case QMetaType::Double:
+ case QMetaType::LongLong:
+ case QMetaType::ULongLong:
+ case QMetaType::UInt:
return QJsonValue(variant.toDouble());
- case QVariant::String:
+ case QMetaType::QString:
return QJsonValue(variant.toString());
- case QVariant::StringList:
+ case QMetaType::QStringList:
return QJsonValue(QJsonArray::fromStringList(variant.toStringList()));
- case QVariant::List:
+ case QMetaType::QVariantList:
return QJsonValue(QJsonArray::fromVariantList(variant.toList()));
- case QVariant::Map:
+ case QMetaType::QVariantMap:
return QJsonValue(QJsonObject::fromVariantMap(variant.toMap()));
- case QVariant::Hash:
+ case QMetaType::QVariantHash:
return QJsonValue(QJsonObject::fromVariantHash(variant.toHash()));
#ifndef QT_BOOTSTRAPPED
- case QVariant::Url:
+ case QMetaType::QUrl:
return QJsonValue(variant.toUrl().toString(QUrl::FullyEncoded));
- case QVariant::Uuid:
+ case QMetaType::QUuid:
return variant.toUuid().toString(QUuid::WithoutBraces);
case QMetaType::QJsonValue:
return variant.toJsonValue();
@@ -495,11 +482,11 @@ QJsonValue QJsonValue::fromVariant(const QVariant &variant)
return doc.isArray() ? QJsonValue(doc.array()) : QJsonValue(doc.object());
}
case QMetaType::QCborValue:
- return variant.value<QCborValue>().toJsonValue();
+ return qvariant_cast<QCborValue>(variant).toJsonValue();
case QMetaType::QCborArray:
- return variant.value<QCborArray>().toJsonArray();
+ return qvariant_cast<QCborArray>(variant).toJsonArray();
case QMetaType::QCborMap:
- return variant.value<QCborMap>().toJsonObject();
+ return qvariant_cast<QCborMap>(variant).toJsonObject();
#endif
default:
break;
@@ -528,23 +515,27 @@ QJsonValue QJsonValue::fromVariant(const QVariant &variant)
QVariant QJsonValue::toVariant() const
{
switch (t) {
- case Bool:
- return b;
- case Double:
- return dbl;
- case String:
+ case QCborValue::True:
+ return true;
+ case QCborValue::False:
+ return false;
+ case QCborValue::Integer:
+ case QCborValue::Double:
+ return toDouble();
+ case QCborValue::String:
return toString();
- case Array:
+ case QCborValue::Array:
return d ?
- QJsonArray(d, static_cast<QJsonPrivate::Array *>(base)).toVariantList() :
+ QJsonArray(d.data()).toVariantList() :
QVariantList();
- case Object:
+ case QCborValue::Map:
return d ?
- QJsonObject(d, static_cast<QJsonPrivate::Object *>(base)).toVariantMap() :
+ QJsonObject(d.data()).toVariantMap() :
QVariantMap();
- case Null:
+ case QCborValue::Null:
return QVariant::fromValue(nullptr);
- case Undefined:
+ case QCborValue::Undefined:
+ default:
break;
}
return QVariant();
@@ -573,7 +564,25 @@ QVariant QJsonValue::toVariant() const
*/
QJsonValue::Type QJsonValue::type() const
{
- return t;
+ switch (t) {
+ case QCborValue::Null:
+ return QJsonValue::Null;
+ case QCborValue::True:
+ case QCborValue::False:
+ return QJsonValue::Bool;
+ case QCborValue::Double:
+ case QCborValue::Integer:
+ return QJsonValue::Double;
+ case QCborValue::String:
+ return QJsonValue::String;
+ case QCborValue::Array:
+ return QJsonValue::Array;
+ case QCborValue::Map:
+ return QJsonValue::Object;
+ case QCborValue::Undefined:
+ default:
+ return QJsonValue::Undefined;
+ }
}
/*!
@@ -583,9 +592,14 @@ QJsonValue::Type QJsonValue::type() const
*/
bool QJsonValue::toBool(bool defaultValue) const
{
- if (t != Bool)
+ switch (t) {
+ case QCborValue::True:
+ return true;
+ case QCborValue::False:
+ return false;
+ default:
return defaultValue;
- return b;
+ }
}
/*!
@@ -597,9 +611,20 @@ bool QJsonValue::toBool(bool defaultValue) const
*/
int QJsonValue::toInt(int defaultValue) const
{
- if (t == Double && int(dbl) == dbl)
- return int(dbl);
- return defaultValue;
+ switch (t) {
+ case QCborValue::Double: {
+ const double dbl = toDouble();
+ int dblInt;
+ convertDoubleTo<int>(dbl, &dblInt);
+ return dbl == dblInt ? dblInt : defaultValue;
+ }
+ case QCborValue::Integer:
+ return (n <= qint64(std::numeric_limits<int>::max())
+ && n >= qint64(std::numeric_limits<int>::min()))
+ ? n : defaultValue;
+ default:
+ return defaultValue;
+ }
}
/*!
@@ -609,9 +634,17 @@ int QJsonValue::toInt(int defaultValue) const
*/
double QJsonValue::toDouble(double defaultValue) const
{
- if (t != Double)
+ switch (t) {
+ case QCborValue::Double: {
+ double d;
+ memcpy(&d, &n, sizeof(d));
+ return d;
+ }
+ case QCborValue::Integer:
+ return n;
+ default:
return defaultValue;
- return dbl;
+ }
}
/*!
@@ -621,11 +654,7 @@ double QJsonValue::toDouble(double defaultValue) const
*/
QString QJsonValue::toString(const QString &defaultValue) const
{
- if (t != String)
- return defaultValue;
- stringData->ref.ref(); // the constructor below doesn't add a ref.
- QStringDataPtr holder = { stringData };
- return QString(holder);
+ return (t == QCborValue::String && d) ? d->stringAt(n) : defaultValue;
}
/*!
@@ -637,11 +666,7 @@ QString QJsonValue::toString(const QString &defaultValue) const
*/
QString QJsonValue::toString() const
{
- if (t != String)
- return QString();
- stringData->ref.ref(); // the constructor below doesn't add a ref.
- QStringDataPtr holder = { stringData };
- return QString(holder);
+ return (t == QCborValue::String && d) ? d->stringAt(n) : QString();
}
/*!
@@ -651,10 +676,10 @@ QString QJsonValue::toString() const
*/
QJsonArray QJsonValue::toArray(const QJsonArray &defaultValue) const
{
- if (!d || t != Array)
+ if (t != QCborValue::Array || n >= 0 || !d)
return defaultValue;
- return QJsonArray(d, static_cast<QJsonPrivate::Array *>(base));
+ return QJsonArray(d.data());
}
/*!
@@ -676,10 +701,10 @@ QJsonArray QJsonValue::toArray() const
*/
QJsonObject QJsonValue::toObject(const QJsonObject &defaultValue) const
{
- if (!d || t != Object)
+ if (t != QCborValue::Map || n >= 0 || !d)
return defaultValue;
- return QJsonObject(d, static_cast<QJsonPrivate::Object *>(base));
+ return QJsonObject(d.data());
}
/*!
@@ -766,33 +791,31 @@ bool QJsonValue::operator==(const QJsonValue &other) const
return false;
switch (t) {
- case Undefined:
- case Null:
+ case QCborValue::Undefined:
+ case QCborValue::Null:
+ case QCborValue::True:
+ case QCborValue::False:
break;
- case Bool:
- return b == other.b;
- case Double:
- return dbl == other.dbl;
- case String:
+ case QCborValue::Double:
+ return toDouble() == other.toDouble();
+ case QCborValue::Integer:
+ return n == other.n;
+ case QCborValue::String:
return toString() == other.toString();
- case Array:
- if (base == other.base)
- return true;
- if (!base)
- return !other.base->length;
- if (!other.base)
- return !base->length;
- return QJsonArray(d, static_cast<QJsonPrivate::Array *>(base))
- == QJsonArray(other.d, static_cast<QJsonPrivate::Array *>(other.base));
- case Object:
- if (base == other.base)
- return true;
- if (!base)
- return !other.base->length;
- if (!other.base)
- return !base->length;
- return QJsonObject(d, static_cast<QJsonPrivate::Object *>(base))
- == QJsonObject(other.d, static_cast<QJsonPrivate::Object *>(other.base));
+ case QCborValue::Array:
+ if (!d)
+ return !other.d || other.d->elements.length() == 0;
+ if (!other.d)
+ return d->elements.length() == 0;
+ return QJsonArray(d.data()) == QJsonArray(other.d.data());
+ case QCborValue::Map:
+ if (!d)
+ return !other.d || other.d->elements.length() == 0;
+ if (!other.d)
+ return d->elements.length() == 0;
+ return QJsonObject(d.data()) == QJsonObject(other.d.data());
+ default:
+ return false;
}
return true;
}
@@ -810,15 +833,7 @@ bool QJsonValue::operator!=(const QJsonValue &other) const
*/
void QJsonValue::detach()
{
- if (!d)
- return;
-
- QJsonPrivate::Data *x = d->clone(base);
- x->ref.ref();
- if (!d->ref.deref())
- delete d;
- d = x;
- base = static_cast<QJsonPrivate::Object *>(d->header->root());
+ d.detach();
}
@@ -914,7 +929,7 @@ uint qHash(const QJsonValue &value, uint seed)
QDebug operator<<(QDebug dbg, const QJsonValue &o)
{
QDebugStateSaver saver(dbg);
- switch (o.t) {
+ switch (o.type()) {
case QJsonValue::Undefined:
dbg << "QJsonValue(undefined)";
break;
@@ -948,7 +963,7 @@ QDebug operator<<(QDebug dbg, const QJsonValue &o)
#ifndef QT_NO_DATASTREAM
QDataStream &operator<<(QDataStream &stream, const QJsonValue &v)
{
- quint8 type = v.t;
+ quint8 type = v.type();
stream << type;
switch (type) {
case QJsonValue::Undefined:
diff --git a/src/corelib/serialization/qjsonvalue.h b/src/corelib/serialization/qjsonvalue.h
index 8ade18509b..5adcd64176 100644
--- a/src/corelib/serialization/qjsonvalue.h
+++ b/src/corelib/serialization/qjsonvalue.h
@@ -42,22 +42,18 @@
#include <QtCore/qglobal.h>
#include <QtCore/qstring.h>
+#include <QtCore/qshareddata.h>
+#include <QtCore/qcborvalue.h>
QT_BEGIN_NAMESPACE
-class QDebug;
class QVariant;
class QJsonArray;
class QJsonObject;
+class QCborContainerPrivate;
namespace QJsonPrivate {
- class Data;
- class Base;
- class Object;
- class Header;
- class Array;
- class Value;
- class Entry;
+class Value;
}
class Q_CORE_EXPORT QJsonValue
@@ -77,12 +73,12 @@ public:
QJsonValue(bool b);
QJsonValue(double n);
QJsonValue(int n);
- QJsonValue(qint64 n);
+ QJsonValue(qint64 v);
QJsonValue(const QString &s);
QJsonValue(QLatin1String s);
#ifndef QT_NO_CAST_FROM_ASCII
inline QT_ASCII_CAST_WARN QJsonValue(const char *s)
- : d(nullptr), t(String) { stringDataFromQStringHelper(QString::fromUtf8(s)); }
+ : QJsonValue(QString::fromUtf8(s)) {}
#endif
QJsonValue(const QJsonArray &a);
QJsonValue(const QJsonObject &o);
@@ -92,15 +88,7 @@ public:
QJsonValue(const QJsonValue &other);
QJsonValue &operator =(const QJsonValue &other);
- QJsonValue(QJsonValue &&other) noexcept
- : ui(other.ui),
- d(other.d),
- t(other.t)
- {
- other.ui = 0;
- other.d = nullptr;
- other.t = Null;
- }
+ QJsonValue(QJsonValue &&other) noexcept;
QJsonValue &operator =(QJsonValue &&other) noexcept
{
@@ -108,12 +96,7 @@ public:
return *this;
}
- void swap(QJsonValue &other) noexcept
- {
- qSwap(ui, other.ui);
- qSwap(d, other.d);
- qSwap(t, other.t);
- }
+ void swap(QJsonValue &other) noexcept;
static QJsonValue fromVariant(const QVariant &variant);
QVariant toVariant() const;
@@ -149,7 +132,7 @@ public:
private:
// avoid implicit conversions from char * to bool
- inline QJsonValue(const void *) {}
+ QJsonValue(const void *) = delete;
friend class QJsonPrivate::Value;
friend class QJsonArray;
friend class QJsonObject;
@@ -157,20 +140,19 @@ private:
friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonValue &);
friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QJsonValue &);
- QJsonValue(QJsonPrivate::Data *d, QJsonPrivate::Base *b, const QJsonPrivate::Value& v);
+ // ### Qt6: Remove this.
void stringDataFromQStringHelper(const QString &string);
void detach();
- union {
- quint64 ui;
- bool b;
- double dbl;
- QStringData *stringData;
- QJsonPrivate::Base *base;
- };
- QJsonPrivate::Data *d; // needed for Objects and Arrays
- Type t;
+ // ### Qt6: change to an actual QCborValue
+ qint64 n = 0;
+ QExplicitlySharedDataPointer<QCborContainerPrivate> d; // needed for Objects, Arrays, Strings
+ QCborValue::Type t;
+
+ // Assert binary compatibility with pre-5.15 QJsonValue
+ Q_STATIC_ASSERT(sizeof(QExplicitlySharedDataPointer<QCborContainerPrivate>) == sizeof(void *));
+ Q_STATIC_ASSERT(sizeof(QCborValue::Type) == sizeof(QJsonValue::Type));
};
class Q_CORE_EXPORT QJsonValueRef
diff --git a/src/corelib/serialization/qjsonwriter.cpp b/src/corelib/serialization/qjsonwriter.cpp
index 012d3bea86..627d1bbd62 100644
--- a/src/corelib/serialization/qjsonwriter.cpp
+++ b/src/corelib/serialization/qjsonwriter.cpp
@@ -44,13 +44,14 @@
#include "qjson_p.h"
#include "private/qutfcodec_p.h"
#include <private/qnumeric_p.h>
+#include <private/qcborvalue_p.h>
QT_BEGIN_NAMESPACE
using namespace QJsonPrivate;
-static void objectContentToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact);
-static void arrayContentToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact);
+static void objectContentToJson(const QCborContainerPrivate *o, QByteArray &json, int indent, bool compact);
+static void arrayContentToJson(const QCborContainerPrivate *a, QByteArray &json, int indent, bool compact);
static inline uchar hexdig(uint u)
{
@@ -126,16 +127,20 @@ static QByteArray escapedString(const QString &s)
return ba;
}
-static void valueToJson(const QJsonPrivate::Base *b, const QJsonPrivate::Value &v, QByteArray &json, int indent, bool compact)
+static void valueToJson(const QCborValue &v, QByteArray &json, int indent, bool compact)
{
- QJsonValue::Type type = (QJsonValue::Type)(uint)v.type;
+ QCborValue::Type type = v.type();
switch (type) {
- case QJsonValue::Bool:
- json += v.toBoolean() ? "true" : "false";
+ case QCborValue::True:
+ json += "true";
break;
- case QJsonValue::Double: {
- const double d = v.toDouble(b);
- if (qIsFinite(d)) { // +2 to format to ensure the expected precision
+ case QCborValue::False:
+ json += "false";
+ break;
+ case QCborValue::Integer:
+ case QCborValue::Double: {
+ const double d = v.toDouble();
+ if (qIsFinite(d)) {
quint64 absInt;
json += QByteArray::number(d, convertDoubleTo(std::abs(d), &absInt) ? 'f' : 'g',
QLocale::FloatingPointShortest);
@@ -144,42 +149,44 @@ static void valueToJson(const QJsonPrivate::Base *b, const QJsonPrivate::Value &
}
break;
}
- case QJsonValue::String:
+ case QCborValue::String:
json += '"';
- json += escapedString(v.toString(b));
+ json += escapedString(v.toString());
json += '"';
break;
- case QJsonValue::Array:
+ case QCborValue::Array:
json += compact ? "[" : "[\n";
- arrayContentToJson(static_cast<QJsonPrivate::Array *>(v.base(b)), json, indent + (compact ? 0 : 1), compact);
+ arrayContentToJson(
+ QJsonPrivate::Value::container(v), json, indent + (compact ? 0 : 1), compact);
json += QByteArray(4*indent, ' ');
json += ']';
break;
- case QJsonValue::Object:
+ case QCborValue::Map:
json += compact ? "{" : "{\n";
- objectContentToJson(static_cast<QJsonPrivate::Object *>(v.base(b)), json, indent + (compact ? 0 : 1), compact);
+ objectContentToJson(
+ QJsonPrivate::Value::container(v), json, indent + (compact ? 0 : 1), compact);
json += QByteArray(4*indent, ' ');
json += '}';
break;
- case QJsonValue::Null:
+ case QCborValue::Null:
default:
json += "null";
}
}
-static void arrayContentToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact)
+static void arrayContentToJson(const QCborContainerPrivate *a, QByteArray &json, int indent, bool compact)
{
- if (!a || !a->length)
+ if (!a || a->elements.empty())
return;
QByteArray indentString(4*indent, ' ');
- uint i = 0;
- while (1) {
+ qsizetype i = 0;
+ while (true) {
json += indentString;
- valueToJson(a, a->at(i), json, indent, compact);
+ valueToJson(a->valueAt(i), json, indent, compact);
- if (++i == a->length) {
+ if (++i == a->elements.size()) {
if (!compact)
json += '\n';
break;
@@ -190,23 +197,23 @@ static void arrayContentToJson(const QJsonPrivate::Array *a, QByteArray &json, i
}
-static void objectContentToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact)
+static void objectContentToJson(const QCborContainerPrivate *o, QByteArray &json, int indent, bool compact)
{
- if (!o || !o->length)
+ if (!o || o->elements.empty())
return;
QByteArray indentString(4*indent, ' ');
- uint i = 0;
- while (1) {
- QJsonPrivate::Entry *e = o->entryAt(i);
+ qsizetype i = 0;
+ while (true) {
+ QCborValue e = o->valueAt(i);
json += indentString;
json += '"';
- json += escapedString(e->key());
+ json += escapedString(o->valueAt(i).toString());
json += compact ? "\":" : "\": ";
- valueToJson(o, e->value, json, indent, compact);
+ valueToJson(o->valueAt(i + 1), json, indent, compact);
- if (++i == o->length) {
+ if ((i += 2) == o->elements.size()) {
if (!compact)
json += '\n';
break;
@@ -216,18 +223,18 @@ static void objectContentToJson(const QJsonPrivate::Object *o, QByteArray &json,
}
}
-void Writer::objectToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact)
+void Writer::objectToJson(const QCborContainerPrivate *o, QByteArray &json, int indent, bool compact)
{
- json.reserve(json.size() + (o ? (int)o->size : 16));
+ json.reserve(json.size() + (o ? (int)o->elements.size() : 16));
json += compact ? "{" : "{\n";
objectContentToJson(o, json, indent + (compact ? 0 : 1), compact);
json += QByteArray(4*indent, ' ');
json += compact ? "}" : "}\n";
}
-void Writer::arrayToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact)
+void Writer::arrayToJson(const QCborContainerPrivate *a, QByteArray &json, int indent, bool compact)
{
- json.reserve(json.size() + (a ? (int)a->size : 16));
+ json.reserve(json.size() + (a ? (int)a->elements.size() : 16));
json += compact ? "[" : "[\n";
arrayContentToJson(a, json, indent + (compact ? 0 : 1), compact);
json += QByteArray(4*indent, ' ');
diff --git a/src/corelib/serialization/qjsonwriter_p.h b/src/corelib/serialization/qjsonwriter_p.h
index 76a8460449..8c263bb7c3 100644
--- a/src/corelib/serialization/qjsonwriter_p.h
+++ b/src/corelib/serialization/qjsonwriter_p.h
@@ -62,8 +62,8 @@ namespace QJsonPrivate
class Writer
{
public:
- static void objectToJson(const QJsonPrivate::Object *o, QByteArray &json, int indent, bool compact = false);
- static void arrayToJson(const QJsonPrivate::Array *a, QByteArray &json, int indent, bool compact = false);
+ static void objectToJson(const QCborContainerPrivate *o, QByteArray &json, int indent, bool compact = false);
+ static void arrayToJson(const QCborContainerPrivate *a, QByteArray &json, int indent, bool compact = false);
};
}
diff --git a/src/corelib/serialization/qtextstream.cpp b/src/corelib/serialization/qtextstream.cpp
index cf59cc54c7..b8137e0abd 100644
--- a/src/corelib/serialization/qtextstream.cpp
+++ b/src/corelib/serialization/qtextstream.cpp
@@ -1681,7 +1681,7 @@ QString QTextStream::readLine(qint64 maxlen)
\since 5.5
Reads one line of text from the stream into \a line.
- If \a line is 0, the read line is not stored.
+ If \a line is \nullptr, the read line is not stored.
The maximum allowed line length is set to \a maxlen. If
the stream contains lines longer than this, then the lines will be
@@ -2689,11 +2689,8 @@ QTextStream &QTextStream::operator<<(const void *ptr)
d->params.numberFlags = oldFlags;
return *this;
}
-#if defined(Q_QDOC) || QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+
namespace Qt {
-#else
-namespace QTextStreamFunctions {
-#endif
/*!
\relates QTextStream
@@ -3020,7 +3017,7 @@ QTextStream &ws(QTextStream &stream)
return stream;
}
-} // namespace QTextStreamFunctions
+} // namespace Qt
/*!
\fn QTextStreamManipulator qSetFieldWidth(int width)
@@ -3045,11 +3042,7 @@ QTextStream &ws(QTextStream &stream)
#if QT_CONFIG(textcodec)
-#if defined(Q_QDOC) || QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
namespace Qt {
-#else
-namespace QTextStreamFunctions {
-#endif
/*!
\relates QTextStream
@@ -3064,7 +3057,7 @@ QTextStream &bom(QTextStream &stream)
return stream;
}
-} // namespace QTextStreamFunctions
+} // namespace Qt
/*!
Sets the codec for this stream to \a codec. The codec is used for
@@ -3215,6 +3208,45 @@ QLocale QTextStream::locale() const
return d->locale;
}
+#if QT_DEPRECATED_SINCE(5, 15) && !defined(Q_QDOC)
+// Deprecated source compatible migration versions:
+namespace QTextStreamFunctions {
+QTextStream &bin(QTextStream &s) { return Qt::bin(s); }
+QTextStream &oct(QTextStream &s) { return Qt::oct(s); }
+QTextStream &dec(QTextStream &s) { return Qt::dec(s); }
+QTextStream &hex(QTextStream &s) { return Qt::hex(s); }
+
+QTextStream &showbase(QTextStream &s) { return Qt::showbase(s); }
+QTextStream &forcesign(QTextStream &s) { return Qt::forcesign(s); }
+QTextStream &forcepoint(QTextStream &s) { return Qt::forcepoint(s); }
+QTextStream &noshowbase(QTextStream &s) { return Qt::noshowbase(s); }
+QTextStream &noforcesign(QTextStream &s) { return Qt::noforcesign(s); }
+QTextStream &noforcepoint(QTextStream &s) { return Qt::noforcepoint(s); }
+
+QTextStream &uppercasebase(QTextStream &s) { return Qt::uppercasebase(s); }
+QTextStream &uppercasedigits(QTextStream &s) { return Qt::uppercasedigits(s); }
+QTextStream &lowercasebase(QTextStream &s) { return Qt::lowercasebase(s); }
+QTextStream &lowercasedigits(QTextStream &s) { return Qt::lowercasedigits(s); }
+
+QTextStream &fixed(QTextStream &s) { return Qt::fixed(s); }
+QTextStream &scientific(QTextStream &s) { return Qt::scientific(s); }
+
+QTextStream &left(QTextStream &s) { return Qt::left(s); }
+QTextStream &right(QTextStream &s) { return Qt::right(s); }
+QTextStream &center(QTextStream &s) { return Qt::center(s); }
+
+QTextStream &endl(QTextStream &s) { return Qt::endl(s); }
+QTextStream &flush(QTextStream &s) { return Qt::flush(s); }
+QTextStream &reset(QTextStream &s) { return Qt::reset(s); }
+
+QTextStream &ws(QTextStream &s) { return Qt::ws(s); }
+
+#if QT_CONFIG(textcodec)
+QTextStream &bom(QTextStream &s) { return Qt::bom(s); }
+#endif
+} // namespace QTextStreamFunctions
+#endif
+
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && !defined(Q_QDOC)
// Binary compatible definitions for Qt<5.14
Q_CORE_EXPORT QTextStream &bin(QTextStream &s) { return Qt::bin(s); }
diff --git a/src/corelib/serialization/qtextstream.h b/src/corelib/serialization/qtextstream.h
index 935ec16536..6f93826d8a 100644
--- a/src/corelib/serialization/qtextstream.h
+++ b/src/corelib/serialization/qtextstream.h
@@ -233,13 +233,7 @@ inline QTextStream &operator<<(QTextStream &s, QTextStreamFunction f)
inline QTextStream &operator<<(QTextStream &s, QTextStreamManipulator m)
{ m.exec(s); return s; }
-#if defined(Q_QDOC) || QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
namespace Qt {
-#else
-// This namespace only exists for 'using namespace' declarations.
-namespace QTextStreamFunctions {
-#endif
-
Q_CORE_EXPORT QTextStream &bin(QTextStream &s);
Q_CORE_EXPORT QTextStream &oct(QTextStream &s);
Q_CORE_EXPORT QTextStream &dec(QTextStream &s);
@@ -272,12 +266,36 @@ Q_CORE_EXPORT QTextStream &bom(QTextStream &s);
Q_CORE_EXPORT QTextStream &ws(QTextStream &s);
-} // namespace QTextStreamFunctions
+} // namespace Qt
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && !defined(Q_QDOC)
-namespace Qt {
-using namespace QTextStreamFunctions;
-}
+#if QT_DEPRECATED_SINCE(5, 15) && !defined(Q_QDOC)
+// This namespace only exists for 'using namespace' declarations.
+namespace QTextStreamFunctions {
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::bin") QTextStream &bin(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::oct") QTextStream &oct(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::dec") QTextStream &dec(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::hex") QTextStream &hex(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::showbase") QTextStream &showbase(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::forcesign") QTextStream &forcesign(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::forcepoint") QTextStream &forcepoint(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::noshowbase") QTextStream &noshowbase(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::noforcesign") QTextStream &noforcesign(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::noforcepoint") QTextStream &noforcepoint(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::uppercasebase") QTextStream &uppercasebase(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::uppercasedigits") QTextStream &uppercasedigits(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::lowercasebase") QTextStream &lowercasebase(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::lowercasedigits") QTextStream &lowercasedigits(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::fixed") QTextStream &fixed(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::scientific") QTextStream &scientific(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::left") QTextStream &left(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::right") QTextStream &right(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::center") QTextStream &center(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::endl") QTextStream &endl(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::flush") QTextStream &flush(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::reset") QTextStream &reset(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::bom") QTextStream &bom(QTextStream &s);
+Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::ws") QTextStream &ws(QTextStream &s);
+} // namespace QTextStreamFunctions
QT_WARNING_PUSH
QT_WARNING_DISABLE_CLANG("-Wheader-hygiene")
@@ -285,7 +303,7 @@ QT_WARNING_DISABLE_CLANG("-Wheader-hygiene")
// conflicting definitions compiler errors.
using namespace QTextStreamFunctions;
QT_WARNING_POP
-#endif // QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && !defined(Q_QDOC)
+#endif // QT_DEPRECATED_SINCE(5, 15) && !defined(Q_QDOC)
inline QTextStreamManipulator qSetFieldWidth(int width)
{
diff --git a/src/corelib/serialization/serialization.pri b/src/corelib/serialization/serialization.pri
index 4f2dc64e4f..ff653ca8f3 100644
--- a/src/corelib/serialization/serialization.pri
+++ b/src/corelib/serialization/serialization.pri
@@ -3,10 +3,11 @@
HEADERS += \
serialization/qcborarray.h \
serialization/qcborcommon.h \
+ serialization/qcborcommon_p.h \
serialization/qcbormap.h \
+ serialization/qcborstream.h \
serialization/qcborvalue.h \
serialization/qcborvalue_p.h \
- serialization/qcborstream.h \
serialization/qdatastream.h \
serialization/qdatastream_p.h \
serialization/qjson_p.h \
@@ -23,11 +24,10 @@ HEADERS += \
serialization/qxmlutils_p.h
SOURCES += \
- serialization/qcborstream.cpp \
+ serialization/qcborcommon.cpp \
serialization/qcbordiagnostic.cpp \
serialization/qcborvalue.cpp \
serialization/qdatastream.cpp \
- serialization/qjson.cpp \
serialization/qjsoncbor.cpp \
serialization/qjsondocument.cpp \
serialization/qjsonobject.cpp \
@@ -39,6 +39,36 @@ SOURCES += \
serialization/qxmlstream.cpp \
serialization/qxmlutils.cpp
+qtConfig(cborstreamreader): {
+ SOURCES += \
+ serialization/qcborstreamreader.cpp
+
+ HEADERS += \
+ serialization/qcborstreamreader.h
+}
+
+qtConfig(cborstreamwriter): {
+ SOURCES += \
+ serialization/qcborstreamwriter.cpp
+
+ HEADERS += \
+ serialization/qcborstreamwriter.h
+}
+
+qtConfig(binaryjson): {
+ HEADERS += \
+ serialization/qbinaryjson_p.h \
+ serialization/qbinaryjsonarray_p.h \
+ serialization/qbinaryjsonobject_p.h \
+ serialization/qbinaryjsonvalue_p.h
+
+ SOURCES += \
+ serialization/qbinaryjson.cpp \
+ serialization/qbinaryjsonarray.cpp \
+ serialization/qbinaryjsonobject.cpp \
+ serialization/qbinaryjsonvalue.cpp \
+}
+
false: SOURCES += \
serialization/qcborarray.cpp \
serialization/qcbormap.cpp
diff --git a/src/corelib/statemachine/qabstractstate.cpp b/src/corelib/statemachine/qabstractstate.cpp
index 0db44bc427..10f54c3e18 100644
--- a/src/corelib/statemachine/qabstractstate.cpp
+++ b/src/corelib/statemachine/qabstractstate.cpp
@@ -84,19 +84,19 @@ QT_BEGIN_NAMESPACE
QAbstractStatePrivate::QAbstractStatePrivate(StateType type)
- : stateType(type), isMachine(false), active(false), parentState(0)
+ : stateType(type), isMachine(false), active(false), parentState(nullptr)
{
}
QStateMachine *QAbstractStatePrivate::machine() const
{
QObject *par = parent;
- while (par != 0) {
+ while (par != nullptr) {
if (QStateMachine *mach = qobject_cast<QStateMachine*>(par))
return mach;
par = par->parent();
}
- return 0;
+ return nullptr;
}
void QAbstractStatePrivate::callOnEntry(QEvent *e)
diff --git a/src/corelib/statemachine/qabstracttransition.cpp b/src/corelib/statemachine/qabstracttransition.cpp
index d841fd3c8b..df70b54721 100644
--- a/src/corelib/statemachine/qabstracttransition.cpp
+++ b/src/corelib/statemachine/qabstracttransition.cpp
@@ -144,7 +144,7 @@ QStateMachine *QAbstractTransitionPrivate::machine() const
Q_Q(const QAbstractTransition);
if (QHistoryState *parent = qobject_cast<QHistoryState *>(q->parent()))
return parent->machine();
- return 0;
+ return nullptr;
}
bool QAbstractTransitionPrivate::callEventTest(QEvent *e)
@@ -223,7 +223,7 @@ void QAbstractTransition::setTargetState(QAbstractState* target)
{
Q_D(QAbstractTransition);
if ((d->targetStates.size() == 1 && target == d->targetStates.at(0).data()) ||
- (d->targetStates.isEmpty() && target == 0)) {
+ (d->targetStates.isEmpty() && target == nullptr)) {
return;
}
if (!target)
diff --git a/src/corelib/statemachine/qeventtransition.cpp b/src/corelib/statemachine/qeventtransition.cpp
index a90f147773..5dcbcfff47 100644
--- a/src/corelib/statemachine/qeventtransition.cpp
+++ b/src/corelib/statemachine/qeventtransition.cpp
@@ -100,7 +100,7 @@ QT_BEGIN_NAMESPACE
*/
QEventTransitionPrivate::QEventTransitionPrivate()
{
- object = 0;
+ object = nullptr;
eventType = QEvent::None;
registered = false;
}
diff --git a/src/corelib/statemachine/qhistorystate.cpp b/src/corelib/statemachine/qhistorystate.cpp
index ccf04d4799..e5b8075b96 100644
--- a/src/corelib/statemachine/qhistorystate.cpp
+++ b/src/corelib/statemachine/qhistorystate.cpp
@@ -147,7 +147,7 @@ protected:
QHistoryStatePrivate::QHistoryStatePrivate()
: QAbstractStatePrivate(HistoryState)
- , defaultTransition(0)
+ , defaultTransition(nullptr)
, historyType(QHistoryState::ShallowHistory)
{
}
diff --git a/src/corelib/statemachine/qsignaltransition.cpp b/src/corelib/statemachine/qsignaltransition.cpp
index 59e0c0d788..8e57695fd7 100644
--- a/src/corelib/statemachine/qsignaltransition.cpp
+++ b/src/corelib/statemachine/qsignaltransition.cpp
@@ -107,7 +107,7 @@ QT_BEGIN_NAMESPACE
QSignalTransitionPrivate::QSignalTransitionPrivate()
{
- sender = 0;
+ sender = nullptr;
signalIndex = -1;
}
diff --git a/src/corelib/statemachine/qstate.cpp b/src/corelib/statemachine/qstate.cpp
index 62dd4f0284..f641d25a96 100644
--- a/src/corelib/statemachine/qstate.cpp
+++ b/src/corelib/statemachine/qstate.cpp
@@ -146,7 +146,7 @@ QT_BEGIN_NAMESPACE
QStatePrivate::QStatePrivate()
: QAbstractStatePrivate(StandardState),
- errorState(0), initialState(0), childMode(QState::ExclusiveStates),
+ errorState(nullptr), initialState(nullptr), childMode(QState::ExclusiveStates),
childStatesListNeedsRefresh(true), transitionsListNeedsRefresh(true)
{
}
@@ -293,11 +293,11 @@ QAbstractState *QState::errorState() const
void QState::setErrorState(QAbstractState *state)
{
Q_D(QState);
- if (state != 0 && qobject_cast<QStateMachine*>(state)) {
+ if (state != nullptr && qobject_cast<QStateMachine*>(state)) {
qWarning("QStateMachine::setErrorState: root state cannot be error state");
return;
}
- if (state != 0 && (!state->machine() || ((state->machine() != machine()) && !qobject_cast<QStateMachine*>(this)))) {
+ if (state != nullptr && (!state->machine() || ((state->machine() != machine()) && !qobject_cast<QStateMachine*>(this)))) {
qWarning("QState::setErrorState: error state cannot belong "
"to a different state machine");
return;
@@ -360,15 +360,15 @@ QSignalTransition *QState::addTransition(const QObject *sender, const char *sign
{
if (!sender) {
qWarning("QState::addTransition: sender cannot be null");
- return 0;
+ return nullptr;
}
if (!signal) {
qWarning("QState::addTransition: signal cannot be null");
- return 0;
+ return nullptr;
}
if (!target) {
qWarning("QState::addTransition: cannot add transition to null state");
- return 0;
+ return nullptr;
}
int offset = (*signal == '0'+QSIGNAL_CODE) ? 1 : 0;
const QMetaObject *meta = sender->metaObject();
@@ -376,7 +376,7 @@ QSignalTransition *QState::addTransition(const QObject *sender, const char *sign
if (meta->indexOfSignal(QMetaObject::normalizedSignature(signal+offset)) == -1) {
qWarning("QState::addTransition: no such signal %s::%s",
meta->className(), signal+offset);
- return 0;
+ return nullptr;
}
}
QSignalTransition *trans = new QSignalTransition(sender, signal);
@@ -409,7 +409,7 @@ QAbstractTransition *QState::addTransition(QAbstractState *target)
{
if (!target) {
qWarning("QState::addTransition: cannot add transition to null state");
- return 0;
+ return nullptr;
}
UnconditionalTransition *trans = new UnconditionalTransition(target);
addTransition(trans);
@@ -438,7 +438,7 @@ void QState::removeTransition(QAbstractTransition *transition)
QStateMachinePrivate *mach = QStateMachinePrivate::get(d->machine());
if (mach)
mach->unregisterTransition(transition);
- transition->setParent(0);
+ transition->setParent(nullptr);
}
/*!
@@ -544,7 +544,7 @@ bool QState::event(QEvent *e)
d->childStatesListNeedsRefresh = true;
d->transitionsListNeedsRefresh = true;
if ((e->type() == QEvent::ChildRemoved) && (static_cast<QChildEvent *>(e)->child() == d->initialState))
- d->initialState = 0;
+ d->initialState = nullptr;
}
return QAbstractState::event(e);
}
diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp
index 44e4e151cb..9d2505ba2e 100644
--- a/src/corelib/statemachine/qstatemachine.cpp
+++ b/src/corelib/statemachine/qstatemachine.cpp
@@ -197,7 +197,7 @@ struct CalculationCache {
bool transitionDomainIsKnown : 1;
TransitionInfo()
- : transitionDomain(0)
+ : transitionDomain(nullptr)
, effectiveTargetStatesIsKnown(false)
, exitSetIsKnown(false)
, transitionDomainIsKnown(false)
@@ -289,9 +289,9 @@ child of a child, etc.) Otherwise returns 'false'.
*/
static inline bool isDescendant(const QAbstractState *state1, const QAbstractState *state2)
{
- Q_ASSERT(state1 != 0);
+ Q_ASSERT(state1 != nullptr);
- for (QAbstractState *it = state1->parentState(); it != 0; it = it->parentState()) {
+ for (QAbstractState *it = state1->parentState(); it != nullptr; it = it->parentState()) {
if (it == state2)
return true;
}
@@ -311,7 +311,7 @@ static bool containsDecendantOf(const QSet<QAbstractState *> &states, const QAbs
static int descendantDepth(const QAbstractState *state, const QAbstractState *ancestor)
{
int depth = 0;
- for (const QAbstractState *it = state; it != 0; it = it->parentState()) {
+ for (const QAbstractState *it = state; it != nullptr; it = it->parentState()) {
if (it == ancestor)
break;
++depth;
@@ -332,7 +332,7 @@ this returns the empty set.
*/
static QVector<QState*> getProperAncestors(const QAbstractState *state, const QAbstractState *upperBound)
{
- Q_ASSERT(state != 0);
+ Q_ASSERT(state != nullptr);
QVector<QState*> result;
result.reserve(16);
for (QState *it = state->parentState(); it && it != upperBound; it = it->parentState()) {
@@ -405,7 +405,7 @@ QStateMachinePrivate::QStateMachinePrivate()
stopProcessingReason = EventQueueEmpty;
error = QStateMachine::NoError;
globalRestorePolicy = QState::DontRestoreProperties;
- signalEventGenerator = 0;
+ signalEventGenerator = nullptr;
#if QT_CONFIG(animation)
animated = true;
#endif
@@ -437,7 +437,7 @@ static QEvent *cloneEvent(QEvent *e)
Q_ASSERT_X(false, "cloneEvent()", "not implemented");
break;
}
- return 0;
+ return nullptr;
}
const QStateMachinePrivate::Handler qt_kernel_statemachine_handler = {
@@ -474,10 +474,10 @@ bool QStateMachinePrivate::transitionStateEntryLessThan(QAbstractTransition *t1,
} else if (isDescendant(s2, s1)) {
return false;
} else {
- Q_ASSERT(s1->machine() != 0);
+ Q_ASSERT(s1->machine() != nullptr);
QStateMachinePrivate *mach = QStateMachinePrivate::get(s1->machine());
QState *lca = mach->findLCA(QList<QAbstractState*>() << s1 << s2);
- Q_ASSERT(lca != 0);
+ Q_ASSERT(lca != nullptr);
int s1Depth = descendantDepth(s1, lca);
int s2Depth = descendantDepth(s2, lca);
if (s1Depth == s2Depth)
@@ -497,10 +497,10 @@ bool QStateMachinePrivate::stateEntryLessThan(QAbstractState *s1, QAbstractState
} else if (isDescendant(s2, s1)) {
return true;
} else {
- Q_ASSERT(s1->machine() != 0);
+ Q_ASSERT(s1->machine() != nullptr);
QStateMachinePrivate *mach = QStateMachinePrivate::get(s1->machine());
QState *lca = mach->findLCA(QList<QAbstractState*>() << s1 << s2);
- Q_ASSERT(lca != 0);
+ Q_ASSERT(lca != nullptr);
return (indexOfDescendant(lca, s1) < indexOfDescendant(lca, s2));
}
}
@@ -515,10 +515,10 @@ bool QStateMachinePrivate::stateExitLessThan(QAbstractState *s1, QAbstractState
} else if (isDescendant(s2, s1)) {
return false;
} else {
- Q_ASSERT(s1->machine() != 0);
+ Q_ASSERT(s1->machine() != nullptr);
QStateMachinePrivate *mach = QStateMachinePrivate::get(s1->machine());
QState *lca = mach->findLCA(QList<QAbstractState*>() << s1 << s2);
- Q_ASSERT(lca != 0);
+ Q_ASSERT(lca != nullptr);
return (indexOfDescendant(lca, s2) < indexOfDescendant(lca, s1));
}
}
@@ -526,7 +526,7 @@ bool QStateMachinePrivate::stateExitLessThan(QAbstractState *s1, QAbstractState
QState *QStateMachinePrivate::findLCA(const QList<QAbstractState*> &states, bool onlyCompound)
{
if (states.isEmpty())
- return 0;
+ return nullptr;
QVector<QState*> ancestors = getProperAncestors(states.at(0), rootState()->parentState());
for (int i = 0; i < ancestors.size(); ++i) {
QState *anc = ancestors.at(i);
@@ -792,7 +792,7 @@ QSet<QAbstractState*> QStateMachinePrivate::computeExitSet_Unordered(QAbstractTr
lst.prepend(t->sourceState());
domain = findLCCA(lst);
- Q_ASSERT(domain != 0);
+ Q_ASSERT(domain != nullptr);
}
for (QAbstractState* s : qAsConst(configuration)) {
@@ -918,7 +918,7 @@ QAbstractState *QStateMachinePrivate::getTransitionDomain(QAbstractTransition *t
Q_ASSERT(cache);
if (effectiveTargetStates.isEmpty())
- return 0;
+ return nullptr;
QAbstractState *domain = nullptr;
if (cache->transitionDomain(t, &domain))
@@ -1234,28 +1234,28 @@ QState *QStateMachinePrivate::toStandardState(QAbstractState *state)
{
if (state && (QAbstractStatePrivate::get(state)->stateType == QAbstractStatePrivate::StandardState))
return static_cast<QState*>(state);
- return 0;
+ return nullptr;
}
const QState *QStateMachinePrivate::toStandardState(const QAbstractState *state)
{
if (state && (QAbstractStatePrivate::get(state)->stateType == QAbstractStatePrivate::StandardState))
return static_cast<const QState*>(state);
- return 0;
+ return nullptr;
}
QFinalState *QStateMachinePrivate::toFinalState(QAbstractState *state)
{
if (state && (QAbstractStatePrivate::get(state)->stateType == QAbstractStatePrivate::FinalState))
return static_cast<QFinalState*>(state);
- return 0;
+ return nullptr;
}
QHistoryState *QStateMachinePrivate::toHistoryState(QAbstractState *state)
{
if (state && (QAbstractStatePrivate::get(state)->stateType == QAbstractStatePrivate::HistoryState))
return static_cast<QHistoryState*>(state);
- return 0;
+ return nullptr;
}
bool QStateMachinePrivate::isInFinalState(QAbstractState* s) const
@@ -1455,13 +1455,13 @@ QHash<QAbstractState*, QVector<QPropertyAssignment> > QStateMachinePrivate::comp
QAbstractState *QStateMachinePrivate::findErrorState(QAbstractState *context)
{
// Find error state recursively in parent hierarchy if not set explicitly for context state
- QAbstractState *errorState = 0;
- if (context != 0) {
+ QAbstractState *errorState = nullptr;
+ if (context != nullptr) {
QState *s = toStandardState(context);
- if (s != 0)
+ if (s != nullptr)
errorState = s->errorState();
- if (errorState == 0)
+ if (errorState == nullptr)
errorState = findErrorState(context->parentState());
}
@@ -1475,21 +1475,21 @@ void QStateMachinePrivate::setError(QStateMachine::Error errorCode, QAbstractSta
error = errorCode;
switch (errorCode) {
case QStateMachine::NoInitialStateError:
- Q_ASSERT(currentContext != 0);
+ Q_ASSERT(currentContext != nullptr);
errorString = QStateMachine::tr("Missing initial state in compound state '%1'")
.arg(currentContext->objectName());
break;
case QStateMachine::NoDefaultStateInHistoryStateError:
- Q_ASSERT(currentContext != 0);
+ Q_ASSERT(currentContext != nullptr);
errorString = QStateMachine::tr("Missing default state in history state '%1'")
.arg(currentContext->objectName());
break;
case QStateMachine::NoCommonAncestorForTransitionError:
- Q_ASSERT(currentContext != 0);
+ Q_ASSERT(currentContext != nullptr);
errorString = QStateMachine::tr("No common ancestor for targets and source of transition from state '%1'")
.arg(currentContext->objectName());
@@ -1513,11 +1513,11 @@ void QStateMachinePrivate::setError(QStateMachine::Error errorCode, QAbstractSta
// Avoid infinite loop if the error state itself has an error
if (currentContext == currentErrorState)
- currentErrorState = 0;
+ currentErrorState = nullptr;
Q_ASSERT(currentErrorState != rootState());
- if (currentErrorState != 0) {
+ if (currentErrorState != nullptr) {
#ifdef QSTATEMACHINE_DEBUG
qDebug() << q << ": entering error state" << currentErrorState << "from" << currentContext;
#endif
@@ -1549,7 +1549,7 @@ QStateMachinePrivate::initializeAnimation(QAbstractAnimation *abstractAnimation,
}
} else {
QPropertyAnimation *animation = qobject_cast<QPropertyAnimation *>(abstractAnimation);
- if (animation != 0
+ if (animation != nullptr
&& prop.object == animation->targetObject()
&& prop.propertyName == animation->propertyName()) {
@@ -1568,7 +1568,7 @@ void QStateMachinePrivate::_q_animationFinished()
{
Q_Q(QStateMachine);
QAbstractAnimation *anim = qobject_cast<QAbstractAnimation*>(q->sender());
- Q_ASSERT(anim != 0);
+ Q_ASSERT(anim != nullptr);
QObject::disconnect(anim, SIGNAL(finished()), q, SLOT(_q_animationFinished()));
if (resetAnimationEndValues.contains(anim)) {
qobject_cast<QVariantAnimation*>(anim)->setEndValue(QVariant()); // ### generalize
@@ -1576,7 +1576,7 @@ void QStateMachinePrivate::_q_animationFinished()
}
QAbstractState *state = stateForAnimation.take(anim);
- Q_ASSERT(state != 0);
+ Q_ASSERT(state != nullptr);
#ifndef QT_NO_PROPERTIES
// Set the final property value.
@@ -1638,7 +1638,7 @@ void QStateMachinePrivate::terminateActiveAnimations(QAbstractState *state,
resetAnimationEndValues.remove(anim);
}
QPropertyAssignment assn = propertyForAnimation.take(anim);
- Q_ASSERT(assn.object != 0);
+ Q_ASSERT(assn.object != nullptr);
// If there is no property assignment that sets this property,
// set the property to its target value.
bool found = false;
@@ -1745,7 +1745,7 @@ QAbstractTransition *QStateMachinePrivate::createInitialTransition() const
};
QState *root = rootState();
- Q_ASSERT(root != 0);
+ Q_ASSERT(root != nullptr);
QList<QAbstractState *> targets;
switch (root->childMode()) {
case QState::ExclusiveStates:
@@ -1891,26 +1891,26 @@ void QStateMachinePrivate::_q_process()
enabledTransitions = selectTransitions(e, &calculationCache);
if (enabledTransitions.isEmpty()) {
delete e;
- e = 0;
+ e = nullptr;
}
- while (enabledTransitions.isEmpty() && ((e = dequeueInternalEvent()) != 0)) {
+ while (enabledTransitions.isEmpty() && ((e = dequeueInternalEvent()) != nullptr)) {
#ifdef QSTATEMACHINE_DEBUG
qDebug() << q << ": dequeued internal event" << e << "of type" << e->type();
#endif
enabledTransitions = selectTransitions(e, &calculationCache);
if (enabledTransitions.isEmpty()) {
delete e;
- e = 0;
+ e = nullptr;
}
}
- while (enabledTransitions.isEmpty() && ((e = dequeueExternalEvent()) != 0)) {
+ while (enabledTransitions.isEmpty() && ((e = dequeueExternalEvent()) != nullptr)) {
#ifdef QSTATEMACHINE_DEBUG
qDebug() << q << ": dequeued external event" << e << "of type" << e->type();
#endif
enabledTransitions = selectTransitions(e, &calculationCache);
if (enabledTransitions.isEmpty()) {
delete e;
- e = 0;
+ e = nullptr;
}
}
if (enabledTransitions.isEmpty()) {
@@ -2009,7 +2009,7 @@ QEvent *QStateMachinePrivate::dequeueInternalEvent()
{
QMutexLocker locker(&internalEventMutex);
if (internalEventQueue.isEmpty())
- return 0;
+ return nullptr;
return internalEventQueue.takeFirst();
}
@@ -2017,7 +2017,7 @@ QEvent *QStateMachinePrivate::dequeueExternalEvent()
{
QMutexLocker locker(&externalEventMutex);
if (externalEventQueue.isEmpty())
- return 0;
+ return nullptr;
return externalEventQueue.takeFirst();
}
@@ -2175,15 +2175,15 @@ void QStateMachinePrivate::goToState(QAbstractState *targetState)
return;
Q_ASSERT(state == Running);
- QState *sourceState = 0;
+ QState *sourceState = nullptr;
QSet<QAbstractState*>::const_iterator it;
for (it = configuration.constBegin(); it != configuration.constEnd(); ++it) {
sourceState = toStandardState(*it);
- if (sourceState != 0)
+ if (sourceState != nullptr)
break;
}
- Q_ASSERT(sourceState != 0);
+ Q_ASSERT(sourceState != nullptr);
// Reuse previous GoToStateTransition in case of several calls to
// goToState() in a row.
GoToStateTransition *trans = sourceState->findChild<GoToStateTransition*>();
@@ -2327,7 +2327,7 @@ void QStateMachinePrivate::unregisterSignalTransition(QSignalTransition *transit
Q_ASSERT(connectedSignalIndexes.size() > signalIndex);
Q_ASSERT(connectedSignalIndexes.at(signalIndex) != 0);
if (--connectedSignalIndexes[signalIndex] == 0) {
- Q_ASSERT(signalEventGenerator != 0);
+ Q_ASSERT(signalEventGenerator != nullptr);
static const int generatorMethodOffset = QSignalEventGenerator::staticMetaObject.methodOffset();
QMetaObject::disconnect(sender, signalIndex, signalEventGenerator, generatorMethodOffset);
int sum = 0;
@@ -2454,7 +2454,7 @@ void QStateMachinePrivate::handleTransitionSignal(QObject *sender, int signalInd
Constructs a new state machine with the given \a parent.
*/
QStateMachine::QStateMachine(QObject *parent)
- : QState(*new QStateMachinePrivate, /*parentState=*/0)
+ : QState(*new QStateMachinePrivate, /*parentState=*/nullptr)
{
// Can't pass the parent to the QState constructor, as it expects a QState
// But this works as expected regardless of whether parent is a QState or not
@@ -2472,7 +2472,7 @@ QStateMachine::QStateMachine(QObject *parent)
state machine is invalid, and might work incorrectly.
*/
QStateMachine::QStateMachine(QState::ChildMode childMode, QObject *parent)
- : QState(*new QStateMachinePrivate, /*parentState=*/0)
+ : QState(*new QStateMachinePrivate, /*parentState=*/nullptr)
{
Q_D(QStateMachine);
d->childMode = childMode;
@@ -2495,7 +2495,7 @@ QStateMachine::QStateMachine(QState::ChildMode childMode, QObject *parent)
\internal
*/
QStateMachine::QStateMachine(QStateMachinePrivate &dd, QObject *parent)
- : QState(dd, /*parentState=*/0)
+ : QState(dd, /*parentState=*/nullptr)
{
setParent(parent);
}
@@ -2637,7 +2637,7 @@ void QStateMachine::removeState(QAbstractState *state)
state, QAbstractStatePrivate::get(state)->machine(), this);
return;
}
- state->setParent(0);
+ state->setParent(nullptr);
}
bool QStateMachine::isRunning() const
@@ -2661,7 +2661,7 @@ void QStateMachine::start()
{
Q_D(QStateMachine);
- if ((childMode() == QState::ExclusiveStates) && (initialState() == 0)) {
+ if ((childMode() == QState::ExclusiveStates) && (initialState() == nullptr)) {
qWarning("QStateMachine::start: No initial state set for machine. Refusing to start.");
return;
}
@@ -2897,7 +2897,7 @@ bool QStateMachine::event(QEvent *e)
d->delayedEventsMutex.lock();
int id = d->timerIdToDelayedEventId.take(tid);
QStateMachinePrivate::DelayedEvent ee = d->delayedEvents.take(id);
- if (ee.event != 0) {
+ if (ee.event != nullptr) {
Q_ASSERT(ee.timerId == tid);
killTimer(tid);
d->delayedEventIdFreeList.release(id);
@@ -3103,7 +3103,7 @@ void QSignalEventGenerator::qt_static_metacall(QObject *_o, QMetaObject::Call _c
const QMetaObject QSignalEventGenerator::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_QSignalEventGenerator.data,
- qt_meta_data_QSignalEventGenerator, qt_static_metacall, 0, 0 }
+ qt_meta_data_QSignalEventGenerator, qt_static_metacall, nullptr, nullptr }
};
const QMetaObject *QSignalEventGenerator::metaObject() const
@@ -3113,7 +3113,7 @@ const QMetaObject *QSignalEventGenerator::metaObject() const
void *QSignalEventGenerator::qt_metacast(const char *_clname)
{
- if (!_clname) return 0;
+ if (!_clname) return nullptr;
if (!strcmp(_clname, qt_meta_stringdata_QSignalEventGenerator.stringdata))
return static_cast<void*>(const_cast< QSignalEventGenerator*>(this));
return QObject::qt_metacast(_clname);
diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp
index e89caabdb0..27e0d56225 100644
--- a/src/corelib/text/qbytearray.cpp
+++ b/src/corelib/text/qbytearray.cpp
@@ -2,6 +2,7 @@
**
** Copyright (C) 2019 The Qt Company Ltd.
** Copyright (C) 2016 Intel Corporation.
+** Copyright (C) 2019 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -41,6 +42,7 @@
#include "qbytearray.h"
#include "qbytearraymatcher.h"
#include "private/qtools_p.h"
+#include "qhashfunctions.h"
#include "qstring.h"
#include "qlist.h"
#include "qlocale.h"
@@ -1002,10 +1004,20 @@ QByteArray qUncompress(const uchar* data, int nbytes)
four.
\value OmitTrailingEquals Omits adding the padding equal signs at the end of the encoded
data.
-
- QByteArray::fromBase64() ignores the KeepTrailingEquals and
- OmitTrailingEquals options and will not flag errors in case they are
- missing or if there are too many of them.
+ \value IgnoreBase64DecodingErrors When decoding Base64-encoded data, ignores errors
+ in the input; invalid characters are simply skipped.
+ This enum value has been added in Qt 5.15.
+ \value AbortOnBase64DecodingErrors When decoding Base64-encoded data, stops at the first
+ decoding error.
+ This enum value has been added in Qt 5.15.
+
+ QByteArray::fromBase64Encoding() and QByteArray::fromBase64()
+ ignore the KeepTrailingEquals and OmitTrailingEquals options. If
+ the IgnoreBase64DecodingErrors option is specified, they will not
+ flag errors in case trailing equal signs are missing or if there
+ are too many of them. If instead the AbortOnBase64DecodingErrors is
+ specified, then the input must either have no padding or have the
+ correct amount of equal signs.
*/
/*! \fn QByteArray::iterator QByteArray::begin()
@@ -1775,12 +1787,7 @@ void QByteArray::resize(int size)
return;
}
- if (size == 0 && !d->capacityReserved) {
- Data *x = Data::allocate(0);
- if (!d->ref.deref())
- Data::deallocate(d);
- d = x;
- } else if (d->size == 0 && d->ref.isStatic()) {
+ if (d->size == 0 && d->ref.isStatic()) {
//
// Optimize the idiom:
// QByteArray a;
@@ -1795,9 +1802,7 @@ void QByteArray::resize(int size)
x->data()[size] = '\0';
d = x;
} else {
- if (d->ref.isShared() || uint(size) + 1u > d->alloc
- || (!d->capacityReserved && size < d->size
- && uint(size) + 1u < uint(d->alloc >> 1)))
+ if (d->ref.isShared() || uint(size) + 1u > d->alloc)
reallocData(uint(size) + 1u, d->detachFlags() | Data::Grow);
if (d->alloc) {
d->size = size;
@@ -4520,7 +4525,140 @@ QByteArray &QByteArray::setRawData(const char *data, uint size)
return *this;
}
+namespace {
+struct fromBase64_helper_result {
+ qsizetype decodedLength;
+ QByteArray::Base64DecodingStatus status;
+};
+
+fromBase64_helper_result fromBase64_helper(const char *input, qsizetype inputSize,
+ char *output /* may alias input */,
+ QByteArray::Base64Options options)
+{
+ fromBase64_helper_result result{ 0, QByteArray::Base64DecodingStatus::Ok };
+
+ unsigned int buf = 0;
+ int nbits = 0;
+
+ qsizetype offset = 0;
+ for (qsizetype i = 0; i < inputSize; ++i) {
+ int ch = input[i];
+ int d;
+
+ if (ch >= 'A' && ch <= 'Z') {
+ d = ch - 'A';
+ } else if (ch >= 'a' && ch <= 'z') {
+ d = ch - 'a' + 26;
+ } else if (ch >= '0' && ch <= '9') {
+ d = ch - '0' + 52;
+ } else if (ch == '+' && (options & QByteArray::Base64UrlEncoding) == 0) {
+ d = 62;
+ } else if (ch == '-' && (options & QByteArray::Base64UrlEncoding) != 0) {
+ d = 62;
+ } else if (ch == '/' && (options & QByteArray::Base64UrlEncoding) == 0) {
+ d = 63;
+ } else if (ch == '_' && (options & QByteArray::Base64UrlEncoding) != 0) {
+ d = 63;
+ } else {
+ if (options & QByteArray::AbortOnBase64DecodingErrors) {
+ if (ch == '=') {
+ // can have 1 or 2 '=' signs, in both cases padding base64Size to
+ // a multiple of 4. Any other case is illegal.
+ if ((inputSize % 4) != 0) {
+ result.status = QByteArray::Base64DecodingStatus::IllegalInputLength;
+ return result;
+ } else if ((i == inputSize - 1) ||
+ (i == inputSize - 2 && input[++i] == '=')) {
+ d = -1; // ... and exit the loop, normally
+ } else {
+ result.status = QByteArray::Base64DecodingStatus::IllegalPadding;
+ return result;
+ }
+ } else {
+ result.status = QByteArray::Base64DecodingStatus::IllegalCharacter;
+ return result;
+ }
+ } else {
+ d = -1;
+ }
+ }
+
+ if (d != -1) {
+ buf = (buf << 6) | d;
+ nbits += 6;
+ if (nbits >= 8) {
+ nbits -= 8;
+ Q_ASSERT(offset < i);
+ output[offset++] = buf >> nbits;
+ buf &= (1 << nbits) - 1;
+ }
+ }
+ }
+
+ result.decodedLength = offset;
+ return result;
+}
+} // anonymous namespace
+
+/*!
+ \fn QByteArray::FromBase64Result QByteArray::fromBase64Encoding(QByteArray &&base64, Base64Options options)
+ \fn QByteArray::FromBase64Result QByteArray::fromBase64Encoding(const QByteArray &base64, Base64Options options)
+ \since 5.15
+ \overload
+
+ Decodes the Base64 array \a base64, using the options
+ defined by \a options. If \a options contains \c{IgnoreBase64DecodingErrors}
+ (the default), the input is not checked for validity; invalid
+ characters in the input are skipped, enabling the decoding process to
+ continue with subsequent characters. If \a options contains
+ \c{AbortOnBase64DecodingErrors}, then decoding will stop at the first
+ invalid character.
+
+ For example:
+
+ \snippet code/src_corelib_tools_qbytearray.cpp 44ter
+
+ The algorithm used to decode Base64-encoded data is defined in \l{RFC 4648}.
+
+ Returns a QByteArrayFromBase64Result object, containing the decoded
+ data and a flag telling whether decoding was successful. If the
+ \c{AbortOnBase64DecodingErrors} option was passed and the input
+ data was invalid, it is unspecified what the decoded data contains.
+
+ \sa toBase64()
+*/
+QByteArray::FromBase64Result QByteArray::fromBase64Encoding(QByteArray &&base64, Base64Options options)
+{
+ // try to avoid a detach when calling data(), as it would over-allocate
+ // (we need less space when decoding than the one required by the full copy)
+ if (base64.isDetached()) {
+ const auto base64result = fromBase64_helper(base64.data(),
+ base64.size(),
+ base64.data(), // in-place
+ options);
+ base64.truncate(int(base64result.decodedLength));
+ return { std::move(base64), base64result.status };
+ }
+
+ return fromBase64Encoding(base64, options);
+}
+
+
+QByteArray::FromBase64Result QByteArray::fromBase64Encoding(const QByteArray &base64, Base64Options options)
+{
+ const auto base64Size = base64.size();
+ QByteArray result((base64Size * 3) / 4, Qt::Uninitialized);
+ const auto base64result = fromBase64_helper(base64.data(),
+ base64Size,
+ const_cast<char *>(result.constData()),
+ options);
+ result.truncate(int(base64result.decodedLength));
+ return { std::move(result), base64result.status };
+}
+
/*!
+ \overload
+
Returns a decoded copy of the Base64 array \a base64. Input is not checked
for validity; invalid characters in the input are skipped, enabling the
decoding process to continue with subsequent characters.
@@ -4531,21 +4669,28 @@ QByteArray &QByteArray::setRawData(const char *data, uint size)
The algorithm used to decode Base64-encoded data is defined in \l{RFC 4648}.
- \sa toBase64()
+ \note The fromBase64Encoding() function is recommended in new code.
+
+ \sa toBase64(), fromBase64Encoding()
*/
QByteArray QByteArray::fromBase64(const QByteArray &base64)
{
- return fromBase64(base64, Base64Encoding);
+ if (auto result = fromBase64Encoding(base64, Base64Encoding))
+ return std::move(result.decoded);
+ return QByteArray();
}
/*!
\since 5.2
\overload
- Returns a decoded copy of the Base64 array \a base64, using the alphabet
- defined by \a options. Input is not checked for validity; invalid
+ Returns a decoded copy of the Base64 array \a base64, using the options
+ defined by \a options. If \a options contains \c{IgnoreBase64DecodingErrors}
+ (the default), the input is not checked for validity; invalid
characters in the input are skipped, enabling the decoding process to
- continue with subsequent characters.
+ continue with subsequent characters. If \a options contains
+ \c{AbortOnBase64DecodingErrors}, then decoding will stop at the first
+ invalid character.
For example:
@@ -4553,49 +4698,18 @@ QByteArray QByteArray::fromBase64(const QByteArray &base64)
The algorithm used to decode Base64-encoded data is defined in \l{RFC 4648}.
- \sa toBase64()
+ Returns the decoded data, or, if the \c{AbortOnBase64DecodingErrors}
+ option was passed and the input data was invalid, an empty byte array.
+
+ \note The fromBase64Encoding() function is recommended in new code.
+
+ \sa toBase64(), fromBase64Encoding()
*/
QByteArray QByteArray::fromBase64(const QByteArray &base64, Base64Options options)
{
- unsigned int buf = 0;
- int nbits = 0;
- QByteArray tmp((base64.size() * 3) / 4, Qt::Uninitialized);
-
- int offset = 0;
- for (int i = 0; i < base64.size(); ++i) {
- int ch = base64.at(i);
- int d;
-
- if (ch >= 'A' && ch <= 'Z')
- d = ch - 'A';
- else if (ch >= 'a' && ch <= 'z')
- d = ch - 'a' + 26;
- else if (ch >= '0' && ch <= '9')
- d = ch - '0' + 52;
- else if (ch == '+' && (options & Base64UrlEncoding) == 0)
- d = 62;
- else if (ch == '-' && (options & Base64UrlEncoding) != 0)
- d = 62;
- else if (ch == '/' && (options & Base64UrlEncoding) == 0)
- d = 63;
- else if (ch == '_' && (options & Base64UrlEncoding) != 0)
- d = 63;
- else
- d = -1;
-
- if (d != -1) {
- buf = (buf << 6) | d;
- nbits += 6;
- if (nbits >= 8) {
- nbits -= 8;
- tmp[offset++] = buf >> nbits;
- buf &= (1 << nbits) - 1;
- }
- }
- }
-
- tmp.truncate(offset);
- return tmp;
+ if (auto result = fromBase64Encoding(base64, options))
+ return std::move(result.decoded);
+ return QByteArray();
}
/*!
@@ -5015,5 +5129,87 @@ void warn(WarningType w, EmittingClass c)
} // namespace DeprecatedRefClassBehavior
} // namespace QtPrivate
+/*!
+ \class QByteArray::FromBase64Result
+ \inmodule QtCore
+ \ingroup tools
+ \since 5.15
+
+ \brief The QByteArray::FromBase64Result class holds the result of
+ a call to QByteArray::fromBase64Encoding.
+
+ Objects of this class can be used to check whether the conversion
+ was successful, and if so, retrieve the decoded QByteArray. The
+ conversion operators defined for QByteArray::FromBase64Result make
+ its usage straightforward:
+
+ \snippet code/src_corelib_tools_qbytearray.cpp 44ter
+
+ In alternative, it is possible to access the conversion status
+ and the decoded data directly:
+
+ \snippet code/src_corelib_tools_qbytearray.cpp 44quater
+
+ \sa QByteArray::fromBase64
+*/
+
+/*!
+ \variable QByteArray::FromBase64Result::decoded
+
+ Contains the decoded byte array.
+*/
+
+/*!
+ \variable QByteArray::FromBase64Result::decodingStatus
+
+ Contains whether the decoding was successful, expressed as a value
+ of type QByteArray::Base64DecodingStatus.
+*/
+
+/*!
+ \fn QByteArray::FromBase64Result::operator bool() const
+
+ Returns whether the decoding was successful. This is equivalent
+ to checking whether the \c{decodingStatus} member is equal to
+ QByteArray::Base64DecodingStatus::Ok.
+*/
+
+/*!
+ \fn QByteArray &QByteArray::FromBase64Result::operator*() const
+
+ Returns the decoded byte array.
+*/
+
+/*!
+ \fn bool operator==(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
+ \relates QByteArray::FromBase64Result
+
+ Returns \c true if \a lhs and \a rhs are equal, otherwise returns \c false.
+
+ \a lhs and \a rhs are equal if and only if they contain the same decoding
+ status and, if the status is QByteArray::Base64DecodingStatus::Ok, if and
+ only if they contain the same decoded data.
+*/
+
+/*!
+ \fn bool operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
+ \relates QByteArray::FromBase64Result
+
+ Returns \c true if \a lhs and \a rhs are different, otherwise returns \c false.
+*/
+
+/*!
+ \relates QByteArray::FromBase64Result
+
+ Returns the hash value for \a key, using
+ \a seed to seed the calculation.
+*/
+uint qHash(const QByteArray::FromBase64Result &key, uint seed) noexcept
+{
+ QtPrivate::QHashCombine hash;
+ seed = hash(seed, key.decoded);
+ seed = hash(seed, static_cast<int>(key.decodingStatus));
+ return seed;
+}
QT_END_NAMESPACE
diff --git a/src/corelib/text/qbytearray.h b/src/corelib/text/qbytearray.h
index 5d8ccbfb1a..36cf580cd9 100644
--- a/src/corelib/text/qbytearray.h
+++ b/src/corelib/text/qbytearray.h
@@ -164,10 +164,20 @@ public:
Base64UrlEncoding = 1,
KeepTrailingEquals = 0,
- OmitTrailingEquals = 2
+ OmitTrailingEquals = 2,
+
+ IgnoreBase64DecodingErrors = 0,
+ AbortOnBase64DecodingErrors = 4,
};
Q_DECLARE_FLAGS(Base64Options, Base64Option)
+ enum class Base64DecodingStatus {
+ Ok,
+ IllegalInputLength,
+ IllegalCharacter,
+ IllegalPadding,
+ };
+
inline QByteArray() noexcept;
QByteArray(const char *, int size = -1);
QByteArray(int size, char c);
@@ -379,6 +389,10 @@ public:
Q_REQUIRED_RESULT static QByteArray number(qulonglong, int base = 10);
Q_REQUIRED_RESULT static QByteArray number(double, char f = 'g', int prec = 6);
Q_REQUIRED_RESULT static QByteArray fromRawData(const char *, int size);
+
+ class FromBase64Result;
+ Q_REQUIRED_RESULT static FromBase64Result fromBase64Encoding(QByteArray &&base64, Base64Options options = Base64Encoding);
+ Q_REQUIRED_RESULT static FromBase64Result fromBase64Encoding(const QByteArray &base64, Base64Options options = Base64Encoding);
Q_REQUIRED_RESULT static QByteArray fromBase64(const QByteArray &base64, Base64Options options);
Q_REQUIRED_RESULT static QByteArray fromBase64(const QByteArray &base64); // ### Qt6 merge with previous
Q_REQUIRED_RESULT static QByteArray fromHex(const QByteArray &hexEncoded);
@@ -749,6 +763,50 @@ inline QByteArray qUncompress(const QByteArray& data)
Q_DECLARE_SHARED(QByteArray)
+class QByteArray::FromBase64Result
+{
+public:
+ QByteArray decoded;
+ QByteArray::Base64DecodingStatus decodingStatus;
+
+ void swap(QByteArray::FromBase64Result &other) noexcept
+ {
+ qSwap(decoded, other.decoded);
+ qSwap(decodingStatus, other.decodingStatus);
+ }
+
+ explicit operator bool() const noexcept { return decodingStatus == QByteArray::Base64DecodingStatus::Ok; }
+
+#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(Q_QDOC)
+ QByteArray &operator*() & noexcept { return decoded; }
+ const QByteArray &operator*() const & noexcept { return decoded; }
+ QByteArray &&operator*() && noexcept { return std::move(decoded); }
+#else
+ QByteArray &operator*() noexcept { return decoded; }
+ const QByteArray &operator*() const noexcept { return decoded; }
+#endif
+};
+
+Q_DECLARE_SHARED(QByteArray::FromBase64Result)
+
+inline bool operator==(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
+{
+ if (lhs.decodingStatus != rhs.decodingStatus)
+ return false;
+
+ if (lhs.decodingStatus == QByteArray::Base64DecodingStatus::Ok && lhs.decoded != rhs.decoded)
+ return false;
+
+ return true;
+}
+
+inline bool operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
+{
+ return !operator==(lhs, rhs);
+}
+
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QByteArray::FromBase64Result &key, uint seed = 0) noexcept;
+
QT_END_NAMESPACE
#endif // QBYTEARRAY_H
diff --git a/src/corelib/text/qchar.cpp b/src/corelib/text/qchar.cpp
index 1f9f51a53a..61b61125b1 100644
--- a/src/corelib/text/qchar.cpp
+++ b/src/corelib/text/qchar.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -189,6 +189,9 @@ QT_BEGIN_NAMESPACE
\value Unicode_8_0 Version 8.0 Since Qt 5.6
\value Unicode_9_0 Version 9.0 Since Qt 5.11
\value Unicode_10_0 Version 10.0 Since Qt 5.11
+ \value Unicode_11_0 Version 11.0 Since Qt 5.15
+ \value Unicode_12_0 Version 12.0 Since Qt 5.15
+ \value Unicode_12_1 Version 12.1 Since Qt 5.15
\value Unicode_Unassigned The value is not assigned to any character
in version 8.0 of Unicode.
@@ -288,145 +291,156 @@ QT_BEGIN_NAMESPACE
\value Script_Common For characters that may be used with multiple scripts
and that do not inherit their script from the preceding characters.
- \value Script_Latin
- \value Script_Greek
- \value Script_Cyrillic
- \value Script_Armenian
- \value Script_Hebrew
+ \value Script_Adlam Since Qt 5.11
+ \value Script_Ahom Since Qt 5.6
+ \value Script_AnatolianHieroglyphs Since Qt 5.6
\value Script_Arabic
- \value Script_Syriac
- \value Script_Thaana
- \value Script_Devanagari
+ \value Script_Armenian
+ \value Script_Avestan
+ \value Script_Balinese
+ \value Script_Bamum
+ \value Script_BassaVah Since Qt 5.5
+ \value Script_Batak
\value Script_Bengali
- \value Script_Gurmukhi
- \value Script_Gujarati
- \value Script_Oriya
- \value Script_Tamil
- \value Script_Telugu
- \value Script_Kannada
- \value Script_Malayalam
- \value Script_Sinhala
- \value Script_Thai
- \value Script_Lao
- \value Script_Tibetan
- \value Script_Myanmar
- \value Script_Georgian
- \value Script_Hangul
- \value Script_Ethiopic
- \value Script_Cherokee
- \value Script_CanadianAboriginal
- \value Script_Ogham
- \value Script_Runic
- \value Script_Khmer
- \value Script_Mongolian
- \value Script_Hiragana
- \value Script_Katakana
+ \value Script_Bhaiksuki Since Qt 5.11
\value Script_Bopomofo
- \value Script_Han
- \value Script_Yi
- \value Script_OldItalic
- \value Script_Gothic
- \value Script_Deseret
- \value Script_Tagalog
- \value Script_Hanunoo
- \value Script_Buhid
- \value Script_Tagbanwa
- \value Script_Coptic
- \value Script_Limbu
- \value Script_TaiLe
- \value Script_LinearB
- \value Script_Ugaritic
- \value Script_Shavian
- \value Script_Osmanya
- \value Script_Cypriot
+ \value Script_Brahmi
\value Script_Braille
\value Script_Buginese
- \value Script_NewTaiLue
- \value Script_Glagolitic
- \value Script_Tifinagh
- \value Script_SylotiNagri
- \value Script_OldPersian
- \value Script_Kharoshthi
- \value Script_Balinese
- \value Script_Cuneiform
- \value Script_Phoenician
- \value Script_PhagsPa
- \value Script_Nko
- \value Script_Sundanese
- \value Script_Lepcha
- \value Script_OlChiki
- \value Script_Vai
- \value Script_Saurashtra
- \value Script_KayahLi
- \value Script_Rejang
- \value Script_Lycian
+ \value Script_Buhid
+ \value Script_CanadianAboriginal
\value Script_Carian
- \value Script_Lydian
+ \value Script_CaucasianAlbanian Since Qt 5.5
+ \value Script_Chakma
\value Script_Cham
- \value Script_TaiTham
- \value Script_TaiViet
- \value Script_Avestan
+ \value Script_Cherokee
+ \value Script_Coptic
+ \value Script_Cuneiform
+ \value Script_Cypriot
+ \value Script_Cyrillic
+ \value Script_Deseret
+ \value Script_Devanagari
+ \value Script_Dogra Since Qt 5.15
+ \value Script_Duployan Since Qt 5.5
\value Script_EgyptianHieroglyphs
- \value Script_Samaritan
- \value Script_Lisu
- \value Script_Bamum
- \value Script_Javanese
- \value Script_MeeteiMayek
+ \value Script_Elbasan Since Qt 5.5
+ \value Script_Elymaic Since Qt 5.15
+ \value Script_Ethiopic
+ \value Script_Georgian
+ \value Script_Glagolitic
+ \value Script_Gothic
+ \value Script_Grantha Since Qt 5.5
+ \value Script_Greek
+ \value Script_Gujarati
+ \value Script_GunjalaGondi Since Qt 5.15
+ \value Script_Gurmukhi
+ \value Script_Han
+ \value Script_Hangul
+ \value Script_HanifiRohingya Since Qt 5.15
+ \value Script_Hanunoo
+ \value Script_Hatran Since Qt 5.6
+ \value Script_Hebrew
+ \value Script_Hiragana
\value Script_ImperialAramaic
- \value Script_OldSouthArabian
- \value Script_InscriptionalParthian
\value Script_InscriptionalPahlavi
- \value Script_OldTurkic
+ \value Script_InscriptionalParthian
+ \value Script_Javanese
\value Script_Kaithi
- \value Script_Batak
- \value Script_Brahmi
+ \value Script_Kannada
+ \value Script_Katakana
+ \value Script_KayahLi
+ \value Script_Kharoshthi
+ \value Script_Khmer
+ \value Script_Khojki Since Qt 5.5
+ \value Script_Khudawadi Since Qt 5.5
+ \value Script_Lao
+ \value Script_Latin
+ \value Script_Lepcha
+ \value Script_Limbu
+ \value Script_LinearA Since Qt 5.5
+ \value Script_LinearB
+ \value Script_Lisu
+ \value Script_Lycian
+ \value Script_Lydian
+ \value Script_Mahajani Since Qt 5.5
+ \value Script_Makasar Since Qt 5.15
+ \value Script_Malayalam
\value Script_Mandaic
- \value Script_Chakma
+ \value Script_Manichaean Since Qt 5.5
+ \value Script_Marchen Since Qt 5.11
+ \value Script_MasaramGondi Since Qt 5.11
+ \value Script_Medefaidrin Since Qt 5.15
+ \value Script_MeeteiMayek
+ \value Script_MendeKikakui Since Qt 5.5
\value Script_MeroiticCursive
\value Script_MeroiticHieroglyphs
\value Script_Miao
+ \value Script_Modi Since Qt 5.5
+ \value Script_Mongolian
+ \value Script_Mro Since Qt 5.5
+ \value Script_Multani Since Qt 5.6
+ \value Script_Myanmar
+ \value Script_Nabataean Since Qt 5.5
+ \value Script_Nandinagari Since Qt 5.15
+ \value Script_Newa Since Qt 5.11
+ \value Script_NewTaiLue
+ \value Script_Nko
+ \value Script_Nushu Since Qt 5.11
+ \value Script_NyiakengPuachueHmong Since Qt 5.15
+ \value Script_Ogham
+ \value Script_OlChiki
+ \value Script_OldHungarian Since Qt 5.6
+ \value Script_OldItalic
+ \value Script_OldNorthArabian Since Qt 5.5
+ \value Script_OldPermic Since Qt 5.5
+ \value Script_OldPersian
+ \value Script_OldSogdian Since Qt 5.15
+ \value Script_OldSouthArabian
+ \value Script_OldTurkic
+ \value Script_Oriya
+ \value Script_Osage Since Qt 5.11
+ \value Script_Osmanya
+ \value Script_PahawhHmong Since Qt 5.5
+ \value Script_Palmyrene Since Qt 5.5
+ \value Script_PauCinHau Since Qt 5.5
+ \value Script_PhagsPa
+ \value Script_Phoenician
+ \value Script_PsalterPahlavi Since Qt 5.5
+ \value Script_Rejang
+ \value Script_Runic
+ \value Script_Samaritan
+ \value Script_Saurashtra
\value Script_Sharada
+ \value Script_Shavian
+ \value Script_Siddham Since Qt 5.5
+ \value Script_SignWriting Since Qt 5.6
+ \value Script_Sinhala
+ \value Script_Sogdian Since Qt 5.15
\value Script_SoraSompeng
+ \value Script_Soyombo Since Qt 5.11
+ \value Script_Sundanese
+ \value Script_SylotiNagri
+ \value Script_Syriac
+ \value Script_Tagalog
+ \value Script_Tagbanwa
+ \value Script_TaiLe
+ \value Script_TaiTham
+ \value Script_TaiViet
\value Script_Takri
- \value Script_CaucasianAlbanian
- \value Script_BassaVah
- \value Script_Duployan
- \value Script_Elbasan
- \value Script_Grantha
- \value Script_PahawhHmong
- \value Script_Khojki
- \value Script_LinearA
- \value Script_Mahajani
- \value Script_Manichaean
- \value Script_MendeKikakui
- \value Script_Modi
- \value Script_Mro
- \value Script_OldNorthArabian
- \value Script_Nabataean
- \value Script_Palmyrene
- \value Script_PauCinHau
- \value Script_OldPermic
- \value Script_PsalterPahlavi
- \value Script_Siddham
- \value Script_Khudawadi
- \value Script_Tirhuta
- \value Script_WarangCiti
- \value Script_Ahom This value was introduced in Qt 5.6.
- \value Script_AnatolianHieroglyphs This value was introduced in Qt 5.6.
- \value Script_Hatran This value was introduced in Qt 5.6.
- \value Script_Multani This value was introduced in Qt 5.6.
- \value Script_OldHungarian This value was introduced in Qt 5.6.
- \value Script_SignWriting This value was introduced in Qt 5.6.
- \value Script_Adlam This value was introduced in Qt 5.11.
- \value Script_Bhaiksuki This value was introduced in Qt 5.11.
- \value Script_Marchen This value was introduced in Qt 5.11.
- \value Script_Newa This value was introduced in Qt 5.11.
- \value Script_Osage This value was introduced in Qt 5.11.
- \value Script_Tangut This value was introduced in Qt 5.11.
- \value Script_MasaramGondi This value was introduced in Qt 5.11.
- \value Script_Nushu This value was introduced in Qt 5.11.
- \value Script_Soyombo This value was introduced in Qt 5.11.
- \value Script_ZanabazarSquare This value was introduced in Qt 5.11.
+ \value Script_Tamil
+ \value Script_Tangut Since Qt 5.11
+ \value Script_Telugu
+ \value Script_Thaana
+ \value Script_Thai
+ \value Script_Tibetan
+ \value Script_Tifinagh
+ \value Script_Tirhuta Since Qt 5.5
+ \value Script_Ugaritic
+ \value Script_Vai
+ \value Script_Wancho Since Qt 5.15
+ \value Script_WarangCiti Since Qt 5.5
+ \value Script_Yi
+ \value Script_ZanabazarSquare Since Qt 5.11
\omitvalue ScriptCount
diff --git a/src/corelib/text/qchar.h b/src/corelib/text/qchar.h
index f67a7ea90a..a3d5d7a65e 100644
--- a/src/corelib/text/qchar.h
+++ b/src/corelib/text/qchar.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -328,6 +328,19 @@ public:
Script_Soyombo,
Script_ZanabazarSquare,
+ // Unicode 12.1 additions
+ Script_Dogra,
+ Script_GunjalaGondi,
+ Script_HanifiRohingya,
+ Script_Makasar,
+ Script_Medefaidrin,
+ Script_OldSogdian,
+ Script_Sogdian,
+ Script_Elymaic,
+ Script_Nandinagari,
+ Script_NyiakengPuachueHmong,
+ Script_Wancho,
+
ScriptCount
};
@@ -421,7 +434,10 @@ public:
Unicode_7_0,
Unicode_8_0,
Unicode_9_0,
- Unicode_10_0
+ Unicode_10_0,
+ Unicode_11_0,
+ Unicode_12_0,
+ Unicode_12_1
};
// ****** WHEN ADDING FUNCTIONS, CONSIDER ADDING TO QCharRef TOO
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp
index 11e788c200..6e33e27276 100644
--- a/src/corelib/text/qlocale.cpp
+++ b/src/corelib/text/qlocale.cpp
@@ -79,7 +79,7 @@
QT_BEGIN_NAMESPACE
#ifndef QT_NO_SYSTEMLOCALE
-static QSystemLocale *_systemLocale = 0;
+static QSystemLocale *_systemLocale = nullptr;
class QSystemLocaleSingleton: public QSystemLocale
{
public:
@@ -699,7 +699,7 @@ QSystemLocale::QSystemLocale(bool)
QSystemLocale::~QSystemLocale()
{
if (_systemLocale == this) {
- _systemLocale = 0;
+ _systemLocale = nullptr;
globalLocaleData.m_language_id = 0;
}
@@ -2053,6 +2053,9 @@ QString QLocale::toString(const QDate &date, QStringView format) const
/*!
Returns a localized string representation of the given \a date according
to the specified \a format.
+
+ \note Some locales may use formats that limit the range of years they can
+ represent.
*/
QString QLocale::toString(const QDate &date, FormatType format) const
@@ -2207,6 +2210,9 @@ QString QLocale::toString(const QDateTime &dateTime, QStringView format, QCalend
Returns a localized string representation of the given \a dateTime according
to the specified \a format.
+
+ \note Some locales may use formats that limit the range of years they can
+ represent.
*/
QString QLocale::toString(const QDateTime &dateTime, FormatType format) const
@@ -2375,14 +2381,19 @@ QTime QLocale::toTime(const QString &string, FormatType format) const
return toTime(string, timeFormat(format));
}
+#if QT_DEPRECATED_SINCE(5, 15)
/*!
\since 5.14
\overload
+ \deprecated
*/
QTime QLocale::toTime(const QString &string, FormatType format, QCalendar cal) const
{
+QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
return toTime(string, timeFormat(format), cal);
+QT_WARNING_POP
}
+#endif
/*!
\since 4.4
@@ -2447,21 +2458,33 @@ QDateTime QLocale::toDateTime(const QString &string, FormatType format, QCalenda
*/
QTime QLocale::toTime(const QString &string, const QString &format) const
{
- return toTime(string, format, QCalendar());
+ QTime time;
+#if QT_CONFIG(datetimeparser)
+ QDateTimeParser dt(QMetaType::QTime, QDateTimeParser::FromString, QCalendar());
+ dt.setDefaultLocale(*this);
+ if (dt.parseFormat(format))
+ dt.fromString(string, nullptr, &time);
+#else
+ Q_UNUSED(string);
+ Q_UNUSED(format);
+#endif
+ return time;
}
+#if QT_DEPRECATED_SINCE(5, 15)
/*!
\since 5.14
\overload
+ \deprecated
*/
QTime QLocale::toTime(const QString &string, const QString &format, QCalendar cal) const
{
QTime time;
#if QT_CONFIG(datetimeparser)
- QDateTimeParser dt(QVariant::Time, QDateTimeParser::FromString, cal);
+ QDateTimeParser dt(QMetaType::QTime, QDateTimeParser::FromString, cal);
dt.setDefaultLocale(*this);
if (dt.parseFormat(format))
- dt.fromString(string, 0, &time);
+ dt.fromString(string, nullptr, &time);
#else
Q_UNUSED(cal);
Q_UNUSED(string);
@@ -2469,6 +2492,7 @@ QTime QLocale::toTime(const QString &string, const QString &format, QCalendar ca
#endif
return time;
}
+#endif
/*!
\since 4.4
@@ -2497,10 +2521,10 @@ QDate QLocale::toDate(const QString &string, const QString &format, QCalendar ca
{
QDate date;
#if QT_CONFIG(datetimeparser)
- QDateTimeParser dt(QVariant::Date, QDateTimeParser::FromString, cal);
+ QDateTimeParser dt(QMetaType::QDate, QDateTimeParser::FromString, cal);
dt.setDefaultLocale(*this);
if (dt.parseFormat(format))
- dt.fromString(string, &date, 0);
+ dt.fromString(string, &date, nullptr);
#else
Q_UNUSED(string);
Q_UNUSED(format);
@@ -2538,7 +2562,7 @@ QDateTime QLocale::toDateTime(const QString &string, const QString &format, QCal
QTime time;
QDate date;
- QDateTimeParser dt(QVariant::DateTime, QDateTimeParser::FromString, cal);
+ QDateTimeParser dt(QMetaType::QDateTime, QDateTimeParser::FromString, cal);
dt.setDefaultLocale(*this);
if (dt.parseFormat(format) && dt.fromString(string, &date, &time))
return QDateTime(date, time);
@@ -3140,7 +3164,7 @@ QList<Qt::DayOfWeek> QLocale::weekdays() const
if (d->m_data == systemData()) {
QVariant res = systemLocale()->query(QSystemLocale::Weekdays, QVariant());
if (!res.isNull())
- return static_cast<QList<Qt::DayOfWeek> >(res.value<QList<Qt::DayOfWeek> >());
+ return static_cast<QList<Qt::DayOfWeek> >(qvariant_cast<QList<Qt::DayOfWeek> >(res));
}
#endif
QList<Qt::DayOfWeek> weekdays;
diff --git a/src/corelib/text/qlocale.h b/src/corelib/text/qlocale.h
index 513e0f097b..0dc9e1bd00 100644
--- a/src/corelib/text/qlocale.h
+++ b/src/corelib/text/qlocale.h
@@ -1037,11 +1037,15 @@ public:
QDateTime toDateTime(const QString &string, const QString &format) const;
// Calendar-aware API
QDate toDate(const QString &string, FormatType format, QCalendar cal) const;
- QTime toTime(const QString &string, FormatType format, QCalendar cal) const;
QDateTime toDateTime(const QString &string, FormatType format, QCalendar cal) const;
QDate toDate(const QString &string, const QString &format, QCalendar cal) const;
- QTime toTime(const QString &string, const QString &format, QCalendar cal) const;
QDateTime toDateTime(const QString &string, const QString &format, QCalendar cal) const;
+# if QT_DEPRECATED_SINCE(5, 15)
+ QT_DEPRECATED_X("Calendar is ignored when parsing times")
+ QTime toTime(const QString &string, FormatType format, QCalendar cal) const;
+ QT_DEPRECATED_X("Calendar is ignored when parsing times")
+ QTime toTime(const QString &string, const QString &format, QCalendar cal) const;
+# endif // 5.15
#endif
// ### Qt 6: We need to return QString from these function since
diff --git a/src/corelib/text/qlocale_tools.cpp b/src/corelib/text/qlocale_tools.cpp
index c246028b4d..0da769d694 100644
--- a/src/corelib/text/qlocale_tools.cpp
+++ b/src/corelib/text/qlocale_tools.cpp
@@ -322,7 +322,7 @@ double qt_asciiToDouble(const char *num, int numLen, bool &ok, int &processed,
conv_flags = double_conversion::StringToDoubleConverter::ALLOW_LEADING_SPACES
| double_conversion::StringToDoubleConverter::ALLOW_TRAILING_SPACES;
}
- double_conversion::StringToDoubleConverter conv(conv_flags, 0.0, qt_qnan(), 0, 0);
+ double_conversion::StringToDoubleConverter conv(conv_flags, 0.0, qt_qnan(), nullptr, nullptr);
d = conv.StringToDouble(num, numLen, &processed);
if (!qIsFinite(d)) {
diff --git a/src/corelib/text/qlocale_tools_p.h b/src/corelib/text/qlocale_tools_p.h
index 594331ae37..e2142bf545 100644
--- a/src/corelib/text/qlocale_tools_p.h
+++ b/src/corelib/text/qlocale_tools_p.h
@@ -54,22 +54,6 @@
#include "qlocale_p.h"
#include "qstring.h"
-#if !defined(QT_QLOCALE_NEEDS_VOLATILE)
-# if defined(Q_CC_GNU)
-# if __GNUC__ == 4
-# define QT_QLOCALE_NEEDS_VOLATILE
-# elif defined(Q_OS_WIN)
-# define QT_QLOCALE_NEEDS_VOLATILE
-# endif
-# endif
-#endif
-
-#if defined(QT_QLOCALE_NEEDS_VOLATILE)
-# define NEEDS_VOLATILE volatile
-#else
-# define NEEDS_VOLATILE
-#endif
-
QT_BEGIN_NAMESPACE
enum StrayCharacterMode {
diff --git a/src/corelib/text/qlocale_unix.cpp b/src/corelib/text/qlocale_unix.cpp
index ff4274d932..207331b8ac 100644
--- a/src/corelib/text/qlocale_unix.cpp
+++ b/src/corelib/text/qlocale_unix.cpp
@@ -234,16 +234,16 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
case CurrencySymbol:
return lc_monetary.currencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
case CurrencyToString: {
- switch (in.type()) {
- case QVariant::Int:
+ switch (in.userType()) {
+ case QMetaType::Int:
return lc_monetary.toCurrencyString(in.toInt());
- case QVariant::UInt:
+ case QMetaType::UInt:
return lc_monetary.toCurrencyString(in.toUInt());
- case QVariant::Double:
+ case QMetaType::Double:
return lc_monetary.toCurrencyString(in.toDouble());
- case QVariant::LongLong:
+ case QMetaType::LongLong:
return lc_monetary.toCurrencyString(in.toLongLong());
- case QVariant::ULongLong:
+ case QMetaType::ULongLong:
return lc_monetary.toCurrencyString(in.toULongLong());
default:
break;
@@ -283,9 +283,9 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const
return d->uiLanguages.isEmpty() ? QVariant() : QVariant(d->uiLanguages);
}
case StringToStandardQuotation:
- return lc_messages.quoteString(in.value<QStringRef>());
+ return lc_messages.quoteString(qvariant_cast<QStringRef>(in));
case StringToAlternateQuotation:
- return lc_messages.quoteString(in.value<QStringRef>(), QLocale::AlternateQuotation);
+ return lc_messages.quoteString(qvariant_cast<QStringRef>(in), QLocale::AlternateQuotation);
case ListToSeparatedString:
return lc_messages.createSeparatedList(in.toStringList());
case LocaleChanged:
diff --git a/src/corelib/text/qregexp.cpp b/src/corelib/text/qregexp.cpp
index ac4d9bbc36..9301a7e573 100644
--- a/src/corelib/text/qregexp.cpp
+++ b/src/corelib/text/qregexp.cpp
@@ -2528,7 +2528,7 @@ void QRegExpEngine::Box::cat(const Box &b)
eng->addCatTransitions(rs, b.ls);
addAnchorsToEngine(b);
if (minl == 0) {
- lanchors.unite(b.lanchors);
+ lanchors.insert(b.lanchors);
if (skipanchors != 0) {
for (int i = 0; i < b.ls.size(); i++) {
int a = eng->anchorConcatenation(lanchors.value(b.ls.at(i), 0), skipanchors);
@@ -2538,7 +2538,7 @@ void QRegExpEngine::Box::cat(const Box &b)
mergeInto(&ls, b.ls);
}
if (b.minl == 0) {
- ranchors.unite(b.ranchors);
+ ranchors.insert(b.ranchors);
if (b.skipanchors != 0) {
for (int i = 0; i < rs.size(); i++) {
int a = eng->anchorConcatenation(ranchors.value(rs.at(i), 0), b.skipanchors);
@@ -2596,9 +2596,9 @@ void QRegExpEngine::Box::cat(const Box &b)
void QRegExpEngine::Box::orx(const Box &b)
{
mergeInto(&ls, b.ls);
- lanchors.unite(b.lanchors);
+ lanchors.insert(b.lanchors);
mergeInto(&rs, b.rs);
- ranchors.unite(b.ranchors);
+ ranchors.insert(b.ranchors);
if (b.minl == 0) {
if (minl == 0)
diff --git a/src/corelib/text/qregularexpression.cpp b/src/corelib/text/qregularexpression.cpp
index 59d21e0a23..d74b759aa9 100644
--- a/src/corelib/text/qregularexpression.cpp
+++ b/src/corelib/text/qregularexpression.cpp
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2016 Giuseppe D'Angelo <dangelog@gmail.com>.
-** Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+** Copyright (C) 2020 Giuseppe D'Angelo <dangelog@gmail.com>.
+** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
@@ -863,7 +863,7 @@ struct QRegularExpressionPrivate : QSharedData
QRegularExpression::MatchType matchType,
QRegularExpression::MatchOptions matchOptions,
CheckSubjectStringOption checkSubjectStringOption = CheckSubjectString,
- const QRegularExpressionMatchPrivate *previous = 0) const;
+ const QRegularExpressionMatchPrivate *previous = nullptr) const;
int captureIndexForName(QStringView name) const;
@@ -944,7 +944,7 @@ QRegularExpression::QRegularExpression(QRegularExpressionPrivate &dd)
*/
QRegularExpressionPrivate::QRegularExpressionPrivate()
: QSharedData(),
- patternOptions(0),
+ patternOptions(),
pattern(),
mutex(),
compiledPattern(nullptr),
@@ -1022,7 +1022,7 @@ void QRegularExpressionPrivate::compilePattern()
options,
&errorCode,
&patternErrorOffset,
- NULL);
+ nullptr);
if (!compiledPattern) {
errorOffset = static_cast<int>(patternErrorOffset);
@@ -1081,7 +1081,7 @@ public:
{
// The default JIT stack size in PCRE is 32K,
// we allocate from 32K up to 512K.
- stack = pcre2_jit_stack_create_16(32 * 1024, 512 * 1024, NULL);
+ stack = pcre2_jit_stack_create_16(32 * 1024, 512 * 1024, nullptr);
}
/*!
\internal
@@ -1105,7 +1105,7 @@ static pcre2_jit_stack_16 *qtPcreCallback(void *)
if (jitStacks()->hasLocalData())
return jitStacks()->localData()->stack;
- return 0;
+ return nullptr;
}
/*!
@@ -1272,9 +1272,9 @@ QRegularExpressionMatchPrivate *QRegularExpressionPrivate::doMatch(const QString
previousMatchWasEmpty = true;
}
- pcre2_match_context_16 *matchContext = pcre2_match_context_create_16(NULL);
- pcre2_jit_stack_assign_16(matchContext, &qtPcreCallback, NULL);
- pcre2_match_data_16 *matchData = pcre2_match_data_create_from_pattern_16(compiledPattern, NULL);
+ pcre2_match_context_16 *matchContext = pcre2_match_context_create_16(nullptr);
+ pcre2_jit_stack_assign_16(matchContext, &qtPcreCallback, nullptr);
+ pcre2_match_data_16 *matchData = pcre2_match_data_create_from_pattern_16(compiledPattern, nullptr);
const unsigned short * const subjectUtf16 = subject.utf16() + subjectStart;
@@ -1829,7 +1829,19 @@ uint qHash(const QRegularExpression &key, uint seed) noexcept
return seed;
}
+#if QT_STRINGVIEW_LEVEL < 2
/*!
+ \overload
+*/
+QString QRegularExpression::escape(const QString &str)
+{
+ return escape(QStringView(str));
+}
+#endif // QT_STRINGVIEW_LEVEL < 2
+
+/*!
+ \since 5.15
+
Escapes all characters of \a str so that they no longer have any special
meaning when used as a regular expression pattern string, and returns
the escaped string. For instance:
@@ -1847,7 +1859,7 @@ uint qHash(const QRegularExpression &key, uint seed) noexcept
inside \a str is escaped with the sequence \c{"\\0"} (backslash +
\c{'0'}), instead of \c{"\\\0"} (backslash + \c{NUL}).
*/
-QString QRegularExpression::escape(const QString &str)
+QString QRegularExpression::escape(QStringView str)
{
QString result;
const int count = str.size();
@@ -1882,8 +1894,19 @@ QString QRegularExpression::escape(const QString &str)
return result;
}
+#if QT_STRINGVIEW_LEVEL < 2
/*!
\since 5.12
+ \overload
+*/
+QString QRegularExpression::wildcardToRegularExpression(const QString &pattern)
+{
+ return wildcardToRegularExpression(QStringView(pattern));
+}
+#endif // QT_STRINGVIEW_LEVEL < 2
+
+/*!
+ \since 5.15
Returns a regular expression representation of the given glob \a pattern.
The transformation is targeting file path globbing, which means in particular
@@ -1932,13 +1955,13 @@ QString QRegularExpression::escape(const QString &str)
\sa escape()
*/
-QString QRegularExpression::wildcardToRegularExpression(const QString &pattern)
+QString QRegularExpression::wildcardToRegularExpression(QStringView pattern)
{
const int wclen = pattern.length();
QString rx;
rx.reserve(wclen + wclen / 16);
int i = 0;
- const QChar *wc = pattern.unicode();
+ const QChar *wc = pattern.data();
#ifdef Q_OS_WIN
const QLatin1Char nativePathSeparator('\\');
@@ -2010,16 +2033,31 @@ QString QRegularExpression::wildcardToRegularExpression(const QString &pattern)
return anchoredPattern(rx);
}
+#if QT_STRINGVIEW_LEVEL < 2
/*!
\fn QRegularExpression::anchoredPattern(const QString &expression)
\since 5.12
+ \overload
+*/
+#endif // QT_STRINGVIEW_LEVEL < 2
+
+/*!
+ \since 5.15
+
Returns the \a expression wrapped between the \c{\A} and \c{\z} anchors to
be used for exact matching.
\sa {Porting from QRegExp's Exact Matching}
*/
+QString QRegularExpression::anchoredPattern(QStringView expression)
+{
+ return QString()
+ + QLatin1String("\\A(?:")
+ + expression
+ + QLatin1String(")\\z");
+}
/*!
\since 5.1
diff --git a/src/corelib/text/qregularexpression.h b/src/corelib/text/qregularexpression.h
index f799a38ae4..4fa258b080 100644
--- a/src/corelib/text/qregularexpression.h
+++ b/src/corelib/text/qregularexpression.h
@@ -1,7 +1,7 @@
/****************************************************************************
**
-** Copyright (C) 2012 Giuseppe D'Angelo <dangelog@gmail.com>.
-** Copyright (C) 2012 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+** Copyright (C) 2020 Giuseppe D'Angelo <dangelog@gmail.com>.
+** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -42,9 +42,8 @@
#define QREGULAREXPRESSION_H
#include <QtCore/qglobal.h>
-
#include <QtCore/qstring.h>
-#include <QtCore/qstringlist.h>
+#include <QtCore/qstringview.h>
#include <QtCore/qshareddata.h>
#include <QtCore/qvariant.h>
@@ -52,7 +51,8 @@ QT_REQUIRE_CONFIG(regularexpression);
QT_BEGIN_NAMESPACE
-class QStringView;
+class QStringList;
+class QLatin1String;
class QRegularExpressionMatch;
class QRegularExpressionMatchIterator;
@@ -137,14 +137,18 @@ public:
void optimize() const;
+#if QT_STRINGVIEW_LEVEL < 2
static QString escape(const QString &str);
static QString wildcardToRegularExpression(const QString &str);
static inline QString anchoredPattern(const QString &expression)
{
- return QLatin1String("\\A(?:")
- + expression
- + QLatin1String(")\\z");
+ return anchoredPattern(QStringView(expression));
}
+#endif
+
+ static QString escape(QStringView str);
+ static QString wildcardToRegularExpression(QStringView str);
+ static QString anchoredPattern(QStringView expression);
bool operator==(const QRegularExpression &re) const;
inline bool operator!=(const QRegularExpression &re) const { return !operator==(re); }
diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp
index fa8b5cf3f8..720c3e98c7 100644
--- a/src/corelib/text/qstring.cpp
+++ b/src/corelib/text/qstring.cpp
@@ -591,6 +591,20 @@ bool QtPrivate::isLatin1(QStringView s) noexcept
return true;
}
+bool QtPrivate::isValidUtf16(QStringView s) noexcept
+{
+ Q_CONSTEXPR uint InvalidCodePoint = UINT_MAX;
+
+ QStringIterator i(s);
+ while (i.hasNext()) {
+ uint c = i.next(InvalidCodePoint);
+ if (c == InvalidCodePoint)
+ return false;
+ }
+
+ return true;
+}
+
// conversion between Latin 1 and UTF-16
void qt_from_latin1(ushort *dst, const char *str, size_t size) noexcept
{
@@ -9054,6 +9068,21 @@ bool QString::isRightToLeft() const
return QtPrivate::isRightToLeft(QStringView(*this));
}
+/*!
+ \fn bool QString::isValidUtf16() const noexcept
+ \since 5.15
+
+ Returns \c true if the string contains valid UTF-16 encoded data,
+ or \c false otherwise.
+
+ Note that this function does not perform any special validation of the
+ data; it merely checks if it can be successfully decoded from UTF-16.
+ The data is assumed to be in host byte order; the presence of a BOM
+ is meaningless.
+
+ \sa QStringView::isValidUtf16()
+*/
+
/*! \fn QChar *QString::data()
Returns a pointer to the data stored in the QString. The pointer
diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h
index 1669d7c94a..1f4e856660 100644
--- a/src/corelib/text/qstring.h
+++ b/src/corelib/text/qstring.h
@@ -919,6 +919,8 @@ public:
bool isSimpleText() const;
bool isRightToLeft() const;
+ Q_REQUIRED_RESULT bool isValidUtf16() const noexcept
+ { return QStringView(*this).isValidUtf16(); }
QString(int size, Qt::Initialization);
Q_DECL_CONSTEXPR inline QString(QStringDataPtr dd) : d(dd.ptr) {}
diff --git a/src/corelib/text/qstringalgorithms.h b/src/corelib/text/qstringalgorithms.h
index d54e376aa9..0b7774b4f3 100644
--- a/src/corelib/text/qstringalgorithms.h
+++ b/src/corelib/text/qstringalgorithms.h
@@ -99,6 +99,7 @@ Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isAscii(QLatin1String
Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isAscii(QStringView s) noexcept;
Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline bool isLatin1(QLatin1String s) noexcept;
Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isLatin1(QStringView s) noexcept;
+Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool isValidUtf16(QStringView s) noexcept;
} // namespace QtPRivate
diff --git a/src/corelib/text/qstringlist.cpp b/src/corelib/text/qstringlist.cpp
index 4bbe424ed2..4b9dcee169 100644
--- a/src/corelib/text/qstringlist.cpp
+++ b/src/corelib/text/qstringlist.cpp
@@ -43,9 +43,9 @@
#if QT_CONFIG(regularexpression)
# include <qregularexpression.h>
#endif
+#include <private/qduplicatetracker_p.h>
#include <algorithm>
-
QT_BEGIN_NAMESPACE
/*! \typedef QStringListIterator
@@ -885,15 +885,13 @@ int QtPrivate::QStringList_removeDuplicates(QStringList *that)
{
int n = that->size();
int j = 0;
- QSet<QString> seen;
+
+ QDuplicateTracker<QString> seen;
seen.reserve(n);
- int setSize = 0;
for (int i = 0; i < n; ++i) {
const QString &s = that->at(i);
- seen.insert(s);
- if (setSize == seen.size()) // unchanged size => was already seen
+ if (seen.hasSeen(s))
continue;
- ++setSize;
if (j != i)
that->swapItemsAt(i, j);
++j;
diff --git a/src/corelib/text/qstringview.cpp b/src/corelib/text/qstringview.cpp
index 75de827583..c4ddb06ea4 100644
--- a/src/corelib/text/qstringview.cpp
+++ b/src/corelib/text/qstringview.cpp
@@ -865,6 +865,21 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \fn bool QStringView::isValidUtf16() const
+ \since 5.15
+
+ Returns \c true if the string contains valid UTF-16 encoded data,
+ or \c false otherwise.
+
+ Note that this function does not perform any special validation of the
+ data; it merely checks if it can be successfully decoded from UTF-16.
+ The data is assumed to be in host byte order; the presence of a BOM
+ is meaningless.
+
+ \sa QString::isValidUtf16()
+*/
+
+/*!
\fn QStringView::toWCharArray(wchar_t *array) const
\since 5.14
diff --git a/src/corelib/text/qstringview.h b/src/corelib/text/qstringview.h
index 4ab4d2570f..06391ffef4 100644
--- a/src/corelib/text/qstringview.h
+++ b/src/corelib/text/qstringview.h
@@ -294,6 +294,8 @@ public:
Q_REQUIRED_RESULT bool isRightToLeft() const noexcept
{ return QtPrivate::isRightToLeft(*this); }
+ Q_REQUIRED_RESULT bool isValidUtf16() const noexcept
+ { return QtPrivate::isValidUtf16(*this); }
Q_REQUIRED_RESULT inline int toWCharArray(wchar_t *array) const; // defined in qstring.h
diff --git a/src/corelib/text/qt_attribution.json b/src/corelib/text/qt_attribution.json
index a488f1341e..c6ac1d1d95 100644
--- a/src/corelib/text/qt_attribution.json
+++ b/src/corelib/text/qt_attribution.json
@@ -11,7 +11,7 @@
define the Unicode character properties and internal mappings.",
"Homepage": "https://www.unicode.org/ucd/",
"Version": "Don't use the Unicode standard version; UCD has its own 'Revision' numbers",
- "Version": "20",
+ "Version": "24",
"License": "Unicode License Agreement - Data Files and Software (2016)",
"LicenseId": "Unicode-DFS-2016",
"LicenseFile": "UNICODE_LICENSE.txt",
diff --git a/src/corelib/text/qtextboundaryfinder.cpp b/src/corelib/text/qtextboundaryfinder.cpp
index 67dd15377b..ebdba6b2c5 100644
--- a/src/corelib/text/qtextboundaryfinder.cpp
+++ b/src/corelib/text/qtextboundaryfinder.cpp
@@ -71,7 +71,7 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int
}
}
- QUnicodeTools::CharAttributeOptions options = 0;
+ QUnicodeTools::CharAttributeOptions options;
switch (type) {
case QTextBoundaryFinder::Grapheme: options |= QUnicodeTools::GraphemeBreaks; break;
case QTextBoundaryFinder::Word: options |= QUnicodeTools::WordBreaks; break;
@@ -161,10 +161,10 @@ static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int
*/
QTextBoundaryFinder::QTextBoundaryFinder()
: t(Grapheme)
- , chars(0)
+ , chars(nullptr)
, length(0)
, freePrivate(true)
- , d(0)
+ , d(nullptr)
{
}
@@ -178,7 +178,7 @@ QTextBoundaryFinder::QTextBoundaryFinder(const QTextBoundaryFinder &other)
, length(other.length)
, pos(other.pos)
, freePrivate(true)
- , d(0)
+ , d(nullptr)
{
if (other.d) {
Q_ASSERT(length > 0);
@@ -199,7 +199,7 @@ QTextBoundaryFinder &QTextBoundaryFinder::operator=(const QTextBoundaryFinder &o
if (other.d) {
Q_ASSERT(other.length > 0);
uint newCapacity = (other.length + 1) * sizeof(QCharAttributes);
- QTextBoundaryFinderPrivate *newD = (QTextBoundaryFinderPrivate *) realloc(freePrivate ? d : 0, newCapacity);
+ QTextBoundaryFinderPrivate *newD = (QTextBoundaryFinderPrivate *) realloc(freePrivate ? d : nullptr, newCapacity);
Q_CHECK_PTR(newD);
freePrivate = true;
d = newD;
@@ -216,7 +216,7 @@ QTextBoundaryFinder &QTextBoundaryFinder::operator=(const QTextBoundaryFinder &o
} else {
if (freePrivate)
free(d);
- d = 0;
+ d = nullptr;
}
return *this;
@@ -242,7 +242,7 @@ QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QString &strin
, length(string.length())
, pos(0)
, freePrivate(true)
- , d(0)
+ , d(nullptr)
{
if (length > 0) {
d = (QTextBoundaryFinderPrivate *) malloc((length + 1) * sizeof(QCharAttributes));
@@ -271,7 +271,7 @@ QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QChar *chars,
, length(length)
, pos(0)
, freePrivate(true)
- , d(0)
+ , d(nullptr)
{
if (!chars) {
length = 0;
diff --git a/src/corelib/text/qunicodetables.cpp b/src/corelib/text/qunicodetables.cpp
index 805a5a6e34..96e53967da 100644
--- a/src/corelib/text/qunicodetables.cpp
+++ b/src/corelib/text/qunicodetables.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -37,7 +37,7 @@
**
****************************************************************************/
-/* This file is autogenerated from the Unicode 10.0 database. Do not edit */
+/* This file is autogenerated from the Unicode 12.1 database. Do not edit */
#include "qunicodetables_p.h"
@@ -77,18 +77,18 @@ static const unsigned short uc_property_trie[] = {
11920, 11952, 11984, 12016, 12048, 12080, 12112, 12144,
12176, 12208, 12240, 12272, 12304, 12336, 9936, 9936,
12368, 12400, 12432, 12464, 12496, 12528, 12560, 12592,
- 12624, 12656, 12688, 12720, 12752, 9936, 12784, 12816,
- 12848, 12880, 12912, 12944, 12976, 13008, 13040, 13072,
- 13104, 13104, 13104, 13104, 13136, 13104, 13104, 13168,
- 13200, 13232, 13264, 13296, 13328, 13360, 13392, 13424,
-
- 13456, 13488, 13520, 13552, 13584, 13616, 13648, 13680,
- 13712, 13744, 13776, 13808, 13840, 13872, 13904, 13936,
- 13968, 14000, 14032, 14064, 14096, 14128, 14160, 14192,
- 14224, 14256, 14288, 14320, 14352, 14384, 14416, 14448,
- 14480, 14512, 14544, 14576, 14608, 14640, 14672, 14704,
- 14480, 14480, 14480, 14480, 14736, 14768, 14800, 14832,
- 14864, 14896, 14928, 14960, 14992, 15024, 15056, 15088,
+ 12624, 12656, 12688, 12720, 12752, 12784, 12816, 12848,
+ 12880, 12912, 12944, 12976, 13008, 13040, 13072, 13104,
+ 13136, 13136, 13136, 13136, 13168, 13136, 13136, 13200,
+ 13232, 13264, 13296, 13328, 13360, 13392, 13424, 13456,
+
+ 13488, 13520, 13552, 13584, 13616, 13648, 13680, 13712,
+ 13744, 13776, 13808, 13840, 13872, 13904, 13936, 13968,
+ 14000, 14032, 14064, 14096, 14128, 14160, 14192, 14224,
+ 14256, 14288, 14320, 14352, 14384, 14416, 14448, 14480,
+ 14512, 14544, 14576, 14608, 14640, 14672, 14704, 14736,
+ 14512, 14512, 14512, 14512, 14768, 14800, 14832, 14864,
+ 14896, 14928, 14512, 14960, 14992, 15024, 15056, 15088,
15120, 15152, 15184, 15216, 15248, 15280, 15312, 15344,
15376, 15376, 15376, 15376, 15376, 15376, 15376, 15376,
15408, 15408, 15408, 15408, 15440, 15472, 15504, 15536,
@@ -225,75 +225,58 @@ static const unsigned short uc_property_trie[] = {
17904, 17904, 17904, 17904, 17936, 17968, 18000, 18032,
18064, 18064, 18064, 18064, 18064, 18064, 18064, 18064,
18096, 18128, 18160, 18192, 18224, 18256, 18256, 18288,
- 18320, 18352, 18384, 18416, 18448, 18480, 9936, 18512,
- 18544, 18576, 18608, 18640, 18672, 18704, 18736, 18768,
- 18800, 18832, 18864, 18896, 18928, 18960, 18992, 19024,
- 19056, 19088, 19120, 19152, 19184, 19216, 19248, 19280,
- 19312, 19344, 19376, 19408, 19440, 19472, 19504, 19536,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
- 19600, 19632, 19664, 19696, 19728, 19760, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19568, 19600, 19632,
- 19664, 19696, 19728, 19760, 19568, 19600, 19632, 19664,
-
- 19696, 19728, 19760, 19568, 19600, 19632, 19664, 19696,
- 19728, 19760, 19568, 19600, 19632, 19664, 19696, 19728,
- 19760, 19568, 19600, 19632, 19664, 19696, 19728, 19760,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
- 19600, 19632, 19664, 19696, 19728, 19760, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19568, 19600, 19632,
- 19664, 19696, 19728, 19760, 19568, 19600, 19632, 19664,
- 19696, 19728, 19760, 19568, 19600, 19632, 19664, 19696,
- 19728, 19760, 19568, 19600, 19632, 19664, 19696, 19728,
- 19760, 19568, 19600, 19632, 19664, 19696, 19728, 19760,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
- 19600, 19632, 19664, 19696, 19728, 19760, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19568, 19600, 19632,
- 19664, 19696, 19728, 19760, 19568, 19600, 19632, 19664,
- 19696, 19728, 19760, 19568, 19600, 19632, 19664, 19696,
- 19728, 19760, 19568, 19600, 19632, 19664, 19696, 19728,
-
- 19760, 19568, 19600, 19632, 19664, 19696, 19728, 19760,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
- 19600, 19632, 19664, 19696, 19728, 19760, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19568, 19600, 19632,
- 19664, 19696, 19728, 19760, 19568, 19600, 19632, 19664,
- 19696, 19728, 19760, 19568, 19600, 19632, 19664, 19696,
- 19728, 19760, 19568, 19600, 19632, 19664, 19696, 19728,
- 19760, 19568, 19600, 19632, 19664, 19696, 19728, 19760,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
- 19600, 19632, 19664, 19696, 19728, 19760, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19568, 19600, 19632,
- 19664, 19696, 19728, 19760, 19568, 19600, 19632, 19664,
- 19696, 19728, 19760, 19568, 19600, 19632, 19664, 19696,
- 19728, 19760, 19568, 19600, 19632, 19664, 19696, 19728,
- 19760, 19568, 19600, 19632, 19664, 19696, 19728, 19760,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
-
- 19600, 19632, 19664, 19696, 19728, 19760, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19568, 19600, 19632,
- 19664, 19696, 19728, 19760, 19568, 19600, 19632, 19664,
- 19696, 19728, 19760, 19568, 19600, 19632, 19664, 19696,
- 19728, 19760, 19568, 19600, 19632, 19664, 19696, 19728,
- 19760, 19568, 19600, 19632, 19664, 19696, 19728, 19760,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
- 19600, 19632, 19664, 19696, 19728, 19792, 19824, 19856,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
-
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
+ 18320, 18352, 18384, 18416, 18448, 18480, 18512, 18544,
+ 18576, 18608, 18640, 18672, 18704, 18736, 18768, 18800,
+ 18832, 18864, 18896, 18928, 18960, 18992, 19024, 19056,
+ 19088, 19120, 19152, 19184, 19216, 19248, 19280, 19312,
+ 19344, 19376, 19408, 19440, 19472, 19504, 19536, 19568,
+ 19600, 19632, 19664, 19696, 19728, 19760, 19792, 19600,
+ 19632, 19664, 19696, 19728, 19760, 19792, 19600, 19632,
+ 19664, 19696, 19728, 19760, 19792, 19600, 19632, 19664,
+ 19696, 19728, 19760, 19792, 19600, 19632, 19664, 19696,
+
+ 19728, 19760, 19792, 19600, 19632, 19664, 19696, 19728,
+ 19760, 19792, 19600, 19632, 19664, 19696, 19728, 19760,
+ 19792, 19600, 19632, 19664, 19696, 19728, 19760, 19792,
+ 19600, 19632, 19664, 19696, 19728, 19760, 19792, 19600,
+ 19632, 19664, 19696, 19728, 19760, 19792, 19600, 19632,
+ 19664, 19696, 19728, 19760, 19792, 19600, 19632, 19664,
+ 19696, 19728, 19760, 19792, 19600, 19632, 19664, 19696,
+ 19728, 19760, 19792, 19600, 19632, 19664, 19696, 19728,
+ 19760, 19792, 19600, 19632, 19664, 19696, 19728, 19760,
+ 19792, 19600, 19632, 19664, 19696, 19728, 19760, 19792,
+ 19600, 19632, 19664, 19696, 19728, 19760, 19792, 19600,
+ 19632, 19664, 19696, 19728, 19760, 19792, 19600, 19632,
+ 19664, 19696, 19728, 19760, 19792, 19600, 19632, 19664,
+ 19696, 19728, 19760, 19792, 19600, 19632, 19664, 19696,
+ 19728, 19760, 19792, 19600, 19632, 19664, 19696, 19728,
+ 19760, 19792, 19600, 19632, 19664, 19696, 19728, 19760,
+
+ 19792, 19600, 19632, 19664, 19696, 19728, 19760, 19792,
+ 19600, 19632, 19664, 19696, 19728, 19760, 19792, 19600,
+ 19632, 19664, 19696, 19728, 19760, 19792, 19600, 19632,
+ 19664, 19696, 19728, 19760, 19792, 19600, 19632, 19664,
+ 19696, 19728, 19760, 19792, 19600, 19632, 19664, 19696,
+ 19728, 19760, 19792, 19600, 19632, 19664, 19696, 19728,
+ 19760, 19792, 19600, 19632, 19664, 19696, 19728, 19760,
+ 19792, 19600, 19632, 19664, 19696, 19728, 19760, 19792,
+ 19600, 19632, 19664, 19696, 19728, 19760, 19792, 19600,
+ 19632, 19664, 19696, 19728, 19760, 19792, 19600, 19632,
+ 19664, 19696, 19728, 19760, 19792, 19600, 19632, 19664,
+ 19696, 19728, 19760, 19792, 19600, 19632, 19664, 19696,
+ 19728, 19760, 19792, 19600, 19632, 19664, 19696, 19728,
+ 19760, 19792, 19600, 19632, 19664, 19696, 19728, 19760,
+ 19792, 19600, 19632, 19664, 19696, 19728, 19760, 19792,
+ 19600, 19632, 19664, 19696, 19728, 19760, 19792, 19600,
+
+ 19632, 19664, 19696, 19728, 19760, 19792, 19600, 19632,
+ 19664, 19696, 19728, 19760, 19792, 19600, 19632, 19664,
+ 19696, 19728, 19760, 19792, 19600, 19632, 19664, 19696,
+ 19728, 19760, 19792, 19600, 19632, 19664, 19696, 19728,
+ 19760, 19792, 19600, 19632, 19664, 19696, 19728, 19760,
+ 19792, 19600, 19632, 19664, 19696, 19728, 19760, 19792,
+ 19600, 19632, 19664, 19696, 19728, 19760, 19792, 19600,
+ 19632, 19664, 19696, 19728, 19760, 19824, 19856, 19888,
19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
@@ -303,568 +286,585 @@ static const unsigned short uc_property_trie[] = {
19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
- 19984, 20016, 20048, 20080, 20112, 20112, 20144, 20176,
- 20208, 20240, 20272, 20304, 20304, 20336, 20368, 20304,
- 20304, 20304, 20304, 20304, 20304, 20304, 20304, 20304,
- 20304, 20400, 20432, 20304, 20464, 20304, 20496, 20528,
- 20560, 20592, 20624, 20656, 20304, 20304, 20304, 20688,
- 20720, 20752, 20784, 20816, 20848, 20880, 20912, 20944,
-
- 20976, 21008, 21040, 9936, 21072, 21072, 21072, 21104,
- 21136, 21168, 21200, 21232, 21264, 21296, 21328, 21360,
- 9936, 9936, 9936, 9936, 21392, 21424, 21456, 21488,
- 21520, 21552, 21584, 21616, 21648, 21680, 21712, 9936,
- 21744, 21776, 21808, 21840, 21872, 21904, 21936, 21968,
- 22000, 22032, 22064, 22096, 9936, 9936, 9936, 9936,
- 22128, 22128, 22128, 22128, 22128, 22128, 22128, 22128,
- 22128, 22160, 22192, 22224, 9936, 9936, 9936, 9936,
- 22256, 22288, 22320, 22352, 22384, 22416, 8432, 22448,
- 22480, 22512, 8432, 8432, 22544, 22576, 22608, 22640,
- 22672, 22704, 22736, 22768, 22800, 8432, 22832, 22864,
- 22896, 22928, 22960, 22992, 23024, 23056, 8432, 8432,
- 23088, 23088, 23120, 8432, 23152, 23184, 23216, 23248,
- 8432, 8432, 8432, 8432, 8432, 8432, 8432, 8432,
- 8432, 8432, 8432, 23280, 8432, 8432, 8432, 8432,
- 8432, 8432, 8432, 8432, 8432, 8432, 8432, 8432,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
+ 19984, 19984, 19984, 19984, 19984, 19984, 19984, 19984,
+ 20016, 20048, 20080, 20112, 20144, 20144, 20176, 20208,
+ 20240, 20272, 20304, 20336, 20336, 20368, 20400, 20336,
+ 20336, 20336, 20336, 20336, 20336, 20336, 20336, 20336,
+ 20336, 20432, 20464, 20336, 20496, 20336, 20528, 20560,
+ 20592, 20624, 20656, 20688, 20336, 20336, 20336, 20720,
+ 20752, 20784, 20816, 20848, 20880, 20912, 20944, 20976,
+
+ 21008, 21040, 21072, 9936, 21104, 21104, 21104, 21136,
+ 21168, 21200, 21232, 21264, 21296, 21328, 21360, 21392,
+ 9936, 9936, 9936, 9936, 21424, 21456, 21488, 21520,
+ 21552, 21584, 21616, 21648, 21680, 21712, 21744, 9936,
+ 21776, 21808, 21840, 21872, 21904, 21936, 21968, 22000,
+ 22032, 22064, 22096, 22128, 9936, 9936, 9936, 9936,
+ 22160, 22160, 22160, 22160, 22160, 22160, 22160, 22160,
+ 22160, 22192, 22224, 22256, 9936, 9936, 9936, 9936,
+ 22288, 22320, 22352, 22384, 22416, 22448, 8432, 22480,
+ 22512, 22544, 8432, 8432, 22576, 22608, 22640, 22672,
+ 22704, 22736, 22768, 22800, 22832, 8432, 22864, 22896,
+ 22928, 22960, 22992, 23024, 23056, 23088, 8432, 8432,
+ 23120, 23120, 23152, 8432, 23184, 23216, 23248, 23280,
+ 23312, 23344, 8432, 8432, 8432, 8432, 8432, 8432,
+ 8432, 8432, 8432, 23376, 8432, 8432, 8432, 8432,
+ 23408, 23440, 23472, 8432, 8432, 8432, 8432, 23504,
// [0x11000..0x110000)
- 23312, 23568, 23824, 24080, 24336, 24592, 24848, 25104,
- 25360, 25616, 25872, 25616, 26128, 26384, 25616, 25616,
- 26640, 26640, 26640, 26896, 27152, 27408, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 27664, 27664, 27920, 28176, 28432, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 28688, 28944, 29200, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 29456, 29456, 29712, 29968, 25616, 25616, 25616, 30224,
- 30480, 30480, 30480, 30480, 30480, 30480, 30480, 30480,
- 30480, 30480, 30480, 30480, 30480, 30480, 30480, 30480,
- 30480, 30480, 30480, 30480, 30480, 30480, 30480, 30736,
- 30480, 30480, 30992, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 31248, 31504, 31760, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 32016, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 32272, 32528, 32784, 33040, 33296, 33552, 33808, 34064,
- 34320, 34320, 34576, 25616, 25616, 25616, 25616, 25616,
- 34832, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 35088, 35344, 35600, 35600, 35600, 35600, 35856, 35600,
- 36112, 36368, 36624, 36880, 37136, 37392, 37648, 37904,
- 38160, 38416, 38672, 38672, 38672, 38672, 38672, 38928,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
-
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39440, 39696,
- 39696, 39696, 39696, 39696, 39696, 39696, 39696, 39696,
- 39696, 39696, 39696, 39696, 39696, 39696, 39696, 39952,
- 40208, 40464, 40464, 40464, 40464, 40464, 40464, 40464,
- 40464, 40464, 40464, 40464, 40464, 40464, 40464, 40464,
- 40464, 40464, 40464, 40464, 40464, 40464, 40720, 40976,
- 40976, 40976, 40976, 40976, 40976, 40976, 40976, 40976,
- 40976, 40976, 40976, 40976, 40976, 40976, 40976, 40976,
- 40976, 40976, 40976, 40976, 40976, 40976, 40976, 40976,
- 40976, 40976, 40976, 41232, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 41488, 41488, 41744, 38672, 38672, 38672, 38672, 38928,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
-
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38928,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 42256, 42512, 42768, 42768, 42768, 42768, 42768, 42768,
- 42768, 42768, 42768, 42768, 42768, 42768, 42768, 42768,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
-
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43280,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
-
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43280,
+ 23536, 23792, 24048, 24304, 24560, 24816, 25072, 25328,
+ 25584, 25840, 26096, 26352, 26608, 26864, 27120, 27376,
+ 27632, 27632, 27632, 27888, 28144, 28400, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 28656, 28656, 28912, 29168, 29424, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 29680, 29936, 30192, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 30448, 30448, 30704, 30960, 26352, 26352, 31216, 31472,
+ 31728, 31728, 31728, 31728, 31728, 31728, 31728, 31728,
+ 31728, 31728, 31728, 31728, 31728, 31728, 31728, 31728,
+ 31728, 31728, 31728, 31728, 31728, 31728, 31728, 31984,
+ 31728, 31728, 32240, 26352, 26352, 26352, 26352, 26352,
+
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 32496, 32752, 33008, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 33264, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 33520, 33776, 34032, 34288, 34544, 34800, 35056, 35312,
+ 35568, 35568, 35824, 26352, 26352, 26352, 26352, 26352,
+ 36080, 36336, 36592, 26352, 26352, 26352, 26352, 26352,
+ 36848, 37104, 37360, 37360, 37616, 37872, 38128, 37360,
+ 38384, 38640, 38896, 39152, 39408, 39664, 39920, 40176,
+ 40432, 40688, 40944, 41200, 41200, 41200, 41200, 41456,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41712, 41712,
+ 41712, 41712, 41712, 41712, 41712, 41712, 41968, 42224,
+ 42224, 42224, 42224, 42224, 42224, 42224, 42224, 42224,
+ 42224, 42224, 42224, 42224, 42224, 42224, 42224, 42480,
+ 42736, 42992, 42992, 42992, 42992, 42992, 42992, 42992,
+ 42992, 42992, 42992, 42992, 42992, 42992, 42992, 42992,
+ 42992, 42992, 42992, 42992, 42992, 42992, 43248, 43504,
+ 43504, 43504, 43504, 43504, 43504, 43504, 43504, 43504,
+ 43504, 43504, 43504, 43504, 43504, 43504, 43504, 43504,
+ 43504, 43504, 43504, 43504, 43504, 43504, 43504, 43504,
+ 43504, 43504, 43504, 43760, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 44016, 44016, 44272, 41200, 41200, 41200, 41200, 41456,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41200,
+ 41200, 41200, 41200, 41200, 41200, 41200, 41200, 41456,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 44528,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 44528,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 44528,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 44528,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 44528,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 44528,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 44528,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 44528,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 44528,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 44528,
+ 44784, 45040, 45296, 45296, 45296, 45296, 45296, 45296,
+ 45296, 45296, 45296, 45296, 45296, 45296, 45296, 45296,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 26352,
+ 26352, 26352, 26352, 26352, 26352, 26352, 26352, 44528,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45808,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45552,
+ 45552, 45552, 45552, 45552, 45552, 45552, 45552, 45808,
0, 0, 0, 0, 0, 0, 0, 0,
@@ -967,975 +967,980 @@ static const unsigned short uc_property_trie[] = {
78, 146, 147, 78, 78, 148, 78, 78,
78, 78, 78, 78, 78, 149, 78, 78,
- 150, 78, 78, 150, 78, 78, 78, 151,
- 150, 152, 153, 153, 154, 78, 78, 78,
- 78, 78, 155, 78, 100, 78, 78, 78,
- 78, 78, 78, 78, 78, 156, 157, 78,
+ 150, 78, 151, 150, 78, 78, 78, 152,
+ 150, 153, 154, 154, 155, 78, 78, 78,
+ 78, 78, 156, 78, 100, 78, 78, 78,
+ 78, 78, 78, 78, 78, 157, 158, 78,
78, 78, 78, 78, 78, 78, 78, 78,
- 78, 158, 158, 158, 158, 158, 114, 114,
- 159, 159, 159, 159, 159, 159, 159, 159,
- 159, 160, 160, 161, 161, 161, 161, 161,
-
- 162, 162, 163, 163, 163, 163, 160, 160,
- 164, 160, 160, 160, 164, 160, 160, 160,
- 161, 161, 163, 163, 163, 163, 163, 163,
- 52, 52, 52, 52, 52, 52, 163, 165,
-
- 159, 159, 159, 159, 159, 42, 42, 42,
- 42, 42, 166, 166, 167, 168, 169, 170,
- 170, 170, 170, 170, 170, 170, 170, 170,
- 170, 170, 170, 170, 170, 170, 170, 170,
-
- 171, 171, 171, 171, 171, 172, 171, 171,
- 171, 171, 171, 171, 171, 172, 172, 171,
- 172, 171, 172, 171, 171, 173, 174, 174,
- 174, 174, 173, 175, 174, 174, 174, 174,
-
- 174, 176, 176, 177, 177, 177, 177, 178,
- 178, 174, 174, 174, 174, 177, 177, 174,
- 177, 177, 174, 174, 179, 179, 179, 179,
- 180, 174, 174, 174, 174, 172, 172, 172,
-
- 181, 181, 171, 181, 181, 182, 183, 184,
- 184, 184, 183, 183, 183, 184, 184, 185,
- 186, 186, 186, 187, 187, 187, 187, 186,
- 188, 189, 189, 190, 191, 192, 192, 193,
-
- 194, 194, 195, 196, 196, 196, 196, 196,
- 196, 196, 196, 196, 196, 196, 196, 196,
- 197, 198, 197, 198, 199, 200, 197, 198,
- 201, 201, 202, 203, 203, 203, 204, 205,
-
- 201, 201, 201, 201, 206, 207, 208, 209,
- 210, 210, 210, 201, 211, 201, 212, 212,
- 213, 214, 214, 214, 214, 214, 214, 214,
- 214, 214, 214, 214, 214, 214, 214, 214,
-
- 214, 214, 201, 214, 214, 214, 214, 214,
- 214, 214, 215, 215, 216, 217, 217, 217,
- 218, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 220, 219, 219, 219, 219, 219,
- 219, 219, 221, 221, 222, 223, 223, 224,
- 225, 226, 227, 228, 228, 229, 230, 231,
- 232, 233, 234, 235, 234, 235, 234, 235,
-
- 234, 235, 236, 237, 236, 237, 236, 237,
- 236, 237, 236, 237, 236, 237, 236, 237,
- 238, 239, 240, 241, 242, 243, 244, 245,
- 246, 247, 245, 246, 248, 249, 249, 249,
-
- 250, 251, 252, 251, 252, 252, 252, 251,
- 252, 252, 252, 252, 251, 250, 251, 252,
- 253, 253, 253, 253, 253, 253, 253, 253,
- 253, 254, 253, 253, 253, 253, 253, 253,
-
- 253, 253, 253, 253, 253, 253, 253, 253,
- 253, 253, 253, 253, 253, 253, 253, 253,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 256, 255, 255, 255, 255, 255, 255,
-
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 257, 258, 259, 258, 259, 259, 259, 258,
- 259, 259, 259, 259, 258, 257, 258, 259,
-
- 260, 261, 260, 261, 260, 261, 260, 261,
- 260, 261, 260, 261, 260, 261, 260, 261,
- 260, 261, 260, 261, 260, 261, 262, 263,
- 260, 261, 260, 261, 260, 261, 260, 261,
-
- 260, 261, 264, 265, 265, 172, 172, 266,
- 267, 267, 268, 269, 270, 271, 270, 271,
- 260, 261, 260, 261, 260, 261, 260, 261,
- 260, 261, 260, 261, 260, 261, 260, 261,
-
- 260, 261, 260, 261, 260, 261, 260, 261,
- 260, 261, 260, 261, 260, 261, 260, 261,
- 260, 261, 260, 261, 260, 261, 260, 261,
- 260, 261, 260, 261, 260, 261, 260, 261,
-
- 272, 262, 263, 260, 261, 268, 269, 260,
- 261, 268, 269, 260, 261, 268, 269, 273,
- 262, 263, 262, 263, 260, 261, 262, 263,
- 260, 261, 262, 263, 262, 263, 262, 263,
-
- 260, 261, 262, 263, 262, 263, 262, 263,
- 260, 261, 262, 263, 274, 275, 262, 263,
- 262, 263, 262, 263, 262, 263, 276, 277,
- 262, 263, 278, 279, 278, 279, 278, 279,
-
- 268, 269, 268, 269, 268, 269, 268, 269,
- 268, 269, 268, 269, 268, 269, 268, 269,
- 278, 279, 278, 279, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 280, 281,
-
- 280, 281, 280, 281, 282, 283, 284, 285,
- 286, 287, 286, 287, 286, 287, 286, 287,
- 201, 288, 288, 288, 288, 288, 288, 288,
- 288, 288, 288, 288, 288, 288, 288, 288,
-
- 288, 288, 288, 288, 288, 288, 288, 288,
- 288, 288, 288, 288, 288, 288, 288, 288,
- 288, 288, 288, 288, 288, 288, 288, 201,
- 201, 289, 290, 290, 290, 291, 290, 290,
-
- 201, 292, 292, 292, 292, 292, 292, 292,
- 292, 292, 292, 292, 292, 292, 292, 292,
- 292, 292, 292, 292, 292, 292, 292, 292,
- 292, 292, 292, 292, 292, 292, 292, 292,
-
- 292, 292, 292, 292, 292, 292, 292, 293,
- 201, 294, 295, 201, 201, 296, 296, 297,
- 298, 299, 300, 300, 300, 300, 299, 300,
- 300, 300, 301, 299, 300, 300, 300, 300,
-
- 300, 300, 302, 299, 299, 299, 299, 299,
- 300, 300, 299, 300, 300, 301, 303, 300,
- 304, 305, 306, 307, 308, 309, 310, 311,
- 312, 313, 314, 315, 316, 317, 318, 319,
-
- 320, 321, 322, 320, 300, 302, 323, 324,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 325, 325, 325, 325, 325, 325, 325, 325,
- 325, 325, 325, 325, 325, 325, 325, 325,
-
- 325, 325, 325, 325, 325, 325, 325, 325,
- 325, 325, 325, 298, 298, 298, 298, 298,
- 325, 325, 325, 326, 327, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 328, 328, 328, 328, 329, 330, 331, 331,
- 332, 333, 333, 334, 19, 335, 336, 336,
- 337, 337, 337, 337, 337, 337, 338, 338,
- 339, 340, 341, 342, 343, 344, 345, 346,
-
- 347, 348, 349, 349, 349, 349, 350, 351,
- 352, 351, 352, 352, 352, 352, 352, 351,
- 351, 351, 351, 352, 352, 352, 352, 352,
- 352, 352, 352, 353, 353, 353, 353, 353,
-
- 354, 352, 352, 352, 352, 352, 352, 352,
- 351, 352, 352, 355, 356, 357, 358, 359,
- 360, 361, 362, 363, 363, 364, 365, 337,
- 337, 366, 366, 366, 367, 366, 366, 368,
-
- 369, 370, 371, 372, 373, 374, 375, 376,
- 377, 378, 379, 380, 381, 382, 383, 383,
- 384, 351, 351, 351, 348, 385, 385, 385,
- 386, 352, 352, 352, 352, 352, 352, 352,
-
- 352, 352, 352, 352, 352, 352, 352, 352,
- 351, 351, 351, 351, 351, 351, 351, 351,
- 351, 351, 351, 351, 351, 351, 351, 351,
- 351, 351, 352, 352, 352, 352, 352, 352,
-
- 352, 352, 352, 352, 352, 352, 352, 352,
- 352, 352, 352, 352, 352, 352, 352, 352,
- 352, 352, 352, 352, 352, 352, 352, 352,
- 387, 387, 352, 352, 352, 352, 352, 387,
-
- 349, 352, 350, 351, 351, 351, 351, 351,
- 351, 351, 351, 351, 352, 351, 352, 388,
- 352, 352, 351, 349, 389, 351, 390, 390,
- 390, 390, 390, 390, 390, 391, 392, 390,
-
- 390, 390, 390, 393, 390, 394, 394, 390,
- 390, 392, 393, 390, 390, 393, 395, 395,
- 396, 397, 398, 399, 400, 401, 402, 403,
- 404, 405, 387, 387, 387, 406, 406, 407,
-
- 408, 408, 408, 409, 409, 409, 409, 409,
- 409, 409, 409, 409, 409, 409, 344, 410,
- 411, 412, 413, 413, 413, 411, 411, 411,
- 411, 411, 413, 413, 413, 413, 411, 413,
-
- 413, 413, 413, 413, 413, 413, 413, 413,
- 411, 413, 411, 413, 411, 414, 414, 415,
- 416, 417, 416, 416, 417, 416, 416, 417,
- 417, 417, 416, 417, 417, 416, 417, 416,
-
- 416, 416, 417, 416, 417, 416, 417, 416,
- 417, 416, 416, 344, 344, 415, 414, 414,
- 418, 418, 418, 418, 418, 418, 418, 418,
- 418, 419, 419, 419, 418, 418, 418, 418,
-
- 418, 418, 418, 418, 418, 418, 418, 418,
- 418, 418, 418, 419, 419, 418, 353, 353,
- 353, 420, 353, 420, 420, 353, 353, 353,
- 420, 420, 353, 353, 353, 353, 353, 353,
-
- 421, 421, 421, 421, 421, 421, 421, 421,
- 421, 421, 421, 421, 421, 421, 421, 421,
- 421, 421, 421, 421, 421, 421, 421, 421,
- 421, 421, 421, 421, 421, 421, 421, 421,
-
- 421, 421, 421, 421, 421, 421, 422, 422,
+ 78, 159, 159, 159, 159, 159, 114, 114,
+ 160, 160, 160, 160, 160, 160, 160, 160,
+ 160, 161, 161, 162, 162, 162, 162, 162,
+
+ 163, 163, 164, 164, 164, 164, 161, 161,
+ 165, 161, 161, 161, 165, 161, 161, 161,
+ 162, 162, 164, 164, 164, 164, 164, 164,
+ 52, 52, 52, 52, 52, 52, 164, 166,
+
+ 160, 160, 160, 160, 160, 42, 42, 42,
+ 42, 42, 167, 167, 168, 169, 170, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171,
+
+ 172, 172, 172, 172, 172, 173, 172, 172,
+ 172, 172, 172, 172, 172, 173, 173, 172,
+ 173, 172, 173, 172, 172, 174, 175, 175,
+ 175, 175, 174, 176, 175, 175, 175, 175,
+
+ 175, 177, 177, 178, 178, 178, 178, 179,
+ 179, 175, 175, 175, 175, 178, 178, 175,
+ 178, 178, 175, 175, 180, 180, 180, 180,
+ 181, 175, 175, 175, 175, 173, 173, 173,
+
+ 182, 182, 172, 182, 182, 183, 184, 185,
+ 185, 185, 184, 184, 184, 185, 185, 186,
+ 187, 187, 187, 188, 188, 188, 188, 187,
+ 189, 190, 190, 191, 192, 193, 193, 194,
+
+ 195, 195, 196, 197, 197, 197, 197, 197,
+ 197, 197, 197, 197, 197, 197, 197, 197,
+ 198, 199, 198, 199, 200, 201, 198, 199,
+ 202, 202, 203, 204, 204, 204, 205, 206,
+
+ 202, 202, 202, 202, 207, 208, 209, 210,
+ 211, 211, 211, 202, 212, 202, 213, 213,
+ 214, 215, 215, 215, 215, 215, 215, 215,
+ 215, 215, 215, 215, 215, 215, 215, 215,
+
+ 215, 215, 202, 215, 215, 215, 215, 215,
+ 215, 215, 216, 216, 217, 218, 218, 218,
+ 219, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+
+ 220, 220, 221, 220, 220, 220, 220, 220,
+ 220, 220, 222, 222, 223, 224, 224, 225,
+ 226, 227, 228, 229, 229, 230, 231, 232,
+ 233, 234, 235, 236, 235, 236, 235, 236,
+
+ 235, 236, 237, 238, 237, 238, 237, 238,
+ 237, 238, 237, 238, 237, 238, 237, 238,
+ 239, 240, 241, 242, 243, 244, 245, 246,
+ 247, 248, 246, 247, 249, 250, 250, 250,
+
+ 251, 252, 253, 252, 253, 253, 253, 252,
+ 253, 253, 253, 253, 252, 251, 252, 253,
+ 254, 254, 254, 254, 254, 254, 254, 254,
+ 254, 255, 254, 254, 254, 254, 254, 254,
+
+ 254, 254, 254, 254, 254, 254, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 257, 256, 256, 256, 256, 256, 256,
+
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 256, 256, 256, 256,
+ 258, 259, 260, 259, 260, 260, 260, 259,
+ 260, 260, 260, 260, 259, 258, 259, 260,
+
+ 261, 262, 261, 262, 261, 262, 261, 262,
+ 261, 262, 261, 262, 261, 262, 261, 262,
+ 261, 262, 261, 262, 261, 262, 263, 264,
+ 261, 262, 261, 262, 261, 262, 261, 262,
+
+ 261, 262, 265, 266, 266, 173, 173, 267,
+ 268, 268, 269, 270, 271, 272, 271, 272,
+ 261, 262, 261, 262, 261, 262, 261, 262,
+ 261, 262, 261, 262, 261, 262, 261, 262,
+
+ 261, 262, 261, 262, 261, 262, 261, 262,
+ 261, 262, 261, 262, 261, 262, 261, 262,
+ 261, 262, 261, 262, 261, 262, 261, 262,
+ 261, 262, 261, 262, 261, 262, 261, 262,
+
+ 273, 263, 264, 261, 262, 269, 270, 261,
+ 262, 269, 270, 261, 262, 269, 270, 274,
+ 263, 264, 263, 264, 261, 262, 263, 264,
+ 261, 262, 263, 264, 263, 264, 263, 264,
+
+ 261, 262, 263, 264, 263, 264, 263, 264,
+ 261, 262, 263, 264, 275, 276, 263, 264,
+ 263, 264, 263, 264, 263, 264, 277, 278,
+ 263, 264, 279, 280, 279, 280, 279, 280,
+
+ 269, 270, 269, 270, 269, 270, 269, 270,
+ 269, 270, 269, 270, 269, 270, 269, 270,
+ 279, 280, 279, 280, 281, 282, 281, 282,
+ 281, 282, 281, 282, 281, 282, 281, 282,
+
+ 281, 282, 281, 282, 283, 284, 285, 286,
+ 287, 288, 287, 288, 287, 288, 287, 288,
+ 202, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 202,
+ 202, 290, 291, 292, 292, 293, 292, 291,
+
+ 294, 295, 295, 295, 295, 295, 295, 295,
+ 295, 295, 295, 295, 295, 295, 295, 295,
+ 295, 295, 295, 295, 295, 295, 295, 295,
+ 295, 295, 295, 295, 295, 295, 295, 295,
+
+ 295, 295, 295, 295, 295, 295, 295, 296,
+ 294, 297, 298, 202, 202, 299, 299, 300,
+ 301, 302, 303, 303, 303, 303, 302, 303,
+ 303, 303, 304, 302, 303, 303, 303, 303,
+
+ 303, 303, 305, 302, 302, 302, 302, 302,
+ 303, 303, 302, 303, 303, 304, 306, 303,
+ 307, 308, 309, 310, 311, 312, 313, 314,
+ 315, 316, 317, 318, 319, 320, 321, 322,
+
+ 323, 324, 325, 323, 303, 305, 326, 327,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 328, 328, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 328, 328, 328, 328, 328,
+
+ 328, 328, 328, 328, 328, 328, 328, 328,
+ 328, 328, 328, 301, 301, 301, 301, 329,
+ 328, 328, 328, 330, 331, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
+ 332, 332, 332, 332, 333, 334, 335, 335,
+ 336, 337, 337, 338, 19, 339, 340, 340,
+ 341, 341, 341, 341, 341, 341, 342, 342,
+ 343, 344, 345, 346, 347, 348, 349, 350,
+
+ 351, 352, 353, 353, 353, 353, 354, 355,
+ 356, 355, 356, 356, 356, 356, 356, 355,
+ 355, 355, 355, 356, 356, 356, 356, 356,
+ 356, 356, 356, 357, 357, 357, 357, 357,
+
+ 358, 356, 356, 356, 356, 356, 356, 356,
+ 355, 356, 356, 359, 360, 361, 362, 363,
+ 364, 365, 366, 367, 367, 368, 369, 341,
+ 341, 370, 370, 370, 371, 370, 370, 372,
+
+ 373, 374, 375, 376, 377, 378, 379, 380,
+ 381, 382, 383, 384, 385, 386, 387, 387,
+ 388, 355, 355, 355, 352, 389, 389, 389,
+ 390, 356, 356, 356, 356, 356, 356, 356,
+
+ 356, 356, 356, 356, 356, 356, 356, 356,
+ 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 356, 356, 356, 356, 356, 356,
+
+ 356, 356, 356, 356, 356, 356, 356, 356,
+ 356, 356, 356, 356, 356, 356, 356, 356,
+ 356, 356, 356, 356, 356, 356, 356, 356,
+ 391, 391, 356, 356, 356, 356, 356, 391,
+
+ 353, 356, 354, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 356, 355, 356, 392,
+ 356, 356, 355, 353, 393, 355, 394, 394,
+ 394, 394, 394, 394, 394, 395, 396, 394,
+
+ 394, 394, 394, 397, 394, 398, 398, 394,
+ 394, 396, 397, 394, 394, 397, 399, 399,
+ 400, 401, 402, 403, 404, 405, 406, 407,
+ 408, 409, 391, 391, 391, 410, 410, 411,
+
+ 412, 412, 412, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 348, 414,
+ 415, 416, 417, 417, 417, 415, 415, 415,
+ 415, 415, 417, 417, 417, 417, 415, 417,
+
+ 417, 417, 417, 417, 417, 417, 417, 417,
+ 415, 417, 415, 417, 415, 418, 418, 419,
+ 420, 421, 420, 420, 421, 420, 420, 421,
+ 421, 421, 420, 421, 421, 420, 421, 420,
+
+ 420, 420, 421, 420, 421, 420, 421, 420,
+ 421, 420, 420, 348, 348, 419, 418, 418,
422, 422, 422, 422, 422, 422, 422, 422,
- 422, 423, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
-
- 424, 425, 426, 427, 428, 429, 430, 431,
- 432, 433, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 434, 434,
-
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 435, 435, 435, 435, 435,
- 435, 435, 436, 435, 437, 437, 438, 439,
- 440, 441, 442, 298, 298, 298, 298, 298,
-
- 443, 443, 443, 443, 443, 443, 443, 443,
- 443, 443, 443, 443, 443, 443, 443, 443,
- 443, 443, 443, 443, 443, 443, 444, 444,
- 444, 444, 445, 444, 444, 444, 444, 444,
-
- 444, 444, 444, 444, 445, 444, 444, 444,
- 445, 444, 444, 444, 444, 444, 298, 298,
- 446, 446, 446, 446, 446, 446, 446, 446,
- 446, 446, 446, 446, 446, 446, 446, 298,
-
- 447, 448, 448, 448, 448, 448, 447, 447,
- 448, 447, 448, 448, 448, 448, 448, 448,
- 448, 448, 448, 448, 447, 448, 449, 449,
- 449, 450, 450, 450, 298, 298, 451, 298,
-
- 452, 453, 452, 452, 452, 452, 453, 454,
- 452, 454, 454, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 455, 456, 455, 455, 455, 455, 455, 455,
- 455, 455, 457, 457, 457, 458, 459, 456,
- 456, 459, 459, 460, 460, 344, 461, 461,
- 461, 462, 461, 461, 461, 461, 344, 344,
-
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 463, 463, 463, 463,
- 463, 463, 463, 463, 463, 463, 463, 463,
-
- 463, 463, 464, 465, 466, 466, 467, 466,
- 466, 467, 466, 466, 466, 467, 467, 467,
- 468, 469, 470, 466, 466, 466, 467, 466,
- 466, 467, 467, 466, 466, 466, 466, 471,
-
- 472, 473, 473, 474, 475, 476, 476, 476,
- 476, 476, 476, 476, 476, 476, 476, 476,
- 476, 476, 476, 476, 476, 476, 476, 476,
- 476, 476, 476, 476, 476, 476, 476, 476,
-
- 476, 476, 476, 476, 476, 476, 476, 476,
- 476, 477, 476, 476, 476, 476, 476, 476,
- 476, 477, 476, 476, 477, 476, 476, 476,
- 476, 476, 478, 479, 480, 476, 474, 474,
-
- 474, 473, 473, 473, 473, 473, 473, 473,
- 473, 474, 474, 474, 474, 481, 482, 479,
- 476, 172, 174, 483, 483, 472, 478, 478,
+ 422, 423, 423, 423, 422, 422, 422, 422,
+
+ 422, 422, 422, 422, 422, 422, 422, 422,
+ 422, 422, 422, 423, 423, 422, 357, 357,
+ 357, 424, 357, 424, 424, 357, 357, 357,
+ 424, 424, 357, 357, 357, 357, 357, 357,
+
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+
+ 425, 425, 425, 425, 425, 425, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 427, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 348,
+
+ 428, 429, 430, 431, 432, 433, 434, 435,
+ 436, 437, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 439, 439, 439, 439, 439,
+ 439, 439, 440, 439, 441, 441, 442, 443,
+ 444, 445, 446, 301, 301, 447, 448, 448,
+
+ 449, 449, 449, 449, 449, 449, 449, 449,
+ 449, 449, 449, 449, 449, 449, 449, 449,
+ 449, 449, 449, 449, 449, 449, 450, 450,
+ 450, 450, 451, 450, 450, 450, 450, 450,
+
+ 450, 450, 450, 450, 451, 450, 450, 450,
+ 451, 450, 450, 450, 450, 450, 301, 301,
+ 452, 452, 452, 452, 452, 452, 452, 453,
+ 452, 453, 452, 452, 452, 453, 453, 301,
+
+ 454, 455, 455, 455, 455, 455, 454, 454,
+ 455, 454, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 454, 455, 456, 456,
+ 456, 457, 457, 457, 301, 301, 458, 301,
+
+ 459, 460, 459, 459, 459, 459, 460, 461,
+ 459, 461, 461, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
+ 462, 463, 462, 462, 462, 462, 462, 462,
+ 462, 462, 464, 464, 464, 465, 466, 463,
+ 463, 466, 466, 467, 467, 348, 468, 468,
+ 468, 469, 468, 468, 468, 468, 348, 348,
+
+ 348, 348, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 470, 471, 471, 471, 471,
+ 471, 471, 471, 471, 471, 471, 471, 471,
+
+ 471, 471, 472, 473, 474, 474, 475, 474,
+ 474, 475, 474, 474, 474, 475, 475, 475,
+ 476, 477, 478, 474, 474, 474, 475, 474,
+ 474, 475, 475, 474, 474, 474, 474, 479,
+
+ 480, 481, 481, 482, 483, 484, 484, 484,
+ 484, 484, 484, 484, 484, 484, 484, 484,
+ 484, 484, 484, 484, 484, 484, 484, 484,
484, 484, 484, 484, 484, 484, 484, 484,
- 476, 476, 473, 473, 485, 485, 486, 487,
- 488, 489, 490, 491, 492, 493, 494, 495,
- 496, 497, 498, 499, 499, 499, 499, 499,
- 500, 501, 501, 502, 502, 503, 502, 502,
-
- 504, 505, 506, 506, 201, 507, 507, 507,
- 507, 507, 507, 507, 507, 201, 201, 507,
- 507, 201, 201, 507, 507, 507, 507, 507,
- 507, 507, 507, 507, 507, 507, 507, 507,
-
- 507, 507, 507, 507, 507, 507, 507, 507,
- 507, 201, 507, 507, 507, 507, 507, 507,
- 507, 201, 507, 201, 201, 201, 507, 507,
- 507, 507, 201, 201, 508, 509, 510, 506,
-
- 506, 505, 505, 505, 505, 201, 201, 506,
- 506, 201, 201, 511, 511, 512, 513, 201,
- 201, 201, 201, 201, 201, 201, 201, 510,
- 201, 201, 201, 201, 514, 514, 201, 514,
-
- 507, 507, 505, 505, 201, 201, 515, 516,
- 517, 518, 519, 520, 521, 522, 523, 524,
- 507, 507, 525, 525, 526, 526, 526, 526,
- 526, 527, 528, 529, 530, 531, 201, 201,
-
- 201, 532, 533, 534, 201, 535, 535, 535,
- 535, 535, 535, 201, 201, 201, 201, 535,
- 535, 201, 201, 535, 535, 535, 535, 535,
- 535, 535, 535, 535, 535, 535, 535, 535,
-
- 535, 535, 535, 535, 535, 535, 535, 535,
- 535, 201, 535, 535, 535, 535, 535, 535,
- 535, 201, 535, 536, 201, 535, 536, 201,
- 535, 535, 201, 201, 537, 201, 538, 538,
-
- 538, 533, 533, 201, 201, 201, 201, 533,
- 533, 201, 201, 533, 533, 539, 201, 201,
- 201, 540, 201, 201, 201, 201, 201, 201,
- 201, 536, 536, 536, 535, 201, 536, 201,
-
- 201, 201, 201, 201, 201, 201, 541, 542,
- 543, 544, 545, 546, 547, 548, 549, 550,
- 533, 533, 535, 535, 535, 540, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 551, 551, 552, 201, 553, 553, 553,
- 553, 553, 553, 553, 554, 553, 201, 553,
- 553, 553, 201, 553, 553, 553, 553, 553,
- 553, 553, 553, 553, 553, 553, 553, 553,
-
- 553, 553, 553, 553, 553, 553, 553, 553,
- 553, 201, 553, 553, 553, 553, 553, 553,
- 553, 201, 553, 553, 201, 553, 553, 553,
- 553, 553, 201, 201, 555, 553, 552, 552,
-
- 552, 551, 551, 551, 551, 551, 201, 551,
- 551, 552, 201, 552, 552, 556, 201, 201,
- 553, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 553, 554, 557, 557, 201, 201, 558, 559,
- 560, 561, 562, 563, 564, 565, 566, 567,
- 568, 569, 201, 201, 201, 201, 201, 201,
- 201, 570, 571, 571, 571, 571, 571, 571,
-
- 201, 572, 573, 573, 201, 574, 574, 574,
- 574, 574, 574, 574, 574, 201, 201, 574,
- 574, 201, 201, 574, 574, 574, 574, 574,
- 574, 574, 574, 574, 574, 574, 574, 574,
-
- 574, 574, 574, 574, 574, 574, 574, 574,
- 574, 201, 574, 574, 574, 574, 574, 574,
- 574, 201, 574, 574, 201, 575, 574, 574,
- 574, 574, 201, 201, 576, 574, 577, 572,
-
- 573, 572, 572, 572, 578, 201, 201, 573,
- 579, 201, 201, 579, 579, 580, 201, 201,
- 201, 201, 201, 201, 201, 201, 581, 577,
- 201, 201, 201, 201, 582, 582, 201, 574,
-
- 574, 574, 578, 578, 201, 201, 583, 584,
- 585, 586, 587, 588, 589, 590, 591, 592,
- 593, 575, 594, 594, 594, 594, 594, 594,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 595, 596, 201, 596, 596, 596,
- 596, 596, 596, 201, 201, 201, 596, 596,
- 596, 201, 596, 596, 597, 596, 201, 201,
- 201, 596, 596, 201, 596, 201, 596, 596,
-
- 201, 201, 201, 596, 596, 201, 201, 201,
- 596, 596, 596, 201, 201, 201, 596, 596,
- 596, 596, 596, 596, 596, 596, 598, 596,
- 596, 596, 201, 201, 201, 201, 599, 600,
-
- 595, 600, 600, 201, 201, 201, 600, 600,
- 600, 201, 601, 601, 601, 602, 201, 201,
- 603, 201, 201, 201, 201, 201, 201, 599,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 604, 605,
- 606, 607, 608, 609, 610, 611, 612, 613,
- 614, 614, 614, 615, 615, 615, 615, 615,
- 615, 616, 615, 201, 201, 201, 201, 201,
-
- 617, 618, 618, 618, 201, 619, 619, 619,
- 619, 619, 619, 619, 619, 201, 619, 619,
- 619, 201, 619, 619, 619, 619, 619, 619,
- 619, 619, 619, 619, 619, 619, 619, 619,
-
- 619, 619, 619, 619, 619, 619, 619, 619,
- 619, 201, 619, 619, 619, 619, 619, 619,
- 619, 619, 619, 619, 620, 619, 619, 619,
- 619, 619, 201, 201, 201, 621, 622, 622,
-
- 622, 618, 618, 618, 618, 201, 622, 622,
- 623, 201, 622, 622, 622, 624, 201, 201,
- 201, 201, 201, 201, 201, 625, 626, 201,
- 621, 621, 627, 201, 201, 201, 201, 201,
-
- 619, 619, 628, 628, 201, 201, 629, 630,
- 631, 632, 633, 634, 635, 636, 637, 638,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 639, 639, 639, 639, 639, 639, 639, 640,
-
- 641, 642, 643, 643, 201, 644, 644, 644,
- 644, 644, 644, 644, 644, 201, 644, 644,
- 644, 201, 644, 644, 644, 644, 644, 644,
- 644, 644, 644, 644, 644, 644, 644, 644,
-
- 644, 644, 644, 644, 644, 644, 644, 644,
- 644, 201, 644, 644, 644, 644, 644, 644,
- 644, 644, 644, 644, 201, 644, 644, 644,
- 644, 644, 201, 201, 645, 646, 643, 647,
-
- 648, 643, 649, 643, 643, 201, 647, 648,
- 648, 201, 648, 648, 650, 651, 201, 201,
- 201, 201, 201, 201, 201, 649, 649, 201,
- 201, 201, 201, 201, 201, 201, 644, 201,
-
- 644, 644, 652, 652, 201, 201, 653, 654,
- 655, 656, 657, 658, 659, 660, 661, 662,
- 201, 663, 663, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 664, 665, 666, 666, 201, 667, 667, 667,
- 667, 667, 667, 667, 667, 201, 667, 667,
- 667, 201, 667, 667, 667, 667, 667, 667,
- 667, 667, 667, 667, 667, 667, 667, 667,
-
- 667, 667, 667, 667, 667, 667, 667, 667,
- 667, 668, 667, 667, 667, 667, 667, 667,
- 667, 667, 667, 667, 667, 667, 667, 667,
- 667, 667, 668, 669, 669, 670, 671, 666,
-
- 666, 672, 672, 672, 673, 201, 666, 666,
- 666, 201, 674, 674, 674, 675, 676, 677,
- 201, 201, 201, 201, 678, 678, 678, 671,
- 679, 679, 679, 679, 679, 679, 679, 680,
-
- 667, 667, 673, 673, 201, 201, 681, 682,
- 683, 684, 685, 686, 687, 688, 689, 690,
- 691, 691, 691, 691, 691, 691, 679, 679,
- 679, 692, 670, 670, 670, 670, 670, 670,
-
- 201, 201, 693, 693, 201, 694, 694, 694,
- 694, 694, 694, 694, 694, 694, 694, 694,
- 694, 694, 694, 694, 694, 694, 694, 201,
- 201, 201, 694, 694, 694, 694, 694, 694,
-
- 694, 694, 694, 694, 694, 694, 694, 694,
- 694, 694, 694, 694, 694, 694, 694, 694,
- 694, 694, 201, 694, 694, 694, 694, 694,
- 694, 694, 694, 694, 201, 694, 201, 201,
-
- 694, 694, 694, 694, 694, 694, 694, 201,
- 201, 201, 695, 201, 201, 201, 201, 696,
- 693, 693, 697, 697, 697, 201, 697, 201,
- 693, 693, 698, 693, 698, 698, 698, 696,
-
- 201, 201, 201, 201, 201, 201, 699, 700,
- 701, 702, 703, 704, 705, 706, 707, 708,
- 201, 201, 693, 693, 709, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 710, 710, 710, 710, 710, 710, 710,
- 710, 710, 710, 710, 710, 710, 710, 710,
- 710, 710, 710, 710, 710, 710, 710, 710,
- 710, 710, 710, 710, 710, 710, 710, 710,
-
- 710, 710, 710, 710, 710, 710, 710, 710,
- 710, 710, 710, 710, 710, 710, 710, 710,
- 710, 711, 710, 712, 711, 711, 711, 711,
- 713, 713, 714, 201, 201, 201, 201, 12,
-
- 710, 710, 710, 710, 710, 710, 715, 711,
- 716, 716, 716, 716, 711, 711, 711, 717,
- 718, 719, 720, 721, 722, 723, 724, 725,
- 726, 727, 728, 728, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 729, 729, 201, 729, 201, 201, 729,
- 729, 201, 729, 201, 201, 729, 201, 201,
- 201, 201, 201, 201, 729, 729, 729, 729,
- 201, 729, 729, 729, 729, 729, 729, 729,
-
- 201, 729, 729, 729, 201, 729, 201, 729,
- 201, 201, 729, 729, 201, 729, 729, 729,
- 729, 730, 729, 731, 730, 730, 730, 730,
- 732, 732, 201, 730, 730, 729, 201, 201,
-
- 729, 729, 729, 729, 729, 201, 733, 201,
- 734, 734, 734, 734, 730, 730, 201, 201,
- 735, 736, 737, 738, 739, 740, 741, 742,
- 743, 744, 201, 201, 745, 745, 746, 746,
-
- 747, 748, 748, 748, 749, 750, 749, 749,
- 751, 749, 749, 752, 753, 754, 754, 754,
- 754, 754, 751, 755, 754, 755, 755, 755,
- 756, 756, 755, 755, 755, 755, 755, 755,
-
- 757, 758, 759, 760, 761, 762, 763, 764,
- 765, 766, 767, 767, 767, 767, 767, 767,
- 767, 767, 767, 767, 768, 756, 755, 756,
- 755, 769, 770, 771, 770, 771, 772, 772,
-
- 747, 747, 747, 773, 747, 747, 747, 747,
- 201, 747, 747, 747, 747, 773, 747, 747,
- 747, 747, 773, 747, 747, 747, 747, 773,
- 747, 747, 747, 747, 773, 747, 747, 747,
-
- 747, 747, 747, 747, 747, 747, 747, 747,
- 747, 773, 774, 775, 775, 201, 201, 201,
- 201, 776, 777, 778, 779, 778, 778, 780,
- 778, 780, 777, 777, 777, 777, 781, 782,
-
- 777, 778, 783, 783, 784, 752, 783, 783,
- 747, 747, 747, 747, 785, 786, 786, 786,
- 781, 781, 781, 778, 781, 781, 787, 781,
- 201, 781, 781, 781, 781, 778, 781, 781,
-
- 781, 781, 778, 781, 781, 781, 781, 778,
- 781, 781, 781, 781, 778, 781, 787, 787,
- 787, 781, 781, 781, 781, 781, 781, 781,
- 787, 778, 787, 787, 787, 201, 788, 788,
-
- 789, 789, 789, 789, 789, 789, 790, 789,
- 789, 789, 789, 789, 789, 201, 791, 789,
- 792, 792, 793, 794, 795, 796, 796, 796,
- 796, 797, 797, 201, 201, 201, 201, 201,
-
- 798, 798, 798, 798, 798, 798, 798, 798,
- 798, 798, 798, 798, 798, 798, 798, 798,
- 798, 798, 798, 798, 798, 798, 798, 798,
- 798, 798, 798, 798, 798, 798, 798, 798,
-
- 798, 798, 799, 798, 798, 798, 800, 798,
- 799, 798, 798, 801, 802, 803, 804, 803,
- 803, 805, 803, 806, 806, 806, 803, 807,
- 802, 808, 809, 810, 810, 806, 806, 799,
-
- 811, 812, 813, 814, 815, 816, 817, 818,
- 819, 820, 821, 821, 822, 822, 822, 822,
- 798, 798, 798, 798, 798, 798, 805, 805,
- 803, 803, 799, 799, 799, 799, 806, 806,
-
- 806, 799, 801, 801, 801, 799, 799, 801,
- 801, 801, 801, 801, 801, 801, 799, 799,
- 799, 806, 806, 806, 806, 799, 799, 799,
- 799, 799, 799, 799, 799, 799, 799, 799,
-
- 799, 799, 806, 801, 810, 806, 806, 801,
- 801, 801, 801, 801, 801, 823, 799, 801,
- 824, 825, 826, 827, 828, 829, 830, 831,
- 832, 833, 834, 834, 834, 835, 836, 836,
-
- 837, 837, 837, 837, 837, 837, 837, 837,
- 837, 837, 837, 837, 837, 837, 837, 837,
- 837, 837, 837, 837, 837, 837, 837, 837,
- 837, 837, 837, 837, 837, 837, 837, 837,
-
- 837, 837, 837, 837, 837, 837, 201, 838,
- 201, 201, 201, 201, 201, 838, 201, 201,
- 839, 839, 839, 839, 839, 839, 839, 839,
- 839, 839, 839, 839, 839, 839, 839, 839,
-
- 839, 839, 839, 839, 839, 839, 839, 839,
- 839, 839, 839, 839, 839, 839, 839, 839,
- 839, 839, 839, 839, 839, 839, 839, 840,
- 840, 841, 841, 842, 843, 844, 844, 844,
-
- 845, 845, 845, 845, 845, 845, 845, 845,
- 845, 845, 845, 845, 845, 845, 845, 845,
- 845, 845, 845, 845, 845, 845, 845, 845,
- 845, 845, 845, 845, 845, 845, 845, 845,
-
- 845, 845, 845, 845, 845, 845, 845, 845,
- 845, 845, 845, 845, 845, 845, 845, 845,
- 845, 845, 845, 845, 845, 845, 845, 845,
- 845, 845, 846, 846, 846, 846, 846, 845,
-
- 847, 848, 848, 848, 848, 848, 848, 848,
- 848, 848, 848, 848, 848, 848, 848, 848,
- 848, 848, 848, 848, 848, 848, 847, 847,
- 847, 847, 847, 847, 847, 847, 847, 847,
-
- 847, 847, 847, 847, 847, 847, 847, 847,
- 847, 847, 847, 847, 847, 847, 847, 847,
- 847, 847, 847, 847, 847, 847, 847, 847,
- 847, 847, 847, 847, 847, 847, 847, 847,
-
- 847, 847, 847, 849, 849, 849, 849, 849,
- 850, 850, 850, 850, 850, 850, 850, 850,
- 850, 850, 850, 850, 850, 850, 850, 850,
- 850, 850, 850, 850, 850, 850, 850, 850,
-
- 850, 850, 850, 851, 851, 851, 851, 851,
- 851, 851, 851, 851, 851, 851, 851, 851,
- 851, 851, 851, 851, 851, 851, 851, 851,
- 851, 851, 851, 851, 851, 851, 851, 851,
+ 484, 484, 484, 484, 484, 484, 484, 484,
+ 484, 485, 484, 484, 484, 484, 484, 484,
+ 484, 485, 484, 484, 485, 484, 484, 484,
+ 484, 484, 486, 487, 488, 484, 482, 482,
+
+ 482, 481, 481, 481, 481, 481, 481, 481,
+ 481, 482, 482, 482, 482, 489, 490, 487,
+ 484, 173, 175, 173, 173, 480, 486, 486,
+ 491, 491, 491, 491, 491, 491, 491, 491,
+
+ 484, 484, 481, 481, 492, 492, 493, 494,
+ 495, 496, 497, 498, 499, 500, 501, 502,
+ 503, 504, 505, 506, 506, 506, 506, 506,
+ 507, 508, 508, 509, 509, 510, 509, 509,
+
+ 511, 512, 513, 513, 202, 514, 514, 514,
+ 514, 514, 514, 514, 514, 202, 202, 514,
+ 514, 202, 202, 514, 514, 514, 514, 514,
+ 514, 514, 514, 514, 514, 514, 514, 514,
+
+ 514, 514, 514, 514, 514, 514, 514, 514,
+ 514, 202, 514, 514, 514, 514, 514, 514,
+ 514, 202, 514, 202, 202, 202, 514, 514,
+ 514, 514, 202, 202, 515, 516, 517, 513,
+
+ 513, 512, 512, 512, 512, 202, 202, 513,
+ 513, 202, 202, 518, 518, 519, 520, 202,
+ 202, 202, 202, 202, 202, 202, 202, 517,
+ 202, 202, 202, 202, 521, 521, 202, 521,
+
+ 514, 514, 512, 512, 202, 202, 522, 523,
+ 524, 525, 526, 527, 528, 529, 530, 531,
+ 514, 514, 532, 532, 533, 533, 533, 533,
+ 533, 534, 535, 536, 537, 538, 539, 202,
+
+ 202, 540, 541, 542, 202, 543, 543, 543,
+ 543, 543, 543, 202, 202, 202, 202, 543,
+ 543, 202, 202, 543, 543, 543, 543, 543,
+ 543, 543, 543, 543, 543, 543, 543, 543,
+
+ 543, 543, 543, 543, 543, 543, 543, 543,
+ 543, 202, 543, 543, 543, 543, 543, 543,
+ 543, 202, 543, 544, 202, 543, 544, 202,
+ 543, 543, 202, 202, 545, 202, 546, 546,
+
+ 546, 541, 541, 202, 202, 202, 202, 541,
+ 541, 202, 202, 541, 541, 547, 202, 202,
+ 202, 548, 202, 202, 202, 202, 202, 202,
+ 202, 544, 544, 544, 543, 202, 544, 202,
+
+ 202, 202, 202, 202, 202, 202, 549, 550,
+ 551, 552, 553, 554, 555, 556, 557, 558,
+ 541, 541, 543, 543, 543, 548, 559, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 560, 560, 561, 202, 562, 562, 562,
+ 562, 562, 562, 562, 563, 562, 202, 562,
+ 562, 562, 202, 562, 562, 562, 562, 562,
+ 562, 562, 562, 562, 562, 562, 562, 562,
+
+ 562, 562, 562, 562, 562, 562, 562, 562,
+ 562, 202, 562, 562, 562, 562, 562, 562,
+ 562, 202, 562, 562, 202, 562, 562, 562,
+ 562, 562, 202, 202, 564, 562, 561, 561,
+
+ 561, 560, 560, 560, 560, 560, 202, 560,
+ 560, 561, 202, 561, 561, 565, 202, 202,
+ 562, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 562, 563, 566, 566, 202, 202, 567, 568,
+ 569, 570, 571, 572, 573, 574, 575, 576,
+ 577, 578, 202, 202, 202, 202, 202, 202,
+ 202, 579, 580, 580, 580, 580, 580, 580,
+
+ 202, 581, 582, 582, 202, 583, 583, 583,
+ 583, 583, 583, 583, 583, 202, 202, 583,
+ 583, 202, 202, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 202, 583, 583, 583, 583, 583, 583,
+ 583, 202, 583, 583, 202, 584, 583, 583,
+ 583, 583, 202, 202, 585, 583, 586, 581,
+
+ 582, 581, 581, 581, 587, 202, 202, 582,
+ 588, 202, 202, 588, 588, 589, 202, 202,
+ 202, 202, 202, 202, 202, 202, 590, 586,
+ 202, 202, 202, 202, 591, 591, 202, 583,
+
+ 583, 583, 587, 587, 202, 202, 592, 593,
+ 594, 595, 596, 597, 598, 599, 600, 601,
+ 602, 584, 603, 603, 603, 603, 603, 603,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 202, 604, 605, 202, 605, 605, 605,
+ 605, 605, 605, 202, 202, 202, 605, 605,
+ 605, 202, 605, 605, 606, 605, 202, 202,
+ 202, 605, 605, 202, 605, 202, 605, 605,
+
+ 202, 202, 202, 605, 605, 202, 202, 202,
+ 605, 605, 605, 202, 202, 202, 605, 605,
+ 605, 605, 605, 605, 605, 605, 607, 605,
+ 605, 605, 202, 202, 202, 202, 608, 609,
+
+ 604, 609, 609, 202, 202, 202, 609, 609,
+ 609, 202, 610, 610, 610, 611, 202, 202,
+ 612, 202, 202, 202, 202, 202, 202, 608,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 202, 202, 202, 202, 202, 613, 614,
+ 615, 616, 617, 618, 619, 620, 621, 622,
+ 623, 623, 623, 624, 624, 624, 624, 624,
+ 624, 625, 624, 202, 202, 202, 202, 202,
+
+ 626, 627, 627, 627, 628, 629, 629, 629,
+ 629, 629, 629, 629, 629, 202, 629, 629,
+ 629, 202, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 202, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 630, 629, 629, 629,
+ 629, 629, 202, 202, 202, 631, 632, 632,
+
+ 632, 627, 627, 627, 627, 202, 632, 632,
+ 633, 202, 632, 632, 632, 634, 202, 202,
+ 202, 202, 202, 202, 202, 635, 636, 202,
+ 631, 631, 637, 202, 202, 202, 202, 202,
+
+ 629, 629, 638, 638, 202, 202, 639, 640,
+ 641, 642, 643, 644, 645, 646, 647, 648,
+ 202, 202, 202, 202, 202, 202, 202, 649,
+ 650, 650, 650, 650, 650, 650, 650, 651,
+
+ 652, 653, 654, 654, 655, 656, 656, 656,
+ 656, 656, 656, 656, 656, 202, 656, 656,
+ 656, 202, 656, 656, 656, 656, 656, 656,
+ 656, 656, 656, 656, 656, 656, 656, 656,
+
+ 656, 656, 656, 656, 656, 656, 656, 656,
+ 656, 202, 656, 656, 656, 656, 656, 656,
+ 656, 656, 656, 656, 202, 656, 656, 656,
+ 656, 656, 202, 202, 657, 658, 654, 659,
+
+ 660, 654, 661, 654, 654, 202, 659, 660,
+ 660, 202, 660, 660, 662, 663, 202, 202,
+ 202, 202, 202, 202, 202, 661, 661, 202,
+ 202, 202, 202, 202, 202, 202, 656, 202,
+
+ 656, 656, 664, 664, 202, 202, 665, 666,
+ 667, 668, 669, 670, 671, 672, 673, 674,
+ 202, 675, 675, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 676, 677, 678, 678, 202, 679, 679, 679,
+ 679, 679, 679, 679, 679, 202, 679, 679,
+ 679, 202, 679, 679, 679, 679, 679, 679,
+ 679, 679, 679, 679, 679, 679, 679, 679,
+
+ 679, 679, 679, 679, 679, 679, 679, 679,
+ 679, 680, 679, 679, 679, 679, 679, 679,
+ 679, 679, 679, 679, 679, 679, 679, 679,
+ 679, 679, 680, 681, 681, 682, 683, 678,
+
+ 678, 684, 684, 684, 685, 202, 678, 678,
+ 678, 202, 686, 686, 686, 687, 688, 689,
+ 202, 202, 202, 202, 690, 690, 690, 683,
+ 691, 691, 691, 691, 691, 691, 691, 692,
+
+ 679, 679, 685, 685, 202, 202, 693, 694,
+ 695, 696, 697, 698, 699, 700, 701, 702,
+ 703, 703, 703, 703, 703, 703, 691, 691,
+ 691, 704, 682, 682, 682, 682, 682, 682,
+
+ 202, 202, 705, 705, 202, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 202,
+ 202, 202, 706, 706, 706, 706, 706, 706,
+
+ 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 202, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 202, 706, 202, 202,
+
+ 706, 706, 706, 706, 706, 706, 706, 202,
+ 202, 202, 707, 202, 202, 202, 202, 708,
+ 705, 705, 709, 709, 709, 202, 709, 202,
+ 705, 705, 710, 705, 710, 710, 710, 708,
+
+ 202, 202, 202, 202, 202, 202, 711, 712,
+ 713, 714, 715, 716, 717, 718, 719, 720,
+ 202, 202, 705, 705, 721, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 722, 722, 722, 722, 722, 722, 722,
+ 722, 722, 722, 722, 722, 722, 722, 722,
+ 722, 722, 722, 722, 722, 722, 722, 722,
+ 722, 722, 722, 722, 722, 722, 722, 722,
+
+ 722, 722, 722, 722, 722, 722, 722, 722,
+ 722, 722, 722, 722, 722, 722, 722, 722,
+ 722, 723, 722, 724, 723, 723, 723, 723,
+ 725, 725, 726, 202, 202, 202, 202, 12,
+
+ 722, 722, 722, 722, 722, 722, 727, 723,
+ 728, 728, 728, 728, 723, 723, 723, 729,
+ 730, 731, 732, 733, 734, 735, 736, 737,
+ 738, 739, 740, 740, 202, 202, 202, 202,
+
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 741, 741, 202, 741, 202, 742, 741,
+ 741, 742, 741, 202, 742, 741, 742, 742,
+ 742, 742, 742, 742, 741, 741, 741, 741,
+ 742, 741, 741, 741, 741, 741, 741, 741,
+
+ 742, 741, 741, 741, 202, 741, 202, 741,
+ 742, 742, 741, 741, 742, 741, 741, 741,
+ 741, 743, 741, 744, 743, 743, 743, 743,
+ 745, 745, 746, 743, 743, 741, 202, 202,
+
+ 741, 741, 741, 741, 741, 202, 747, 202,
+ 748, 748, 748, 748, 743, 743, 202, 202,
+ 749, 750, 751, 752, 753, 754, 755, 756,
+ 757, 758, 202, 202, 759, 759, 760, 760,
+
+ 761, 762, 762, 762, 763, 764, 763, 763,
+ 765, 763, 763, 766, 767, 768, 768, 768,
+ 768, 768, 765, 769, 768, 769, 769, 769,
+ 770, 770, 769, 769, 769, 769, 769, 769,
+
+ 771, 772, 773, 774, 775, 776, 777, 778,
+ 779, 780, 781, 781, 781, 781, 781, 781,
+ 781, 781, 781, 781, 782, 770, 769, 770,
+ 769, 783, 784, 785, 784, 785, 786, 786,
+
+ 761, 761, 761, 787, 761, 761, 761, 761,
+ 202, 761, 761, 761, 761, 787, 761, 761,
+ 761, 761, 787, 761, 761, 761, 761, 787,
+ 761, 761, 761, 761, 787, 761, 761, 761,
+
+ 761, 761, 761, 761, 761, 761, 761, 761,
+ 761, 787, 788, 789, 789, 202, 202, 202,
+ 202, 790, 791, 792, 793, 792, 792, 794,
+ 792, 794, 791, 791, 791, 791, 795, 796,
+
+ 791, 792, 797, 797, 798, 766, 797, 797,
+ 761, 761, 761, 761, 799, 800, 800, 800,
+ 795, 795, 795, 792, 795, 795, 801, 795,
+ 202, 795, 795, 795, 795, 792, 795, 795,
+
+ 795, 795, 792, 795, 795, 795, 795, 792,
+ 795, 795, 795, 795, 792, 795, 801, 801,
+ 801, 795, 795, 795, 795, 795, 795, 795,
+ 801, 792, 801, 801, 801, 202, 802, 802,
+
+ 803, 803, 803, 803, 803, 803, 804, 803,
+ 803, 803, 803, 803, 803, 202, 805, 803,
+ 806, 806, 807, 808, 809, 810, 810, 810,
+ 810, 811, 811, 202, 202, 202, 202, 202,
+
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+ 812, 812, 812, 812, 812, 812, 812, 812,
+
+ 812, 812, 813, 812, 812, 812, 814, 812,
+ 813, 812, 812, 815, 816, 817, 818, 817,
+ 817, 819, 817, 820, 820, 820, 817, 821,
+ 816, 822, 823, 824, 824, 820, 820, 813,
+
+ 825, 826, 827, 828, 829, 830, 831, 832,
+ 833, 834, 835, 835, 836, 836, 836, 836,
+ 812, 812, 812, 812, 812, 812, 819, 819,
+ 817, 817, 813, 813, 813, 813, 820, 820,
+
+ 820, 813, 815, 815, 815, 813, 813, 815,
+ 815, 815, 815, 815, 815, 815, 813, 813,
+ 813, 820, 820, 820, 820, 813, 813, 813,
+ 813, 813, 813, 813, 813, 813, 813, 813,
+
+ 813, 813, 820, 815, 824, 820, 820, 815,
+ 815, 815, 815, 815, 815, 837, 813, 815,
+ 838, 839, 840, 841, 842, 843, 844, 845,
+ 846, 847, 848, 848, 848, 849, 850, 850,
851, 851, 851, 851, 851, 851, 851, 851,
851, 851, 851, 851, 851, 851, 851, 851,
851, 851, 851, 851, 851, 851, 851, 851,
- 851, 851, 852, 852, 852, 852, 852, 852,
-
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
-
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
-
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 201, 853, 853, 853, 853, 201, 201,
- 853, 853, 853, 853, 853, 853, 853, 201,
- 853, 201, 853, 853, 853, 853, 201, 201,
-
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 201, 853, 853, 853, 853, 201, 201,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
+ 851, 851, 851, 851, 851, 851, 851, 851,
+ 851, 851, 851, 851, 851, 851, 202, 852,
+ 202, 202, 202, 202, 202, 852, 202, 202,
853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 201, 853, 853, 853, 853, 201, 201,
- 853, 853, 853, 853, 853, 853, 853, 201,
-
- 853, 201, 853, 853, 853, 853, 201, 201,
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 853, 853, 853, 853, 853, 853, 201,
853, 853, 853, 853, 853, 853, 853, 853,
853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
-
853, 853, 853, 853, 853, 853, 853, 853,
853, 853, 853, 853, 853, 853, 853, 854,
- 853, 201, 853, 853, 853, 853, 201, 201,
- 853, 853, 853, 853, 853, 853, 853, 854,
-
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 201, 201, 855, 855, 856,
-
- 857, 858, 859, 860, 860, 860, 860, 859,
- 859, 861, 862, 863, 864, 865, 866, 867,
- 868, 869, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 201, 201, 201,
-
- 854, 854, 854, 854, 854, 854, 854, 854,
- 854, 854, 854, 854, 854, 854, 854, 854,
- 871, 871, 871, 871, 871, 871, 871, 871,
- 871, 871, 201, 201, 201, 201, 201, 201,
-
- 872, 873, 874, 875, 876, 877, 878, 879,
- 880, 881, 882, 883, 884, 885, 886, 887,
- 888, 889, 890, 891, 892, 893, 894, 895,
- 896, 897, 898, 899, 900, 901, 902, 903,
-
- 904, 905, 906, 907, 908, 909, 910, 911,
- 912, 913, 914, 915, 916, 917, 918, 919,
- 920, 921, 922, 923, 924, 925, 926, 927,
- 928, 929, 930, 931, 932, 933, 934, 935,
-
- 936, 937, 938, 939, 940, 941, 942, 943,
- 944, 945, 946, 947, 948, 949, 950, 951,
- 952, 952, 952, 952, 952, 953, 201, 201,
- 954, 954, 954, 954, 954, 954, 201, 201,
-
- 955, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 956, 956, 956,
-
- 956, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 956, 956, 956,
-
- 956, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 957, 958, 956,
- 956, 956, 956, 956, 956, 956, 956, 959,
- 959, 959, 959, 959, 959, 959, 959, 959,
-
- 960, 961, 961, 961, 961, 961, 961, 961,
- 961, 961, 961, 961, 961, 961, 961, 961,
- 961, 961, 961, 961, 961, 961, 961, 961,
- 961, 961, 961, 962, 963, 201, 201, 201,
-
- 964, 964, 964, 964, 964, 964, 964, 964,
- 964, 964, 964, 964, 964, 964, 964, 964,
- 964, 964, 964, 964, 964, 964, 964, 964,
- 964, 964, 964, 964, 964, 964, 964, 964,
-
- 964, 964, 964, 964, 964, 964, 964, 964,
- 964, 964, 964, 965, 965, 965, 966, 966,
- 966, 967, 967, 967, 967, 967, 967, 967,
- 967, 201, 201, 201, 201, 201, 201, 201,
-
- 968, 968, 968, 968, 968, 968, 968, 968,
- 968, 968, 968, 968, 968, 201, 968, 968,
- 968, 968, 969, 969, 970, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 971, 971, 971, 971, 971, 971, 971, 971,
- 971, 971, 971, 971, 971, 971, 971, 971,
- 971, 971, 972, 972, 973, 974, 974, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
+ 854, 855, 855, 856, 857, 858, 858, 858,
+
+ 859, 859, 859, 859, 859, 859, 859, 859,
+ 859, 859, 859, 859, 859, 859, 859, 859,
+ 859, 859, 859, 859, 859, 859, 859, 859,
+ 859, 859, 859, 859, 859, 859, 859, 859,
+
+ 859, 859, 859, 859, 859, 859, 859, 859,
+ 859, 859, 859, 859, 859, 859, 859, 859,
+ 859, 859, 859, 859, 859, 859, 859, 859,
+ 859, 859, 860, 860, 860, 860, 860, 859,
+
+ 861, 862, 862, 862, 862, 862, 862, 862,
+ 862, 862, 862, 862, 862, 862, 862, 862,
+ 862, 862, 862, 862, 862, 862, 861, 861,
+ 861, 861, 861, 861, 861, 861, 861, 861,
+
+ 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 861, 861, 861, 861, 861, 861, 861,
+ 861, 861, 861, 861, 861, 861, 861, 861,
+
+ 861, 861, 861, 863, 863, 863, 863, 863,
+ 864, 864, 864, 864, 864, 864, 864, 864,
+ 864, 864, 864, 864, 864, 864, 864, 864,
+ 864, 864, 864, 864, 864, 864, 864, 864,
+
+ 864, 864, 864, 865, 865, 865, 865, 865,
+ 865, 865, 865, 865, 865, 865, 865, 865,
+ 865, 865, 865, 865, 865, 865, 865, 865,
+ 865, 865, 865, 865, 865, 865, 865, 865,
+
+ 865, 865, 865, 865, 865, 865, 865, 865,
+ 865, 865, 865, 865, 865, 865, 865, 865,
+ 865, 865, 865, 865, 865, 865, 865, 865,
+ 865, 865, 866, 866, 866, 866, 866, 866,
+
+ 867, 867, 867, 867, 867, 867, 867, 868,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+
+ 867, 867, 867, 867, 867, 867, 867, 867,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+
+ 867, 867, 867, 867, 867, 867, 867, 868,
+ 867, 202, 867, 867, 867, 867, 202, 202,
+ 867, 867, 867, 867, 867, 867, 867, 202,
+ 867, 202, 867, 867, 867, 867, 202, 202,
+
+ 867, 867, 867, 867, 867, 867, 867, 868,
+ 867, 202, 867, 867, 867, 867, 202, 202,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+
+ 867, 867, 867, 867, 867, 867, 867, 867,
+ 867, 867, 867, 867, 867, 867, 867, 868,
+ 867, 202, 867, 867, 867, 867, 202, 202,
+ 867, 867, 867, 867, 867, 867, 867, 202,
+
+ 867, 202, 867, 867, 867, 867, 202, 202,
+ 867, 867, 867, 867, 867, 867, 867, 868,
+ 867, 867, 867, 867, 867, 867, 867, 202,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+
+ 867, 867, 867, 867, 867, 867, 867, 867,
+ 867, 867, 867, 867, 867, 867, 867, 868,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+
+ 867, 867, 867, 867, 867, 867, 867, 867,
+ 867, 867, 867, 867, 867, 867, 867, 868,
+ 867, 202, 867, 867, 867, 867, 202, 202,
+ 867, 867, 867, 867, 867, 867, 867, 868,
+
+ 867, 867, 867, 867, 867, 867, 867, 868,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+ 867, 867, 867, 867, 867, 867, 867, 867,
+ 867, 867, 867, 202, 202, 869, 869, 870,
+
+ 871, 872, 873, 874, 874, 874, 874, 873,
+ 873, 875, 876, 877, 878, 879, 880, 881,
+ 882, 883, 884, 884, 884, 884, 884, 884,
+ 884, 884, 884, 884, 884, 202, 202, 202,
+
+ 868, 868, 868, 868, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 868,
+ 885, 885, 885, 885, 885, 885, 885, 885,
+ 885, 885, 202, 202, 202, 202, 202, 202,
+
+ 886, 887, 888, 889, 890, 891, 892, 893,
+ 894, 895, 896, 897, 898, 899, 900, 901,
+ 902, 903, 904, 905, 906, 907, 908, 909,
+ 910, 911, 912, 913, 914, 915, 916, 917,
+
+ 918, 919, 920, 921, 922, 923, 924, 925,
+ 926, 927, 928, 929, 930, 931, 932, 933,
+ 934, 935, 936, 937, 938, 939, 940, 941,
+ 942, 943, 944, 945, 946, 947, 948, 949,
+
+ 950, 951, 952, 953, 954, 955, 956, 957,
+ 958, 959, 960, 961, 962, 963, 964, 965,
+ 966, 966, 966, 966, 966, 967, 202, 202,
+ 968, 968, 968, 968, 968, 968, 202, 202,
+
+ 969, 970, 970, 970, 970, 970, 970, 970,
+ 970, 970, 970, 970, 970, 970, 970, 970,
+ 970, 970, 970, 970, 970, 970, 970, 970,
+ 970, 970, 970, 970, 970, 970, 970, 970,
+
+ 970, 970, 970, 970, 970, 970, 970, 970,
+ 970, 970, 970, 970, 970, 970, 970, 970,
+ 970, 970, 970, 970, 970, 970, 970, 970,
+ 970, 970, 970, 970, 970, 970, 970, 970,
+
+ 970, 970, 970, 970, 970, 970, 970, 970,
+ 970, 970, 970, 970, 970, 971, 972, 970,
+ 970, 970, 970, 970, 970, 970, 970, 973,
+ 973, 973, 973, 973, 973, 973, 973, 973,
+
+ 974, 975, 975, 975, 975, 975, 975, 975,
975, 975, 975, 975, 975, 975, 975, 975,
975, 975, 975, 975, 975, 975, 975, 975,
- 975, 975, 976, 976, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 977, 977, 977, 977, 977, 977, 977, 977,
- 977, 977, 977, 977, 977, 201, 977, 977,
- 977, 201, 978, 978, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 979, 979, 979, 979, 979, 979, 979, 979,
- 979, 979, 979, 979, 979, 979, 979, 979,
- 979, 979, 979, 979, 979, 979, 979, 979,
- 979, 979, 979, 979, 979, 979, 979, 979,
-
- 979, 979, 979, 979, 979, 979, 979, 979,
- 979, 979, 979, 979, 979, 979, 979, 979,
- 979, 979, 979, 979, 980, 980, 981, 980,
- 980, 980, 980, 980, 980, 980, 981, 981,
-
- 981, 981, 981, 981, 981, 981, 980, 981,
- 981, 980, 980, 980, 980, 980, 980, 980,
- 980, 980, 982, 980, 983, 983, 984, 985,
- 983, 986, 983, 987, 979, 988, 201, 201,
-
- 989, 990, 991, 992, 993, 994, 995, 996,
- 997, 998, 201, 201, 201, 201, 201, 201,
- 999, 999, 999, 999, 999, 999, 999, 999,
- 999, 999, 201, 201, 201, 201, 201, 201,
-
- 1000, 1000, 1001, 1002, 1003, 1004, 1005, 1006,
- 1007, 1008, 1009, 1010, 1010, 1010, 1011, 201,
- 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019,
- 1020, 1021, 201, 201, 201, 201, 201, 201,
-
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
-
- 1022, 1022, 1022, 1023, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
-
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1024, 1024, 1024, 1024, 1024, 1010, 1010, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
-
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1025, 1026, 201, 201, 201, 201, 201,
- 959, 959, 959, 959, 959, 959, 959, 959,
- 959, 959, 959, 959, 959, 959, 959, 959,
-
- 959, 959, 959, 959, 959, 959, 959, 959,
- 959, 959, 959, 959, 959, 959, 959, 959,
- 959, 959, 959, 959, 959, 959, 959, 959,
- 959, 959, 959, 959, 959, 959, 959, 959,
-
- 959, 959, 959, 959, 959, 959, 959, 959,
- 959, 959, 959, 959, 959, 959, 959, 959,
- 959, 959, 959, 959, 959, 959, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
- 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
- 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
- 1027, 1027, 1027, 1027, 1027, 1028, 1028, 201,
-
- 1029, 1029, 1029, 1030, 1030, 1030, 1030, 1029,
- 1029, 1030, 1030, 1030, 201, 201, 201, 201,
- 1030, 1030, 1029, 1030, 1030, 1030, 1030, 1030,
- 1030, 1031, 1032, 1033, 201, 201, 201, 201,
-
- 1034, 201, 201, 201, 1035, 1035, 1036, 1037,
- 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045,
- 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
- 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
-
- 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
- 1046, 1046, 1046, 1046, 1046, 1046, 201, 201,
- 1046, 1046, 1046, 1046, 1046, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
-
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
- 1047, 1047, 1048, 1048, 201, 201, 201, 201,
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
-
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
- 1047, 1047, 201, 201, 201, 201, 201, 201,
- 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056,
- 1057, 1058, 1059, 201, 201, 201, 1060, 1060,
-
- 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 975, 975, 975, 976, 977, 202, 202, 202,
+
+ 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 978, 978, 978, 978, 978,
+
+ 978, 978, 978, 978, 978, 978, 978, 978,
+ 978, 978, 978, 979, 979, 979, 980, 980,
+ 980, 981, 981, 981, 981, 981, 981, 981,
+ 981, 202, 202, 202, 202, 202, 202, 202,
+
+ 982, 982, 982, 982, 982, 982, 982, 982,
+ 982, 982, 982, 982, 982, 202, 982, 982,
+ 982, 982, 983, 983, 984, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985,
+ 985, 985, 986, 986, 987, 988, 988, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 989, 989, 989, 989, 989, 989, 989, 989,
+ 989, 989, 989, 989, 989, 989, 989, 989,
+ 989, 989, 990, 990, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 991, 991, 991, 991, 991, 991, 991, 991,
+ 991, 991, 991, 991, 991, 202, 991, 991,
+ 991, 202, 992, 992, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 994, 994, 995, 994,
+ 994, 994, 994, 994, 994, 994, 995, 995,
+
+ 995, 995, 995, 995, 995, 995, 994, 995,
+ 995, 994, 994, 994, 994, 994, 994, 994,
+ 994, 994, 996, 994, 997, 997, 998, 999,
+ 997, 1000, 997, 1001, 993, 1002, 202, 202,
+
+ 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010,
+ 1011, 1012, 202, 202, 202, 202, 202, 202,
+ 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
+ 1013, 1013, 202, 202, 202, 202, 202, 202,
+
+ 1014, 1014, 1015, 1016, 1017, 1018, 1019, 1020,
+ 1021, 1022, 1023, 1024, 1024, 1024, 1025, 202,
+ 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033,
+ 1034, 1035, 202, 202, 202, 202, 202, 202,
+
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+
+ 1036, 1036, 1036, 1037, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1038, 202, 202, 202, 202, 202, 202, 202,
+
+ 1039, 1039, 1039, 1039, 1039, 1024, 1024, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+
+ 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036,
+ 1036, 1040, 1041, 202, 202, 202, 202, 202,
+ 973, 973, 973, 973, 973, 973, 973, 973,
+ 973, 973, 973, 973, 973, 973, 973, 973,
+
+ 973, 973, 973, 973, 973, 973, 973, 973,
+ 973, 973, 973, 973, 973, 973, 973, 973,
+ 973, 973, 973, 973, 973, 973, 973, 973,
+ 973, 973, 973, 973, 973, 973, 973, 973,
+
+ 973, 973, 973, 973, 973, 973, 973, 973,
+ 973, 973, 973, 973, 973, 973, 973, 973,
+ 973, 973, 973, 973, 973, 973, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+ 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+ 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+ 1042, 1042, 1042, 1042, 1042, 1043, 1043, 202,
+
+ 1044, 1044, 1044, 1045, 1045, 1045, 1045, 1044,
+ 1044, 1045, 1045, 1045, 202, 202, 202, 202,
+ 1045, 1045, 1044, 1045, 1045, 1045, 1045, 1045,
+ 1045, 1046, 1047, 1048, 202, 202, 202, 202,
+
+ 1049, 202, 202, 202, 1050, 1050, 1051, 1052,
+ 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060,
1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+
1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 202, 202,
+ 1061, 1061, 1061, 1061, 1061, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
- 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1063,
- 1064, 1065, 1065, 1066, 201, 201, 1067, 1067,
-
- 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
- 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
- 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
- 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
-
- 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
- 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
- 1068, 1068, 1068, 1068, 1068, 1069, 1070, 1069,
- 1070, 1070, 1070, 1070, 1070, 1070, 1070, 201,
-
- 1071, 1072, 1070, 1072, 1072, 1070, 1070, 1070,
- 1070, 1070, 1070, 1070, 1070, 1069, 1069, 1069,
- 1069, 1069, 1069, 1070, 1070, 1073, 1073, 1073,
- 1073, 1073, 1073, 1073, 1073, 201, 201, 1074,
-
- 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082,
- 1083, 1084, 201, 201, 201, 201, 201, 201,
- 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082,
- 1083, 1084, 201, 201, 201, 201, 201, 201,
-
- 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1086,
- 1087, 1087, 1087, 1087, 1085, 1085, 201, 201,
- 1088, 1088, 1088, 1088, 1088, 1089, 1089, 1089,
- 1089, 1089, 1089, 1088, 1088, 1089, 1090, 201,
-
- 1091, 1091, 1091, 1091, 1092, 1093, 1094, 1093,
- 1094, 1093, 1094, 1093, 1094, 1093, 1094, 1093,
- 1093, 1093, 1094, 1093, 1093, 1093, 1093, 1093,
- 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
-
- 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
- 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
- 1093, 1093, 1093, 1093, 1095, 1096, 1091, 1091,
- 1091, 1091, 1091, 1097, 1091, 1097, 1092, 1092,
-
- 1097, 1097, 1091, 1097, 1098, 1093, 1093, 1093,
- 1093, 1093, 1093, 1093, 201, 201, 201, 201,
- 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106,
- 1107, 1108, 1109, 1109, 1110, 1111, 1109, 1109,
-
- 1111, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
- 1112, 1112, 1112, 1113, 1114, 1113, 1113, 1113,
- 1113, 1113, 1113, 1113, 1112, 1112, 1112, 1112,
- 1112, 1112, 1112, 1112, 1112, 201, 201, 201,
-
- 1115, 1115, 1116, 1117, 1117, 1117, 1117, 1117,
- 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117,
- 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117,
- 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117,
-
- 1117, 1116, 1115, 1115, 1115, 1115, 1116, 1116,
- 1115, 1115, 1118, 1119, 1120, 1120, 1117, 1117,
- 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128,
- 1129, 1130, 1131, 1131, 1131, 1131, 1131, 1131,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
- 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 1063, 1063, 202, 202, 202, 202,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+
+ 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 202, 202, 202, 202, 202, 202,
+ 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071,
+ 1072, 1073, 1074, 202, 202, 202, 1075, 1075,
+
+ 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076,
+ 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076,
+ 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076,
+ 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076,
+
+ 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077,
+ 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077,
+ 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1078,
+ 1079, 1080, 1080, 1081, 202, 202, 1082, 1082,
+
+ 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083,
+ 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083,
+ 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083,
+ 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083,
+
+ 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083,
+ 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083,
+ 1083, 1083, 1083, 1083, 1083, 1084, 1085, 1084,
+ 1085, 1085, 1085, 1085, 1085, 1085, 1085, 202,
+
+ 1086, 1087, 1085, 1087, 1087, 1085, 1085, 1085,
+ 1085, 1085, 1085, 1085, 1085, 1084, 1084, 1084,
+ 1084, 1084, 1084, 1085, 1085, 1088, 1088, 1088,
+ 1088, 1088, 1088, 1088, 1088, 202, 202, 1089,
+
+ 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097,
+ 1098, 1099, 202, 202, 202, 202, 202, 202,
+ 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097,
+ 1098, 1099, 202, 202, 202, 202, 202, 202,
+
+ 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1101,
+ 1102, 1102, 1102, 1102, 1100, 1100, 202, 202,
+ 1103, 1103, 1103, 1103, 1103, 1104, 1104, 1104,
+ 1104, 1104, 1104, 1103, 1103, 1104, 1105, 202,
+
+ 1106, 1106, 1106, 1106, 1107, 1108, 1109, 1108,
+ 1109, 1108, 1109, 1108, 1109, 1108, 1109, 1108,
+ 1108, 1108, 1109, 1108, 1108, 1108, 1108, 1108,
+ 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108,
+
+ 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108,
+ 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108,
+ 1108, 1108, 1108, 1108, 1110, 1111, 1106, 1106,
+ 1106, 1106, 1106, 1112, 1106, 1112, 1107, 1107,
+
+ 1112, 1112, 1106, 1112, 1113, 1108, 1108, 1108,
+ 1108, 1108, 1108, 1108, 202, 202, 202, 202,
+ 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121,
+ 1122, 1123, 1124, 1124, 1125, 1126, 1124, 1124,
+
+ 1126, 1127, 1127, 1127, 1127, 1127, 1127, 1127,
+ 1127, 1127, 1127, 1128, 1129, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1127, 1127, 1127, 1127,
+ 1127, 1127, 1127, 1127, 1127, 202, 202, 202,
+
+ 1130, 1130, 1131, 1132, 1132, 1132, 1132, 1132,
1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
- 1132, 1132, 1132, 1132, 1132, 1132, 1133, 1134,
- 1135, 1135, 1134, 1134, 1134, 1135, 1134, 1135,
- 1135, 1135, 1136, 1136, 201, 201, 201, 201,
- 201, 201, 201, 201, 1137, 1137, 1137, 1137,
-
- 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
- 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
- 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
- 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
-
- 1138, 1138, 1138, 1138, 1139, 1139, 1139, 1139,
- 1139, 1139, 1139, 1139, 1140, 1140, 1140, 1140,
- 1140, 1140, 1140, 1140, 1139, 1139, 1140, 1141,
- 201, 201, 201, 1142, 1142, 1143, 1143, 1143,
-
- 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151,
- 1152, 1153, 201, 201, 201, 1138, 1138, 1138,
- 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161,
- 1162, 1163, 1164, 1164, 1164, 1164, 1164, 1164,
-
- 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164,
- 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164,
- 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164,
- 1165, 1165, 1165, 1165, 1165, 1165, 1166, 1166,
-
- 1167, 1168, 1169, 1170, 1170, 1171, 1172, 1173,
- 1174, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 1176, 1176, 1176, 1177, 1178, 1179, 1179, 1179,
- 1179, 1179, 1176, 1176, 1179, 1179, 1179, 1179,
-
- 1176, 1180, 1178, 1178, 1178, 1178, 1178, 1178,
- 1178, 1181, 1181, 1181, 1181, 1179, 1181, 1181,
- 1181, 1181, 1180, 1182, 1183, 1184, 1184, 1185,
- 1088, 1088, 201, 201, 201, 201, 201, 201,
+ 1132, 1131, 1130, 1130, 1130, 1130, 1131, 1131,
+ 1130, 1130, 1133, 1134, 1135, 1135, 1132, 1132,
+ 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143,
+ 1144, 1145, 1146, 1146, 1146, 1146, 1146, 1146,
+
+ 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147,
+ 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147,
+ 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147,
+ 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147,
+
+ 1147, 1147, 1147, 1147, 1147, 1147, 1148, 1149,
+ 1150, 1150, 1149, 1149, 1149, 1150, 1149, 1150,
+ 1150, 1150, 1151, 1151, 202, 202, 202, 202,
+ 202, 202, 202, 202, 1152, 1152, 1152, 1152,
+
+ 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153,
+ 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153,
+ 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153,
+ 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153,
+
+ 1153, 1153, 1153, 1153, 1154, 1154, 1154, 1154,
+ 1154, 1154, 1154, 1154, 1155, 1155, 1155, 1155,
+ 1155, 1155, 1155, 1155, 1154, 1154, 1155, 1156,
+ 202, 202, 202, 1157, 1157, 1158, 1158, 1158,
+
+ 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166,
+ 1167, 1168, 202, 202, 202, 1153, 1153, 1153,
+ 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176,
+ 1177, 1178, 1179, 1179, 1179, 1179, 1179, 1179,
+
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1180, 1180, 1180, 1180, 1180, 1180, 1181, 1181,
+
+ 1182, 1183, 1184, 1185, 1185, 1186, 1187, 1188,
+ 1189, 202, 202, 202, 202, 202, 202, 202,
+ 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190,
+ 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190,
+
+ 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190,
+ 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190,
+ 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190,
+ 1190, 1190, 1190, 202, 202, 1190, 1190, 1190,
+
+ 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 1192, 1192, 1192, 1193, 1194, 1195, 1195, 1195,
+ 1195, 1195, 1192, 1192, 1195, 1195, 1195, 1195,
+
+ 1192, 1196, 1194, 1194, 1194, 1194, 1194, 1194,
+ 1194, 1197, 1197, 1197, 1197, 1195, 1197, 1197,
+ 1197, 1197, 1197, 1198, 1199, 1198, 1198, 1200,
+ 1103, 1103, 1201, 202, 202, 202, 202, 202,
114, 114, 114, 114, 114, 114, 114, 114,
114, 114, 114, 114, 114, 114, 114, 114,
114, 114, 114, 114, 114, 114, 114, 114,
114, 114, 114, 114, 114, 114, 114, 114,
- 114, 114, 114, 114, 114, 114, 1186, 1186,
- 1186, 1186, 1186, 1187, 1188, 1188, 1188, 1189,
- 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
- 1188, 1188, 1188, 1189, 1188, 1188, 1188, 1188,
+ 114, 114, 114, 114, 114, 114, 1202, 1202,
+ 1202, 1202, 1202, 1203, 1204, 1204, 1204, 1205,
+ 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
+ 1204, 1204, 1204, 1205, 1204, 1204, 1204, 1204,
- 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
- 1188, 1188, 1188, 1188, 1188, 1188, 1189, 1188,
- 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
- 1188, 1188, 1188, 1188, 1188, 1190, 1190, 1190,
+ 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
+ 1204, 1204, 1204, 1204, 1204, 1204, 1205, 1204,
+ 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
+ 1204, 1204, 1204, 1204, 1204, 1206, 1206, 1206,
- 1190, 1190, 1188, 1188, 1188, 1188, 1190, 1190,
- 1190, 1190, 1190, 114, 115, 115, 115, 115,
+ 1206, 1206, 1204, 1204, 1204, 1204, 1206, 1206,
+ 1206, 1206, 1206, 114, 115, 115, 115, 115,
115, 115, 115, 115, 115, 115, 115, 115,
- 1191, 1192, 115, 115, 115, 1193, 115, 115,
+ 1207, 1208, 115, 115, 115, 1209, 115, 115,
115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 1210, 115,
115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 1194, 1194, 1194, 1194, 1194,
+ 115, 115, 115, 1211, 1211, 1211, 1211, 1211,
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1195,
+ 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211,
+ 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211,
+ 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211,
+ 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1212,
- 190, 190, 189, 190, 1196, 1196, 1196, 1196,
- 1196, 1196, 1197, 1198, 1198, 1199, 1200, 1201,
- 1202, 1198, 1198, 1198, 1198, 1198, 1198, 1198,
- 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198,
+ 191, 191, 190, 191, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1214, 1215, 1215, 1216, 1217, 1218,
+ 1219, 1215, 1215, 1215, 1215, 1215, 1215, 1215,
+ 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215,
- 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1088,
- 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088,
- 1088, 1088, 1088, 1088, 1088, 1088, 1203, 1204,
- 1204, 1205, 201, 1206, 1207, 1179, 1196, 1197,
+ 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1103,
+ 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103,
+ 1103, 1103, 1103, 1103, 1103, 1103, 1220, 1221,
+ 1221, 1222, 202, 1223, 1224, 1195, 1213, 1214,
70, 71, 70, 71, 70, 71, 70, 71,
70, 71, 70, 71, 70, 71, 70, 71,
@@ -1944,258 +1949,258 @@ static const unsigned short uc_property_trie[] = {
70, 71, 70, 71, 70, 71, 70, 71,
70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 1208, 1209,
- 1210, 1211, 1212, 1213, 1214, 1214, 1215, 1214,
+ 70, 71, 70, 71, 70, 71, 1225, 1226,
+ 1227, 1228, 1229, 1230, 1231, 1231, 1232, 1231,
70, 71, 70, 71, 70, 71, 70, 71,
70, 71, 70, 71, 70, 71, 70, 71,
70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 1216, 1217, 1216, 1217, 1216, 1217,
-
- 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218,
- 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219,
- 1218, 1218, 1218, 1218, 1218, 1218, 201, 201,
- 1219, 1219, 1219, 1219, 1219, 1219, 201, 201,
-
- 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218,
- 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219,
- 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218,
- 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219,
-
- 1218, 1218, 1218, 1218, 1218, 1218, 201, 201,
- 1219, 1219, 1219, 1219, 1219, 1219, 201, 201,
- 1220, 1218, 1221, 1218, 1222, 1218, 1223, 1218,
- 201, 1219, 201, 1219, 201, 1219, 201, 1219,
-
- 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218,
- 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219,
- 1224, 1225, 1226, 1227, 1226, 1227, 1228, 1229,
- 1230, 1231, 1232, 1233, 1234, 1235, 201, 201,
-
- 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243,
- 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251,
- 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259,
- 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267,
-
- 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275,
- 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283,
- 1218, 1218, 1284, 1285, 1286, 201, 1287, 1288,
- 1219, 1219, 1289, 1290, 1291, 206, 1292, 206,
-
- 206, 1293, 1294, 1295, 1296, 201, 1297, 1298,
- 1299, 1300, 1299, 1300, 1301, 1293, 1293, 1293,
- 1218, 1218, 1302, 1303, 201, 201, 1304, 1305,
- 1219, 1219, 1306, 1307, 201, 1293, 1293, 1293,
-
- 1218, 1218, 1308, 1309, 1310, 1311, 1312, 1313,
- 1219, 1219, 1314, 1315, 1316, 1293, 1317, 1317,
- 201, 201, 1318, 1319, 1320, 201, 1321, 1322,
- 1323, 1324, 1325, 1326, 1327, 1328, 206, 201,
-
- 1329, 1329, 1330, 1330, 1330, 1330, 1330, 1331,
- 1330, 1330, 1330, 1332, 1333, 1334, 1335, 1336,
- 1337, 1338, 1337, 1339, 1340, 1341, 14, 1342,
- 1343, 1344, 1345, 1346, 1346, 1347, 1345, 1346,
-
- 14, 14, 14, 14, 1348, 1349, 1349, 1350,
- 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358,
- 13, 13, 13, 1359, 1359, 1360, 1361, 1361,
- 14, 1362, 1363, 14, 1364, 1365, 1342, 43,
-
- 43, 14, 14, 14, 1366, 16, 1367, 1368,
- 1369, 1369, 1370, 1370, 1370, 1370, 1371, 1371,
- 1371, 1371, 1372, 1373, 1374, 1375, 1376, 1377,
- 1376, 1376, 1376, 1376, 1375, 1376, 1376, 1378,
-
- 1379, 1380, 1380, 1380, 1381, 1382, 1383, 1384,
- 1385, 1386, 1387, 1387, 1387, 1387, 1387, 1387,
- 1388, 1389, 201, 201, 1390, 1391, 1392, 1393,
- 1394, 1395, 1396, 1396, 1397, 1398, 1399, 159,
-
- 1388, 63, 58, 59, 1390, 1391, 1392, 1393,
- 1394, 1395, 1396, 1396, 1397, 1398, 1399, 201,
- 1194, 1194, 1194, 1194, 1194, 1400, 1400, 1400,
- 1400, 1400, 1400, 1400, 1400, 201, 201, 201,
+ 70, 71, 1233, 1234, 1233, 1234, 1233, 1234,
+
+ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1235, 1235, 1235, 1235, 1235, 1235, 202, 202,
+ 1236, 1236, 1236, 1236, 1236, 1236, 202, 202,
+
+ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+
+ 1235, 1235, 1235, 1235, 1235, 1235, 202, 202,
+ 1236, 1236, 1236, 1236, 1236, 1236, 202, 202,
+ 1237, 1235, 1238, 1235, 1239, 1235, 1240, 1235,
+ 202, 1236, 202, 1236, 202, 1236, 202, 1236,
+
+ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1241, 1242, 1243, 1244, 1243, 1244, 1245, 1246,
+ 1247, 1248, 1249, 1250, 1251, 1252, 202, 202,
+
+ 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260,
+ 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268,
+ 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276,
+ 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284,
+
+ 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292,
+ 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300,
+ 1235, 1235, 1301, 1302, 1303, 202, 1304, 1305,
+ 1236, 1236, 1306, 1307, 1308, 207, 1309, 207,
+
+ 207, 1310, 1311, 1312, 1313, 202, 1314, 1315,
+ 1316, 1317, 1316, 1317, 1318, 1310, 1310, 1310,
+ 1235, 1235, 1319, 1320, 202, 202, 1321, 1322,
+ 1236, 1236, 1323, 1324, 202, 1310, 1310, 1310,
+
+ 1235, 1235, 1325, 1326, 1327, 1328, 1329, 1330,
+ 1236, 1236, 1331, 1332, 1333, 1310, 1334, 1334,
+ 202, 202, 1335, 1336, 1337, 202, 1338, 1339,
+ 1340, 1341, 1342, 1343, 1344, 1345, 207, 202,
+
+ 1346, 1346, 1347, 1347, 1347, 1347, 1347, 1348,
+ 1347, 1347, 1347, 1349, 1350, 1351, 1352, 1353,
+ 1354, 1355, 1354, 1356, 1357, 1358, 14, 1359,
+ 1360, 1361, 1362, 1363, 1363, 1364, 1362, 1363,
+
+ 14, 14, 14, 14, 1365, 1366, 1366, 1367,
+ 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375,
+ 13, 13, 13, 1376, 1376, 1377, 1378, 1378,
+ 14, 1379, 1380, 14, 1381, 1382, 1359, 43,
+
+ 43, 14, 14, 14, 1383, 16, 1384, 1385,
+ 1386, 1386, 1387, 1387, 1387, 1387, 1388, 1388,
+ 1388, 1388, 1389, 1390, 1391, 1392, 1393, 1394,
+ 1393, 1393, 1393, 1393, 1392, 1393, 1393, 1395,
+
+ 1396, 1397, 1397, 1397, 1398, 1399, 1400, 1401,
+ 1402, 1403, 1404, 1404, 1404, 1404, 1404, 1404,
+ 1405, 1406, 202, 202, 1407, 1408, 1409, 1410,
+ 1411, 1412, 1413, 1413, 1414, 1415, 1416, 160,
+
+ 1405, 63, 58, 59, 1407, 1408, 1409, 1410,
+ 1411, 1412, 1413, 1413, 1414, 1415, 1416, 202,
+ 1211, 1211, 1211, 1211, 1211, 1417, 1417, 1417,
+ 1417, 1417, 1417, 1417, 1417, 202, 202, 202,
12, 12, 12, 12, 12, 12, 12, 50,
- 1401, 12, 12, 1402, 1403, 1404, 1404, 1404,
- 1405, 1405, 1406, 1406, 1406, 1406, 1407, 1408,
- 1408, 1409, 1410, 1411, 1412, 1412, 1413, 1414,
-
- 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
- 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
- 172, 172, 179, 179, 172, 172, 172, 172,
- 179, 179, 179, 172, 172, 1416, 1416, 1416,
-
- 1416, 172, 1417, 1417, 1418, 1419, 1419, 196,
- 1420, 196, 1419, 1421, 1197, 1197, 1197, 1197,
- 1198, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1422, 1422, 1423, 1424, 51, 1422, 1422, 1423,
- 51, 1424, 1425, 1423, 1423, 1423, 1425, 1425,
- 1423, 1423, 1423, 1425, 51, 1423, 1426, 51,
- 36, 1423, 1423, 1423, 1423, 1423, 51, 51,
-
- 1422, 1422, 1422, 51, 1423, 51, 1427, 51,
- 1423, 51, 1428, 1429, 1423, 1423, 1430, 1425,
- 1423, 1423, 1431, 1423, 1425, 1432, 1432, 1432,
- 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1438,
-
- 1439, 1372, 1372, 1372, 1372, 1438, 1437, 1437,
- 1437, 1437, 1440, 1372, 1441, 1442, 1443, 1444,
- 1445, 1445, 1445, 65, 65, 65, 65, 65,
+ 1418, 12, 12, 1419, 1420, 1421, 1421, 1421,
+ 1422, 1422, 1423, 1423, 1423, 1423, 1424, 1425,
+ 1425, 1426, 1427, 1428, 1429, 1429, 1430, 1431,
+
+ 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432,
+ 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432,
+ 173, 173, 180, 180, 173, 173, 173, 173,
+ 180, 180, 180, 173, 173, 1433, 1433, 1433,
+
+ 1433, 173, 1434, 1434, 1435, 1436, 1436, 197,
+ 1437, 197, 1436, 1438, 1214, 1214, 1214, 1214,
+ 1215, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 1439, 1439, 1440, 1441, 51, 1439, 1439, 1440,
+ 51, 1441, 1442, 1440, 1440, 1440, 1442, 1442,
+ 1440, 1440, 1440, 1442, 51, 1440, 1443, 51,
+ 36, 1440, 1440, 1440, 1440, 1440, 51, 51,
+
+ 1439, 1439, 1439, 51, 1440, 51, 1444, 51,
+ 1440, 51, 1445, 1446, 1440, 1440, 1447, 1442,
+ 1440, 1440, 1448, 1440, 1442, 1449, 1449, 1449,
+ 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1455,
+
+ 1456, 1389, 1389, 1389, 1389, 1455, 1454, 1454,
+ 1454, 1454, 1457, 1389, 1458, 1459, 1460, 1461,
+ 1462, 1462, 1462, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65,
- 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446,
- 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446,
- 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447,
- 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447,
+ 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463,
+ 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463,
+ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464,
+ 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464,
- 1448, 1448, 1448, 111, 123, 1449, 1449, 1449,
- 1449, 1445, 1450, 1450, 201, 201, 201, 201,
+ 1465, 1465, 1465, 111, 123, 1466, 1466, 1466,
+ 1466, 1462, 1467, 1467, 202, 202, 202, 202,
36, 36, 36, 36, 36, 51, 51, 51,
- 51, 51, 1451, 1451, 51, 51, 51, 51,
+ 51, 51, 1468, 1468, 51, 51, 51, 51,
36, 51, 51, 36, 51, 51, 36, 51,
- 51, 51, 51, 51, 51, 51, 1451, 51,
+ 51, 51, 51, 51, 51, 51, 1468, 51,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 1452, 1451, 1451,
+ 51, 51, 51, 51, 51, 1469, 1468, 1468,
51, 51, 36, 51, 36, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 1434, 1434, 1434, 1434, 1434,
- 1434, 1434, 1434, 1434, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 36, 36, 36, 36, 1451, 36, 36, 36,
- 1453, 1454, 1453, 1455, 1456, 1455, 36, 36,
- 36, 36, 18, 57, 36, 1457, 36, 36,
+ 51, 51, 51, 1451, 1451, 1451, 1451, 1451,
+ 1451, 1451, 1451, 1451, 1389, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+
+ 36, 36, 36, 36, 1468, 36, 36, 36,
+ 1470, 1471, 1470, 1472, 1473, 1472, 36, 36,
+ 36, 36, 18, 57, 36, 1474, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 1475,
+
+ 1476, 1477, 1478, 36, 1479, 36, 1468, 36,
+ 36, 36, 36, 36, 1414, 1414, 36, 1414,
+ 1414, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 1480, 1481, 36, 36,
+
+ 36, 1468, 36, 1482, 1468, 1483, 36, 1468,
+ 36, 1468, 36, 36, 1484, 36, 36, 36,
+ 36, 36, 1480, 1481, 1480, 1481, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 1451, 36, 1451, 36,
- 36, 36, 36, 36, 1397, 1397, 36, 1397,
- 1397, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 1458, 1459, 36, 36,
-
- 36, 1451, 36, 1460, 1451, 36, 36, 1451,
- 36, 1451, 36, 36, 36, 36, 36, 36,
- 36, 36, 1458, 1459, 1458, 1459, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36,
+ 1468, 36, 1468, 36, 1480, 1481, 1480, 1481,
+ 1480, 1481, 1480, 1481, 36, 1468, 1485, 1486,
+ 1485, 1486, 1480, 1481, 1485, 1486, 1480, 1481,
+ 1485, 1486, 1480, 1481, 1480, 1481, 1480, 1481,
- 1451, 36, 1451, 36, 1458, 1459, 1458, 1459,
- 1458, 1459, 1458, 1459, 36, 1451, 1461, 1462,
- 1461, 1462, 1458, 1459, 1461, 1462, 1458, 1459,
- 1461, 1462, 1458, 1459, 1458, 1459, 1458, 1459,
+ 1485, 1486, 1480, 1481, 1485, 1486, 1480, 1481,
+ 1485, 1486, 1480, 1481, 36, 36, 36, 1480,
+ 1481, 1480, 1481, 36, 36, 36, 36, 36,
+ 1487, 36, 36, 36, 36, 36, 36, 36,
- 1461, 1462, 1458, 1459, 1461, 1462, 1458, 1459,
- 1461, 1462, 1458, 1459, 36, 36, 36, 1458,
- 1459, 1458, 1459, 36, 36, 36, 36, 36,
- 1463, 36, 36, 36, 36, 36, 36, 36,
-
- 36, 36, 1458, 1459, 36, 36, 1464, 36,
- 1465, 1466, 36, 1466, 1451, 1451, 1451, 1451,
- 1458, 1459, 1458, 1459, 1458, 1459, 1458, 1459,
- 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 1480, 1481, 36, 36, 1488, 36,
+ 1489, 1490, 36, 1490, 1468, 1468, 1468, 1468,
+ 1480, 1481, 1480, 1481, 1480, 1481, 1480, 1481,
+ 1491, 36, 36, 36, 36, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36,
- 36, 1458, 1459, 1458, 1459, 1467, 36, 36,
- 1458, 1459, 36, 36, 36, 36, 1458, 1459,
- 1458, 1459, 1458, 1459, 1458, 1459, 1458, 1459,
+ 36, 1480, 1481, 1480, 1481, 1492, 36, 36,
+ 1480, 1481, 36, 36, 36, 36, 1480, 1481,
+ 1480, 1481, 1480, 1481, 1480, 1481, 1480, 1481,
- 1461, 1462, 1461, 1462, 1458, 1459, 1458, 1459,
- 1458, 1459, 1461, 1462, 1461, 1462, 36, 1468,
- 1458, 1459, 1469, 1469, 1469, 1372, 1470, 1470,
- 1372, 1372, 1471, 1471, 1471, 1472, 1472, 1372,
+ 1485, 1486, 1485, 1486, 1480, 1481, 1480, 1481,
+ 1480, 1481, 1485, 1486, 1485, 1486, 36, 1493,
+ 1480, 1481, 1494, 1494, 1494, 1389, 1495, 1495,
+ 1389, 1389, 1496, 1496, 1496, 1497, 1497, 1389,
- 51, 1434, 51, 51, 51, 51, 51, 51,
- 16, 1367, 16, 1367, 51, 51, 51, 51,
+ 51, 1451, 51, 51, 51, 51, 51, 51,
+ 16, 1384, 16, 1384, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 1473, 1473, 51, 51, 51, 51,
+ 51, 51, 1498, 1498, 51, 51, 51, 51,
36, 36, 51, 51, 51, 51, 51, 51,
- 51, 1474, 1475, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 1476, 1476,
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
-
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
-
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
- 1476, 1476, 1476, 1434, 1372, 1434, 1434, 1434,
-
- 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434,
- 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434,
- 1434, 1434, 1434, 1434, 1434, 1477, 1434, 1434,
- 1434, 1434, 1434, 1372, 1372, 1372, 1372, 1372,
-
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1440, 1440, 1440, 1440,
- 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440,
-
- 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440,
- 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1478,
- 1478, 1441, 1441, 1441, 1441, 1441, 1441, 1441,
- 1441, 1441, 1441, 1441, 1479, 1479, 1479, 1479,
-
- 1479, 1479, 1442, 1442, 1442, 1442, 1442, 1442,
- 1480, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1482, 1482, 1482, 1482, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1484, 1484, 1484, 1484, 1485,
+ 51, 1499, 1500, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 1501, 1501,
+ 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501,
+
+ 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501,
+ 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501,
+ 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501,
+ 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501,
+
+ 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501,
+ 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501,
+ 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501,
+ 1501, 1501, 1501, 1451, 1389, 1451, 1451, 1451,
+
+ 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451,
+ 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451,
+ 1451, 1451, 1451, 1451, 1451, 1502, 1451, 1451,
+ 1451, 1451, 1451, 1389, 1389, 1389, 1389, 1389,
+
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1457, 1457, 1457, 1457,
+ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457,
+
+ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457,
+ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1503,
+ 1503, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1504, 1504, 1504, 1504,
+
+ 1504, 1504, 1459, 1459, 1459, 1459, 1459, 1459,
+ 1505, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1507, 1507, 1507, 1507, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1509, 1509, 1509, 1509, 1510,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 1434, 1434, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
+ 51, 51, 51, 51, 51, 1451, 1451, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
+ 51, 51, 51, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
- 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493,
- 1494, 65, 65, 65, 65, 65, 65, 65,
- 65, 65, 65, 65, 1486, 1487, 1488, 1489,
- 1490, 1491, 1492, 1493, 1494, 65, 65, 65,
+ 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518,
+ 1519, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 1511, 1512, 1513, 1514,
+ 1515, 1516, 1517, 1518, 1519, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65,
- 63, 58, 59, 1390, 1391, 1392, 1393, 1394,
- 1395, 1495, 1495, 1495, 1495, 1495, 1495, 1495,
- 1495, 1495, 1495, 1495, 1496, 1496, 1496, 1496,
+ 63, 58, 59, 1407, 1408, 1409, 1410, 1411,
+ 1412, 1520, 1520, 1520, 1520, 1520, 1520, 1520,
+ 1520, 1520, 1520, 1520, 1521, 1521, 1521, 1521,
- 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496,
- 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496,
- 1496, 1496, 1496, 1496, 1496, 1496, 1497, 1497,
- 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497,
+ 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
+ 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
+ 1521, 1521, 1521, 1521, 1521, 1521, 1522, 1522,
+ 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
- 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497,
- 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497,
- 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498,
- 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498,
+ 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
+ 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
+ 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
+ 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
- 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498,
- 1498, 1498, 1499, 1500, 1500, 1500, 1500, 1500,
- 1500, 1500, 1500, 1500, 1500, 1501, 1502, 1503,
- 1504, 1505, 1506, 1507, 1508, 1509, 1500, 1510,
+ 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
+ 1523, 1523, 1524, 1525, 1525, 1525, 1525, 1525,
+ 1525, 1525, 1525, 1525, 1525, 1526, 1527, 1528,
+ 1529, 1530, 1531, 1532, 1533, 1534, 1525, 1535,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 1440, 1440,
- 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440,
+ 51, 51, 51, 51, 51, 51, 1457, 1457,
+ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
@@ -2209,2454 +2214,1713 @@ static const unsigned short uc_property_trie[] = {
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
- 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
+ 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
- 1473, 1473, 1473, 1473, 51, 51, 51, 51,
+ 1498, 1498, 1498, 1498, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 1511, 1511, 1440, 1440,
- 1512, 1434, 1473, 1473, 1473, 1513, 1473, 1473,
+ 51, 51, 51, 51, 1536, 1536, 1457, 1457,
+ 1537, 1451, 1498, 1498, 1498, 1538, 1498, 1498,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
- 51, 1473, 1473, 1473, 51, 51, 51, 51,
+ 51, 1498, 1498, 1498, 51, 51, 51, 51,
- 1514, 51, 1514, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
+ 1498, 51, 51, 51, 51, 51, 51, 36,
+ 1451, 1451, 1457, 1457, 1457, 1457, 1457, 1457,
+ 1457, 1457, 1457, 1457, 1457, 1457, 1458, 1537,
+
+ 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457,
+ 1457, 1457, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1539, 1505, 1505,
+
+ 1503, 1503, 1458, 1458, 1458, 1458, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1540, 1458, 1458, 1458,
+ 1458, 1458, 1459, 1539, 1539, 1539, 1539, 1539,
+ 1539, 1539, 1539, 1539, 1539, 1541, 1541, 1541,
+
+ 1542, 1542, 1542, 1542, 1541, 1541, 1541, 1541,
+ 1541, 1505, 1505, 1505, 1505, 1541, 1506, 1541,
+ 1541, 1541, 1505, 1541, 1541, 1505, 1505, 1505,
+ 1541, 1541, 1505, 1505, 1541, 1505, 1505, 1541,
+
+ 1541, 1541, 1506, 1505, 1506, 1506, 1506, 1506,
+ 1505, 1505, 1541, 1505, 1505, 1505, 1505, 1505,
+ 1505, 1541, 1541, 1541, 1541, 1541, 1505, 1541,
+ 1541, 1543, 1541, 1505, 1505, 1541, 1541, 1541,
+
+ 1544, 1498, 1498, 1498, 1498, 1506, 51, 51,
+ 1498, 1498, 1545, 1545, 1538, 1538, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
- 1473, 51, 51, 51, 51, 51, 51, 36,
- 1434, 1434, 1440, 1440, 1440, 1440, 1440, 1440,
- 1440, 1440, 1440, 1440, 1440, 1440, 1441, 1512,
-
- 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440,
- 1440, 1440, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1441, 1441, 1441, 1515, 1515, 1441,
- 1441, 1441, 1441, 1441, 1441, 1516, 1480, 1480,
-
- 1478, 1478, 1441, 1441, 1441, 1441, 1441, 1441,
- 1441, 1441, 1441, 1441, 1517, 1441, 1441, 1441,
- 1441, 1441, 1442, 1516, 1516, 1516, 1516, 1516,
- 1516, 1516, 1516, 1516, 1516, 1518, 1518, 1518,
-
- 1519, 1519, 1519, 1519, 1518, 1518, 1518, 1518,
- 1518, 1480, 1480, 1480, 1480, 1518, 1481, 1518,
- 1518, 1518, 1480, 1518, 1518, 1480, 1480, 1480,
- 1518, 1518, 1480, 1480, 1518, 1480, 1480, 1518,
-
- 1518, 1518, 1481, 1480, 1481, 1481, 1481, 1481,
- 1480, 1480, 1518, 1480, 1480, 1480, 1480, 1480,
- 1480, 1518, 1518, 1518, 1518, 1518, 1480, 1518,
- 1518, 1520, 1518, 1480, 1480, 1518, 1518, 1518,
-
- 1521, 1473, 1473, 1473, 1473, 1481, 51, 51,
- 1522, 1473, 1523, 1523, 1513, 1513, 51, 51,
+ 1506, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
- 1481, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 1506, 51, 1506, 51,
+ 51, 51, 51, 1506, 1506, 1506, 51, 1505,
+ 51, 51, 51, 1546, 1546, 1546, 1546, 1547,
+
+ 1547, 51, 1548, 1548, 1498, 51, 51, 51,
+ 1549, 1550, 1549, 1550, 1549, 1550, 1549, 1550,
+ 1549, 1550, 1549, 1550, 1549, 1550, 1551, 1552,
+ 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560,
+
+ 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558,
+ 1559, 1560, 1551, 1552, 1553, 1554, 1555, 1556,
+ 1557, 1558, 1559, 1560, 51, 1506, 1506, 1506,
51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 1481, 51, 1481, 51,
- 51, 51, 51, 1481, 1481, 1481, 51, 1480,
- 51, 51, 51, 1524, 1524, 1524, 1524, 1525,
-
- 1525, 51, 1526, 1526, 1522, 51, 51, 51,
- 1527, 1528, 1527, 1528, 1527, 1528, 1527, 1528,
- 1527, 1528, 1527, 1528, 1527, 1528, 1529, 1530,
- 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538,
-
- 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536,
- 1537, 1538, 1529, 1530, 1531, 1532, 1533, 1534,
- 1535, 1536, 1537, 1538, 51, 1481, 1481, 1481,
51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 1481, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 1481,
-
- 1539, 1539, 1539, 1540, 1541, 1542, 1543, 1479,
- 1544, 1545, 1479, 1546, 1547, 1548, 1549, 1549,
- 1372, 1372, 1372, 1372, 1372, 1550, 1551, 1372,
- 1372, 1372, 1372, 1372, 1372, 1550, 1551, 1372,
-
- 1372, 1372, 1550, 1551, 1550, 1551, 1527, 1528,
- 1527, 1528, 1527, 1528, 1552, 1553, 1552, 1553,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554,
- 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554,
- 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554,
- 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554,
-
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 1372, 1372, 1372, 1527, 1528, 1527, 1528, 1527,
- 1528, 1527, 1528, 1527, 1528, 1555, 1556, 1557,
- 1558, 1527, 1528, 1527, 1528, 1527, 1528, 1527,
- 1528, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1559, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 1550, 1551, 1372, 1372, 1550, 1551, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1550,
- 1551, 1550, 1551, 1372, 1550, 1551, 1372, 1372,
- 1527, 1528, 1527, 1528, 1372, 1372, 1372, 1372,
-
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1560, 1372, 1372,
- 1550, 1551, 1372, 1372, 1527, 1528, 1372, 1372,
-
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1439, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1550, 1551, 1550, 1551, 1372,
- 1372, 1372, 1372, 1372, 1550, 1551, 1372, 1372,
- 1372, 1372, 1372, 1372, 1550, 1551, 1372, 1372,
-
- 1372, 1372, 1372, 1372, 1550, 1551, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1439, 1439, 1439, 1372,
- 1372, 1550, 1551, 1372, 1372, 1550, 1551, 1550,
-
- 1551, 1550, 1551, 1550, 1551, 1372, 1372, 1372,
- 1372, 1372, 1372, 1550, 1551, 1372, 1372, 1372,
- 1372, 1550, 1551, 1550, 1551, 1550, 1551, 1550,
- 1551, 1550, 1551, 1550, 1551, 1372, 1372, 1372,
-
- 1372, 1550, 1551, 1372, 1372, 1372, 1550, 1551,
- 1550, 1551, 1550, 1551, 1550, 1551, 1372, 1550,
- 1551, 1372, 1372, 1550, 1551, 1372, 1372, 1372,
- 1372, 1372, 1372, 1550, 1551, 1550, 1551, 1550,
-
- 1551, 1550, 1551, 1550, 1551, 1550, 1551, 1372,
- 1372, 1372, 1372, 1372, 1372, 1550, 1551, 1550,
- 1551, 1550, 1551, 1550, 1551, 1550, 1551, 1372,
- 1372, 1372, 1372, 1372, 1561, 1372, 1562, 1372,
-
- 1372, 1372, 1372, 1563, 1564, 1563, 1372, 1372,
- 1372, 1372, 1372, 1372, 1550, 1551, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1550,
- 1551, 1550, 1551, 1372, 1372, 1372, 1372, 1372,
-
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1441, 1441,
- 1441, 1441, 1441, 1441, 1442, 1442, 1442, 1442,
- 1442, 1442, 1442, 1516, 1516, 1516, 1516, 1516,
-
- 1442, 1442, 1442, 1442, 1516, 1516, 1516, 1516,
- 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516,
- 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547,
- 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547,
-
- 1547, 1547, 1547, 1547, 1547, 1516, 1516, 1547,
- 1547, 1547, 1547, 1547, 1547, 1483, 1483, 1483,
- 1516, 1516, 1516, 1516, 1516, 1480, 1480, 1480,
- 1480, 1480, 1483, 1483, 1483, 1483, 1483, 1483,
-
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 201, 201, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
-
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 201, 201,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
-
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 201, 201, 201, 1483, 1483, 1483,
-
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 201, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1485, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 1450, 1450, 1450, 1450,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
- 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
- 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
- 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
-
- 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
- 1565, 1565, 1565, 1565, 1565, 1565, 1565, 201,
- 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
-
- 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- 1566, 1566, 1566, 1566, 1566, 1566, 1566, 201,
-
- 127, 123, 1567, 1568, 1569, 1570, 1571, 127,
- 123, 127, 123, 127, 123, 1572, 1573, 1574,
- 1575, 1214, 1216, 1217, 1576, 127, 123, 1576,
- 1214, 1214, 1214, 1214, 1577, 1577, 1578, 1579,
-
- 1580, 1581, 1580, 1581, 1580, 1581, 1580, 1581,
- 1580, 1581, 1580, 1581, 1580, 1581, 1580, 1581,
- 1580, 1581, 1580, 1581, 1580, 1581, 1580, 1581,
- 1580, 1581, 1580, 1581, 1580, 1581, 1580, 1581,
-
- 1580, 1581, 1580, 1581, 1582, 1583, 1583, 1583,
- 1583, 1583, 1583, 1584, 1585, 1584, 1585, 1586,
- 1586, 1586, 1587, 1588, 201, 201, 201, 201,
- 201, 1589, 1590, 1590, 1590, 1591, 1589, 1590,
-
- 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ 1506, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 1506,
+
+ 1561, 1561, 1561, 1562, 1563, 1564, 1565, 1504,
+ 1566, 1567, 1504, 1568, 1569, 1570, 1571, 1571,
+ 1389, 1389, 1389, 1389, 1389, 1572, 1573, 1389,
+ 1389, 1389, 1389, 1389, 1574, 1572, 1573, 1389,
+
+ 1389, 1389, 1572, 1573, 1572, 1573, 1549, 1550,
+ 1549, 1550, 1549, 1550, 1575, 1576, 1575, 1576,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+
+ 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577,
+ 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577,
+ 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577,
+ 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577,
+
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+
+ 1389, 1389, 1389, 1549, 1550, 1549, 1550, 1549,
+ 1550, 1549, 1550, 1549, 1550, 1578, 1579, 1580,
+ 1581, 1549, 1550, 1549, 1550, 1549, 1550, 1549,
+ 1550, 1389, 1389, 1582, 1389, 1389, 1389, 1389,
+
+ 1583, 1389, 1389, 1584, 1572, 1573, 1389, 1389,
+ 1572, 1573, 1572, 1573, 1572, 1573, 1572, 1573,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1585, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+
+ 1572, 1573, 1389, 1389, 1572, 1573, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1572,
+ 1573, 1572, 1573, 1389, 1572, 1573, 1389, 1389,
+ 1549, 1550, 1549, 1550, 1389, 1389, 1389, 1389,
+
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1572, 1573, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1389, 1586, 1389, 1389,
+ 1572, 1573, 1389, 1389, 1549, 1550, 1389, 1389,
+
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1456, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1572, 1573, 1572, 1573, 1389,
+ 1389, 1389, 1389, 1389, 1572, 1573, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1572, 1573, 1389, 1389,
+
+ 1389, 1389, 1389, 1389, 1572, 1573, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1456, 1456, 1456, 1389,
+ 1389, 1572, 1573, 1572, 1573, 1572, 1573, 1572,
+
+ 1573, 1572, 1573, 1572, 1573, 1572, 1573, 1572,
+ 1573, 1572, 1573, 1572, 1573, 1572, 1573, 1572,
+ 1573, 1572, 1573, 1572, 1573, 1572, 1573, 1572,
+ 1573, 1572, 1573, 1572, 1573, 1572, 1573, 1572,
+
+ 1573, 1572, 1573, 1389, 1389, 1389, 1572, 1573,
+ 1572, 1573, 1572, 1573, 1572, 1573, 1389, 1572,
+ 1573, 1572, 1573, 1572, 1573, 1572, 1573, 1572,
+ 1573, 1572, 1573, 1572, 1573, 1572, 1573, 1572,
+
+ 1573, 1572, 1573, 1572, 1573, 1572, 1573, 1572,
+ 1573, 1572, 1573, 1572, 1573, 1572, 1573, 1572,
+ 1573, 1572, 1573, 1572, 1573, 1572, 1573, 1389,
+ 1389, 1389, 1389, 1389, 1587, 1389, 1588, 1389,
+
+ 1389, 1389, 1389, 1589, 1590, 1589, 1389, 1389,
+ 1389, 1389, 1389, 1389, 1572, 1573, 1591, 1389,
+ 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1572,
+ 1573, 1572, 1573, 1389, 1389, 1389, 1389, 1389,
+
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1458, 1458,
+ 1458, 1458, 1458, 1458, 1459, 1459, 1459, 1459,
+ 1459, 1459, 1459, 1539, 1539, 1539, 1539, 1539,
+
+ 1459, 1459, 1459, 1459, 1539, 1539, 1539, 1539,
+ 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539,
+ 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569,
+ 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569,
+
+ 1569, 1569, 1569, 1569, 1569, 1539, 1539, 1569,
+ 1569, 1569, 1569, 1569, 1569, 1508, 1508, 1508,
+ 1539, 1539, 1539, 1539, 1539, 1505, 1505, 1505,
+ 1505, 1505, 1508, 1508, 1508, 1508, 1508, 1508,
+
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 202, 202, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 202, 202,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1592, 1592, 1592, 1508, 1508, 1508,
+
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1593, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1510, 1592, 1592, 1592, 1592, 1592,
1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+
1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
+ 1592, 1592, 1592, 1592, 1467, 1467, 1467, 1467,
1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
-
- 1592, 1592, 1592, 1592, 1592, 1592, 201, 1593,
- 201, 201, 201, 201, 201, 1593, 201, 201,
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
-
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
-
- 1594, 1594, 1594, 1594, 1594, 1594, 1595, 1595,
- 201, 201, 201, 201, 201, 201, 201, 1596,
- 1597, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 1598,
-
- 854, 854, 854, 854, 854, 854, 854, 854,
- 854, 854, 854, 854, 854, 854, 854, 854,
- 854, 854, 854, 854, 854, 854, 854, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 854, 854, 854, 854, 854, 854, 854, 201,
- 854, 854, 854, 854, 854, 854, 854, 201,
- 854, 854, 854, 854, 854, 854, 854, 201,
- 854, 854, 854, 854, 854, 854, 854, 201,
-
- 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266,
-
- 1599, 1599, 1600, 1601, 1600, 1601, 1599, 1599,
- 1599, 1600, 1601, 1599, 1600, 1601, 1376, 1376,
- 1376, 1376, 1376, 1376, 1376, 1376, 1375, 1602,
- 1603, 1604, 1605, 1606, 1600, 1601, 1606, 1606,
-
- 1607, 1608, 1552, 1553, 1552, 1553, 1552, 1553,
- 1552, 1553, 1604, 1604, 1604, 1604, 1609, 1610,
- 1604, 1611, 1612, 1613, 1613, 1612, 1612, 1612,
- 1612, 1612, 1614, 1614, 1615, 1616, 1616, 1617,
-
- 1618, 1616, 1619, 1620, 1620, 1621, 1621, 1621,
- 1621, 1621, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 201, 1622, 1622, 1622, 1622, 1623,
+ 1592, 1592, 1592, 1592, 1592, 1592, 1594, 1593,
+
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 202,
+ 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+ 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+
+ 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+ 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+ 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
+ 1596, 1596, 1596, 1596, 1596, 1596, 1596, 202,
+
+ 127, 123, 1597, 1598, 1599, 1600, 1601, 127,
+ 123, 127, 123, 127, 123, 1602, 1603, 1604,
+ 1605, 1231, 1233, 1234, 1606, 127, 123, 1606,
+ 1231, 1231, 1231, 1231, 1607, 1607, 1608, 1609,
+
+ 1610, 1611, 1610, 1611, 1610, 1611, 1610, 1611,
+ 1610, 1611, 1610, 1611, 1610, 1611, 1610, 1611,
+ 1610, 1611, 1610, 1611, 1610, 1611, 1610, 1611,
+ 1610, 1611, 1610, 1611, 1610, 1611, 1610, 1611,
+
+ 1610, 1611, 1610, 1611, 1612, 1613, 1613, 1613,
+ 1613, 1613, 1613, 1614, 1615, 1614, 1615, 1616,
+ 1616, 1616, 1617, 1618, 202, 202, 202, 202,
+ 202, 1619, 1620, 1620, 1620, 1621, 1619, 1620,
1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 1622, 1623, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
+ 1622, 1622, 1622, 1622, 1622, 1622, 202, 1623,
+ 202, 202, 202, 202, 202, 1623, 202, 202,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
- 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623,
- 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623,
- 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623,
- 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
- 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623,
- 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623,
- 1623, 1623, 1623, 1623, 1623, 1623, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1625, 1625,
+ 202, 202, 202, 202, 202, 202, 202, 1626,
+ 1627, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 1628,
+
+ 868, 868, 868, 868, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 868,
+ 868, 868, 868, 868, 868, 868, 868, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 868, 868, 868, 868, 868, 868, 868, 202,
+ 868, 868, 868, 868, 868, 868, 868, 202,
+ 868, 868, 868, 868, 868, 868, 868, 202,
+ 868, 868, 868, 868, 868, 868, 868, 202,
+
+ 267, 267, 267, 267, 267, 267, 267, 267,
+ 267, 267, 267, 267, 267, 267, 267, 267,
+ 267, 267, 267, 267, 267, 267, 267, 267,
+ 267, 267, 267, 267, 267, 267, 267, 267,
+
+ 1629, 1629, 1630, 1631, 1630, 1631, 1629, 1629,
+ 1629, 1630, 1631, 1629, 1630, 1631, 1393, 1393,
+ 1393, 1393, 1393, 1393, 1393, 1393, 1392, 1632,
+ 1633, 1634, 1635, 1636, 1630, 1631, 1636, 1636,
+
+ 1637, 1638, 1575, 1576, 1575, 1576, 1575, 1576,
+ 1575, 1576, 1634, 1634, 1634, 1634, 1639, 1640,
+ 1634, 1641, 1642, 1643, 1643, 1642, 1642, 1642,
+ 1642, 1642, 1644, 1644, 1645, 1646, 1646, 1647,
+
+ 1648, 1646, 1649, 1650, 1650, 1651, 1651, 1651,
+ 1651, 1651, 1652, 1653, 1652, 1653, 1652, 1654,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 202, 1655, 1655, 1655, 1655, 1656,
+
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655,
+ 1655, 1655, 1655, 1656, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656,
+ 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656,
+ 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656,
+ 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656,
+
+ 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656,
+ 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656,
+ 1656, 1656, 1656, 1656, 1656, 1656, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657,
+ 1657, 1657, 1657, 1657, 202, 202, 202, 202,
+
+ 1347, 1658, 1659, 1660, 1498, 1661, 1662, 1663,
+ 16, 1384, 16, 1384, 16, 1384, 16, 1384,
+ 16, 1384, 1498, 1498, 16, 1384, 16, 1384,
+ 16, 1384, 16, 1384, 1664, 1362, 1665, 1665,
+
+ 1498, 1663, 1663, 1663, 1663, 1663, 1663, 1663,
+ 1663, 1663, 1666, 1667, 174, 1668, 1669, 1669,
+ 1670, 1671, 1671, 1671, 1671, 1672, 1673, 1498,
+ 1674, 1674, 1674, 1675, 1676, 1677, 1657, 1498,
+
+ 202, 1678, 1679, 1678, 1679, 1678, 1679, 1678,
+ 1679, 1678, 1679, 1679, 1680, 1679, 1680, 1679,
+ 1680, 1679, 1680, 1679, 1680, 1679, 1680, 1679,
+ 1680, 1679, 1680, 1679, 1680, 1679, 1680, 1679,
+
+ 1680, 1679, 1680, 1678, 1679, 1680, 1679, 1680,
+ 1679, 1680, 1679, 1679, 1679, 1679, 1679, 1679,
+ 1680, 1680, 1679, 1680, 1680, 1679, 1680, 1680,
+ 1679, 1680, 1680, 1679, 1680, 1680, 1679, 1679,
+
+ 1679, 1679, 1679, 1678, 1679, 1678, 1679, 1678,
+ 1679, 1679, 1679, 1679, 1679, 1679, 1678, 1679,
+ 1679, 1679, 1679, 1679, 1680, 1681, 1681, 202,
+ 202, 1682, 1682, 1683, 1683, 1684, 1685, 1686,
+
+ 1687, 1688, 1689, 1688, 1689, 1688, 1689, 1688,
+ 1689, 1688, 1689, 1689, 1690, 1689, 1690, 1689,
+ 1690, 1689, 1690, 1689, 1690, 1689, 1690, 1689,
+ 1690, 1689, 1690, 1689, 1690, 1689, 1690, 1689,
+
+ 1690, 1689, 1690, 1688, 1689, 1690, 1689, 1690,
+ 1689, 1690, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1690, 1690, 1689, 1690, 1690, 1689, 1690, 1690,
+ 1689, 1690, 1690, 1689, 1690, 1690, 1689, 1689,
+
+ 1689, 1689, 1689, 1688, 1689, 1688, 1689, 1688,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1688, 1689,
+ 1689, 1689, 1689, 1689, 1690, 1688, 1688, 1690,
+ 1690, 1690, 1690, 1691, 1692, 1693, 1694, 1695,
+
+ 202, 202, 202, 202, 202, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1697, 1698, 1699,
+ 202, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
+ 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
+
+ 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
+ 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
+ 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
+ 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
+
+ 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
+ 1700, 1700, 1700, 1700, 1700, 1700, 1700, 202,
+ 1701, 1701, 1702, 1702, 1702, 1702, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+
+ 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704,
+ 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704,
+ 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704,
+ 1705, 1705, 1705, 202, 202, 202, 202, 202,
+
+ 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537,
+ 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+
+ 1542, 1542, 1542, 1542, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
+ 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706,
+
+ 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
+ 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
+ 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
+ 1707, 1707, 1707, 1707, 1707, 1708, 1708, 202,
+
+ 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702,
+ 1702, 1702, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+
+ 1703, 1703, 1703, 1703, 1709, 1709, 1709, 1709,
+ 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710,
+ 1711, 1712, 1712, 1712, 1712, 1712, 1712, 1712,
+ 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712,
+
+ 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
+ 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
+ 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707,
+ 1707, 1707, 1707, 1707, 1708, 1708, 1713, 1701,
+
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1712, 1712, 1712, 1712, 1712, 1712, 1712,
+ 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712,
+
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1711, 1711, 1711, 1711,
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
+
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1715,
+
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
+
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
+ 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1711,
+ 1711, 1711, 1711, 1703, 1703, 1703, 1703, 1703,
+
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1711, 1711,
+
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703,
+ 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1711,
+
+ 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716,
+ 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716,
+ 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716,
+ 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716,
+
+ 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716,
+ 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716,
+ 1716, 1716, 1716, 1716, 1716, 1716, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+
+ 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718,
+ 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718,
+ 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718,
+ 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718,
+
+ 1718, 1718, 1718, 1718, 1718, 1718, 1719, 1719,
+ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719,
+ 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719,
+ 1719, 1719, 1719, 1719, 1720, 1720, 1720, 1720,
+
+ 1720, 1720, 1720, 1720, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1722, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1725, 1725, 1725, 1725, 1725,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
- 1624, 1624, 1624, 1624, 201, 201, 201, 201,
-
- 1330, 1625, 1626, 1627, 1473, 1628, 1629, 1630,
- 16, 1367, 16, 1367, 16, 1367, 16, 1367,
- 16, 1367, 1473, 1473, 16, 1367, 16, 1367,
- 16, 1367, 16, 1367, 1631, 1345, 1632, 1632,
-
- 1473, 1630, 1630, 1630, 1630, 1630, 1630, 1630,
- 1630, 1630, 1633, 1634, 173, 1635, 1636, 1636,
- 1637, 1638, 1638, 1638, 1638, 1639, 1640, 1473,
- 1641, 1641, 1641, 1642, 1643, 1644, 1624, 1473,
-
- 201, 1645, 1646, 1645, 1646, 1645, 1646, 1645,
- 1646, 1645, 1646, 1646, 1647, 1646, 1647, 1646,
- 1647, 1646, 1647, 1646, 1647, 1646, 1647, 1646,
- 1647, 1646, 1647, 1646, 1647, 1646, 1647, 1646,
-
- 1647, 1646, 1647, 1645, 1646, 1647, 1646, 1647,
- 1646, 1647, 1646, 1646, 1646, 1646, 1646, 1646,
- 1647, 1647, 1646, 1647, 1647, 1646, 1647, 1647,
- 1646, 1647, 1647, 1646, 1647, 1647, 1646, 1646,
-
- 1646, 1646, 1646, 1645, 1646, 1645, 1646, 1645,
- 1646, 1646, 1646, 1646, 1646, 1646, 1645, 1646,
- 1646, 1646, 1646, 1646, 1647, 1648, 1648, 201,
- 201, 1649, 1649, 1650, 1650, 1651, 1652, 1653,
-
- 1654, 1655, 1656, 1655, 1656, 1655, 1656, 1655,
- 1656, 1655, 1656, 1656, 1657, 1656, 1657, 1656,
- 1657, 1656, 1657, 1656, 1657, 1656, 1657, 1656,
- 1657, 1656, 1657, 1656, 1657, 1656, 1657, 1656,
-
- 1657, 1656, 1657, 1655, 1656, 1657, 1656, 1657,
- 1656, 1657, 1656, 1656, 1656, 1656, 1656, 1656,
- 1657, 1657, 1656, 1657, 1657, 1656, 1657, 1657,
- 1656, 1657, 1657, 1656, 1657, 1657, 1656, 1656,
-
- 1656, 1656, 1656, 1655, 1656, 1655, 1656, 1655,
- 1656, 1656, 1656, 1656, 1656, 1656, 1655, 1656,
- 1656, 1656, 1656, 1656, 1657, 1655, 1655, 1657,
- 1657, 1657, 1657, 1658, 1659, 1660, 1661, 1662,
-
- 201, 201, 201, 201, 201, 1663, 1663, 1663,
- 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663,
- 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663,
- 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663,
-
- 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663,
- 1663, 1663, 1663, 1663, 1663, 1664, 1665, 201,
- 201, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
-
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
-
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 201,
- 1667, 1667, 1668, 1668, 1668, 1668, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
-
- 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670,
- 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670,
- 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670,
- 1671, 1671, 1671, 201, 201, 201, 201, 201,
-
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
-
- 1519, 1519, 1519, 1519, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672,
- 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672,
-
- 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673,
- 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673,
- 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673,
- 1673, 1673, 1673, 1673, 1673, 1674, 1674, 201,
-
- 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668,
- 1668, 1668, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
-
- 1669, 1669, 1669, 1669, 1675, 1675, 1675, 1675,
- 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676,
- 1677, 1678, 1678, 1678, 1678, 1678, 1678, 1678,
- 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678,
-
- 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673,
- 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673,
- 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673,
- 1673, 1673, 1673, 1673, 1674, 1674, 1679, 1667,
-
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1678, 1678, 1678, 1678, 1678, 1678, 1678,
- 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678,
-
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1677, 1677, 1677, 1677,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
-
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 201,
-
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
-
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
-
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1677,
- 1677, 1677, 1677, 1669, 1669, 1669, 1669, 1669,
-
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
-
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1677, 1677,
-
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1677,
-
- 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
- 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
- 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
- 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
-
- 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
- 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
- 1681, 1681, 1681, 1681, 1681, 1681, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
-
- 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
- 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
- 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
- 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
-
- 1683, 1683, 1683, 1683, 1683, 1683, 1684, 1684,
- 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
- 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
- 1684, 1684, 1684, 1684, 1685, 1685, 1685, 1685,
-
- 1685, 1685, 1685, 1685, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1687, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
-
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 1691, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
-
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
-
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 201, 201, 201,
- 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692,
- 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692,
-
- 1692, 1692, 1693, 1693, 1692, 1692, 1692, 1692,
- 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692,
- 1692, 1692, 1692, 1692, 1693, 1692, 1692, 1692,
- 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692,
-
- 1692, 1693, 1692, 1692, 1692, 1693, 1692, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694,
- 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694,
-
- 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694,
- 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694,
- 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694,
- 1695, 1695, 1695, 1695, 1695, 1695, 1696, 1697,
-
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
-
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
- 1698, 1698, 1698, 1698, 1699, 1700, 1701, 1702,
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
-
- 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710,
- 1711, 1712, 1698, 1698, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 280, 281, 280, 281, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 280, 281,
-
- 284, 285, 280, 281, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 1713, 266,
- 1714, 1714, 1714, 1715, 1716, 1716, 1716, 1716,
- 1716, 1716, 1716, 1716, 266, 266, 1715, 1717,
-
- 280, 281, 280, 281, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 280, 281,
- 286, 287, 286, 287, 1718, 1718, 1719, 1716,
-
- 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
- 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
- 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
- 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
-
- 1720, 1720, 1720, 1720, 1720, 1720, 1721, 1721,
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
- 1722, 1722, 1723, 1724, 1725, 1725, 1725, 1724,
- 201, 201, 201, 201, 201, 201, 201, 201,
+ 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
+ 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
+ 1726, 1726, 1726, 1726, 1726, 1727, 1726, 1726,
+ 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
- 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1727,
- 1727, 1727, 1727, 1610, 1610, 1610, 1610, 1610,
-
- 1728, 1728, 1216, 1217, 1216, 1217, 1216, 1217,
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1214, 1214, 1216, 1217, 1216, 1217, 1216, 1217,
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
-
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
-
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1577, 1214, 1214, 1214, 1214, 1214, 1214, 1214,
- 1214, 1216, 1217, 1216, 1217, 1729, 1216, 1217,
-
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1610, 1730, 1730, 1216, 1217, 1731, 1732, 1733,
- 1734, 1735, 1736, 1737, 1738, 1738, 1739, 1740,
- 1739, 1740, 1739, 1740, 1739, 1740, 1739, 1740,
-
- 1734, 1735, 1734, 1735, 1734, 1735, 1734, 1735,
- 1734, 1735, 1741, 1742, 1743, 1744, 1745, 201,
- 1746, 1747, 1748, 1749, 1750, 1751, 1750, 1751,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 1752,
- 1753, 1753, 1732, 1754, 1754, 1754, 1754, 1754,
-
- 1755, 1755, 1756, 1755, 1755, 1755, 1757, 1755,
- 1755, 1755, 1755, 1756, 1755, 1755, 1755, 1755,
- 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
- 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
-
- 1755, 1755, 1755, 1758, 1758, 1756, 1756, 1758,
- 1759, 1759, 1759, 1759, 201, 201, 201, 201,
- 1676, 1676, 1676, 1676, 1676, 1676, 796, 796,
- 1407, 1760, 201, 201, 201, 201, 201, 201,
-
- 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
- 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
- 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
- 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
-
- 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
- 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
- 1761, 1761, 1762, 1763, 1764, 1764, 1765, 1765,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1766, 1766, 1767, 1767, 1767, 1767, 1767, 1767,
- 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767,
- 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767,
- 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767,
-
- 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767,
- 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767,
- 1767, 1767, 1767, 1767, 1766, 1766, 1766, 1766,
- 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
-
- 1766, 1766, 1766, 1766, 1768, 1769, 201, 201,
- 201, 201, 201, 201, 201, 201, 1770, 1770,
- 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778,
- 1779, 1780, 201, 201, 201, 201, 201, 201,
-
- 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781,
- 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781,
- 1781, 1781, 501, 501, 501, 501, 501, 501,
- 1782, 1782, 1782, 501, 1783, 1784, 201, 201,
-
- 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792,
- 1793, 1794, 1795, 1795, 1795, 1795, 1795, 1795,
- 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795,
- 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795,
-
- 1795, 1795, 1795, 1795, 1795, 1795, 1796, 1796,
- 1796, 1796, 1796, 1797, 1797, 1797, 1798, 1799,
+ 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
+ 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
+
+ 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
+ 1726, 1726, 1726, 1726, 1726, 202, 202, 202,
+ 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
+ 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
+
+ 1728, 1728, 1729, 1729, 1728, 1728, 1728, 1728,
+ 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
+ 1728, 1728, 1728, 1728, 1729, 1728, 1728, 1728,
+ 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728,
+
+ 1728, 1729, 1728, 1728, 1728, 1729, 1728, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+ 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+
+ 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+ 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+ 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
+ 1731, 1731, 1731, 1731, 1731, 1731, 1732, 1733,
+
+ 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
+ 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
+ 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
+ 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
+
+ 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
+ 1734, 1734, 1734, 1734, 1735, 1736, 1737, 1738,
+ 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
+ 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734,
+
+ 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746,
+ 1747, 1748, 1734, 1734, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 281, 282, 281, 282, 281, 282, 281, 282,
+ 281, 282, 281, 282, 281, 282, 281, 282,
+ 281, 282, 281, 282, 281, 282, 281, 282,
+ 281, 282, 281, 282, 281, 282, 281, 282,
+
+ 285, 286, 281, 282, 281, 282, 281, 282,
+ 281, 282, 281, 282, 281, 282, 1749, 267,
+ 1750, 1750, 1750, 1751, 1752, 1752, 1752, 1752,
+ 1752, 1752, 1752, 1752, 267, 267, 1751, 1753,
+
+ 281, 282, 281, 282, 281, 282, 281, 282,
+ 281, 282, 281, 282, 281, 282, 281, 282,
+ 281, 282, 281, 282, 281, 282, 281, 282,
+ 287, 288, 287, 288, 1754, 1754, 1755, 1752,
+
+ 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756,
+ 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756,
+ 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756,
+ 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756,
+
+ 1756, 1756, 1756, 1756, 1756, 1756, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1758, 1758, 1759, 1760, 1761, 1761, 1761, 1760,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762,
+ 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762,
+ 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1763,
+ 1763, 1763, 1763, 1640, 1640, 1640, 1640, 1640,
+
+ 1764, 1764, 1233, 1234, 1233, 1234, 1233, 1234,
+ 1233, 1234, 1233, 1234, 1233, 1234, 1233, 1234,
+ 1231, 1231, 1233, 1234, 1233, 1234, 1233, 1234,
+ 1233, 1234, 1233, 1234, 1233, 1234, 1233, 1234,
+
+ 1233, 1234, 1233, 1234, 1233, 1234, 1233, 1234,
+ 1233, 1234, 1233, 1234, 1233, 1234, 1233, 1234,
+ 1233, 1234, 1233, 1234, 1233, 1234, 1233, 1234,
+ 1233, 1234, 1233, 1234, 1233, 1234, 1233, 1234,
+
+ 1233, 1234, 1233, 1234, 1233, 1234, 1233, 1234,
+ 1233, 1234, 1233, 1234, 1233, 1234, 1233, 1234,
+ 1607, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1233, 1234, 1233, 1234, 1765, 1233, 1234,
+
+ 1233, 1234, 1233, 1234, 1233, 1234, 1233, 1234,
+ 1640, 1766, 1766, 1233, 1234, 1767, 1768, 1769,
+ 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777,
+ 1776, 1777, 1776, 1777, 1776, 1777, 1776, 1777,
+
+ 1770, 1771, 1770, 1771, 1770, 1771, 1770, 1771,
+ 1770, 1771, 1778, 1779, 1780, 1781, 1782, 1783,
+ 1784, 1785, 1786, 1787, 1788, 1789, 1788, 1789,
+ 1790, 1791, 1792, 1793, 1792, 1793, 1792, 1793,
+
+ 202, 202, 1792, 1793, 1794, 1795, 1796, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 1797,
+ 1798, 1798, 1768, 1799, 1799, 1799, 1799, 1799,
+
+ 1800, 1800, 1801, 1800, 1800, 1800, 1802, 1800,
+ 1800, 1800, 1800, 1801, 1800, 1800, 1800, 1800,
1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800,
1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800,
- 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1801,
- 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801,
- 1801, 1801, 1802, 1803, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 1804,
-
- 846, 846, 846, 846, 846, 846, 846, 846,
- 846, 846, 846, 846, 846, 846, 846, 846,
- 846, 846, 846, 846, 846, 846, 846, 846,
- 846, 846, 846, 846, 846, 201, 201, 201,
-
- 1805, 1805, 1805, 1806, 1807, 1807, 1807, 1807,
- 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
- 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
- 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
-
- 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
- 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
- 1807, 1807, 1807, 1808, 1806, 1806, 1805, 1805,
- 1805, 1805, 1806, 1806, 1805, 1806, 1806, 1806,
-
- 1809, 1810, 1810, 1810, 1810, 1810, 1810, 1811,
- 1812, 1812, 1810, 1810, 1810, 1810, 201, 1813,
- 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821,
- 1822, 1823, 201, 201, 201, 201, 1810, 1810,
-
- 1824, 1824, 1824, 1824, 1824, 1825, 1826, 1824,
- 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824,
- 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834,
- 1835, 1836, 1824, 1824, 1824, 1824, 1824, 201,
-
- 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
- 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
- 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
- 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
-
- 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
- 1837, 1838, 1838, 1838, 1838, 1838, 1838, 1839,
- 1839, 1838, 1838, 1839, 1839, 1838, 1838, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1837, 1837, 1837, 1838, 1837, 1837, 1837, 1837,
- 1837, 1837, 1837, 1837, 1838, 1839, 201, 201,
- 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847,
- 1848, 1849, 201, 201, 1850, 1851, 1851, 1851,
-
- 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
- 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
- 1853, 1852, 1852, 1852, 1852, 1852, 1852, 1854,
- 1854, 1854, 1852, 834, 1825, 1855, 1824, 1824,
-
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
-
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
- 1857, 1856, 1857, 1857, 1858, 1856, 1856, 1857,
- 1857, 1856, 1856, 1856, 1856, 1856, 1857, 1857,
-
- 1856, 1857, 1856, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 1856, 1856, 1859, 1860, 1860,
-
- 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861,
- 1861, 1861, 1861, 1862, 1863, 1863, 1862, 1862,
- 1864, 1864, 1861, 1865, 1865, 1862, 1866, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 1867, 1867, 1867, 1867, 1867, 1867, 201,
- 201, 1867, 1867, 1867, 1867, 1867, 1867, 201,
- 201, 1867, 1867, 1867, 1867, 1867, 1867, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1867, 1867, 1867, 1867, 1867, 1867, 1867, 201,
- 1867, 1867, 1867, 1867, 1867, 1867, 1867, 201,
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
-
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
- 1738, 1738, 1738, 1868, 1738, 1738, 1738, 1738,
- 1738, 1738, 1738, 1869, 1870, 1870, 1870, 1870,
-
- 1871, 1871, 1871, 1871, 1738, 1872, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880,
- 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888,
-
- 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896,
- 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904,
- 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912,
- 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920,
-
+ 1800, 1800, 1800, 1803, 1803, 1801, 1801, 1803,
+ 1804, 1804, 1804, 1804, 202, 202, 202, 202,
+ 1710, 1710, 1710, 1710, 1710, 1710, 810, 810,
+ 1424, 1805, 202, 202, 202, 202, 202, 202,
+
+ 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806,
+ 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806,
+ 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806,
+ 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806,
+
+ 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806,
+ 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806,
+ 1806, 1806, 1807, 1808, 1809, 1809, 1810, 1810,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 1811, 1811, 1812, 1812, 1812, 1812, 1812, 1812,
+ 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
+ 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
+ 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
+
+ 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
+ 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812,
+ 1812, 1812, 1812, 1812, 1811, 1811, 1811, 1811,
+ 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811,
+
+ 1811, 1811, 1811, 1811, 1813, 1814, 202, 202,
+ 202, 202, 202, 202, 202, 202, 1815, 1815,
+ 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823,
+ 1824, 1825, 202, 202, 202, 202, 202, 202,
+
+ 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826,
+ 1826, 1826, 1826, 1826, 1826, 1826, 1826, 1826,
+ 1826, 1826, 508, 508, 508, 508, 508, 508,
+ 1827, 1827, 1827, 508, 1828, 1829, 1830, 1831,
+
+ 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839,
+ 1840, 1841, 1842, 1842, 1842, 1842, 1842, 1842,
+ 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842,
+ 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842,
+
+ 1842, 1842, 1842, 1842, 1842, 1842, 1843, 1843,
+ 1843, 1843, 1843, 1844, 1844, 1844, 1845, 1846,
+ 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847,
+ 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847,
+
+ 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1848,
+ 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848,
+ 1848, 1848, 1849, 1850, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 1851,
+
+ 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 860, 860, 860,
+ 860, 860, 860, 860, 860, 202, 202, 202,
+
+ 1852, 1852, 1852, 1853, 1854, 1854, 1854, 1854,
+ 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854,
+ 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854,
+ 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854,
+
+ 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854,
+ 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854,
+ 1854, 1854, 1854, 1855, 1853, 1853, 1852, 1852,
+ 1852, 1852, 1853, 1853, 1852, 1852, 1853, 1853,
+
+ 1856, 1857, 1857, 1857, 1857, 1857, 1857, 1858,
+ 1859, 1859, 1857, 1857, 1857, 1857, 202, 1860,
+ 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868,
+ 1869, 1870, 202, 202, 202, 202, 1857, 1857,
+
+ 1871, 1871, 1871, 1871, 1871, 1872, 1873, 1871,
+ 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871,
+ 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881,
+ 1882, 1883, 1871, 1871, 1871, 1871, 1871, 202,
+
+ 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884,
+ 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884,
+ 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884,
+ 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884,
+
+ 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884,
+ 1884, 1885, 1885, 1885, 1885, 1885, 1885, 1886,
+ 1886, 1885, 1885, 1886, 1886, 1885, 1885, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 1884, 1884, 1884, 1885, 1884, 1884, 1884, 1884,
+ 1884, 1884, 1884, 1884, 1885, 1886, 202, 202,
+ 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894,
+ 1895, 1896, 202, 202, 1897, 1898, 1898, 1898,
+
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
+ 1900, 1899, 1899, 1899, 1899, 1899, 1899, 1901,
+ 1901, 1901, 1899, 848, 1872, 1902, 1871, 1871,
+
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+ 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903,
+ 1904, 1903, 1904, 1904, 1905, 1903, 1903, 1904,
+ 1904, 1903, 1903, 1903, 1903, 1903, 1904, 1904,
+
+ 1903, 1904, 1903, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 1903, 1903, 1906, 1907, 1907,
+
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1909, 1910, 1910, 1909, 1909,
+ 1911, 1911, 1908, 1912, 1912, 1909, 1913, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 1914, 1914, 1914, 1914, 1914, 1914, 202,
+ 202, 1914, 1914, 1914, 1914, 1914, 1914, 202,
+ 202, 1914, 1914, 1914, 1914, 1914, 1914, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 1914, 1914, 1914, 1914, 1914, 1914, 1914, 202,
+ 1914, 1914, 1914, 1914, 1914, 1914, 1914, 202,
+ 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775,
+ 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775,
+
+ 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775,
+ 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775,
+ 1775, 1775, 1775, 1915, 1775, 1775, 1775, 1775,
+ 1775, 1775, 1775, 1916, 1917, 1917, 1917, 1917,
+
+ 1918, 1918, 1918, 1918, 1775, 1919, 1920, 1920,
+ 202, 202, 202, 202, 202, 202, 202, 202,
1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928,
1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936,
+
1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944,
1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952,
-
- 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953,
- 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953,
- 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953,
- 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953,
-
- 1953, 1953, 1953, 1954, 1954, 1955, 1954, 1954,
- 1955, 1954, 1954, 1956, 1954, 1957, 201, 201,
- 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965,
- 1966, 1967, 201, 201, 201, 201, 201, 201,
-
- 1968, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1968, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1968, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1968, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1968, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1968, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1968, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 1968, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 849, 849, 849, 849, 849, 849, 849, 849,
- 849, 849, 849, 849, 849, 849, 849, 849,
-
- 849, 849, 849, 849, 849, 849, 849, 201,
- 201, 201, 201, 852, 852, 852, 852, 852,
- 852, 852, 852, 852, 852, 852, 852, 852,
- 852, 852, 852, 852, 852, 852, 852, 852,
-
- 852, 852, 852, 852, 852, 852, 852, 852,
- 852, 852, 852, 852, 852, 852, 852, 852,
- 852, 852, 852, 852, 852, 852, 852, 852,
- 852, 852, 852, 852, 201, 201, 201, 201,
-
- 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970,
- 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970,
- 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970,
- 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970,
-
- 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
- 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
- 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
- 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
-
- 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972,
- 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972,
- 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972,
- 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972,
-
- 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972,
- 1972, 1972, 1972, 1972, 1972, 1972, 1683, 1683,
- 1972, 1683, 1972, 1683, 1683, 1972, 1972, 1972,
- 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1683,
-
- 1972, 1683, 1972, 1683, 1683, 1972, 1972, 1683,
- 1683, 1683, 1972, 1972, 1972, 1972, 1973, 1973,
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
-
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
-
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
- 1974, 1974, 1974, 1975, 1975, 1975, 1682, 1682,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
-
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
-
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1977, 1978, 1979, 1980, 1981, 1982, 1982, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 1983, 1984, 1985, 1986, 1987,
- 201, 201, 201, 201, 201, 1988, 1989, 1990,
-
- 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991,
- 1991, 1992, 1990, 1990, 1990, 1990, 1990, 1990,
- 1990, 1990, 1990, 1990, 1990, 1990, 1990, 298,
- 1990, 1990, 1990, 1990, 1990, 298, 1990, 298,
-
- 1990, 1990, 298, 1990, 1990, 298, 1990, 1990,
- 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1991,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
-
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
-
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1994, 1994, 1994, 1994, 1994, 1994,
- 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994,
-
- 1994, 1994, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
-
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1632, 1345,
-
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
-
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 344, 344, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
-
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995,
- 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995,
-
- 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995,
- 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1996, 336, 344, 344,
-
- 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997,
- 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997,
- 1998, 1999, 2000, 2001, 2002, 2003, 2003, 2004,
- 2005, 2006, 201, 201, 201, 201, 201, 201,
-
- 172, 172, 172, 172, 1198, 1198, 1198, 1089,
- 1089, 1089, 1089, 1089, 1089, 1089, 1719, 1719,
- 2007, 2008, 2008, 2009, 2009, 2010, 2011, 2010,
- 2011, 2010, 2011, 2010, 2011, 2010, 2011, 2010,
-
- 2011, 2010, 2011, 2010, 2011, 1644, 1644, 2012,
- 2013, 2007, 2007, 2007, 2007, 2009, 2009, 2009,
- 2014, 2015, 2016, 201, 2017, 2018, 2019, 2019,
- 2008, 1398, 1399, 1398, 1399, 1398, 1399, 2020,
-
- 2007, 2007, 2021, 2022, 2023, 2024, 2025, 201,
- 2007, 1401, 1359, 2007, 201, 201, 201, 201,
- 1993, 1993, 1993, 2026, 1993, 344, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
-
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 344, 344, 2027,
-
- 201, 2019, 2007, 2020, 1401, 1359, 2007, 2028,
- 1398, 1399, 2007, 2021, 2014, 2022, 2016, 2029,
- 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037,
- 2038, 2039, 2018, 2017, 2040, 2025, 2041, 2019,
-
- 2007, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
- 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
+ 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960,
+ 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968,
+
+ 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976,
+ 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984,
+ 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992,
+ 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+ 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001,
+
+ 2001, 2001, 2001, 2002, 2002, 2003, 2002, 2002,
+ 2003, 2002, 2002, 2004, 2002, 2005, 202, 202,
+ 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013,
+ 2014, 2015, 202, 202, 202, 202, 202, 202,
+
+ 2016, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2016, 2017, 2017, 2017,
+
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2016, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2016, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2016, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2016, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2016, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+
+ 2017, 2017, 2017, 2017, 2016, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+ 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
+
+ 2017, 2017, 2017, 2017, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 863, 863, 863, 863, 863, 863, 863, 863,
+ 863, 863, 863, 863, 863, 863, 863, 863,
+
+ 863, 863, 863, 863, 863, 863, 863, 202,
+ 202, 202, 202, 866, 866, 866, 866, 866,
+ 866, 866, 866, 866, 866, 866, 866, 866,
+ 866, 866, 866, 866, 866, 866, 866, 866,
+
+ 866, 866, 866, 866, 866, 866, 866, 866,
+ 866, 866, 866, 866, 866, 866, 866, 866,
+ 866, 866, 866, 866, 866, 866, 866, 866,
+ 866, 866, 866, 866, 202, 202, 202, 202,
+
+ 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018,
+ 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018,
+ 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018,
+ 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018,
+
+ 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019,
+ 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019,
+ 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019,
+ 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019,
+
+ 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020,
+ 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020,
+ 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020,
+ 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020,
+
+ 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020,
+ 2020, 2020, 2020, 2020, 2020, 2020, 1718, 1718,
+ 2020, 1718, 2020, 1718, 1718, 2020, 2020, 2020,
+ 2020, 2020, 2020, 2020, 2020, 2020, 2020, 1718,
+
+ 2020, 1718, 2020, 1718, 1718, 2020, 2020, 1718,
+ 1718, 1718, 2020, 2020, 2020, 2020, 2021, 2021,
+ 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022,
+ 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022,
+
+ 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022,
+ 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022,
+ 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022,
+ 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022,
+
+ 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022,
+ 2022, 2022, 2022, 2023, 2023, 2023, 1717, 1717,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 2024, 2024, 2024, 2024, 2024, 2024,
+ 2024, 2024, 1717, 1717, 1717, 1717, 1717, 1717,
+
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+
+ 2025, 2026, 2027, 2028, 2029, 2030, 2030, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 2031, 2032, 2033, 2034, 2035,
+ 202, 202, 202, 202, 202, 2036, 2037, 2038,
+
+ 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039,
+ 2039, 2040, 2038, 2038, 2038, 2038, 2038, 2038,
+ 2038, 2038, 2038, 2038, 2038, 2038, 2038, 301,
+ 2038, 2038, 2038, 2038, 2038, 301, 2038, 301,
+
+ 2038, 2038, 301, 2038, 2038, 301, 2038, 2038,
+ 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2039,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2042, 2042, 2042, 2042, 2042, 2042,
2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
- 2042, 2042, 2042, 2043, 2007, 2044, 2045, 2009,
-
- 2045, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
- 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
- 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
- 2046, 2046, 2046, 2043, 2025, 2044, 2025, 2047,
-
- 2048, 2049, 1398, 1399, 2050, 2051, 2052, 2053,
- 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053,
- 2054, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
- 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
-
- 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
- 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
- 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
- 2052, 2052, 2052, 2052, 2052, 2052, 2055, 2055,
-
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 201,
-
- 201, 201, 1666, 1666, 1666, 1666, 1666, 1666,
- 201, 201, 1666, 1666, 1666, 1666, 1666, 1666,
- 201, 201, 1666, 1666, 1666, 1666, 1666, 1666,
- 201, 201, 1666, 1666, 1666, 201, 201, 201,
-
- 2056, 1401, 2025, 2045, 1640, 1401, 1401, 201,
- 1422, 1397, 1397, 1397, 1397, 1422, 1422, 201,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 2057, 2057, 2057, 2058, 51, 2059, 2059,
-
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 201, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
-
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 201,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 201, 2060, 2060, 201, 2060,
-
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 201, 201,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 201, 201,
-
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
-
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 201, 201, 201, 201, 201,
-
- 2061, 2062, 2061, 201, 201, 201, 201, 2063,
- 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063,
- 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063,
- 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063,
-
- 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063,
- 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063,
- 2063, 2063, 2063, 2063, 201, 201, 201, 2064,
- 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064,
-
- 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
- 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
- 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
- 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
-
- 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
- 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
- 2065, 2065, 2065, 2065, 2065, 2066, 2066, 2066,
- 2066, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
-
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2066, 2068, 2069, 2070, 2070, 201,
- 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516,
- 1516, 1516, 1516, 1516, 201, 201, 201, 201,
-
- 2069, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444,
- 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444,
-
- 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444,
- 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444,
- 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444,
- 1444, 1444, 1444, 1444, 1444, 1201, 201, 201,
-
- 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071,
- 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071,
- 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071,
- 2071, 2071, 2071, 2071, 2071, 201, 201, 201,
-
- 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
- 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
- 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
- 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
-
- 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
- 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
- 2072, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1089, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
- 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
- 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
- 2073, 2073, 2073, 2073, 201, 201, 201, 201,
-
- 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
- 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
- 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
- 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2075,
-
- 2076, 2076, 2076, 2076, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 2077, 2077, 2077,
- 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078,
- 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078,
-
- 2078, 2079, 2078, 2078, 2078, 2078, 2078, 2078,
- 2078, 2078, 2079, 201, 201, 201, 201, 201,
- 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080,
- 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080,
-
- 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080,
- 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080,
- 2080, 2080, 2080, 2080, 2080, 2080, 2081, 2081,
- 2081, 2081, 2081, 201, 201, 201, 201, 201,
-
- 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082,
- 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082,
- 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082,
- 2082, 2082, 2082, 2082, 2082, 2082, 201, 2083,
-
- 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
- 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
- 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
- 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
-
- 2084, 2084, 2084, 2084, 201, 201, 201, 201,
- 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
- 2085, 2086, 2086, 2086, 2086, 2086, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
- 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
- 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
- 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
-
- 2087, 2087, 2087, 2087, 2087, 2087, 2088, 2088,
- 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089,
- 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089,
- 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089,
-
- 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089,
- 2089, 2089, 2089, 2089, 2089, 2089, 2090, 2090,
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
-
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
-
- 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092,
- 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092,
- 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092,
- 2092, 2092, 2092, 2092, 2092, 2092, 201, 201,
-
- 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100,
- 2101, 2102, 201, 201, 201, 201, 201, 201,
- 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103,
- 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103,
-
- 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103,
- 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103,
- 2103, 2103, 2103, 2103, 201, 201, 201, 201,
- 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104,
-
- 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104,
- 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104,
- 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104,
- 2104, 2104, 2104, 2104, 201, 201, 201, 201,
-
- 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
- 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
- 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
- 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
-
- 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106,
- 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106,
-
- 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106,
- 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106,
- 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106,
- 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106,
-
- 2106, 2106, 2106, 2106, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 2107,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
+
+ 2042, 2042, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 1665, 1362,
+
+ 348, 348, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 348,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 348, 348, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 348, 348, 348, 348, 348, 348, 348, 348,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2044, 340, 348, 348,
+
+ 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045,
+ 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045,
+ 2046, 2047, 2048, 2049, 2050, 2051, 2051, 2052,
+ 2053, 2054, 202, 202, 202, 202, 202, 202,
+
+ 173, 173, 173, 173, 1215, 1215, 1215, 1104,
+ 1104, 1104, 1104, 1104, 1104, 1104, 1755, 1755,
+ 2055, 2056, 2056, 2057, 2057, 2058, 2059, 2058,
+ 2059, 2058, 2059, 2058, 2059, 2058, 2059, 2058,
+
+ 2059, 2058, 2059, 2058, 2059, 1677, 1677, 2060,
+ 2061, 2055, 2055, 2055, 2055, 2057, 2057, 2057,
+ 2062, 2063, 2064, 202, 2065, 2066, 2067, 2067,
+ 2056, 1415, 1416, 1415, 1416, 1415, 1416, 2068,
+
+ 2055, 2055, 2069, 2070, 2071, 2072, 2073, 202,
+ 2055, 1418, 1376, 2055, 202, 202, 202, 202,
+ 2041, 2041, 2041, 2074, 2041, 348, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 2041, 2041, 2041,
+ 2041, 2041, 2041, 2041, 2041, 348, 348, 2075,
+
+ 202, 2067, 2055, 2068, 1418, 1376, 2055, 2076,
+ 1415, 1416, 2055, 2069, 2062, 2070, 2064, 2077,
+ 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085,
+ 2086, 2087, 2066, 2065, 2088, 2073, 2089, 2067,
+
+ 2055, 2090, 2090, 2090, 2090, 2090, 2090, 2090,
+ 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090,
+ 2090, 2090, 2090, 2090, 2090, 2090, 2090, 2090,
+ 2090, 2090, 2090, 2091, 2055, 2092, 2093, 2057,
+
+ 2093, 2094, 2094, 2094, 2094, 2094, 2094, 2094,
+ 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094,
+ 2094, 2094, 2094, 2094, 2094, 2094, 2094, 2094,
+ 2094, 2094, 2094, 2091, 2073, 2092, 2073, 2095,
+
+ 2096, 2097, 1415, 1416, 2098, 2099, 2100, 2101,
+ 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101,
+ 2102, 2100, 2100, 2100, 2100, 2100, 2100, 2100,
+ 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100,
+
+ 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100,
+ 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100,
+ 2100, 2100, 2100, 2100, 2100, 2100, 2100, 2100,
+ 2100, 2100, 2100, 2100, 2100, 2100, 2103, 2103,
+
+ 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
+ 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
+ 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
+ 1700, 1700, 1700, 1700, 1700, 1700, 1700, 202,
+
+ 202, 202, 1700, 1700, 1700, 1700, 1700, 1700,
+ 202, 202, 1700, 1700, 1700, 1700, 1700, 1700,
+ 202, 202, 1700, 1700, 1700, 1700, 1700, 1700,
+ 202, 202, 1700, 1700, 1700, 202, 202, 202,
+
+ 2104, 1418, 2073, 2093, 1673, 1418, 1418, 202,
+ 1439, 1414, 1414, 1414, 1414, 1439, 1439, 202,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 2105, 2105, 2105, 2106, 51, 2107, 2107,
2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
+ 2108, 2108, 2108, 2108, 202, 2108, 2108, 2108,
2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
+
+ 2108, 2108, 2108, 2108, 2108, 2108, 2108, 202,
+ 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
+ 2108, 2108, 2108, 202, 2108, 2108, 202, 2108,
2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
+ 2108, 2108, 2108, 2108, 2108, 2108, 202, 202,
2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
- 2108, 2108, 2108, 2108, 2108, 2108, 2108, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
+ 2108, 2108, 2108, 2108, 2108, 2108, 202, 202,
2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
- 2108, 2108, 2108, 2108, 2108, 2108, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
+ 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
+ 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2109, 2109, 2109, 2109, 2109, 2109, 298, 298,
- 2109, 298, 2109, 2109, 2109, 2109, 2109, 2109,
- 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
- 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
-
- 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
- 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
- 2109, 2109, 2109, 2109, 2109, 2109, 298, 2109,
- 2109, 298, 298, 298, 2109, 298, 298, 2109,
-
- 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110,
- 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110,
- 2110, 2110, 2110, 2110, 2110, 2110, 298, 2111,
+ 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
+ 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
+ 2108, 2108, 2108, 202, 202, 202, 202, 202,
+
+ 2109, 2110, 2109, 202, 202, 202, 202, 2111,
+ 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111,
+ 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111,
+ 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111,
+
+ 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111,
+ 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111,
+ 2111, 2111, 2111, 2111, 202, 202, 202, 2112,
2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112,
2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113,
2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113,
- 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2114,
+ 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113,
+ 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113,
+
+ 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113,
+ 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113,
+ 2113, 2113, 2113, 2113, 2113, 2114, 2114, 2114,
2114, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
- 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116,
- 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116,
- 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116,
- 2116, 2116, 2116, 2116, 2116, 2116, 2116, 298,
+ 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
+ 2115, 2115, 2114, 2116, 2117, 2118, 2118, 202,
+ 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539,
+ 1539, 1539, 1539, 1539, 202, 202, 202, 202,
+
+ 2117, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
- 298, 298, 298, 298, 298, 298, 298, 2117,
- 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461,
+ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461,
- 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118,
- 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118,
- 2118, 2118, 2118, 298, 2118, 2118, 298, 298,
- 298, 298, 298, 2119, 2119, 2119, 2119, 2119,
+ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461,
+ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461,
+ 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461,
+ 1461, 1461, 1461, 1461, 1461, 1218, 202, 202,
+ 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119,
+ 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119,
+ 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119,
+ 2119, 2119, 2119, 2119, 2119, 202, 202, 202,
+
+ 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120,
2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120,
2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120,
- 2120, 2120, 2120, 2120, 2120, 2120, 2121, 2121,
- 2121, 2121, 2122, 2122, 298, 298, 298, 2123,
+ 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120,
+
+ 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120,
+ 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120,
+ 2120, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
- 2124, 2124, 2124, 2124, 2124, 2124, 2124, 2124,
- 2124, 2124, 2124, 2124, 2124, 2124, 2124, 2124,
- 2124, 2124, 2124, 2124, 2124, 2124, 2124, 2124,
- 2124, 2124, 298, 298, 298, 298, 298, 2125,
+ 1104, 2121, 2121, 2121, 2121, 2121, 2121, 2121,
+ 2121, 2121, 2121, 2121, 2121, 2121, 2121, 2121,
+ 2121, 2121, 2121, 2121, 2121, 2121, 2121, 2121,
+ 2121, 2121, 2121, 2121, 202, 202, 202, 202,
+ 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122,
+ 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122,
+ 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122,
+ 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2123,
+
+ 2124, 2124, 2124, 2124, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 2125, 2125, 2125,
2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
- 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
- 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
-
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 298, 298, 298, 298, 2128, 2128, 2127, 2127,
+ 2126, 2127, 2126, 2126, 2126, 2126, 2126, 2126,
+ 2126, 2126, 2127, 202, 202, 202, 202, 202,
2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 298, 298, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
-
- 2129, 2130, 2130, 2130, 298, 2130, 2130, 298,
- 298, 298, 298, 298, 2130, 2131, 2130, 2132,
- 2129, 2129, 2129, 2129, 298, 2129, 2129, 2129,
- 298, 2129, 2129, 2129, 2129, 2129, 2129, 2129,
-
- 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129,
- 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129,
- 2129, 2129, 2129, 2129, 298, 298, 298, 298,
- 2132, 2133, 2131, 298, 298, 298, 298, 2134,
-
- 2135, 2136, 2137, 2138, 2139, 2139, 2139, 2139,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 2140, 2140, 2140, 2140, 2140, 2140, 2141, 2141,
- 2142, 298, 298, 298, 298, 298, 298, 298,
-
- 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143,
- 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143,
- 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143,
- 2143, 2143, 2143, 2143, 2143, 2144, 2144, 2145,
-
- 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146,
- 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146,
- 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146,
- 2146, 2146, 2146, 2146, 2146, 2147, 2147, 2147,
-
- 2148, 2148, 2148, 2148, 2148, 2149, 2150, 2149,
- 2151, 2149, 2149, 2150, 2150, 2152, 2149, 2149,
- 2149, 2149, 2149, 2148, 2148, 2148, 2148, 2152,
- 2148, 2148, 2148, 2148, 2148, 2149, 2148, 2148,
-
- 2148, 2149, 2150, 2150, 2149, 2153, 2154, 298,
- 298, 298, 298, 2155, 2155, 2155, 2155, 2156,
- 2157, 2157, 2157, 2157, 2157, 2157, 2158, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
- 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
- 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
- 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
-
- 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
- 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
- 2159, 2159, 2159, 2159, 2159, 2159, 298, 298,
- 298, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2128, 2128, 2128, 2128, 2128, 2128, 2129, 2129,
+ 2129, 2129, 2129, 202, 202, 202, 202, 202,
+
+ 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
+ 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
+ 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130,
+ 2130, 2130, 2130, 2130, 2130, 2130, 202, 2131,
+
+ 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
+ 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
+ 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
+ 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
+
+ 2132, 2132, 2132, 2132, 202, 202, 202, 202,
+ 2132, 2132, 2132, 2132, 2132, 2132, 2132, 2132,
+ 2133, 2134, 2134, 2134, 2134, 2134, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
+ 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
+ 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
+ 2135, 2135, 2135, 2135, 2135, 2135, 2135, 2135,
+
+ 2135, 2135, 2135, 2135, 2135, 2135, 2136, 2136,
+ 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137,
+ 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137,
+ 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137,
+
+ 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137,
+ 2137, 2137, 2137, 2137, 2137, 2137, 2138, 2138,
+ 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139,
+ 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139,
+
+ 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139,
+ 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139,
+ 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139,
+ 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139,
+
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 202, 202,
+
+ 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148,
+ 2149, 2150, 202, 202, 202, 202, 202, 202,
+ 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151,
+ 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151,
+
+ 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151,
+ 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151,
+ 2151, 2151, 2151, 2151, 202, 202, 202, 202,
+ 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
+
+ 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
+ 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
+ 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152,
+ 2152, 2152, 2152, 2152, 202, 202, 202, 202,
+
+ 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153,
+ 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153,
+ 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153,
+ 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153,
+
+ 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
+ 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
+
+ 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
+ 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
+ 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
+ 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154,
+
+ 2154, 2154, 2154, 2154, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 2155,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
+
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
+ 2156, 2156, 2156, 2156, 2156, 2156, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2157, 2157, 2157, 2157, 2157, 2157, 301, 301,
+ 2157, 301, 2157, 2157, 2157, 2157, 2157, 2157,
+ 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157,
+ 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157,
+
+ 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157,
+ 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157,
+ 2157, 2157, 2157, 2157, 2157, 2157, 301, 2157,
+ 2157, 301, 301, 301, 2157, 301, 301, 2157,
+
+ 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
+ 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
+ 2158, 2158, 2158, 2158, 2158, 2158, 301, 2159,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161,
2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161,
- 2161, 2161, 2161, 2161, 2161, 2161, 298, 298,
- 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162,
+ 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2162,
+ 2162, 2163, 2163, 2163, 2163, 2163, 2163, 2163,
- 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163,
- 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163,
- 2163, 2163, 2163, 298, 298, 298, 298, 298,
2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 301,
- 2165, 2166, 2165, 2166, 2166, 2166, 2165, 2165,
- 2165, 2166, 2165, 2165, 2166, 2165, 2166, 2166,
- 2165, 2166, 298, 298, 298, 298, 298, 298,
- 298, 2167, 2167, 2167, 2167, 298, 298, 298,
-
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 2168, 2168, 2168, 2168, 2169, 2169, 2170,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
+ 301, 301, 301, 301, 301, 301, 301, 2165,
+ 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166,
+ 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166,
+ 2166, 2166, 2166, 301, 2166, 2166, 301, 301,
+ 301, 301, 301, 2167, 2167, 2167, 2167, 2167,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
+ 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168,
+ 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168,
+ 2168, 2168, 2168, 2168, 2168, 2168, 2169, 2169,
+ 2169, 2169, 2170, 2170, 301, 301, 301, 2171,
2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
-
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
- 2172, 2172, 2172, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
-
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
- 2173, 2173, 2173, 298, 298, 298, 298, 298,
- 298, 298, 2174, 2174, 2174, 2174, 2174, 2174,
-
- 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182,
- 2183, 2184, 2184, 2184, 2184, 2184, 2184, 2184,
- 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184,
- 2184, 2184, 2184, 2184, 2184, 2184, 2184, 298,
-
- 2185, 2186, 2185, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186,
- 2186, 2186, 2186, 2186, 2186, 2186, 2188, 2189,
- 2189, 2190, 2190, 2190, 2190, 2190, 201, 201,
- 201, 201, 2191, 2192, 2193, 2194, 2195, 2196,
- 2197, 2198, 2199, 2200, 2200, 2200, 2200, 2200,
- 2200, 2200, 2200, 2200, 2200, 2200, 2201, 2202,
- 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 2211,
- 2212, 2212, 2213, 2214, 2214, 2214, 2214, 2214,
- 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
- 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
- 2214, 2214, 2215, 2214, 2215, 2214, 2214, 2214,
+ 2172, 2172, 301, 301, 301, 301, 301, 2173,
+
+ 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174,
+ 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174,
+ 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174,
+ 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174,
+
+ 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175,
+ 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175,
+ 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175,
+ 301, 301, 301, 301, 2176, 2176, 2175, 2175,
+
+ 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176,
+ 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176,
+ 301, 301, 2176, 2176, 2176, 2176, 2176, 2176,
+ 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176,
+
+ 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176,
+ 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176,
+ 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176,
+ 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176,
+
+ 2177, 2178, 2178, 2178, 301, 2178, 2178, 301,
+ 301, 301, 301, 301, 2178, 2179, 2178, 2180,
+ 2177, 2177, 2177, 2177, 301, 2177, 2177, 2177,
+ 301, 2177, 2177, 2177, 2177, 2177, 2177, 2177,
+
+ 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177,
+ 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177,
+ 2177, 2177, 2177, 2177, 2181, 2181, 301, 301,
+ 2180, 2182, 2179, 301, 301, 301, 301, 2183,
+
+ 2184, 2185, 2186, 2187, 2188, 2188, 2188, 2188,
+ 2189, 301, 301, 301, 301, 301, 301, 301,
+ 2190, 2190, 2190, 2190, 2190, 2190, 2191, 2191,
+ 2192, 301, 301, 301, 301, 301, 301, 301,
+
+ 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193,
+ 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193,
+ 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193,
+ 2193, 2193, 2193, 2193, 2193, 2194, 2194, 2195,
+
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2197, 2197, 2197,
+
+ 2198, 2198, 2198, 2198, 2198, 2199, 2200, 2199,
+ 2201, 2199, 2199, 2200, 2200, 2202, 2199, 2199,
+ 2199, 2199, 2199, 2198, 2198, 2198, 2198, 2202,
+ 2198, 2198, 2198, 2198, 2198, 2199, 2198, 2198,
+
+ 2198, 2199, 2200, 2200, 2199, 2203, 2204, 301,
+ 301, 301, 301, 2205, 2205, 2205, 2205, 2206,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2208, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
+ 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209,
+ 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209,
+ 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209,
+ 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209,
+
+ 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209,
+ 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209,
+ 2209, 2209, 2209, 2209, 2209, 2209, 301, 301,
+ 301, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+
+ 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
+ 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211,
+ 2211, 2211, 2211, 2211, 2211, 2211, 301, 301,
+ 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212,
+
+ 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213,
+ 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213,
+ 2213, 2213, 2213, 301, 301, 301, 301, 301,
2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
- 2214, 2214, 2214, 2215, 2214, 2214, 2214, 2214,
- 2213, 2213, 2213, 2212, 2212, 2212, 2212, 2213,
- 2213, 2216, 2217, 2218, 2218, 2219, 2220, 2220,
- 2220, 2220, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
+
+ 2215, 2216, 2215, 2216, 2216, 2216, 2215, 2215,
+ 2215, 2216, 2215, 2215, 2216, 2215, 2216, 2216,
+ 2215, 2216, 301, 301, 301, 301, 301, 301,
+ 301, 2217, 2217, 2217, 2217, 301, 301, 301,
+
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 2218, 2218, 2218, 2218, 2219, 2219, 2220,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
- 2221, 201, 201, 201, 201, 201, 201, 201,
- 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229,
- 2230, 2231, 201, 201, 201, 201, 201, 201,
-
- 2232, 2232, 2232, 2233, 2233, 2233, 2233, 2233,
- 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233,
- 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233,
- 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233,
- 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2234,
- 2235, 2235, 2235, 2235, 2236, 2235, 2237, 2237,
- 2235, 2235, 2235, 2238, 2238, 201, 2239, 2240,
- 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248,
- 2249, 2250, 2250, 2250, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
- 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
- 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
+ 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
+
+ 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
+ 2221, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
+ 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222,
+ 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222,
+ 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222,
+ 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222,
+
+ 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222,
+ 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222,
+ 2222, 2222, 2222, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223,
+ 2223, 2223, 2223, 301, 301, 301, 301, 301,
+ 301, 301, 2224, 2224, 2224, 2224, 2224, 2224,
+
+ 2225, 2226, 2226, 2226, 2226, 2226, 2226, 2226,
+ 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226,
+ 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226,
+ 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226,
+
+ 2226, 2226, 2227, 2226, 2228, 2228, 2228, 2228,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236,
+ 2237, 2238, 301, 301, 301, 301, 301, 301,
+
+ 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246,
+ 2247, 2248, 2248, 2248, 2248, 2248, 2248, 2248,
+ 2248, 2248, 2248, 2248, 2248, 2248, 2248, 2248,
+ 2248, 2248, 2248, 2248, 2248, 2248, 2248, 301,
+
+ 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 2249, 2249, 2249, 2249, 2249,
+ 2249, 2249, 2249, 2249, 2249, 2250, 2250, 2250,
+
+ 2250, 2250, 2250, 2250, 2250, 2250, 2250, 2249,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 2251, 2251, 2251, 2252, 2251, 2251, 2251, 2251,
2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
- 2251, 2251, 2251, 2252, 2253, 2254, 2251, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2255, 2255, 2256, 2257, 2257, 2257, 2257, 2257,
- 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257,
- 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257,
- 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257,
- 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257,
- 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257,
- 2257, 2257, 2257, 2256, 2256, 2256, 2255, 2255,
- 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2256,
- 2258, 2257, 2259, 2259, 2257, 2260, 2260, 2261,
- 2262, 2263, 2264, 2265, 2265, 2266, 201, 201,
- 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274,
- 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2281,
- 201, 2282, 2282, 2282, 2282, 2282, 2282, 2282,
- 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282,
- 2282, 2282, 2282, 2282, 2282, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 201, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 2283, 2283, 2284, 2284, 2284, 2285,
- 2285, 2285, 2284, 2284, 2285, 2286, 2287, 2285,
- 2288, 2288, 2289, 2288, 2288, 2289, 2290, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2291, 2291, 2291, 2291, 2291, 2291, 2291, 201,
- 2291, 201, 2291, 2291, 2291, 2291, 201, 2291,
- 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291,
- 2291, 2291, 2291, 2291, 2291, 2291, 201, 2291,
- 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291,
- 2291, 2292, 201, 201, 201, 201, 201, 201,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2294,
- 2295, 2295, 2295, 2294, 2294, 2294, 2294, 2294,
- 2294, 2296, 2297, 201, 201, 201, 201, 201,
+
+ 2251, 2251, 2251, 2251, 2251, 2253, 2254, 2254,
+ 2255, 2255, 2255, 2254, 2255, 2254, 2254, 2254,
+ 2254, 2256, 2256, 2256, 2257, 2258, 2258, 2258,
+ 2258, 2258, 301, 301, 301, 301, 301, 301,
+
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
+ 2260, 2261, 2260, 2262, 2262, 2262, 2262, 2262,
+ 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
+ 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
+ 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
+ 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
+ 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
+ 2262, 2262, 2262, 2262, 2262, 2262, 2262, 2262,
+ 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261,
+ 2261, 2261, 2261, 2261, 2261, 2261, 2263, 2264,
+ 2264, 2265, 2265, 2265, 2265, 2265, 202, 202,
+ 202, 202, 2266, 2267, 2268, 2269, 2270, 2271,
+ 2272, 2273, 2274, 2275, 2275, 2275, 2275, 2275,
+ 2275, 2275, 2275, 2275, 2275, 2275, 2276, 2277,
+ 2278, 2279, 2280, 2281, 2282, 2283, 2284, 2285,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 2286,
+ 2287, 2287, 2288, 2289, 2289, 2289, 2289, 2289,
+ 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289,
+ 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289,
+ 2289, 2289, 2290, 2289, 2290, 2289, 2289, 2289,
+ 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289,
+ 2289, 2289, 2289, 2290, 2289, 2289, 2289, 2289,
+ 2288, 2288, 2288, 2287, 2287, 2287, 2287, 2288,
+ 2288, 2291, 2292, 2293, 2293, 2294, 2295, 2295,
+ 2295, 2295, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 2296, 202, 202,
+ 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297,
+ 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297,
+ 2297, 2297, 2297, 2297, 2297, 2297, 2297, 2297,
+ 2297, 202, 202, 202, 202, 202, 202, 202,
2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305,
- 2306, 2307, 201, 201, 201, 201, 201, 201,
-
- 2308, 2309, 2310, 2310, 201, 2311, 2311, 2311,
- 2311, 2311, 2311, 2311, 2311, 201, 201, 2311,
- 2311, 201, 201, 2311, 2311, 2311, 2311, 2311,
- 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311,
- 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311,
- 2311, 201, 2311, 2311, 2311, 2311, 2311, 2311,
- 2311, 201, 2311, 2311, 201, 2311, 2311, 2311,
- 2311, 2311, 201, 201, 2312, 2311, 2313, 2310,
- 2309, 2310, 2310, 2310, 2310, 201, 201, 2310,
- 2310, 201, 201, 2314, 2314, 2315, 201, 201,
- 2316, 201, 201, 201, 201, 201, 201, 2313,
- 201, 201, 201, 201, 201, 2311, 2311, 2311,
- 2311, 2311, 2310, 2310, 201, 201, 2317, 2317,
- 2317, 2317, 2317, 2317, 2317, 201, 201, 201,
- 2317, 2317, 2317, 2317, 2317, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318,
- 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318,
- 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318,
- 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318,
- 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318,
- 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318,
- 2318, 2318, 2318, 2318, 2318, 2319, 2319, 2319,
- 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320,
- 2319, 2319, 2321, 2320, 2320, 2319, 2322, 2318,
- 2318, 2318, 2318, 2323, 2323, 2324, 2324, 2325,
- 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333,
- 2334, 2335, 201, 2324, 201, 2325, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2337, 2338, 2338, 2339, 2339, 2339, 2339, 2339,
- 2339, 2338, 2340, 2341, 2341, 2337, 2341, 2339,
- 2339, 2338, 2342, 2343, 2336, 2336, 2344, 2336,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352,
- 2353, 2354, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2356,
- 2357, 2357, 2358, 2358, 2358, 2358, 201, 201,
- 2357, 2357, 2359, 2359, 2358, 2358, 2357, 2360,
- 2361, 2362, 2363, 2363, 2364, 2364, 2365, 2365,
- 2365, 2363, 2366, 2366, 2366, 2366, 2366, 2366,
- 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
- 2367, 2367, 2367, 2367, 2368, 2368, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369,
- 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369,
- 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369,
- 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369,
- 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369,
- 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369,
- 2370, 2370, 2370, 2371, 2371, 2371, 2371, 2371,
- 2371, 2371, 2371, 2370, 2370, 2371, 2370, 2372,
- 2371, 2373, 2373, 2374, 2369, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
+ 2306, 2307, 202, 202, 202, 202, 202, 202,
+
+ 2308, 2308, 2308, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2310,
+ 2311, 2311, 2311, 2311, 2312, 2311, 2313, 2313,
+ 2311, 2311, 2311, 2314, 2314, 202, 2315, 2316,
+ 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324,
+ 2325, 2326, 2326, 2326, 2327, 2328, 2328, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329,
+ 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329,
+ 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329,
+ 2329, 2329, 2329, 2329, 2329, 2329, 2329, 2329,
+ 2329, 2329, 2329, 2330, 2331, 2332, 2329, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2333, 2333, 2334, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2335, 2335, 2335, 2335, 2335,
+ 2335, 2335, 2335, 2334, 2334, 2334, 2333, 2333,
+ 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2334,
+ 2336, 2335, 2337, 2337, 2335, 2338, 2338, 2339,
+ 2340, 2341, 2342, 2341, 2341, 2343, 202, 202,
+ 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351,
+ 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2358,
+ 202, 2359, 2359, 2359, 2359, 2359, 2359, 2359,
+ 2359, 2359, 2359, 2359, 2359, 2359, 2359, 2359,
+ 2359, 2359, 2359, 2359, 2359, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 202, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2360, 2360, 2360, 2360, 2360,
+ 2360, 2360, 2360, 2360, 2361, 2361, 2361, 2362,
+ 2362, 2362, 2361, 2361, 2362, 2363, 2364, 2362,
+ 2365, 2365, 2366, 2365, 2365, 2366, 2367, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 202,
+ 2368, 202, 2368, 2368, 2368, 2368, 202, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 202, 2368,
+ 2368, 2368, 2368, 2368, 2368, 2368, 2368, 2368,
+ 2368, 2369, 202, 202, 202, 202, 202, 202,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2371,
+ 2372, 2372, 2372, 2371, 2371, 2371, 2371, 2371,
+ 2371, 2373, 2374, 202, 202, 202, 202, 202,
2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382,
- 2383, 2384, 201, 201, 201, 201, 201, 201,
- 2385, 2385, 2385, 2385, 2385, 2385, 2385, 2385,
- 2385, 2385, 2385, 2385, 2385, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
- 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
- 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
- 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
- 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
- 2386, 2386, 2386, 2387, 2388, 2387, 2388, 2388,
- 2387, 2387, 2387, 2387, 2387, 2387, 2389, 2390,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398,
- 2399, 2400, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401,
- 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401,
- 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401,
- 2401, 2401, 201, 201, 201, 2402, 2402, 2402,
- 2403, 2403, 2402, 2402, 2402, 2402, 2403, 2402,
- 2402, 2402, 2402, 2404, 201, 201, 201, 201,
- 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412,
- 2413, 2414, 2415, 2415, 2416, 2416, 2416, 2417,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
- 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
- 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
- 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
- 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
- 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
- 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
- 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
- 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427,
- 2428, 2429, 2430, 2430, 2430, 2430, 2430, 2430,
- 2430, 2430, 2430, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 2431,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2432, 2433, 2433, 2433, 2433, 2433, 2433, 2434,
- 2434, 2433, 2433, 2432, 2432, 2432, 2432, 2432,
- 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432,
- 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432,
- 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432,
- 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432,
- 2432, 2432, 2432, 2433, 2435, 2433, 2433, 2433,
- 2433, 2434, 2436, 2433, 2433, 2433, 2433, 2437,
- 2438, 2439, 2440, 2440, 2439, 2437, 2438, 2435,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2441, 2442, 2442, 2442, 2442, 2442, 2442, 2443,
- 2443, 2442, 2442, 2442, 2441, 2441, 2441, 2441,
- 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441,
- 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441,
- 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441,
- 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441,
- 2441, 2441, 2441, 2441, 201, 201, 2444, 2444,
- 2444, 2444, 2442, 2442, 2442, 2442, 2442, 2442,
- 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2443,
- 2442, 2445, 2446, 2447, 2447, 201, 2448, 2448,
- 2448, 2446, 2446, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
+ 2383, 2384, 202, 202, 202, 202, 202, 202,
+
+ 2385, 2386, 2387, 2387, 202, 2388, 2388, 2388,
+ 2388, 2388, 2388, 2388, 2388, 202, 202, 2388,
+ 2388, 202, 202, 2388, 2388, 2388, 2388, 2388,
+ 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388,
+ 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388,
+ 2388, 202, 2388, 2388, 2388, 2388, 2388, 2388,
+ 2388, 202, 2388, 2388, 202, 2388, 2388, 2388,
+ 2388, 2388, 202, 2389, 2390, 2388, 2391, 2387,
+ 2386, 2387, 2387, 2387, 2387, 202, 202, 2387,
+ 2387, 202, 202, 2392, 2392, 2393, 202, 202,
+ 2394, 202, 202, 202, 202, 202, 202, 2391,
+ 202, 202, 202, 202, 202, 2388, 2388, 2388,
+ 2388, 2388, 2387, 2387, 202, 202, 2395, 2395,
+ 2395, 2395, 2395, 2395, 2395, 202, 202, 202,
+ 2395, 2395, 2395, 2395, 2395, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396,
+ 2396, 2396, 2396, 2396, 2396, 2397, 2397, 2397,
+ 2398, 2398, 2398, 2398, 2398, 2398, 2398, 2398,
+ 2397, 2397, 2399, 2398, 2398, 2397, 2400, 2396,
+ 2396, 2396, 2396, 2401, 2401, 2402, 2402, 2403,
+ 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411,
+ 2412, 2413, 202, 2402, 202, 2403, 2414, 2415,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
+ 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
+ 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
+ 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
+ 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
+ 2416, 2416, 2416, 2416, 2416, 2416, 2416, 2416,
+ 2417, 2418, 2418, 2419, 2419, 2419, 2419, 2419,
+ 2419, 2418, 2420, 2421, 2421, 2417, 2421, 2419,
+ 2419, 2418, 2422, 2423, 2416, 2416, 2424, 2416,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2425, 2426, 2427, 2428, 2429, 2430, 2431, 2432,
+ 2433, 2434, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435,
+ 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435,
+ 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435,
+ 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435,
+ 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435,
+ 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2436,
+ 2437, 2437, 2438, 2438, 2438, 2438, 202, 202,
+ 2437, 2437, 2439, 2439, 2438, 2438, 2437, 2440,
+ 2441, 2442, 2443, 2443, 2444, 2444, 2445, 2445,
+ 2445, 2443, 2446, 2446, 2446, 2446, 2446, 2446,
+ 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446,
+ 2447, 2447, 2447, 2447, 2448, 2448, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
- 2449, 201, 201, 201, 201, 201, 201, 201,
-
- 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2450,
- 2450, 201, 2450, 2450, 2450, 2450, 2450, 2450,
- 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2450,
- 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2450,
- 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2450,
- 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2451,
- 2452, 2452, 2452, 2452, 2452, 2452, 2452, 201,
- 2452, 2452, 2452, 2452, 2452, 2452, 2451, 2453,
- 2450, 2454, 2454, 2455, 2455, 2455, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463,
- 2464, 2465, 2466, 2466, 2466, 2466, 2466, 2466,
+ 2450, 2450, 2450, 2451, 2451, 2451, 2451, 2451,
+ 2451, 2451, 2451, 2450, 2450, 2451, 2450, 2452,
+ 2451, 2453, 2453, 2454, 2449, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462,
+ 2463, 2464, 202, 202, 202, 202, 202, 202,
+ 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465,
+ 2465, 2465, 2465, 2465, 2465, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466,
- 2466, 2466, 2466, 2466, 2466, 201, 201, 201,
- 2467, 2468, 2469, 2469, 2469, 2469, 2469, 2469,
- 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469,
- 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469,
- 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469,
- 201, 201, 2470, 2470, 2470, 2470, 2470, 2470,
- 2470, 2470, 2470, 2470, 2470, 2470, 2470, 2470,
- 2470, 2470, 2470, 2470, 2470, 2470, 2470, 2470,
- 201, 2471, 2470, 2470, 2470, 2470, 2470, 2470,
- 2470, 2471, 2470, 2470, 2471, 2470, 2470, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2472, 2472, 2472, 2472, 2472, 2472, 2472, 201,
- 2472, 2472, 201, 2472, 2472, 2472, 2472, 2472,
- 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
- 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
- 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
- 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
- 2472, 2473, 2473, 2473, 2473, 2473, 2473, 201,
- 201, 201, 2473, 201, 2473, 2473, 201, 2473,
- 2473, 2473, 2474, 2473, 2475, 2475, 2476, 2473,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484,
- 2485, 2486, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
-
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2488,
- 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488,
- 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488,
- 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488,
- 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488,
- 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488,
- 2488, 2489, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2491, 2491, 2491, 2491, 2491,
- 2491, 2491, 2491, 2491, 2491, 2491, 2491, 201,
- 2492, 2492, 2492, 2492, 2493, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
-
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
-
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2495, 2495, 2495, 2496, 2496, 2496, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2496, 2494, 2494, 2494, 2495, 2496,
- 2495, 2496, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
-
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2495, 2496, 2496, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
-
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
-
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2498, 2499,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
-
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
+ 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466,
+ 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466,
+ 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466,
+ 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466,
+ 2466, 2466, 2466, 2467, 2468, 2467, 2468, 2468,
+ 2467, 2467, 2467, 2467, 2467, 2467, 2469, 2470,
+ 2471, 202, 202, 202, 202, 202, 202, 202,
+ 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479,
+ 2480, 2481, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482,
+ 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482,
+ 2482, 2482, 2482, 2482, 2482, 2482, 2482, 2482,
+ 2482, 2482, 2483, 202, 202, 2484, 2484, 2484,
+ 2485, 2485, 2484, 2484, 2484, 2484, 2485, 2484,
+ 2484, 2484, 2484, 2486, 202, 202, 202, 202,
+ 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494,
+ 2495, 2496, 2497, 2497, 2498, 2498, 2498, 2499,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 201, 201, 201, 201, 201, 201, 201,
- 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501,
- 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501,
- 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501,
- 2501, 2501, 2501, 2501, 2501, 2501, 2501, 201,
- 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509,
- 2510, 2511, 201, 201, 201, 201, 2512, 2512,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 201, 201,
- 2514, 2514, 2514, 2514, 2514, 2515, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2517, 2517, 2517, 2517, 2517, 2517, 2517, 2518,
- 2518, 2519, 2520, 2520, 2521, 2521, 2521, 2521,
- 2522, 2522, 2522, 2522, 2518, 2521, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530,
- 2531, 2532, 201, 2533, 2533, 2533, 2533, 2533,
- 2533, 2533, 201, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 201, 201, 201, 201, 201, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2534, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2500, 2500, 2500, 2500, 2501, 2501, 2501, 2502,
+ 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502,
+ 2501, 2503, 2504, 2505, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506,
+ 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506,
+ 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506,
+ 2506, 2506, 2506, 2506, 2506, 2506, 2506, 2506,
+ 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
+ 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
+ 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
+ 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
+ 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515,
+ 2516, 2517, 2518, 2518, 2518, 2518, 2518, 2518,
+ 2518, 2518, 2518, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 2519,
+
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 202, 202, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2520, 2520, 2520, 2520, 2520, 2520, 2520,
+ 2520, 2521, 2521, 2521, 2522, 2522, 2522, 2522,
+ 202, 202, 2522, 2522, 2521, 2521, 2521, 2521,
+ 2523, 2520, 2524, 2520, 2521, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2525, 2526, 2526, 2526, 2526, 2526, 2526, 2527,
+ 2527, 2526, 2526, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2526, 2528, 2526, 2526, 2526,
+ 2526, 2529, 2530, 2526, 2526, 2526, 2526, 2531,
+ 2532, 2533, 2534, 2534, 2533, 2531, 2532, 2528,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2535, 2536, 2536, 2536, 2536, 2536, 2536, 2537,
+ 2537, 2536, 2536, 2536, 2535, 2535, 2535, 2535,
2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
- 2535, 2535, 2535, 2535, 2535, 2535, 2535, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 2536,
- 2536, 2536, 2536, 2537, 2537, 2537, 2537, 2537,
- 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2538, 2539, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
-
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2541, 2542, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
-
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
-
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 201, 201, 201, 201,
-
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
+ 2535, 2535, 2535, 2535, 2538, 2538, 2539, 2539,
+ 2539, 2539, 2536, 2536, 2536, 2536, 2536, 2536,
+ 2536, 2536, 2536, 2536, 2536, 2536, 2536, 2537,
+ 2536, 2540, 2541, 2542, 2542, 2543, 2544, 2544,
+ 2544, 2541, 2541, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
@@ -4664,1480 +3928,2548 @@ static const unsigned short uc_property_trie[] = {
2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 201, 201, 201, 201, 201,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 201, 201, 201,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 201, 201, 201, 201, 201, 201, 201,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 201, 201, 2546, 2547, 2548, 2549,
- 2550, 2550, 2550, 2550, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 201,
- 201, 1444, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2552, 2552,
- 2552, 2552, 2552, 2552, 2552, 2553, 2554, 2555,
- 2555, 2555, 2551, 2551, 2551, 2556, 2553, 2553,
- 2553, 2553, 2553, 2557, 2557, 2557, 2557, 2557,
- 2557, 2557, 2557, 2558, 2558, 2558, 2558, 2558,
- 2558, 2558, 2558, 2551, 2551, 2559, 2559, 2559,
- 2559, 2559, 2558, 2558, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2559, 2559, 2559, 2559, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2552, 2552, 2552, 2552, 2552,
- 2552, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2560, 2560,
- 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560,
- 2560, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2561, 2561, 2561, 2067, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
+ 2545, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546,
+ 2546, 202, 2546, 2546, 2546, 2546, 2546, 2546,
+ 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546,
+ 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546,
+ 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2546,
+ 2546, 2546, 2546, 2546, 2546, 2546, 2546, 2547,
+ 2548, 2548, 2548, 2548, 2548, 2548, 2548, 202,
+ 2548, 2548, 2548, 2548, 2548, 2548, 2547, 2549,
+ 2546, 2550, 2550, 2551, 2551, 2551, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559,
+ 2560, 2561, 2562, 2562, 2562, 2562, 2562, 2562,
2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562,
- 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562,
- 2562, 2562, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 201, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2563, 201, 2563, 2563,
- 201, 201, 2563, 201, 201, 2563, 2563, 201,
- 201, 2563, 2563, 2563, 2563, 201, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2564, 2564,
- 2564, 2564, 201, 2564, 201, 2564, 2564, 2564,
- 2564, 2565, 2564, 2564, 201, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
-
- 2564, 2564, 2564, 2564, 2563, 2563, 201, 2563,
- 2563, 2563, 2563, 201, 201, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 201, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 201, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 201, 2563, 2563, 2563, 2563, 201,
- 2563, 2563, 2563, 2563, 2563, 201, 2563, 201,
- 201, 201, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 201, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
-
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 1436, 1436, 201, 201,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2566, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2567, 2564, 2564, 2564, 2564,
- 2564, 2564, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2566, 2564, 2564, 2564, 2564,
-
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2567, 2564, 2564,
- 2564, 2564, 2564, 2564, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2566, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2567,
- 2564, 2564, 2564, 2564, 2564, 2564, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2566,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2567, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2566, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2567, 2564, 2564, 2564, 2564,
- 2564, 2564, 2568, 2569, 201, 201, 2570, 2571,
- 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579,
- 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577,
- 2578, 2579, 2570, 2571, 2572, 2573, 2574, 2575,
- 2576, 2577, 2578, 2579, 2570, 2571, 2572, 2573,
- 2574, 2575, 2576, 2577, 2578, 2579, 2570, 2571,
- 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579,
-
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
-
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2580,
- 2580, 2580, 2580, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2581, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2581, 2580, 2580, 2582,
- 2583, 2582, 2582, 2584, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 2581, 2581, 2581, 2581, 2581,
- 201, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2585, 2585, 2585, 2585, 2585, 2585, 2585, 201,
- 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585,
- 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585,
- 2585, 201, 201, 2585, 2585, 2585, 2585, 2585,
- 2585, 2585, 201, 2585, 2585, 201, 2585, 2585,
- 2585, 2585, 2585, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 298, 298, 2587,
- 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587,
- 2588, 2588, 2588, 2588, 2588, 2588, 2588, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589,
- 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589,
- 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589,
- 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589,
- 2589, 2589, 2590, 2590, 2590, 2590, 2590, 2590,
- 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
- 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
- 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
- 2590, 2590, 2590, 2590, 2591, 2591, 2591, 2591,
- 2591, 2591, 2592, 298, 298, 298, 298, 298,
- 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600,
- 2601, 2602, 298, 298, 298, 298, 2603, 2603,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 2604, 2604, 2604, 2604, 344, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 344, 2604, 2604, 344, 2604, 344, 344, 2604,
- 344, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 344, 2604, 2604, 2604, 2604,
- 344, 2604, 344, 2604, 344, 344, 344, 344,
- 344, 344, 2604, 344, 344, 344, 344, 2604,
- 344, 2604, 344, 2604, 344, 2604, 2604, 2604,
- 344, 2604, 2604, 344, 2604, 344, 344, 2604,
- 344, 2604, 344, 2604, 344, 2604, 344, 2604,
- 344, 2604, 2604, 344, 2604, 344, 344, 2604,
- 2604, 2604, 2604, 344, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 344, 2604, 2604, 2604, 2604,
- 344, 2604, 2604, 2604, 2604, 344, 2604, 344,
- 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 344, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 344, 344, 344, 344,
- 344, 2604, 2604, 2604, 344, 2604, 2604, 2604,
- 2604, 2604, 344, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 2605, 2605, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
-
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1682, 1682, 1682, 1682,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1682,
- 1682, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1521,
- 1682, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1682, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 2606, 2606, 2607, 2608, 2609, 2610, 2611, 2612,
- 2613, 2614, 2615, 2616, 2616, 1682, 1682, 1682,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 1682,
- 2618, 2619, 2618, 2618, 2618, 2618, 2618, 2618,
- 2618, 2618, 2618, 2618, 2618, 2619, 2618, 2619,
- 2618, 2618, 2619, 2618, 2618, 2618, 2619, 2618,
- 2618, 2618, 2617, 2617, 2617, 2617, 2617, 2620,
- 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2622,
- 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2622,
+ 2562, 2562, 2562, 2562, 2562, 202, 202, 202,
+ 2563, 2564, 2565, 2565, 2565, 2565, 2565, 2565,
+ 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565,
+ 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565,
+ 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565,
+ 202, 202, 2566, 2566, 2566, 2566, 2566, 2566,
+ 2566, 2566, 2566, 2566, 2566, 2566, 2566, 2566,
+ 2566, 2566, 2566, 2566, 2566, 2566, 2566, 2566,
+ 202, 2567, 2566, 2566, 2566, 2566, 2566, 2566,
+ 2566, 2567, 2566, 2566, 2567, 2566, 2566, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2568, 2568, 2568, 2568, 2568, 2568, 2568, 202,
+ 2568, 2568, 202, 2568, 2568, 2568, 2568, 2568,
+ 2568, 2568, 2568, 2568, 2568, 2568, 2568, 2568,
+ 2568, 2568, 2568, 2568, 2568, 2568, 2568, 2568,
+ 2568, 2568, 2568, 2568, 2568, 2568, 2568, 2568,
+ 2568, 2568, 2568, 2568, 2568, 2568, 2568, 2568,
+ 2568, 2569, 2569, 2569, 2569, 2569, 2569, 202,
+ 202, 202, 2569, 202, 2569, 2569, 202, 2569,
+ 2569, 2569, 2570, 2569, 2571, 2571, 2572, 2569,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580,
+ 2581, 2582, 202, 202, 202, 202, 202, 202,
+ 2583, 2583, 2583, 2583, 2583, 2583, 202, 2583,
+ 2583, 202, 2583, 2583, 2583, 2583, 2583, 2583,
+ 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583,
+ 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583,
+ 2583, 2583, 2583, 2583, 2583, 2583, 2583, 2583,
+ 2583, 2583, 2584, 2584, 2584, 2584, 2584, 202,
+ 2585, 2585, 202, 2584, 2584, 2585, 2584, 2586,
+ 2583, 202, 202, 202, 202, 202, 202, 202,
+ 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594,
+ 2595, 2596, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2598, 2598, 2599, 2599, 2600,
+ 2600, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601,
+ 2601, 2601, 2601, 2601, 2601, 2601, 2601, 2601,
+ 2601, 2601, 2601, 2601, 2601, 2602, 2602, 2602,
+ 2602, 2602, 2602, 2602, 2602, 2603, 2603, 2603,
+ 2603, 2602, 2602, 2602, 2602, 2602, 2602, 2602,
+ 2602, 2602, 2602, 2602, 2602, 2602, 2602, 2602,
+ 2602, 2602, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 2604,
+
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2605,
+ 2605, 2605, 2605, 2605, 2605, 2605, 2605, 2606,
+ 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606,
+ 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606,
+ 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606,
+ 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606,
+ 2606, 2606, 2606, 2606, 2606, 2606, 2606, 2606,
+ 2606, 2607, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2608, 2608, 2608, 2608, 2608,
+ 2608, 2608, 2608, 2609, 2609, 2609, 2609, 2609,
+ 2609, 2609, 2609, 2609, 2609, 2609, 2609, 202,
+ 2610, 2610, 2610, 2610, 2611, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607,
+ 2607, 2607, 2607, 2607, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2613, 2613, 2613, 2614, 2614, 2614, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2614, 2612, 2612, 2612, 2613, 2614,
+ 2613, 2614, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2613, 2614, 2614, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 2612,
+ 2612, 2612, 2612, 2612, 2612, 2612, 2612, 202,
+ 2615, 2615, 2615, 2615, 2615, 2615, 2615, 2616,
+ 2617, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2619, 2620,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 2618,
+ 2618, 2618, 2618, 2618, 2618, 2618, 2618, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
- 2621, 2621, 2623, 2623, 1682, 1682, 1682, 1682,
2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
- 2621, 2622, 2621, 2622, 2622, 2621, 2621, 2622,
2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
- 2621, 2621, 796, 796, 796, 796, 2624, 2624,
- 2617, 2624, 2624, 2624, 2624, 2624, 2624, 2624,
- 2624, 2624, 2624, 2625, 2625, 2625, 2625, 2625,
- 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625,
- 2625, 2625, 2625, 2625, 2625, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 2626, 2626,
- 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
- 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
- 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
-
- 2627, 2628, 2628, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1675, 2628, 2628, 2628, 2628, 2628, 2628,
- 2628, 2628, 2628, 2629, 1682, 1682, 1682, 1682,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 2628, 2628, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 2630, 2630, 2630, 2630, 2630, 2630, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 2631, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 2632, 2632, 2632,
- 1482, 1482, 1482, 1482, 1482, 1482, 1521, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 2631, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 2631, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1521, 2632, 2632,
- 1482, 1482, 1482, 1482, 1482, 1523, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 2631, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1483, 1483, 1521, 1521,
- 1482, 1482, 1482, 1482, 2631, 1482, 1482, 1482,
- 2631, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1481, 1481, 1482,
- 1482, 1482, 1482, 1482, 1481, 1482, 1482, 1482,
- 1482, 1482, 1523, 1523, 1523, 1521, 1482, 1523,
- 1482, 1482, 1523, 2633, 2633, 1521, 1521, 2632,
- 2632, 2632, 2632, 2632, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 2631, 1482, 2631, 1482, 1482,
- 1482, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 2632, 2632, 2632, 2634, 2634, 2634, 2634, 2634,
-
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1521,
- 1482, 1521, 1523, 1523, 1482, 1482, 1523, 1523,
- 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
- 1523, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 2635, 2635,
- 2635, 2635, 1482, 1482, 1482, 1482, 1523, 1482,
- 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
- 1523, 1482, 1482, 1482, 1523, 1482, 1482, 1482,
- 1482, 1523, 1523, 1523, 1482, 1523, 1523, 1523,
- 1482, 1482, 1482, 2631, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1481, 1482, 1481, 1482, 1481, 1482, 1482, 1482,
- 1482, 1482, 1523, 1482, 1482, 1482, 1482, 1481,
- 1482, 1481, 1481, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 2631, 2631, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1521, 1482, 1482, 1482, 1482, 1521, 1521, 2632,
-
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1482, 1482, 2631,
- 1482, 1482, 1482, 1482, 2631, 1482, 1482, 1482,
- 1482, 1482, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1483, 1483,
- 2636, 2636, 2636, 2636, 1483, 1483, 1483, 1483,
- 1483, 1483, 1521, 2632, 2632, 2632, 2632, 2632,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 2633, 2633, 1521, 1521,
- 1521, 1521, 2637, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 2633, 1521, 1521, 1521, 1521, 2633, 2633, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 2638, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 2639, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1483, 1483, 1483, 1483,
- 1483, 1483, 1521, 1482, 1482, 1482, 1482, 1482,
-
- 2640, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 2640, 1482, 1482, 1482, 2640, 1482, 2640,
- 1482, 2640, 1482, 2640, 1482, 1482, 1482, 2640,
- 1482, 1482, 1482, 1482, 1482, 1482, 2640, 2640,
- 1482, 1482, 1482, 1482, 2640, 1482, 2640, 2640,
- 1482, 1482, 1482, 1482, 2640, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1521, 1521, 2632, 2632, 1523, 1523, 1523,
- 1482, 1482, 1482, 1523, 1523, 1523, 1523, 1523,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 2641, 2641,
- 2641, 2642, 2642, 2642, 1483, 1483, 1483, 1483,
- 2631, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 2631, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1523, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1523, 1523, 1523, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1523, 1482, 1482, 1482, 1482, 1482, 1521, 1521,
- 1521, 1521, 1521, 1521, 2633, 1521, 1521, 1521,
- 2632, 2638, 2638, 2630, 2630, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1682, 1682, 1682,
- 1521, 1521, 1521, 1521, 2638, 2638, 2638, 2630,
- 2630, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1682, 1682, 1682, 1682,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1682, 1682, 1682, 1682, 1682, 1682,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485,
- 1485, 1485, 1485, 1485, 1682, 1682, 1682, 1682,
- 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632,
- 2643, 2637, 2637, 2637, 2637, 2638, 2637, 2644,
- 2638, 2638, 2638, 2638, 2638, 2638, 2637, 2638,
- 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630,
- 2637, 2644, 2644, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2638, 2638, 2638, 2637, 2637, 1682,
- 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
- 2638, 2638, 2638, 2638, 2630, 1682, 1682, 1682,
- 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
- 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2630,
- 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630,
- 2630, 2630, 2630, 2630, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 2632, 2632, 2632, 2632, 2632, 2638, 2638, 2638,
- 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
- 2638, 2638, 2630, 2630, 2630, 2630, 2630, 2630,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 2632, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 2630, 2644, 2644, 2644, 2644, 2644, 2644, 2644,
- 2644, 2644, 2644, 2644, 2644, 2644, 2630, 2630,
- 2630, 2630, 2630, 2630, 2630, 2630, 2630, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 2645, 2645,
-
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
-
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
-
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
-
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 1682, 1682,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
-
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
-
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
-
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
-
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
-
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 2645, 2645,
-
- 1382, 2557, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
-
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2645, 2645
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 202, 202, 202, 202, 202, 202, 202,
+ 2622, 2622, 2622, 2622, 2622, 2622, 2622, 2622,
+ 2622, 2622, 2622, 2622, 2622, 2622, 2622, 2622,
+ 2622, 2622, 2622, 2622, 2622, 2622, 2622, 2622,
+ 2622, 2622, 2622, 2622, 2622, 2622, 2622, 202,
+ 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630,
+ 2631, 2632, 202, 202, 202, 202, 2633, 2633,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 202, 202,
+ 2635, 2635, 2635, 2635, 2635, 2636, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2639,
+ 2639, 2640, 2641, 2641, 2642, 2642, 2642, 2642,
+ 2643, 2643, 2643, 2643, 2639, 2642, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2644, 2645, 2646, 2647, 2648, 2649, 2650, 2651,
+ 2652, 2653, 202, 2654, 2654, 2654, 2654, 2654,
+ 2654, 2654, 202, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 202, 202, 202, 202, 202, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2655, 2655, 2655, 2655, 2655, 2655, 2655, 2655,
+ 2655, 2655, 2655, 2655, 2655, 2655, 2655, 2655,
+ 2655, 2655, 2655, 2655, 2655, 2655, 2655, 2655,
+ 2655, 2655, 2655, 2655, 2655, 2655, 2655, 2655,
+ 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656,
+ 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656,
+ 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656,
+ 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656,
+ 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
+ 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2657,
+ 2657, 2657, 2657, 2657, 2657, 2657, 2657, 2658,
+ 2659, 2660, 2660, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661,
+ 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661,
+ 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661,
+ 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661,
+ 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661,
+ 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661,
+ 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661,
+ 2661, 2661, 2661, 2661, 2661, 2661, 2661, 2661,
+ 2661, 2661, 2661, 2661, 2661, 2662, 2662, 2662,
+ 2662, 2662, 2662, 202, 202, 202, 202, 2663,
+ 2661, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
+ 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
+ 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
+ 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
+ 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2664,
+ 2664, 2664, 2664, 2664, 2664, 2664, 2664, 2665,
+ 2665, 2665, 2665, 2665, 2665, 2665, 2665, 2665,
+ 202, 202, 202, 202, 202, 202, 202, 2666,
+ 2666, 2666, 2666, 2667, 2667, 2667, 2667, 2667,
+ 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2667,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2668, 2669, 2670, 2671, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2673, 2673, 2673,
+ 2673, 2673, 2674, 2674, 2674, 2674, 2674, 2674,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2672,
+ 2672, 2672, 2672, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2675, 2676, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 2677,
+ 2677, 2677, 2677, 2677, 2677, 2677, 2677, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2678, 2678, 2678, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 2679, 2679, 2679, 2679,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 2680, 2680, 2680, 2680,
+ 2680, 2680, 2680, 2680, 202, 202, 202, 202,
+
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 202, 202, 202, 202, 202,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 2681, 2681, 2681, 202, 202, 202,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 202, 202, 202, 202, 202, 202, 202,
+ 2681, 2681, 2681, 2681, 2681, 2681, 2681, 2681,
+ 2681, 2681, 202, 202, 2682, 2683, 2684, 2685,
+ 2686, 2686, 2686, 2686, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 202,
+ 202, 1461, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2688, 2688,
+ 2688, 2688, 2688, 2688, 2688, 2689, 2690, 2691,
+ 2691, 2691, 2687, 2687, 2687, 2692, 2689, 2689,
+ 2689, 2689, 2689, 2693, 2693, 2693, 2693, 2693,
+ 2693, 2693, 2693, 2694, 2694, 2694, 2694, 2694,
+ 2694, 2694, 2694, 2687, 2687, 2695, 2695, 2695,
+ 2695, 2695, 2694, 2694, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2695, 2695, 2695, 2695, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2688, 2688, 2688, 2688, 2688,
+ 2688, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2696, 2696,
+ 2696, 2696, 2696, 2696, 2696, 2696, 2696, 2696,
+ 2696, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
+ 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
+ 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
+ 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
+ 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
+ 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
+ 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
+ 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
+ 2115, 2115, 2697, 2697, 2697, 2115, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2698, 2698, 2698, 2698, 2698, 2698, 2698, 2698,
+ 2698, 2698, 2698, 2698, 2698, 2698, 2698, 2698,
+ 2698, 2698, 2698, 2698, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
+ 1503, 1503, 1503, 1503, 1503, 1503, 1503, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2699, 2699, 2699, 2699, 2699, 2699, 2699, 2699,
+ 2699, 2699, 2699, 2699, 2699, 2699, 2699, 2699,
+ 2699, 2699, 2698, 2698, 2698, 2698, 2698, 2698,
+ 2698, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 202, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2700, 202, 2700, 2700,
+ 202, 202, 2700, 202, 202, 2700, 2700, 202,
+ 202, 2700, 2700, 2700, 2700, 202, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2701, 2701,
+ 2701, 2701, 202, 2701, 202, 2701, 2701, 2701,
+ 2701, 2702, 2701, 2701, 202, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+
+ 2701, 2701, 2701, 2701, 2700, 2700, 202, 2700,
+ 2700, 2700, 2700, 202, 202, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 202, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 202, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2700, 2700, 202, 2700, 2700, 2700, 2700, 202,
+ 2700, 2700, 2700, 2700, 2700, 202, 2700, 202,
+ 202, 202, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 202, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 1453, 1453, 202, 202,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2703, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2704, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2703, 2701, 2701, 2701, 2701,
+
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2704, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2703, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2704,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2703,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2704, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2703, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2701, 2704, 2701, 2701, 2701, 2701,
+ 2701, 2701, 2705, 2706, 202, 202, 2707, 2708,
+ 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716,
+ 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714,
+ 2715, 2716, 2707, 2708, 2709, 2710, 2711, 2712,
+ 2713, 2714, 2715, 2716, 2707, 2708, 2709, 2710,
+ 2711, 2712, 2713, 2714, 2715, 2716, 2707, 2708,
+ 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716,
+
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2717,
+ 2717, 2717, 2717, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2718, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2717, 2717, 2717, 2717,
+ 2717, 2717, 2717, 2717, 2718, 2717, 2717, 2719,
+ 2720, 2719, 2719, 2721, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 2718, 2718, 2718, 2718, 2718,
+ 202, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 2718, 2718, 2718, 2718, 2718, 2718, 2718, 2718,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2722, 2722, 2722, 2722, 2722, 2722, 2722, 202,
+ 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722,
+ 2722, 2722, 2722, 2722, 2722, 2722, 2722, 2722,
+ 2722, 202, 202, 2722, 2722, 2722, 2722, 2722,
+ 2722, 2722, 202, 2722, 2722, 202, 2722, 2722,
+ 2722, 2722, 2722, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 2723, 2723, 2723, 2723, 2723, 2723, 2723, 2723,
+ 2723, 2723, 2723, 2723, 2723, 2723, 2723, 2723,
+ 2723, 2723, 2723, 2723, 2723, 2723, 2723, 2723,
+ 2723, 2723, 2723, 2723, 2723, 2723, 2723, 2723,
+ 2723, 2723, 2723, 2723, 2723, 2723, 2723, 2723,
+ 2723, 2723, 2723, 2723, 2723, 202, 202, 202,
+ 2724, 2724, 2724, 2724, 2724, 2724, 2724, 2725,
+ 2725, 2725, 2725, 2725, 2725, 2725, 202, 202,
+ 2726, 2727, 2728, 2729, 2730, 2731, 2732, 2733,
+ 2734, 2735, 202, 202, 202, 202, 2723, 2736,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
+ 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
+ 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
+ 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
+ 2737, 2737, 2737, 2737, 2737, 2737, 2737, 2737,
+ 2737, 2737, 2737, 2737, 2738, 2738, 2738, 2738,
+ 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746,
+ 2747, 2748, 202, 202, 202, 202, 202, 2749,
+
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2750, 2750, 2750, 2750, 301, 301, 2751,
+ 2751, 2751, 2751, 2751, 2751, 2751, 2751, 2751,
+ 2752, 2752, 2752, 2752, 2752, 2752, 2752, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
+ 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753,
+ 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753,
+ 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753,
+ 2753, 2753, 2753, 2753, 2753, 2753, 2753, 2753,
+ 2753, 2753, 2754, 2754, 2754, 2754, 2754, 2754,
+ 2754, 2754, 2754, 2754, 2754, 2754, 2754, 2754,
+ 2754, 2754, 2754, 2754, 2754, 2754, 2754, 2754,
+ 2754, 2754, 2754, 2754, 2754, 2754, 2754, 2754,
+ 2754, 2754, 2754, 2754, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2756, 2757, 301, 301, 301, 301,
+ 2758, 2759, 2760, 2761, 2762, 2763, 2764, 2765,
+ 2766, 2767, 301, 301, 301, 301, 2768, 2768,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 2769, 2769, 2769, 2769, 2769, 2769, 2769,
+ 2769, 2769, 2769, 2769, 2769, 2769, 2769, 2769,
+ 2769, 2769, 2769, 2769, 2769, 2769, 2769, 2769,
+ 2769, 2769, 2769, 2769, 2769, 2769, 2769, 2769,
+ 2769, 2769, 2769, 2769, 2769, 2769, 2769, 2769,
+ 2769, 2769, 2769, 2769, 2769, 2769, 2769, 2769,
+ 2769, 2769, 2769, 2769, 2769, 2769, 2769, 2769,
+ 2769, 2769, 2769, 2769, 2770, 2769, 2769, 2769,
+ 2771, 2769, 2769, 2769, 2769, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
+ 301, 2772, 2772, 2772, 2772, 2772, 2772, 2772,
+ 2772, 2772, 2772, 2772, 2772, 2772, 2772, 2772,
+ 2772, 2772, 2772, 2772, 2772, 2772, 2772, 2772,
+ 2772, 2772, 2772, 2772, 2772, 2772, 2772, 2772,
+ 2772, 2772, 2772, 2772, 2772, 2772, 2772, 2772,
+ 2772, 2772, 2772, 2772, 2772, 2772, 2773, 2772,
+ 2772, 2772, 2772, 2772, 2772, 2772, 2772, 2772,
+ 2772, 2772, 2772, 2772, 2772, 2772, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+
+ 2774, 2774, 2774, 2774, 348, 2774, 2774, 2774,
+ 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
+ 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
+ 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
+ 348, 2774, 2774, 348, 2774, 348, 348, 2774,
+ 348, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
+ 2774, 2774, 2774, 348, 2774, 2774, 2774, 2774,
+ 348, 2774, 348, 2774, 348, 348, 348, 348,
+ 348, 348, 2774, 348, 348, 348, 348, 2774,
+ 348, 2774, 348, 2774, 348, 2774, 2774, 2774,
+ 348, 2774, 2774, 348, 2774, 348, 348, 2774,
+ 348, 2774, 348, 2774, 348, 2774, 348, 2774,
+ 348, 2774, 2774, 348, 2774, 348, 348, 2774,
+ 2774, 2774, 2774, 348, 2774, 2774, 2774, 2774,
+ 2774, 2774, 2774, 348, 2774, 2774, 2774, 2774,
+ 348, 2774, 2774, 2774, 2774, 348, 2774, 348,
+ 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
+ 2774, 2774, 348, 2774, 2774, 2774, 2774, 2774,
+ 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
+ 2774, 2774, 2774, 2774, 348, 348, 348, 348,
+ 348, 2774, 2774, 2774, 348, 2774, 2774, 2774,
+ 2774, 2774, 348, 2774, 2774, 2774, 2774, 2774,
+ 2774, 2774, 2774, 2774, 2774, 2774, 2774, 2774,
+ 2774, 2774, 2774, 2774, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 348,
+ 2775, 2775, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 348,
+
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1717, 1717, 1717, 1717,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,
+ 1542, 1542, 1542, 1542, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1717,
+ 1717, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1544,
+ 1717, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1717, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+
+ 2776, 2776, 2777, 2778, 2779, 2780, 2781, 2782,
+ 2783, 2784, 2785, 2786, 2786, 1717, 1717, 1717,
+ 2787, 2787, 2787, 2787, 2787, 2787, 2787, 2787,
+ 2787, 2787, 2787, 2787, 2787, 2787, 2787, 2787,
+ 2787, 2787, 2787, 2787, 2787, 2787, 2787, 2787,
+ 2787, 2787, 2787, 2787, 2787, 2787, 2787, 1592,
+ 2788, 2789, 2788, 2788, 2788, 2788, 2788, 2788,
+ 2788, 2788, 2788, 2788, 2788, 2789, 2788, 2789,
+ 2788, 2788, 2789, 2788, 2788, 2788, 2789, 2788,
+ 2788, 2788, 2787, 2787, 2787, 2787, 2787, 2790,
+ 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2792,
+ 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2792,
+ 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
+ 2791, 2791, 2793, 2793, 2794, 1717, 1717, 1717,
+ 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
+ 2791, 2792, 2791, 2792, 2792, 2791, 2791, 2792,
+ 2791, 2791, 2791, 2791, 2791, 2791, 2791, 2791,
+ 2791, 2791, 810, 810, 810, 810, 2795, 2795,
+ 2787, 2795, 2795, 2795, 2795, 2795, 2795, 2795,
+ 2795, 2795, 2795, 2796, 2796, 2796, 2796, 2796,
+ 2796, 2796, 2796, 2796, 2796, 2796, 2796, 2796,
+ 2796, 2796, 2796, 2796, 2796, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 2797, 2797,
+ 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
+ 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
+ 2797, 2797, 2797, 2797, 2797, 2797, 2797, 2797,
+
+ 2798, 2799, 2799, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
+ 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
+ 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
+ 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
+ 1709, 1709, 2799, 2799, 2799, 2799, 2799, 2799,
+ 2799, 2799, 2799, 2800, 1717, 1717, 1717, 1717,
+ 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709,
+ 1709, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 2799, 2799, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 2801, 2801, 2801, 2801, 2801, 2801, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 2802, 2802, 2802,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1544, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1544, 2802, 2802,
+ 1507, 1507, 1507, 1507, 1507, 1545, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1508, 1508, 1544, 1544,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1506, 1506, 1507,
+ 1507, 1507, 1507, 1507, 1506, 1507, 1507, 1507,
+ 1507, 1507, 1545, 1545, 1545, 1544, 1507, 1545,
+ 1507, 1507, 1545, 2803, 2803, 1544, 1544, 2802,
+ 2802, 2802, 2802, 2802, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 2802, 2802, 2802, 2804, 2804, 2804, 2804, 2804,
+
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1544,
+ 1507, 1544, 1545, 1545, 1507, 1507, 1545, 1545,
+ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545,
+ 1545, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1545, 1545,
+ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545,
+ 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545,
+ 1545, 1507, 1507, 1507, 1545, 1507, 1507, 1507,
+ 1507, 1545, 1545, 1545, 1507, 1545, 1545, 1545,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1545,
+ 1507, 1545, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1506, 1507, 1506, 1507, 1506, 1507, 1507, 1507,
+ 1507, 1507, 1545, 1507, 1507, 1507, 1507, 1506,
+ 1507, 1506, 1506, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1544, 1507, 1507, 1507, 1507, 1544, 1544, 2802,
+
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1508, 1508,
+ 2805, 2805, 2805, 2805, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1544, 2802, 2802, 2802, 2802, 2802,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 2803, 2803, 1544, 1544,
+ 1544, 1544, 2806, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 2803, 1544, 1544, 1544, 1544, 2803, 2803, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 2807, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1544, 1507, 1507, 1507, 1507, 1507,
+
+ 2808, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 2808, 1507, 1507, 1507, 2808, 1507, 2808,
+ 1507, 2808, 1507, 2808, 1507, 1507, 1507, 2808,
+ 1507, 1507, 1507, 1507, 1507, 1507, 2808, 2808,
+ 1507, 1507, 1507, 1507, 2808, 1507, 2808, 2808,
+ 1507, 1507, 1507, 1507, 2808, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1544, 1544, 2802, 2802, 1545, 1545, 1545,
+ 1507, 1507, 1507, 1545, 1545, 1545, 1545, 1545,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 2809, 2809,
+ 2809, 2810, 2810, 2810, 1508, 1508, 1508, 1508,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1545, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1507, 1507, 1507, 1507, 1545, 1545, 1545, 1507,
+ 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
+ 1545, 1507, 1507, 1507, 1507, 1507, 1544, 1544,
+ 1544, 1544, 1544, 1544, 2803, 1544, 1544, 1544,
+ 2802, 2807, 2807, 2801, 2801, 2811, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
+ 1544, 1544, 1544, 1544, 1544, 1717, 1717, 1717,
+ 1544, 1544, 1544, 1544, 2807, 2807, 2807, 2801,
+ 2801, 2812, 2811, 1717, 1717, 1717, 1717, 1717,
+
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506,
+ 1506, 1506, 1506, 1506, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 2812, 2812, 2812,
+ 2812, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811,
+ 2811, 2811, 2811, 2811, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1717, 1717, 1717, 1717,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508,
+ 1508, 1508, 1508, 1508, 1508, 1508, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+
+ 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
+ 1510, 1510, 1510, 1510, 1717, 2811, 2811, 2813,
+ 2802, 2802, 2802, 2802, 2802, 2802, 2802, 2802,
+ 2814, 2806, 2806, 2806, 2806, 2806, 2806, 2815,
+ 2807, 2807, 2807, 2807, 2807, 2807, 2806, 2807,
+ 2801, 2801, 2801, 2801, 2801, 2801, 2801, 2801,
+ 2806, 2815, 2815, 2806, 2806, 2806, 2806, 2806,
+ 2806, 2806, 2807, 2807, 2806, 2806, 2806, 2811,
+ 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2807,
+ 2807, 2807, 2807, 2807, 2801, 2812, 2812, 2812,
+ 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2807,
+ 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2801,
+ 2801, 2801, 2801, 2801, 2801, 2801, 2801, 2801,
+ 2801, 2801, 2801, 2801, 2812, 2812, 2812, 2812,
+ 2812, 2811, 1717, 2812, 2812, 2812, 2812, 1717,
+ 1717, 1717, 2812, 2811, 2812, 2812, 2812, 2812,
+ 2802, 2802, 2802, 2802, 2802, 2807, 2807, 2807,
+ 2807, 2807, 2807, 2807, 2807, 2807, 2807, 2807,
+ 2807, 2807, 2801, 2801, 2801, 2801, 2801, 2801,
+ 2812, 2812, 2812, 2812, 2812, 2812, 2812, 2812,
+ 2812, 2812, 2812, 1717, 1717, 2811, 2811, 2811,
+ 2811, 2811, 2811, 1717, 1717, 1717, 2811, 2811,
+ 2812, 2812, 2812, 2812, 2812, 2816, 2816, 2812,
+ 2816, 2816, 2811, 2813, 2811, 2811, 2811, 2811,
+ 2802, 2812, 2812, 2811, 2811, 2811, 2811, 2811,
+ 2811, 2811, 2811, 1717, 1717, 2813, 2813, 2813,
+ 2801, 2815, 2815, 2815, 2815, 2815, 2815, 2815,
+ 2815, 2815, 2815, 2815, 2815, 2815, 2801, 2801,
+ 2801, 2801, 2801, 2801, 2801, 2801, 2801, 2812,
+ 2812, 2812, 2812, 2812, 2812, 2812, 2812, 2812,
+ 2812, 2812, 2812, 2812, 2812, 2812, 2812, 2812,
+ 2812, 2812, 2812, 2812, 2812, 2812, 2812, 2812,
+
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+ 1593, 1593, 1593, 1593, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 2812, 2812, 2812, 2812, 2812, 2812, 2812, 2812,
+ 2812, 2812, 2812, 2812, 2812, 2812, 1717, 1717,
+ 2811, 2811, 2811, 2811, 1717, 1717, 1717, 1717,
+ 2811, 2811, 2811, 1717, 1717, 1717, 1717, 1717,
+ 2811, 2811, 2811, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 2811, 2811, 2811, 2811, 2811, 2811, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 2817, 2817,
+
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 2818,
+ 2818, 2818, 2818, 2818, 2818, 2818, 2818, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819,
+ 2819, 2819, 2819, 2819, 2819, 2819, 1717, 1717,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723,
+ 1723, 1723, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724,
+ 1724, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 2820, 2820,
+ 2820, 2820, 2820, 2820, 2820, 2820, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+ 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717,
+
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 2817, 2817,
+
+ 1399, 2693, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 2822, 2822, 2822, 2822, 2822, 2822, 2822, 2822,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+ 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399,
+
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2823, 2823,
+ 2823, 2823, 2823, 2823, 2823, 2823, 2817, 2817
};
#define GET_PROP_INDEX(ucs4) \
@@ -6157,7 +6489,7 @@ static const Properties uc_properties[] = {
{ 9, 7, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 1, 1, 36, 1, 2 },
{ 9, 7, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 21, 0, 2 },
{ 9, 8, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 21, 0, 2 },
- { 6, 9, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 35, 5, 2 },
+ { 6, 9, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 35, 5, 2 },
{ 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 2 },
{ 25, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 12, 3, 13, 2 },
{ 25, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
@@ -6216,19 +6548,19 @@ static const Properties uc_properties[] = {
{ 24, 10, 0, 0, -1, -16, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
{ 5, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 410}, {1, 407}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 418}, {1, 415}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 121}, {0, 121}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 14, 0, 0, 0, -1, 0, 1, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 17, { {1, 413}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 17, { {1, 421}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -232}, {0, -232}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 14, 0, 0, 0, -1, 0, 1, 80, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 492}, {1, 492}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 500}, {1, 500}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, -121}, {0, 0}, {0, 0}, {0, -121} }, 0, 10, 12, 7, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -300}, {0, -300}, {0, -268} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 195}, {0, 195}, {0, 0} }, 0, 10, 12, 6, 3 },
@@ -6255,7 +6587,7 @@ static const Properties uc_properties[] = {
{ 16, 0, 0, 0, -1, 0, 1, 80, { {0, 1}, {0, -1}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, -2}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -79}, {0, -79}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 503}, {1, 503}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 511}, {1, 511}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 14, 0, 0, 0, -1, 0, 4, 0, { {0, -97}, {0, 0}, {0, 0}, {0, -97} }, 0, 10, 12, 7, 3 },
{ 14, 0, 0, 0, -1, 0, 4, 0, { {0, -56}, {0, 0}, {0, 0}, {0, -56} }, 0, 10, 12, 7, 3 },
{ 14, 0, 0, 0, -1, 0, 4, 17, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
@@ -6301,12 +6633,13 @@ static const Properties uc_properties[] = {
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 31}, {1, 31}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -218}, {0, -218}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 33}, {1, 33}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 35}, {1, 35}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -69}, {0, -69}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -217}, {0, -217}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -71}, {0, -71}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -219}, {0, -219}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 35}, {1, 35}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 37}, {1, 37}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {1, 39}, {1, 39}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 17, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 17, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
@@ -6362,12 +6695,12 @@ static const Properties uc_properties[] = {
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, 37}, {0, 0}, {0, 0}, {0, 37} }, 0, 10, 12, 7, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, 64}, {0, 0}, {0, 0}, {0, 64} }, 0, 10, 12, 7, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, 63}, {0, 0}, {0, 0}, {0, 63} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 495}, {1, 495}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 503}, {1, 503}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -38}, {0, -38}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -37}, {0, -37}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 499}, {1, 499}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 507}, {1, 507}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -31}, {0, -31}, {0, 1} }, 0, 10, 12, 6, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 4 },
@@ -6440,9 +6773,11 @@ static const Properties uc_properties[] = {
{ 14, 0, 0, 0, -1, 0, 1, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 12, 7, 6 },
{ 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 6 },
{ 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 6 },
+ { 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 6 },
{ 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 11, 6 },
+ { 15, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 6 },
{ 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 459}, {1, 456}, {0, 0} }, 0, 10, 12, 6, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 467}, {1, 464}, {0, 0} }, 0, 10, 12, 6, 6 },
{ 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 12, 2 },
{ 20, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 6 },
{ 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 6 },
@@ -6475,6 +6810,7 @@ static const Properties uc_properties[] = {
{ 25, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 7 },
{ 0, 17, 18, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
{ 18, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 7 },
+ { 18, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 7 },
{ 25, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 7 },
{ 25, 1, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 14, 12, 0, 7 },
{ 10, 5, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 8 },
@@ -6494,7 +6830,7 @@ static const Properties uc_properties[] = {
{ 25, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 2 },
{ 10, 13, 0, 5, -1, 0, 15, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 21, 4, 8 },
{ 13, 13, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0 },
- { 25, 13, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 8 },
+ { 25, 13, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 8 },
{ 25, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 2 },
{ 18, 13, 0, 2, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
{ 18, 13, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
@@ -6592,10 +6928,13 @@ static const Properties uc_properties[] = {
{ 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 15, 8, 11, 66 },
{ 25, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 12, 66 },
{ 17, 1, 0, 1, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 66 },
+ { 0, 17, 220, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 66 },
+ { 27, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 66 },
{ 18, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 82 },
{ 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 82 },
{ 17, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 82 },
{ 25, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 82 },
+ { 25, 1, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 82 },
{ 18, 1, 0, 3, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 95 },
{ 18, 1, 0, 2, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 95 },
{ 18, 1, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 95 },
@@ -6612,6 +6951,7 @@ static const Properties uc_properties[] = {
{ 18, 13, 0, 2, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
{ 18, 13, 0, 2, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
{ 18, 13, 0, 3, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
+ { 0, 17, 220, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
{ 0, 17, 230, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
{ 10, 5, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 2 },
{ 0, 17, 220, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 8 },
@@ -6632,7 +6972,6 @@ static const Properties uc_properties[] = {
{ 0, 17, 7, 5, -1, 0, 1, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 11 },
{ 0, 17, 9, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 11 },
{ 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 11 },
- { 0, 17, 230, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 11 },
{ 18, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
{ 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 2 },
{ 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 11 },
@@ -6681,6 +7020,7 @@ static const Properties uc_properties[] = {
{ 27, 4, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 12 },
{ 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 12 },
{ 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 12 },
+ { 0, 17, 230, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 12 },
{ 0, 17, 0, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 13 },
{ 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 13 },
{ 1, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 13 },
@@ -6700,6 +7040,7 @@ static const Properties uc_properties[] = {
{ 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
{ 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
{ 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 13 },
+ { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 13 },
{ 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 14 },
{ 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 14 },
{ 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 14 },
@@ -6768,6 +7109,7 @@ static const Properties uc_properties[] = {
{ 27, 4, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 16 },
{ 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 17 },
{ 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 17 },
+ { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 17 },
{ 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 17 },
{ 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 17 },
{ 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 17 },
@@ -6788,11 +7130,13 @@ static const Properties uc_properties[] = {
{ 3, 0, 0, 0, 7, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
{ 3, 0, 0, 0, 8, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
{ 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 17 },
+ { 25, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 17 },
{ 5, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 17 },
{ 29, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 17 },
{ 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 18 },
{ 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 18 },
{ 1, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 18 },
+ { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 18 },
{ 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 18 },
{ 0, 17, 7, 5, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 18 },
{ 18, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 18 },
@@ -6879,9 +7223,11 @@ static const Properties uc_properties[] = {
{ 3, 0, 0, 0, 9, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 21 },
{ 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 21 },
{ 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 22 },
+ { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 22 },
{ 0, 17, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 22 },
{ 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 0, 33, 8, 22 },
{ 0, 17, 118, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 22 },
+ { 0, 17, 9, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 22 },
{ 17, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 22 },
{ 0, 17, 122, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 22 },
{ 3, 0, 0, 0, 0, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 22 },
@@ -6988,12 +7334,12 @@ static const Properties uc_properties[] = {
{ 29, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 24 },
{ 14, 0, 0, 0, -1, 0, 1, 0, { {0, 7264}, {0, 0}, {0, 0}, {0, 7264} }, 0, 10, 12, 7, 25 },
{ 14, 0, 0, 0, -1, 0, 13, 0, { {0, 7264}, {0, 0}, {0, 0}, {0, 7264} }, 0, 10, 12, 7, 25 },
- { 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
- { 18, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
- { 18, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
+ { 15, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
+ { 15, 0, 0, 0, -1, 0, 6, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
+ { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
{ 25, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
- { 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
+ { 15, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 3008}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 25 },
{ 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 25, 8, 26 },
{ 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 9, 10, 25, 8, 26 },
{ 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 10, 10, 26, 8, 26 },
@@ -7021,7 +7367,6 @@ static const Properties uc_properties[] = {
{ 5, 0, 0, 0, 9, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
{ 5, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
{ 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 27 },
- { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 39}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
{ 14, 0, 0, 0, -1, 0, 4, 0, { {1, 41}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
{ 14, 0, 0, 0, -1, 0, 4, 0, { {1, 43}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
{ 14, 0, 0, 0, -1, 0, 4, 0, { {1, 45}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
@@ -7101,15 +7446,16 @@ static const Properties uc_properties[] = {
{ 14, 0, 0, 0, -1, 0, 4, 0, { {1, 193}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
{ 14, 0, 0, 0, -1, 0, 4, 0, { {1, 195}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
{ 14, 0, 0, 0, -1, 0, 4, 0, { {1, 197}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
+ { 14, 0, 0, 0, -1, 0, 4, 0, { {1, 199}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
{ 14, 0, 0, 0, -1, 0, 4, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
{ 14, 0, 0, 0, -1, 0, 17, 0, { {0, 8}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 28 },
{ 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, -8}, {0, -8}, {0, -8} }, 0, 10, 12, 6, 28 },
{ 20, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 29 },
{ 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 29 },
- { 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 29 },
+ { 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 29 },
{ 25, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 29 },
{ 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 29 },
- { 6, 9, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 5, 30 },
+ { 6, 9, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 17, 5, 30 },
{ 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 30 },
{ 21, 10, 0, 0, -1, 1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 30 },
{ 22, 10, 0, 0, -1, -1, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 30 },
@@ -7173,6 +7519,7 @@ static const Properties uc_properties[] = {
{ 3, 0, 0, 0, 9, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 33 },
{ 18, 0, 0, 2, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 33 },
{ 17, 0, 0, 2, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 33 },
+ { 18, 0, 0, 2, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 33 },
{ 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 33 },
{ 0, 17, 228, 5, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 33 },
{ 18, 0, 0, 2, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 33 },
@@ -7245,7 +7592,7 @@ static const Properties uc_properties[] = {
{ 18, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 62 },
{ 18, 0, 0, 0, -1, 0, 9, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 62 },
{ 0, 17, 7, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 62 },
- { 1, 0, 0, 0, -1, 0, 9, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 62 },
+ { 1, 0, 0, 0, -1, 0, 9, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 62 },
{ 1, 0, 0, 0, -1, 0, 9, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 62 },
{ 1, 0, 9, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 62 },
{ 3, 0, 0, 0, 0, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 62 },
@@ -7323,7 +7670,8 @@ static const Properties uc_properties[] = {
{ 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6243}, {0, -6243}, {0, -6211} }, 0, 10, 12, 6, 5 },
{ 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6236}, {0, -6236}, {0, -6204} }, 0, 10, 12, 6, 5 },
{ 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, -6181}, {0, -6181}, {0, -6180} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {1, 199}, {1, 199}, {1, 711} }, 0, 10, 12, 6, 5 },
+ { 15, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {1, 201}, {1, 201}, {1, 719} }, 0, 10, 12, 6, 5 },
+ { 14, 0, 0, 0, -1, 0, 20, 0, { {0, -3008}, {0, 0}, {0, 0}, {0, -3008} }, 0, 10, 12, 8, 25 },
{ 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 67 },
{ 0, 17, 230, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
{ 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
@@ -7331,18 +7679,19 @@ static const Properties uc_properties[] = {
{ 0, 17, 220, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
{ 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 2 },
{ 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
- { 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 2 },
- { 0, 17, 230, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
{ 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
+ { 0, 17, 230, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
{ 1, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 2 },
+ { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
{ 15, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 15, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 5 },
{ 17, 0, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 17, 0, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 17, 0, 0, 0, -1, 0, 7, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 5 },
- { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {1, 201}, {1, 201}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {1, 203}, {1, 203}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 3814}, {0, 3814}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {1, 205}, {1, 205}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 17, 0, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 0, 17, 230, 5, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
@@ -7357,11 +7706,11 @@ static const Properties uc_properties[] = {
{ 0, 17, 220, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
{ 0, 17, 230, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
{ 0, 17, 233, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 506}, {1, 506}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 509}, {1, 509}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 512}, {1, 512}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 515}, {1, 515}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 518}, {1, 518}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 514}, {1, 514}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 517}, {1, 517}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 520}, {1, 520}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 523}, {1, 523}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 526}, {1, 526}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 2, 81, { {0, 0}, {0, -59}, {0, -59}, {0, -58} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 14, 0, 0, 0, -1, 0, 10, 0, { {0, -7615}, {0, 0}, {0, 0}, {0, -7615} }, 0, 10, 12, 7, 3 },
@@ -7369,10 +7718,10 @@ static const Properties uc_properties[] = {
{ 15, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 8}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {0, 0}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 521}, {1, 521}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 524}, {1, 524}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 528}, {1, 528}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 529}, {1, 529}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 532}, {1, 532}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 536}, {1, 536}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 540}, {1, 540}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 74}, {0, 74}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 74}, {0, 74}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 86}, {0, 86}, {0, 0} }, 0, 10, 12, 6, 4 },
@@ -7385,101 +7734,101 @@ static const Properties uc_properties[] = {
{ 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 112}, {0, 112}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 126}, {0, 126}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 126}, {0, 126}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 570}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 573}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 576}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 579}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 582}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 585}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 588}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 591}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 570}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 573}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 576}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 579}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 582}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 585}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 588}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 591}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 594}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 597}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 600}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 603}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 606}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 609}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 612}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 615}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 594}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 597}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 600}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 603}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 606}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 609}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 612}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 615}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 618}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 621}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 624}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 627}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 630}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 633}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 636}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 639}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 618}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 621}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 624}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 627}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 630}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 633}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 636}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 639}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 654}, {1, 651}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 642}, {0, 9}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 660}, {1, 657}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 536}, {1, 536}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 691}, {1, 687}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 578}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 581}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 584}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 587}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 590}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 593}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 596}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 599}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 578}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 581}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 584}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 587}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 590}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 593}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 596}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 599}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 602}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 605}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 608}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 611}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 614}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 617}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 620}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 623}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 602}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 605}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 608}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 611}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 614}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 617}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 620}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 623}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 626}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 629}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 632}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 635}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 638}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 641}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 644}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 647}, {0, 8}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 626}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 629}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 632}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 635}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 638}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 641}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 644}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -8}, {1, 647}, {0, 0}, {0, -8} }, 0, 10, 12, 7, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 662}, {1, 659}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 650}, {0, 9}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 668}, {1, 665}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 544}, {1, 544}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 699}, {1, 695}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, -74}, {0, 0}, {0, 0}, {0, -74} }, 0, 10, 12, 7, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 85, { {0, -74}, {0, 0}, {0, 0}, {0, -74} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -9}, {1, 642}, {0, 0}, {0, -9} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -9}, {1, 650}, {0, 0}, {0, -9} }, 0, 10, 12, 7, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, -7205}, {0, -7205}, {0, -7173} }, 0, 10, 12, 6, 4 },
{ 28, 10, 0, 0, -1, 0, 1, 81, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 666}, {1, 663}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 645}, {0, 9}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 672}, {1, 669}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 539}, {1, 539}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 699}, {1, 695}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 674}, {1, 671}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 653}, {0, 9}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 680}, {1, 677}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 547}, {1, 547}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 707}, {1, 703}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, -86}, {0, 0}, {0, 0}, {0, -86} }, 0, 10, 12, 7, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 85, { {0, -86}, {0, 0}, {0, 0}, {0, -86} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -9}, {1, 645}, {0, 0}, {0, -9} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 542}, {1, 542}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {1, 495}, {1, 495}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 546}, {1, 546}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 549}, {1, 549}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -9}, {1, 653}, {0, 0}, {0, -9} }, 0, 10, 12, 7, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 550}, {1, 550}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {1, 503}, {1, 503}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 554}, {1, 554}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 557}, {1, 557}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, -100}, {0, 0}, {0, 0}, {0, -100} }, 0, 10, 12, 7, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 85, { {0, -100}, {0, 0}, {0, 0}, {0, -100} }, 0, 10, 12, 7, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 553}, {1, 553}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {1, 499}, {1, 499}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 557}, {1, 557}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 561}, {1, 561}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {1, 507}, {1, 507}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 565}, {1, 565}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {0, 7}, {0, 7}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 560}, {1, 560}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 563}, {1, 563}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 568}, {1, 568}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 571}, {1, 571}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, -112}, {0, 0}, {0, 0}, {0, -112} }, 0, 10, 12, 7, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 85, { {0, -112}, {0, 0}, {0, 0}, {0, -112} }, 0, 10, 12, 7, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, -7}, {0, 0}, {0, 0}, {0, -7} }, 0, 10, 12, 7, 4 },
{ 28, 10, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 678}, {1, 675}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 648}, {0, 9}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 684}, {1, 681}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 567}, {1, 567}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 707}, {1, 703}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 686}, {1, 683}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 656}, {0, 9}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 692}, {1, 689}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 575}, {1, 575}, {0, 0} }, 0, 10, 12, 6, 4 },
+ { 15, 0, 0, 0, -1, 0, 1, 17, { {0, 0}, {1, 715}, {1, 711}, {0, 0} }, 0, 10, 12, 6, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, -128}, {0, 0}, {0, 0}, {0, -128} }, 0, 10, 12, 7, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 85, { {0, -128}, {0, 0}, {0, 0}, {0, -128} }, 0, 10, 12, 7, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 17, { {0, -126}, {0, 0}, {0, 0}, {0, -126} }, 0, 10, 12, 7, 4 },
{ 14, 0, 0, 0, -1, 0, 1, 85, { {0, -126}, {0, 0}, {0, 0}, {0, -126} }, 0, 10, 12, 7, 4 },
- { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -9}, {1, 648}, {0, 0}, {0, -9} }, 0, 10, 12, 7, 4 },
+ { 16, 0, 0, 0, -1, 0, 1, 17, { {0, -9}, {1, 656}, {0, 0}, {0, -9} }, 0, 10, 12, 7, 4 },
{ 28, 10, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 4 },
- { 6, 9, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 5, 2 },
- { 6, 9, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 5, 2 },
+ { 6, 9, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 17, 5, 2 },
+ { 6, 9, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 17, 5, 2 },
{ 6, 9, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 4, 5, 2 },
{ 10, 18, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 20, 4, 2 },
{ 10, 18, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
@@ -7527,7 +7876,7 @@ static const Properties uc_properties[] = {
{ 25, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 25, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
{ 25, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 6, 9, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 5, 2 },
+ { 6, 9, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 22, 17, 5, 2 },
{ 10, 18, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 22, 4, 2 },
{ 10, 18, 0, 5, -1, 0, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 12, 4, 2 },
{ 10, 18, 0, 5, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 12, 4, 2 },
@@ -7577,8 +7926,8 @@ static const Properties uc_properties[] = {
{ 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 },
{ 29, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 2 },
{ 14, 0, 0, 0, -1, 0, 1, 85, { {0, -7517}, {0, 0}, {0, 0}, {0, -7517} }, 0, 10, 12, 7, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {1, 203}, {0, 0}, {0, 0}, {1, 203} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 85, { {1, 205}, {0, 0}, {0, 0}, {1, 205} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 85, { {1, 207}, {0, 0}, {0, 0}, {1, 207} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 1, 85, { {1, 209}, {0, 0}, {0, 0}, {1, 209} }, 0, 10, 12, 7, 3 },
{ 29, 4, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 14, 0, 0, 0, -1, 0, 1, 0, { {0, 28}, {0, 0}, {0, 0}, {0, 28} }, 0, 10, 12, 7, 3 },
{ 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
@@ -7607,15 +7956,23 @@ static const Properties uc_properties[] = {
{ 26, 10, 0, 0, -1, -3, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, -3, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, 2016, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 26, 10, 0, 0, -1, 2527, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 26, 10, 0, 0, -1, 1923, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 26, 10, 0, 0, -1, 1914, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 26, 10, 0, 0, -1, 1918, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 26, 10, 0, 0, -1, 2250, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, 1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, -1, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, 138, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 26, 10, 0, 0, -1, 7, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 26, 10, 0, 0, -1, -7, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, 1, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, -1, 1, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, 1824, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, 2104, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, 2108, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, 2106, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 26, 10, 0, 0, -1, 1316, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, -138, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 15, 0, 2 },
{ 26, 10, 0, 0, -1, 8, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
@@ -7662,17 +8019,14 @@ static const Properties uc_properties[] = {
{ 5, 10, 0, 0, 0, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 7, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 18, 30, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 16, 20, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 16, 20, 12, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 29, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 18, 30, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 16, 20, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 18, 30, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
{ 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
{ 29, 10, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 6, 0, 2 },
@@ -7701,6 +8055,7 @@ static const Properties uc_properties[] = {
{ 26, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, 1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, -1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 26, 10, 0, 0, -1, -1316, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 21, 10, 0, 0, -1, 1, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
{ 22, 10, 0, 0, -1, -1, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
{ 29, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 54 },
@@ -7708,27 +8063,34 @@ static const Properties uc_properties[] = {
{ 22, 10, 0, 0, -1, 1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
{ 21, 10, 0, 0, -1, -1, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
{ 22, 10, 0, 0, -1, -3, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 1, 13, 2 },
+ { 26, 10, 0, 0, -1, -1914, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 26, 10, 0, 0, -1, -1918, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 26, 10, 0, 0, -1, -1923, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, -1824, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, -2016, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, 0, 6, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, -2104, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, -2106, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 26, 10, 0, 0, -1, -2108, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 26, 10, 0, 0, -1, -2250, 6, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 29, 10, 0, 0, -1, -2527, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 14, 0, 0, 0, -1, 0, 8, 0, { {0, 48}, {0, 0}, {0, 0}, {0, 48} }, 0, 10, 12, 7, 57 },
{ 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, -48}, {0, -48}, {0, 0} }, 0, 10, 12, 6, 57 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {1, 207}, {0, 0}, {0, 0}, {1, 207} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 0, { {1, 211}, {0, 0}, {0, 0}, {1, 211} }, 0, 10, 12, 7, 3 },
{ 14, 0, 0, 0, -1, 0, 9, 0, { {0, -3814}, {0, 0}, {0, 0}, {0, -3814} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 9, 0, { {1, 209}, {0, 0}, {0, 0}, {1, 209} }, 0, 10, 12, 7, 3 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {1, 211}, {1, 211}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {1, 213}, {1, 213}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 215}, {0, 0}, {0, 0}, {1, 215} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 217}, {0, 0}, {0, 0}, {1, 217} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 9, 0, { {1, 213}, {0, 0}, {0, 0}, {1, 213} }, 0, 10, 12, 7, 3 },
+ { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {1, 215}, {1, 215}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {1, 217}, {1, 217}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 14, 0, 0, 0, -1, 0, 10, 0, { {1, 219}, {0, 0}, {0, 0}, {1, 219} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {1, 221}, {0, 0}, {0, 0}, {1, 221} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 221}, {0, 0}, {0, 0}, {1, 221} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 223}, {0, 0}, {0, 0}, {1, 223} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 11, 0, { {1, 225}, {0, 0}, {0, 0}, {1, 225} }, 0, 10, 12, 7, 3 },
{ 15, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 17, 0, 0, 0, -1, 0, 10, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {1, 223}, {0, 0}, {0, 0}, {1, 223} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 11, 0, { {1, 225}, {0, 0}, {0, 0}, {1, 225} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 11, 0, { {1, 227}, {0, 0}, {0, 0}, {1, 227} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 11, 0, { {1, 229}, {0, 0}, {0, 0}, {1, 229} }, 0, 10, 12, 7, 3 },
{ 14, 0, 0, 0, -1, 0, 8, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 46 },
{ 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 46 },
{ 15, 0, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 46 },
@@ -7771,6 +8133,9 @@ static const Properties uc_properties[] = {
{ 21, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 13, 2 },
{ 25, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
{ 25, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 25, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 37 },
{ 29, 10, 0, 0, -1, 0, 4, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 37 },
{ 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
@@ -7815,6 +8180,7 @@ static const Properties uc_properties[] = {
{ 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 },
{ 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 },
{ 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 },
+ { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 36 },
{ 18, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 26 },
{ 29, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
{ 5, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
@@ -7830,6 +8196,7 @@ static const Properties uc_properties[] = {
{ 5, 10, 0, 0, -1, 0, 6, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 8, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 26 },
{ 29, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 0, 35 },
+ { 29, 0, 0, 0, -1, 0, 22, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
{ 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
{ 13, 0, 0, 0, -1, 0, 0, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 0 },
{ 18, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
@@ -7839,6 +8206,7 @@ static const Properties uc_properties[] = {
{ 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
{ 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
{ 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
+ { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
{ 18, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 14, 8, 38 },
{ 17, 0, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 38 },
{ 29, 10, 0, 0, -1, 0, 4, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 38 },
@@ -7878,29 +8246,38 @@ static const Properties uc_properties[] = {
{ 28, 10, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 17, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 2 },
{ 28, 10, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 227}, {0, 0}, {0, 0}, {1, 227} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 10, 0, { {1, 231}, {0, 0}, {0, 0}, {1, 231} }, 0, 10, 12, 7, 3 },
{ 28, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 0, 2 },
- { 14, 0, 0, 0, -1, 0, 12, 0, { {1, 229}, {0, 0}, {0, 0}, {1, 229} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 12, 0, { {1, 233}, {0, 0}, {0, 0}, {1, 233} }, 0, 10, 12, 7, 3 },
{ 15, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3 },
{ 14, 0, 0, 0, -1, 0, 12, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
{ 15, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 14, 0, 0, 0, -1, 0, 13, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
{ 15, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 48}, {0, 48}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 14, 0, 0, 0, -1, 0, 16, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
{ 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 14, 0, 0, 0, -1, 0, 13, 0, { {1, 231}, {0, 0}, {0, 0}, {1, 231} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 233}, {0, 0}, {0, 0}, {1, 233} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 235}, {0, 0}, {0, 0}, {1, 235} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 13, 0, { {1, 235}, {0, 0}, {0, 0}, {1, 235} }, 0, 10, 12, 7, 3 },
{ 14, 0, 0, 0, -1, 0, 16, 0, { {1, 237}, {0, 0}, {0, 0}, {1, 237} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 18, 0, { {1, 239}, {0, 0}, {0, 0}, {1, 239} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 239}, {0, 0}, {0, 0}, {1, 239} }, 0, 10, 12, 7, 3 },
{ 14, 0, 0, 0, -1, 0, 16, 0, { {1, 241}, {0, 0}, {0, 0}, {1, 241} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 243}, {0, 0}, {0, 0}, {1, 243} }, 0, 10, 12, 7, 3 },
- { 14, 0, 0, 0, -1, 0, 17, 0, { {1, 245}, {0, 0}, {0, 0}, {1, 245} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 18, 0, { {1, 243}, {0, 0}, {0, 0}, {1, 243} }, 0, 10, 12, 7, 3 },
+ { 15, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 245}, {0, 0}, {0, 0}, {1, 245} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 16, 0, { {1, 247}, {0, 0}, {0, 0}, {1, 247} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 17, 0, { {1, 249}, {0, 0}, {0, 0}, {1, 249} }, 0, 10, 12, 7, 3 },
{ 14, 0, 0, 0, -1, 0, 17, 0, { {0, 928}, {0, 0}, {0, 0}, {0, 928} }, 0, 10, 12, 7, 3 },
{ 14, 0, 0, 0, -1, 0, 17, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
{ 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 14, 0, 0, 0, -1, 0, 20, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
+ { 15, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 14, 0, 0, 0, -1, 0, 21, 0, { {0, 1}, {0, 0}, {0, 0}, {0, 1} }, 0, 10, 12, 7, 3 },
+ { 15, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, -1}, {0, -1}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 14, 0, 0, 0, -1, 0, 21, 0, { {0, -48}, {0, 0}, {0, 0}, {0, -48} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 21, 0, { {1, 251}, {0, 0}, {0, 0}, {1, 251} }, 0, 10, 12, 7, 3 },
+ { 14, 0, 0, 0, -1, 0, 21, 0, { {1, 253}, {0, 0}, {0, 0}, {1, 253} }, 0, 10, 12, 7, 3 },
{ 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3 },
{ 17, 0, 0, 0, -1, 0, 13, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 18, 0, 0, 0, -1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 3 },
@@ -7934,6 +8311,8 @@ static const Properties uc_properties[] = {
{ 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 11 },
{ 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 11 },
{ 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
+ { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 11 },
+ { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 11 },
{ 3, 0, 0, 0, 0, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
{ 3, 0, 0, 0, 1, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
{ 3, 0, 0, 0, 2, 0, 10, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 72 },
@@ -8022,10 +8401,7 @@ static const Properties uc_properties[] = {
{ 17, 0, 0, 0, -1, 0, 16, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 4 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 247}, {1, 247}, {1, 247} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 249}, {1, 249}, {1, 249} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 251}, {1, 251}, {1, 251} }, 0, 10, 12, 6, 28 },
- { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 253}, {1, 253}, {1, 253} }, 0, 10, 12, 6, 28 },
+ { 15, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 255}, {1, 255}, {1, 255} }, 0, 10, 12, 6, 28 },
{ 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 257}, {1, 257}, {1, 257} }, 0, 10, 12, 6, 28 },
{ 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 259}, {1, 259}, {1, 259} }, 0, 10, 12, 6, 28 },
@@ -8102,6 +8478,10 @@ static const Properties uc_properties[] = {
{ 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 401}, {1, 401}, {1, 401} }, 0, 10, 12, 6, 28 },
{ 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 403}, {1, 403}, {1, 403} }, 0, 10, 12, 6, 28 },
{ 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 405}, {1, 405}, {1, 405} }, 0, 10, 12, 6, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 407}, {1, 407}, {1, 407} }, 0, 10, 12, 6, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 409}, {1, 409}, {1, 409} }, 0, 10, 12, 6, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 411}, {1, 411}, {1, 411} }, 0, 10, 12, 6, 28 },
+ { 15, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {1, 413}, {1, 413}, {1, 413} }, 0, 10, 12, 6, 28 },
{ 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 86 },
{ 1, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 86 },
{ 0, 17, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 86 },
@@ -8119,24 +8499,24 @@ static const Properties uc_properties[] = {
{ 3, 0, 0, 0, 9, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 86 },
{ 18, 0, 0, 0, -1, 0, 2, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 12, 10, 23, 8, 26 },
{ 18, 0, 0, 0, -1, 0, 2, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 13, 10, 24, 8, 26 },
- { 11, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 0, 34, 0, 0 },
+ { 11, 0, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 34, 0, 0 },
{ 12, 0, 0, 0, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0 },
{ 18, 0, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
{ 18, 0, 0, 0, -1, 0, 13, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
{ 18, 0, 0, 0, -1, 0, 6, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
{ 18, 0, 0, 0, -1, 0, 11, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
{ 18, 0, 0, 0, -1, 0, 8, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 419}, {1, 416}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 425}, {1, 422}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 431}, {1, 428}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 438}, {1, 434}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 427}, {1, 424}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 433}, {1, 430}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 439}, {1, 436}, {0, 0} }, 0, 10, 12, 6, 3 },
{ 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 446}, {1, 442}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 453}, {1, 450}, {0, 0} }, 0, 10, 12, 6, 3 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 465}, {1, 462}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 471}, {1, 468}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 477}, {1, 474}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 483}, {1, 480}, {0, 0} }, 0, 10, 12, 6, 6 },
- { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 489}, {1, 486}, {0, 0} }, 0, 10, 12, 6, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 454}, {1, 450}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 461}, {1, 458}, {0, 0} }, 0, 10, 12, 6, 3 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 473}, {1, 470}, {0, 0} }, 0, 10, 12, 6, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 479}, {1, 476}, {0, 0} }, 0, 10, 12, 6, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 485}, {1, 482}, {0, 0} }, 0, 10, 12, 6, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 491}, {1, 488}, {0, 0} }, 0, 10, 12, 6, 6 },
+ { 15, 0, 0, 0, -1, 0, 1, 80, { {0, 0}, {1, 497}, {1, 494}, {0, 0} }, 0, 10, 12, 6, 6 },
{ 18, 1, 0, 0, -1, 0, 4, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 7 },
{ 0, 17, 26, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 7 },
{ 18, 1, 0, 0, -1, 0, 1, 85, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 9, 13, 8, 7 },
@@ -8179,16 +8559,16 @@ static const Properties uc_properties[] = {
{ 10, 18, 0, 5, -1, 0, 1, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 22, 4, 2 },
{ 25, 10, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 13, 14, 0, 2 },
{ 25, 6, 0, 0, -1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 3, 2, 0, 0, 0, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 3, 2, 0, 0, 1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 3, 2, 0, 0, 2, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 3, 2, 0, 0, 3, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 3, 2, 0, 0, 4, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 3, 2, 0, 0, 5, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 3, 2, 0, 0, 6, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 3, 2, 0, 0, 7, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 3, 2, 0, 0, 8, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 3, 2, 0, 0, 9, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
+ { 3, 2, 0, 0, 0, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
+ { 3, 2, 0, 0, 1, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
+ { 3, 2, 0, 0, 2, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
+ { 3, 2, 0, 0, 3, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
+ { 3, 2, 0, 0, 4, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
+ { 3, 2, 0, 0, 5, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
+ { 3, 2, 0, 0, 6, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
+ { 3, 2, 0, 0, 7, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
+ { 3, 2, 0, 0, 8, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
+ { 3, 2, 0, 0, 9, 0, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 14, 9, 2 },
{ 26, 10, 0, 0, -1, 2, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
{ 26, 10, 0, 0, -1, -2, 1, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
{ 14, 0, 0, 0, -1, 0, 1, 80, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 14, 7, 3 },
@@ -8282,6 +8662,7 @@ static const Properties uc_properties[] = {
{ 0, 17, 0, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 61 },
{ 0, 17, 220, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 61 },
{ 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 61 },
+ { 18, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 61 },
{ 0, 17, 1, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 61 },
{ 0, 17, 9, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 61 },
{ 5, 1, 0, 0, 1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
@@ -8289,6 +8670,7 @@ static const Properties uc_properties[] = {
{ 5, 1, 0, 0, 3, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
{ 5, 1, 0, 0, 4, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
{ 5, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
+ { 5, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
{ 25, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 61 },
{ 25, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 61 },
{ 25, 1, 0, 0, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 61 },
@@ -8324,6 +8706,20 @@ static const Properties uc_properties[] = {
{ 14, 1, 0, 0, -1, 0, 17, 0, { {0, 64}, {0, 0}, {0, 0}, {0, 64} }, 0, 10, 12, 7, 130 },
{ 15, 1, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, -64}, {0, -64}, {0, 0} }, 0, 10, 12, 6, 130 },
{ 5, 1, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 130 },
+ { 18, 13, 0, 4, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 144 },
+ { 18, 13, 0, 2, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 144 },
+ { 18, 13, 0, 3, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 144 },
+ { 0, 17, 230, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 144 },
+ { 3, 5, 0, 0, 0, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
+ { 3, 5, 0, 0, 1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
+ { 3, 5, 0, 0, 2, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
+ { 3, 5, 0, 0, 3, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
+ { 3, 5, 0, 0, 4, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
+ { 3, 5, 0, 0, 5, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
+ { 3, 5, 0, 0, 6, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
+ { 3, 5, 0, 0, 7, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
+ { 3, 5, 0, 0, 8, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
+ { 3, 5, 0, 0, 9, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 144 },
{ 5, 5, 0, 0, 1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
{ 5, 5, 0, 0, 2, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
{ 5, 5, 0, 0, 3, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
@@ -8334,6 +8730,17 @@ static const Properties uc_properties[] = {
{ 5, 5, 0, 0, 8, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
{ 5, 5, 0, 0, 9, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
{ 5, 5, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
+ { 18, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 147 },
+ { 5, 1, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 147 },
+ { 18, 13, 0, 2, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 148 },
+ { 18, 13, 0, 3, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 148 },
+ { 18, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 148 },
+ { 0, 17, 220, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 148 },
+ { 0, 17, 230, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 148 },
+ { 5, 13, 0, 2, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 148 },
+ { 5, 13, 0, 3, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 148 },
+ { 25, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 148 },
+ { 18, 1, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 149 },
{ 1, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 94 },
{ 0, 17, 0, 5, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 94 },
{ 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 94 },
@@ -8368,8 +8775,9 @@ static const Properties uc_properties[] = {
{ 0, 17, 9, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 92 },
{ 0, 17, 7, 5, -1, 0, 11, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 92 },
{ 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 92 },
- { 10, 0, 0, 5, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 92 },
+ { 10, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 92 },
{ 25, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 92 },
+ { 10, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 6, 12, 4, 92 },
{ 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 101 },
{ 3, 0, 0, 0, 0, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 101 },
{ 3, 0, 0, 0, 1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 101 },
@@ -8400,6 +8808,8 @@ static const Properties uc_properties[] = {
{ 3, 0, 0, 0, 9, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 96 },
{ 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 96 },
{ 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 96 },
+ { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 96 },
+ { 1, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 96 },
{ 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 111 },
{ 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 111 },
{ 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 111 },
@@ -8412,9 +8822,8 @@ static const Properties uc_properties[] = {
{ 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 100 },
{ 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 100 },
{ 25, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 100 },
- { 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 100 },
- { 0, 17, 7, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 100 },
{ 0, 17, 0, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 100 },
+ { 0, 17, 7, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 100 },
{ 25, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 100 },
{ 3, 0, 0, 0, 0, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 100 },
{ 3, 0, 0, 0, 1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 100 },
@@ -8461,6 +8870,7 @@ static const Properties uc_properties[] = {
{ 0, 17, 0, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 107 },
{ 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 107 },
{ 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 107 },
+ { 0, 17, 7, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
{ 0, 17, 7, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 107 },
{ 1, 0, 0, 0, -1, 0, 16, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 107 },
{ 1, 0, 0, 0, -1, 0, 16, 17, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 107 },
@@ -8485,6 +8895,8 @@ static const Properties uc_properties[] = {
{ 3, 0, 0, 0, 7, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
{ 3, 0, 0, 0, 8, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
{ 3, 0, 0, 0, 9, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 135 },
+ { 0, 17, 230, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 135 },
+ { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 135 },
{ 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 124 },
{ 1, 0, 0, 0, -1, 0, 16, 204, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 124 },
{ 1, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 124 },
@@ -8540,6 +8952,7 @@ static const Properties uc_properties[] = {
{ 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 102 },
{ 1, 0, 9, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 102 },
{ 0, 17, 7, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 102 },
+ { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 102 },
{ 3, 0, 0, 0, 0, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
{ 3, 0, 0, 0, 1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
{ 3, 0, 0, 0, 2, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
@@ -8551,6 +8964,7 @@ static const Properties uc_properties[] = {
{ 3, 0, 0, 0, 8, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
{ 3, 0, 0, 0, 9, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 102 },
{ 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 126 },
+ { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 8, 126 },
{ 0, 17, 0, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 126 },
{ 1, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 33, 4, 126 },
{ 0, 17, 9, 5, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 33, 4, 126 },
@@ -8567,6 +8981,12 @@ static const Properties uc_properties[] = {
{ 5, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 126 },
{ 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 126 },
{ 29, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 33, 0, 126 },
+ { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 142 },
+ { 1, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 142 },
+ { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 142 },
+ { 0, 17, 9, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 142 },
+ { 0, 17, 7, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 142 },
+ { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 142 },
{ 14, 0, 0, 0, -1, 0, 16, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 125 },
{ 15, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 125 },
{ 3, 0, 0, 0, 0, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 125 },
@@ -8581,10 +9001,16 @@ static const Properties uc_properties[] = {
{ 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 125 },
{ 5, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 125 },
{ 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 125 },
+ { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 150 },
+ { 1, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 150 },
+ { 0, 17, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 150 },
+ { 0, 17, 9, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 150 },
+ { 25, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 150 },
{ 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 141 },
{ 0, 17, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 141 },
- { 1, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 141 },
+ { 0, 0, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 141 },
{ 0, 17, 9, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 141 },
+ { 1, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 141 },
{ 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 141 },
{ 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 141 },
{ 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 141 },
@@ -8593,10 +9019,12 @@ static const Properties uc_properties[] = {
{ 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 140 },
{ 0, 17, 0, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 140 },
{ 1, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 140 },
+ { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 140 },
{ 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 7, 10, 12, 8, 140 },
{ 0, 17, 9, 5, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 140 },
{ 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 140 },
{ 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 140 },
+ { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 140 },
{ 25, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 18, 0, 140 },
{ 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 119 },
{ 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 133 },
@@ -8636,6 +9064,28 @@ static const Properties uc_properties[] = {
{ 3, 0, 0, 0, 7, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
{ 3, 0, 0, 0, 8, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
{ 3, 0, 0, 0, 9, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 138 },
+ { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 143 },
+ { 1, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 143 },
+ { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 143 },
+ { 0, 17, 9, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 143 },
+ { 3, 0, 0, 0, 0, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
+ { 3, 0, 0, 0, 1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
+ { 3, 0, 0, 0, 2, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
+ { 3, 0, 0, 0, 3, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
+ { 3, 0, 0, 0, 4, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
+ { 3, 0, 0, 0, 5, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
+ { 3, 0, 0, 0, 6, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
+ { 3, 0, 0, 0, 7, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
+ { 3, 0, 0, 0, 8, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
+ { 3, 0, 0, 0, 9, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 143 },
+ { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 145 },
+ { 0, 17, 0, 5, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 145 },
+ { 1, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 145 },
+ { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 12, 145 },
+ { 5, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 16 },
+ { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 16 },
+ { 27, 4, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 16 },
+ { 25, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 16 },
{ 18, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 63 },
{ 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 63 },
{ 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 63 },
@@ -8646,6 +9096,9 @@ static const Properties uc_properties[] = {
{ 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 81 },
{ 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 0, 8, 81 },
{ 18, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 1, 8, 81 },
+ { 10, 0, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 4, 4, 81 },
+ { 10, 0, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 0, 4, 81 },
+ { 10, 0, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 3, 6, 1, 4, 81 },
{ 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 127 },
{ 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 0, 8, 127 },
{ 18, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 1, 8, 127 },
@@ -8683,16 +9136,31 @@ static const Properties uc_properties[] = {
{ 3, 0, 0, 0, 8, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 108 },
{ 3, 0, 0, 0, 9, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 108 },
{ 5, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 108 },
+ { 14, 0, 0, 0, -1, 0, 20, 0, { {0, 32}, {0, 0}, {0, 0}, {0, 32} }, 0, 10, 12, 7, 146 },
+ { 15, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, -32}, {0, -32}, {0, 0} }, 0, 10, 12, 6, 146 },
+ { 5, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 146 },
+ { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 0, 146 },
+ { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 146 },
+ { 25, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 146 },
{ 18, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 99 },
+ { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 99 },
+ { 0, 17, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 99 },
{ 1, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 99 },
+ { 1, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 8, 4, 21, 4, 99 },
{ 0, 17, 0, 5, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 99 },
{ 17, 0, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 99 },
{ 17, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 137 },
{ 17, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 139 },
+ { 25, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 2 },
+ { 17, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 5, 8, 2 },
{ 18, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 137 },
+ { 18, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 137 },
+ { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 137 },
{ 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 14, 8, 35 },
{ 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 34 },
{ 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 34 },
+ { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 8, 34 },
+ { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 8, 5, 8, 35 },
{ 18, 0, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 139 },
{ 18, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 105 },
{ 29, 0, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 105 },
@@ -8711,6 +9179,7 @@ static const Properties uc_properties[] = {
{ 0, 17, 230, 5, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 1 },
{ 29, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 0, 17, 230, 5, -1, 0, 8, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 4 },
+ { 5, 0, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 5, 0, 0, 0, -1, 0, 9, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 14, 0, 0, 0, -1, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 },
{ 15, 0, 0, 0, -1, 0, 5, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 6, 2 },
@@ -8735,6 +9204,33 @@ static const Properties uc_properties[] = {
{ 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 17, 12, 131 },
{ 25, 0, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 131 },
{ 0, 17, 230, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 57 },
+ { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 151 },
+ { 0, 17, 230, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 151 },
+ { 17, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 151 },
+ { 3, 0, 0, 0, 0, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
+ { 3, 0, 0, 0, 1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
+ { 3, 0, 0, 0, 2, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
+ { 3, 0, 0, 0, 3, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
+ { 3, 0, 0, 0, 4, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
+ { 3, 0, 0, 0, 5, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
+ { 3, 0, 0, 0, 6, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
+ { 3, 0, 0, 0, 7, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
+ { 3, 0, 0, 0, 8, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
+ { 3, 0, 0, 0, 9, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 151 },
+ { 29, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 151 },
+ { 18, 0, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 152 },
+ { 0, 17, 230, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 152 },
+ { 3, 0, 0, 0, 0, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
+ { 3, 0, 0, 0, 1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
+ { 3, 0, 0, 0, 2, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
+ { 3, 0, 0, 0, 3, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
+ { 3, 0, 0, 0, 4, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
+ { 3, 0, 0, 0, 5, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
+ { 3, 0, 0, 0, 6, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
+ { 3, 0, 0, 0, 7, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
+ { 3, 0, 0, 0, 8, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
+ { 3, 0, 0, 0, 9, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 152 },
+ { 27, 4, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 9, 0, 152 },
{ 18, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 113 },
{ 5, 1, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 113 },
{ 0, 17, 220, 5, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 113 },
@@ -8742,6 +9238,7 @@ static const Properties uc_properties[] = {
{ 15, 1, 0, 2, -1, 0, 18, 0, { {0, 0}, {0, -34}, {0, -34}, {0, 0} }, 0, 10, 12, 6, 132 },
{ 0, 17, 230, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 132 },
{ 0, 17, 7, 5, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 21, 4, 132 },
+ { 17, 1, 0, 5, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 132 },
{ 3, 1, 0, 0, 0, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
{ 3, 1, 0, 0, 1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
{ 3, 1, 0, 0, 2, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
@@ -8753,6 +9250,11 @@ static const Properties uc_properties[] = {
{ 3, 1, 0, 0, 8, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
{ 3, 1, 0, 0, 9, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 16, 11, 9, 132 },
{ 25, 1, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 0, 0, 132 },
+ { 5, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 29, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
+ { 27, 13, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 10, 0, 2 },
+ { 5, 13, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 29, 13, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 18, 13, 0, 0, -1, 0, 13, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 8, 8 },
{ 26, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 8 },
{ 5, 2, 0, 0, 0, 0, 11, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
@@ -8773,6 +9275,7 @@ static const Properties uc_properties[] = {
{ 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 },
{ 29, 0, 0, 0, -1, 0, 11, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 10, 12, 7, 2 },
{ 29, 10, 0, 0, -1, 0, 13, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 29, 0, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
{ 29, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 6, 7, 28, 0, 2 },
@@ -8780,20 +9283,21 @@ static const Properties uc_properties[] = {
{ 29, 0, 0, 0, -1, 0, 12, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
{ 29, 0, 0, 0, -1, 0, 18, 80, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 16, 20, 14, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 18, 30, 0, 2 },
- { 28, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 15, 19, 31, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 17, 21, 30, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
+ { 28, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 4, 4, 31, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 18, 30, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 18, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 16, 20, 14, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 13, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
{ 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 3, 13, 2 },
{ 29, 10, 0, 0, -1, 0, 16, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 5, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 18, 30, 0, 2 },
- { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 14, 18, 30, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 21, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 17, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 19, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
+ { 29, 10, 0, 0, -1, 0, 20, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 30, 0, 2 },
{ 13, 18, 0, 0, -1, 0, 2, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 12, 0, 0 },
{ 18, 0, 0, 0, -1, 0, 5, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
{ 18, 0, 0, 0, -1, 0, 12, 0, { {0, 0}, {0, 0}, {0, 0}, {0, 0} }, 0, 0, 14, 8, 37 },
@@ -8862,6 +9366,7 @@ static const unsigned short specialCaseMap[] = {
0x1, 0xa7ad,
0x1, 0x2c6e,
0x1, 0x2c64,
+ 0x1, 0xa7c5,
0x1, 0xa7b1,
0x1, 0xa7b2,
0x1, 0xa7b0,
@@ -8947,6 +9452,7 @@ static const unsigned short specialCaseMap[] = {
0x1, 0xabbf,
0x1, 0xa64a,
0x1, 0xa77d,
+ 0x1, 0xa7c6,
0x1, 0x6b,
0x1, 0xe5,
0x1, 0x26b,
@@ -8969,6 +9475,8 @@ static const unsigned short specialCaseMap[] = {
0x1, 0x29e,
0x1, 0x287,
0x1, 0x29d,
+ 0x1, 0x282,
+ 0x1, 0x1d8e,
0x1, 0x13a0,
0x1, 0x13a1,
0x1, 0x13a2,
@@ -10020,55 +10528,55 @@ static const unsigned short uc_decomposition_trie[] = {
0x15f5, 0x15f7, 0x15f9, 0x15fb, 0x15fd, 0x15ff, 0x1601, 0x1603,
0x1605, 0x1607, 0x1609, 0x160b, 0x160d, 0x160f, 0x1611, 0x1613,
- 0x1615, 0x1617, 0x1619, 0x161b, 0x161d, 0x161f, 0x1621, 0xffff,
+ 0x1615, 0x1617, 0x1619, 0x161b, 0x161d, 0x161f, 0x1621, 0x1623,
- 0x1623, 0x1628, 0x162d, 0x1632, 0x1636, 0x163b, 0x163f, 0x1643,
- 0x1649, 0x164e, 0x1652, 0x1656, 0x165a, 0x165f, 0x1664, 0x1668,
+ 0x1626, 0x162b, 0x1630, 0x1635, 0x1639, 0x163e, 0x1642, 0x1646,
+ 0x164c, 0x1651, 0x1655, 0x1659, 0x165d, 0x1662, 0x1667, 0x166b,
- 0x166c, 0x166f, 0x1673, 0x1678, 0x167d, 0x1680, 0x1686, 0x168d,
- 0x1693, 0x1697, 0x169d, 0x16a3, 0x16a8, 0x16ac, 0x16b0, 0x16b4,
+ 0x166f, 0x1672, 0x1676, 0x167b, 0x1680, 0x1683, 0x1689, 0x1690,
+ 0x1696, 0x169a, 0x16a0, 0x16a6, 0x16ab, 0x16af, 0x16b3, 0x16b7,
- 0x16b9, 0x16bf, 0x16c4, 0x16c8, 0x16cc, 0x16d0, 0x16d3, 0x16d6,
- 0x16d9, 0x16dc, 0x16e0, 0x16e4, 0x16ea, 0x16ee, 0x16f3, 0x16f9,
+ 0x16bc, 0x16c2, 0x16c7, 0x16cb, 0x16cf, 0x16d3, 0x16d6, 0x16d9,
+ 0x16dc, 0x16df, 0x16e3, 0x16e7, 0x16ed, 0x16f1, 0x16f6, 0x16fc,
- 0x16fd, 0x1700, 0x1703, 0x1709, 0x170e, 0x1714, 0x1718, 0x171e,
- 0x1721, 0x1725, 0x1729, 0x172d, 0x1731, 0x1735, 0x173a, 0x173e,
+ 0x1700, 0x1703, 0x1706, 0x170c, 0x1711, 0x1717, 0x171b, 0x1721,
+ 0x1724, 0x1728, 0x172c, 0x1730, 0x1734, 0x1738, 0x173d, 0x1741,
- 0x1741, 0x1745, 0x1749, 0x174d, 0x1752, 0x1756, 0x175a, 0x175e,
- 0x1764, 0x1769, 0x176c, 0x1772, 0x1775, 0x177a, 0x177f, 0x1783,
+ 0x1744, 0x1748, 0x174c, 0x1750, 0x1755, 0x1759, 0x175d, 0x1761,
+ 0x1767, 0x176c, 0x176f, 0x1775, 0x1778, 0x177d, 0x1782, 0x1786,
- 0x1787, 0x178b, 0x1790, 0x1793, 0x1797, 0x179c, 0x179f, 0x17a5,
- 0x17a9, 0x17ac, 0x17af, 0x17b2, 0x17b5, 0x17b8, 0x17bb, 0x17be,
+ 0x178a, 0x178e, 0x1793, 0x1796, 0x179a, 0x179f, 0x17a2, 0x17a8,
+ 0x17ac, 0x17af, 0x17b2, 0x17b5, 0x17b8, 0x17bb, 0x17be, 0x17c1,
- 0x17c1, 0x17c4, 0x17c7, 0x17cb, 0x17cf, 0x17d3, 0x17d7, 0x17db,
- 0x17df, 0x17e3, 0x17e7, 0x17eb, 0x17ef, 0x17f3, 0x17f7, 0x17fb,
+ 0x17c4, 0x17c7, 0x17ca, 0x17ce, 0x17d2, 0x17d6, 0x17da, 0x17de,
+ 0x17e2, 0x17e6, 0x17ea, 0x17ee, 0x17f2, 0x17f6, 0x17fa, 0x17fe,
- 0x17ff, 0x1803, 0x1807, 0x180a, 0x180d, 0x1811, 0x1814, 0x1817,
- 0x181a, 0x181e, 0x1822, 0x1825, 0x1828, 0x182b, 0x182e, 0x1831,
+ 0x1802, 0x1806, 0x180a, 0x180d, 0x1810, 0x1814, 0x1817, 0x181a,
+ 0x181d, 0x1821, 0x1825, 0x1828, 0x182b, 0x182e, 0x1831, 0x1834,
- 0x1836, 0x1839, 0x183c, 0x183f, 0x1842, 0x1845, 0x1848, 0x184b,
- 0x184e, 0x1852, 0x1857, 0x185a, 0x185d, 0x1860, 0x1863, 0x1866,
+ 0x1839, 0x183c, 0x183f, 0x1842, 0x1845, 0x1848, 0x184b, 0x184e,
+ 0x1851, 0x1855, 0x185a, 0x185d, 0x1860, 0x1863, 0x1866, 0x1869,
- 0x1869, 0x186c, 0x1870, 0x1874, 0x1878, 0x187c, 0x187f, 0x1882,
- 0x1885, 0x1888, 0x188b, 0x188e, 0x1891, 0x1894, 0x1897, 0x189a,
+ 0x186c, 0x186f, 0x1873, 0x1877, 0x187b, 0x187f, 0x1882, 0x1885,
+ 0x1888, 0x188b, 0x188e, 0x1891, 0x1894, 0x1897, 0x189a, 0x189d,
- 0x189e, 0x18a2, 0x18a5, 0x18a9, 0x18ad, 0x18b1, 0x18b4, 0x18b8,
- 0x18bc, 0x18c1, 0x18c4, 0x18c8, 0x18cc, 0x18d0, 0x18d4, 0x18da,
+ 0x18a1, 0x18a5, 0x18a8, 0x18ac, 0x18b0, 0x18b4, 0x18b7, 0x18bb,
+ 0x18bf, 0x18c4, 0x18c7, 0x18cb, 0x18cf, 0x18d3, 0x18d7, 0x18dd,
- 0x18e1, 0x18e4, 0x18e7, 0x18ea, 0x18ed, 0x18f0, 0x18f3, 0x18f6,
- 0x18f9, 0x18fc, 0x18ff, 0x1902, 0x1905, 0x1908, 0x190b, 0x190e,
+ 0x18e4, 0x18e7, 0x18ea, 0x18ed, 0x18f0, 0x18f3, 0x18f6, 0x18f9,
+ 0x18fc, 0x18ff, 0x1902, 0x1905, 0x1908, 0x190b, 0x190e, 0x1911,
- 0x1911, 0x1914, 0x1917, 0x191c, 0x191f, 0x1922, 0x1925, 0x192a,
- 0x192e, 0x1931, 0x1934, 0x1937, 0x193a, 0x193d, 0x1940, 0x1943,
+ 0x1914, 0x1917, 0x191a, 0x191f, 0x1922, 0x1925, 0x1928, 0x192d,
+ 0x1931, 0x1934, 0x1937, 0x193a, 0x193d, 0x1940, 0x1943, 0x1946,
- 0x1946, 0x1949, 0x194c, 0x1950, 0x1953, 0x1956, 0x195a, 0x195e,
- 0x1961, 0x1966, 0x196a, 0x196d, 0x1970, 0x1973, 0x1976, 0x197a,
+ 0x1949, 0x194c, 0x194f, 0x1953, 0x1956, 0x1959, 0x195d, 0x1961,
+ 0x1964, 0x1969, 0x196d, 0x1970, 0x1973, 0x1976, 0x1979, 0x197d,
- 0x197e, 0x1981, 0x1984, 0x1987, 0x198a, 0x198d, 0x1990, 0x1993,
- 0x1996, 0x1999, 0x199d, 0x19a1, 0x19a5, 0x19a9, 0x19ad, 0x19b1,
+ 0x1981, 0x1984, 0x1987, 0x198a, 0x198d, 0x1990, 0x1993, 0x1996,
+ 0x1999, 0x199c, 0x19a0, 0x19a4, 0x19a8, 0x19ac, 0x19b0, 0x19b4,
- 0x19b5, 0x19b9, 0x19bd, 0x19c1, 0x19c5, 0x19c9, 0x19cd, 0x19d1,
- 0x19d5, 0x19d9, 0x19dd, 0x19e1, 0x19e5, 0x19e9, 0x19ed, 0x19f1,
+ 0x19b8, 0x19bc, 0x19c0, 0x19c4, 0x19c8, 0x19cc, 0x19d0, 0x19d4,
+ 0x19d8, 0x19dc, 0x19e0, 0x19e4, 0x19e8, 0x19ec, 0x19f0, 0x19f4,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10122,7 +10630,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x19f5, 0x19f7, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0x19f8, 0x19fa, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10150,7 +10658,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x19f9, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x19fc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10167,7 +10675,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x19fb, 0x19fd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x19fe, 0x1a00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10180,7 +10688,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x19ff, 0x1a01, 0x1a03, 0x1a05,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0x1a02, 0x1a04, 0x1a06, 0x1a08,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10202,234 +10710,234 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x1a07, 0x1a09, 0x1a0b, 0x1a0d, 0x1a0f, 0x1a11, 0x1a13, 0x1a15,
- 0x1a17, 0x1a19, 0x1a1b, 0x1a1d, 0x1a1f, 0x1a21, 0x1a23, 0x1a25,
- 0x1a27, 0x1a29, 0x1a2b, 0x1a2d, 0x1a2f, 0x1a31, 0x1a33, 0x1a35,
- 0x1a37, 0x1a39, 0x1a3b, 0x1a3d, 0x1a3f, 0x1a41, 0x1a43, 0x1a45,
- 0x1a47, 0x1a49, 0x1a4b, 0x1a4d, 0x1a4f, 0x1a51, 0x1a53, 0x1a55,
- 0x1a57, 0x1a59, 0x1a5b, 0x1a5d, 0x1a5f, 0x1a61, 0x1a63, 0x1a65,
- 0x1a67, 0x1a69, 0x1a6b, 0x1a6d, 0x1a6f, 0x1a71, 0x1a73, 0x1a75,
- 0x1a77, 0x1a79, 0x1a7b, 0x1a7d, 0x1a7f, 0x1a81, 0x1a83, 0x1a85,
- 0x1a87, 0x1a89, 0x1a8b, 0x1a8d, 0x1a8f, 0x1a91, 0x1a93, 0x1a95,
- 0x1a97, 0x1a99, 0x1a9b, 0x1a9d, 0x1a9f, 0x1aa1, 0x1aa3, 0x1aa5,
- 0x1aa7, 0x1aa9, 0x1aab, 0x1aad, 0x1aaf, 0x1ab1, 0x1ab3, 0x1ab5,
- 0x1ab7, 0x1ab9, 0x1abb, 0x1abd, 0x1abf, 0x1ac1, 0x1ac3, 0x1ac5,
- 0x1ac7, 0x1ac9, 0x1acb, 0x1acd, 0x1acf, 0x1ad1, 0x1ad3, 0x1ad5,
- 0x1ad7, 0x1ad9, 0x1adb, 0x1add, 0x1adf, 0x1ae1, 0x1ae3, 0x1ae5,
- 0x1ae7, 0x1ae9, 0x1aeb, 0x1aed, 0x1aef, 0x1af1, 0x1af3, 0x1af5,
- 0x1af7, 0x1af9, 0x1afb, 0x1afd, 0x1aff, 0x1b01, 0x1b03, 0x1b05,
- 0x1b07, 0x1b09, 0x1b0b, 0x1b0d, 0x1b0f, 0x1b11, 0x1b13, 0x1b15,
- 0x1b17, 0x1b19, 0x1b1b, 0x1b1d, 0x1b1f, 0x1b21, 0x1b23, 0x1b25,
- 0x1b27, 0x1b29, 0x1b2b, 0x1b2d, 0x1b2f, 0x1b31, 0x1b33, 0x1b35,
- 0x1b37, 0x1b39, 0x1b3b, 0x1b3d, 0x1b3f, 0x1b41, 0x1b43, 0x1b45,
- 0x1b47, 0x1b49, 0x1b4b, 0x1b4d, 0x1b4f, 0x1b51, 0x1b53, 0x1b55,
- 0x1b57, 0x1b59, 0x1b5b, 0x1b5d, 0x1b5f, 0x1b61, 0x1b63, 0x1b65,
- 0x1b67, 0x1b69, 0x1b6b, 0x1b6d, 0x1b6f, 0x1b71, 0x1b73, 0x1b75,
- 0x1b77, 0x1b79, 0x1b7b, 0x1b7d, 0x1b7f, 0x1b81, 0x1b83, 0x1b85,
- 0x1b87, 0x1b89, 0x1b8b, 0x1b8d, 0x1b8f, 0x1b91, 0x1b93, 0x1b95,
- 0x1b97, 0x1b99, 0x1b9b, 0x1b9d, 0x1b9f, 0x1ba1, 0x1ba3, 0x1ba5,
- 0x1ba7, 0x1ba9, 0x1bab, 0x1bad, 0x1baf, 0x1bb1, 0x1bb3, 0x1bb5,
- 0x1bb7, 0x1bb9, 0x1bbb, 0x1bbd, 0x1bbf, 0x1bc1, 0x1bc3, 0x1bc5,
- 0x1bc7, 0x1bc9, 0x1bcb, 0x1bcd, 0x1bcf, 0x1bd1, 0x1bd3, 0x1bd5,
- 0x1bd7, 0x1bd9, 0x1bdb, 0x1bdd, 0x1bdf, 0x1be1, 0x1be3, 0x1be5,
- 0x1be7, 0x1be9, 0x1beb, 0x1bed, 0x1bef, 0x1bf1, 0x1bf3, 0x1bf5,
- 0x1bf7, 0x1bf9, 0x1bfb, 0x1bfd, 0x1bff, 0x1c01, 0x1c03, 0x1c05,
+ 0x1a0a, 0x1a0c, 0x1a0e, 0x1a10, 0x1a12, 0x1a14, 0x1a16, 0x1a18,
+ 0x1a1a, 0x1a1c, 0x1a1e, 0x1a20, 0x1a22, 0x1a24, 0x1a26, 0x1a28,
+ 0x1a2a, 0x1a2c, 0x1a2e, 0x1a30, 0x1a32, 0x1a34, 0x1a36, 0x1a38,
+ 0x1a3a, 0x1a3c, 0x1a3e, 0x1a40, 0x1a42, 0x1a44, 0x1a46, 0x1a48,
+ 0x1a4a, 0x1a4c, 0x1a4e, 0x1a50, 0x1a52, 0x1a54, 0x1a56, 0x1a58,
+ 0x1a5a, 0x1a5c, 0x1a5e, 0x1a60, 0x1a62, 0x1a64, 0x1a66, 0x1a68,
+ 0x1a6a, 0x1a6c, 0x1a6e, 0x1a70, 0x1a72, 0x1a74, 0x1a76, 0x1a78,
+ 0x1a7a, 0x1a7c, 0x1a7e, 0x1a80, 0x1a82, 0x1a84, 0x1a86, 0x1a88,
+ 0x1a8a, 0x1a8c, 0x1a8e, 0x1a90, 0x1a92, 0x1a94, 0x1a96, 0x1a98,
+ 0x1a9a, 0x1a9c, 0x1a9e, 0x1aa0, 0x1aa2, 0x1aa4, 0x1aa6, 0x1aa8,
+ 0x1aaa, 0x1aac, 0x1aae, 0x1ab0, 0x1ab2, 0x1ab4, 0x1ab6, 0x1ab8,
+ 0x1aba, 0x1abc, 0x1abe, 0x1ac0, 0x1ac2, 0x1ac4, 0x1ac6, 0x1ac8,
+ 0x1aca, 0x1acc, 0x1ace, 0x1ad0, 0x1ad2, 0x1ad4, 0x1ad6, 0x1ad8,
+ 0x1ada, 0x1adc, 0x1ade, 0x1ae0, 0x1ae2, 0x1ae4, 0x1ae6, 0x1ae8,
+ 0x1aea, 0x1aec, 0x1aee, 0x1af0, 0x1af2, 0x1af4, 0x1af6, 0x1af8,
+ 0x1afa, 0x1afc, 0x1afe, 0x1b00, 0x1b02, 0x1b04, 0x1b06, 0x1b08,
+ 0x1b0a, 0x1b0c, 0x1b0e, 0x1b10, 0x1b12, 0x1b14, 0x1b16, 0x1b18,
+ 0x1b1a, 0x1b1c, 0x1b1e, 0x1b20, 0x1b22, 0x1b24, 0x1b26, 0x1b28,
+ 0x1b2a, 0x1b2c, 0x1b2e, 0x1b30, 0x1b32, 0x1b34, 0x1b36, 0x1b38,
+ 0x1b3a, 0x1b3c, 0x1b3e, 0x1b40, 0x1b42, 0x1b44, 0x1b46, 0x1b48,
+ 0x1b4a, 0x1b4c, 0x1b4e, 0x1b50, 0x1b52, 0x1b54, 0x1b56, 0x1b58,
+ 0x1b5a, 0x1b5c, 0x1b5e, 0x1b60, 0x1b62, 0x1b64, 0x1b66, 0x1b68,
+ 0x1b6a, 0x1b6c, 0x1b6e, 0x1b70, 0x1b72, 0x1b74, 0x1b76, 0x1b78,
+ 0x1b7a, 0x1b7c, 0x1b7e, 0x1b80, 0x1b82, 0x1b84, 0x1b86, 0x1b88,
+ 0x1b8a, 0x1b8c, 0x1b8e, 0x1b90, 0x1b92, 0x1b94, 0x1b96, 0x1b98,
+ 0x1b9a, 0x1b9c, 0x1b9e, 0x1ba0, 0x1ba2, 0x1ba4, 0x1ba6, 0x1ba8,
+ 0x1baa, 0x1bac, 0x1bae, 0x1bb0, 0x1bb2, 0x1bb4, 0x1bb6, 0x1bb8,
+ 0x1bba, 0x1bbc, 0x1bbe, 0x1bc0, 0x1bc2, 0x1bc4, 0x1bc6, 0x1bc8,
+ 0x1bca, 0x1bcc, 0x1bce, 0x1bd0, 0x1bd2, 0x1bd4, 0x1bd6, 0x1bd8,
+ 0x1bda, 0x1bdc, 0x1bde, 0x1be0, 0x1be2, 0x1be4, 0x1be6, 0x1be8,
+ 0x1bea, 0x1bec, 0x1bee, 0x1bf0, 0x1bf2, 0x1bf4, 0x1bf6, 0x1bf8,
+ 0x1bfa, 0x1bfc, 0x1bfe, 0x1c00, 0x1c02, 0x1c04, 0x1c06, 0x1c08,
- 0x1c07, 0x1c09, 0x1c0b, 0x1c0d, 0x1c0f, 0x1c11, 0x1c13, 0x1c15,
- 0x1c17, 0x1c19, 0x1c1b, 0x1c1d, 0x1c1f, 0x1c21, 0xffff, 0xffff,
- 0x1c23, 0xffff, 0x1c25, 0xffff, 0xffff, 0x1c27, 0x1c29, 0x1c2b,
- 0x1c2d, 0x1c2f, 0x1c31, 0x1c33, 0x1c35, 0x1c37, 0x1c39, 0xffff,
- 0x1c3b, 0xffff, 0x1c3d, 0xffff, 0xffff, 0x1c3f, 0x1c41, 0xffff,
- 0xffff, 0xffff, 0x1c43, 0x1c45, 0x1c47, 0x1c49, 0x1c4b, 0x1c4d,
- 0x1c4f, 0x1c51, 0x1c53, 0x1c55, 0x1c57, 0x1c59, 0x1c5b, 0x1c5d,
- 0x1c5f, 0x1c61, 0x1c63, 0x1c65, 0x1c67, 0x1c69, 0x1c6b, 0x1c6d,
- 0x1c6f, 0x1c71, 0x1c73, 0x1c75, 0x1c77, 0x1c79, 0x1c7b, 0x1c7d,
- 0x1c7f, 0x1c81, 0x1c83, 0x1c85, 0x1c87, 0x1c89, 0x1c8b, 0x1c8d,
- 0x1c8f, 0x1c91, 0x1c93, 0x1c95, 0x1c97, 0x1c99, 0x1c9b, 0x1c9d,
- 0x1c9f, 0x1ca1, 0x1ca3, 0x1ca5, 0x1ca7, 0x1ca9, 0x1cab, 0x1cad,
- 0x1caf, 0x1cb1, 0x1cb3, 0x1cb5, 0x1cb7, 0x1cb9, 0x1cbb, 0x1cbd,
- 0x1cbf, 0x1cc1, 0x1cc3, 0x1cc5, 0x1cc7, 0x1cca, 0xffff, 0xffff,
- 0x1ccc, 0x1cce, 0x1cd0, 0x1cd2, 0x1cd4, 0x1cd6, 0x1cd8, 0x1cda,
- 0x1cdc, 0x1cde, 0x1ce0, 0x1ce2, 0x1ce4, 0x1ce6, 0x1ce8, 0x1cea,
- 0x1cec, 0x1cee, 0x1cf0, 0x1cf2, 0x1cf4, 0x1cf6, 0x1cf8, 0x1cfa,
- 0x1cfc, 0x1cfe, 0x1d00, 0x1d02, 0x1d04, 0x1d06, 0x1d08, 0x1d0a,
- 0x1d0c, 0x1d0e, 0x1d10, 0x1d12, 0x1d14, 0x1d16, 0x1d18, 0x1d1a,
- 0x1d1c, 0x1d1e, 0x1d20, 0x1d22, 0x1d24, 0x1d26, 0x1d28, 0x1d2a,
- 0x1d2c, 0x1d2e, 0x1d30, 0x1d32, 0x1d34, 0x1d36, 0x1d38, 0x1d3a,
- 0x1d3c, 0x1d3e, 0x1d40, 0x1d42, 0x1d44, 0x1d46, 0x1d48, 0x1d4a,
- 0x1d4c, 0x1d4e, 0x1d50, 0x1d52, 0x1d54, 0x1d56, 0x1d58, 0x1d5a,
- 0x1d5c, 0x1d5e, 0x1d60, 0x1d62, 0x1d64, 0x1d66, 0x1d68, 0x1d6a,
- 0x1d6c, 0x1d6e, 0x1d70, 0x1d72, 0x1d74, 0x1d76, 0x1d78, 0x1d7a,
- 0x1d7c, 0x1d7e, 0x1d80, 0x1d82, 0x1d84, 0x1d86, 0x1d88, 0x1d8a,
- 0x1d8d, 0x1d90, 0x1d93, 0x1d95, 0x1d97, 0x1d99, 0x1d9c, 0x1d9f,
- 0x1da2, 0x1da4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x1c0a, 0x1c0c, 0x1c0e, 0x1c10, 0x1c12, 0x1c14, 0x1c16, 0x1c18,
+ 0x1c1a, 0x1c1c, 0x1c1e, 0x1c20, 0x1c22, 0x1c24, 0xffff, 0xffff,
+ 0x1c26, 0xffff, 0x1c28, 0xffff, 0xffff, 0x1c2a, 0x1c2c, 0x1c2e,
+ 0x1c30, 0x1c32, 0x1c34, 0x1c36, 0x1c38, 0x1c3a, 0x1c3c, 0xffff,
+ 0x1c3e, 0xffff, 0x1c40, 0xffff, 0xffff, 0x1c42, 0x1c44, 0xffff,
+ 0xffff, 0xffff, 0x1c46, 0x1c48, 0x1c4a, 0x1c4c, 0x1c4e, 0x1c50,
+ 0x1c52, 0x1c54, 0x1c56, 0x1c58, 0x1c5a, 0x1c5c, 0x1c5e, 0x1c60,
+ 0x1c62, 0x1c64, 0x1c66, 0x1c68, 0x1c6a, 0x1c6c, 0x1c6e, 0x1c70,
+ 0x1c72, 0x1c74, 0x1c76, 0x1c78, 0x1c7a, 0x1c7c, 0x1c7e, 0x1c80,
+ 0x1c82, 0x1c84, 0x1c86, 0x1c88, 0x1c8a, 0x1c8c, 0x1c8e, 0x1c90,
+ 0x1c92, 0x1c94, 0x1c96, 0x1c98, 0x1c9a, 0x1c9c, 0x1c9e, 0x1ca0,
+ 0x1ca2, 0x1ca4, 0x1ca6, 0x1ca8, 0x1caa, 0x1cac, 0x1cae, 0x1cb0,
+ 0x1cb2, 0x1cb4, 0x1cb6, 0x1cb8, 0x1cba, 0x1cbc, 0x1cbe, 0x1cc0,
+ 0x1cc2, 0x1cc4, 0x1cc6, 0x1cc8, 0x1cca, 0x1ccd, 0xffff, 0xffff,
+ 0x1ccf, 0x1cd1, 0x1cd3, 0x1cd5, 0x1cd7, 0x1cd9, 0x1cdb, 0x1cdd,
+ 0x1cdf, 0x1ce1, 0x1ce3, 0x1ce5, 0x1ce7, 0x1ce9, 0x1ceb, 0x1ced,
+ 0x1cef, 0x1cf1, 0x1cf3, 0x1cf5, 0x1cf7, 0x1cf9, 0x1cfb, 0x1cfd,
+ 0x1cff, 0x1d01, 0x1d03, 0x1d05, 0x1d07, 0x1d09, 0x1d0b, 0x1d0d,
+ 0x1d0f, 0x1d11, 0x1d13, 0x1d15, 0x1d17, 0x1d19, 0x1d1b, 0x1d1d,
+ 0x1d1f, 0x1d21, 0x1d23, 0x1d25, 0x1d27, 0x1d29, 0x1d2b, 0x1d2d,
+ 0x1d2f, 0x1d31, 0x1d33, 0x1d35, 0x1d37, 0x1d39, 0x1d3b, 0x1d3d,
+ 0x1d3f, 0x1d41, 0x1d43, 0x1d45, 0x1d47, 0x1d49, 0x1d4b, 0x1d4d,
+ 0x1d4f, 0x1d51, 0x1d53, 0x1d55, 0x1d57, 0x1d59, 0x1d5b, 0x1d5d,
+ 0x1d5f, 0x1d61, 0x1d63, 0x1d65, 0x1d67, 0x1d69, 0x1d6b, 0x1d6d,
+ 0x1d6f, 0x1d71, 0x1d73, 0x1d75, 0x1d77, 0x1d79, 0x1d7b, 0x1d7d,
+ 0x1d7f, 0x1d81, 0x1d83, 0x1d85, 0x1d87, 0x1d89, 0x1d8b, 0x1d8d,
+ 0x1d90, 0x1d93, 0x1d96, 0x1d98, 0x1d9a, 0x1d9c, 0x1d9f, 0x1da2,
+ 0x1da5, 0x1da7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x1da6, 0x1da9, 0x1dac, 0x1daf, 0x1db3, 0x1db7, 0x1dba, 0xffff,
+ 0x1da9, 0x1dac, 0x1daf, 0x1db2, 0x1db6, 0x1dba, 0x1dbd, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x1dbd, 0x1dc0, 0x1dc3, 0x1dc6, 0x1dc9,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x1dcc, 0xffff, 0x1dcf,
- 0x1dd2, 0x1dd4, 0x1dd6, 0x1dd8, 0x1dda, 0x1ddc, 0x1dde, 0x1de0,
- 0x1de2, 0x1de4, 0x1de6, 0x1de9, 0x1dec, 0x1def, 0x1df2, 0x1df5,
- 0x1df8, 0x1dfb, 0x1dfe, 0x1e01, 0x1e04, 0x1e07, 0x1e0a, 0xffff,
- 0x1e0d, 0x1e10, 0x1e13, 0x1e16, 0x1e19, 0xffff, 0x1e1c, 0xffff,
- 0x1e1f, 0x1e22, 0xffff, 0x1e25, 0x1e28, 0xffff, 0x1e2b, 0x1e2e,
- 0x1e31, 0x1e34, 0x1e37, 0x1e3a, 0x1e3d, 0x1e40, 0x1e43, 0x1e46,
- 0x1e49, 0x1e4b, 0x1e4d, 0x1e4f, 0x1e51, 0x1e53, 0x1e55, 0x1e57,
- 0x1e59, 0x1e5b, 0x1e5d, 0x1e5f, 0x1e61, 0x1e63, 0x1e65, 0x1e67,
- 0x1e69, 0x1e6b, 0x1e6d, 0x1e6f, 0x1e71, 0x1e73, 0x1e75, 0x1e77,
- 0x1e79, 0x1e7b, 0x1e7d, 0x1e7f, 0x1e81, 0x1e83, 0x1e85, 0x1e87,
- 0x1e89, 0x1e8b, 0x1e8d, 0x1e8f, 0x1e91, 0x1e93, 0x1e95, 0x1e97,
- 0x1e99, 0x1e9b, 0x1e9d, 0x1e9f, 0x1ea1, 0x1ea3, 0x1ea5, 0x1ea7,
- 0x1ea9, 0x1eab, 0x1ead, 0x1eaf, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eb7,
- 0x1eb9, 0x1ebb, 0x1ebd, 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7,
- 0x1ec9, 0x1ecb, 0x1ecd, 0x1ecf, 0x1ed1, 0x1ed3, 0x1ed5, 0x1ed7,
- 0x1ed9, 0x1edb, 0x1edd, 0x1edf, 0x1ee1, 0x1ee3, 0x1ee5, 0x1ee7,
- 0x1ee9, 0x1eeb, 0x1eed, 0x1eef, 0x1ef1, 0x1ef3, 0x1ef5, 0x1ef7,
- 0x1ef9, 0x1efb, 0x1efd, 0x1eff, 0x1f01, 0x1f03, 0x1f05, 0x1f07,
- 0x1f09, 0x1f0b, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x1f0d, 0x1f0f, 0x1f11, 0x1f13, 0x1f15,
- 0x1f17, 0x1f19, 0x1f1b, 0x1f1d, 0x1f1f, 0x1f21, 0x1f23, 0x1f25,
- 0x1f27, 0x1f29, 0x1f2b, 0x1f2d, 0x1f2f, 0x1f31, 0x1f33, 0x1f35,
- 0x1f37, 0x1f39, 0x1f3b, 0x1f3e, 0x1f41, 0x1f44, 0x1f47, 0x1f4a,
- 0x1f4d, 0x1f50, 0x1f53, 0x1f56, 0x1f59, 0x1f5c, 0x1f5f, 0x1f62,
- 0x1f65, 0x1f68, 0x1f6b, 0x1f6e, 0x1f71, 0x1f73, 0x1f75, 0x1f77,
-
- 0x1f79, 0x1f7c, 0x1f7f, 0x1f82, 0x1f85, 0x1f88, 0x1f8b, 0x1f8e,
- 0x1f91, 0x1f94, 0x1f97, 0x1f9a, 0x1f9d, 0x1fa0, 0x1fa3, 0x1fa6,
- 0x1fa9, 0x1fac, 0x1faf, 0x1fb2, 0x1fb5, 0x1fb8, 0x1fbb, 0x1fbe,
- 0x1fc1, 0x1fc4, 0x1fc7, 0x1fca, 0x1fcd, 0x1fd0, 0x1fd3, 0x1fd6,
- 0x1fd9, 0x1fdc, 0x1fdf, 0x1fe2, 0x1fe5, 0x1fe8, 0x1feb, 0x1fee,
- 0x1ff1, 0x1ff4, 0x1ff7, 0x1ffa, 0x1ffd, 0x2000, 0x2003, 0x2006,
- 0x2009, 0x200c, 0x200f, 0x2012, 0x2015, 0x2018, 0x201b, 0x201e,
- 0x2021, 0x2024, 0x2027, 0x202a, 0x202d, 0x2030, 0x2033, 0x2036,
- 0x2039, 0x203c, 0x203f, 0x2042, 0x2045, 0x2048, 0x204b, 0x204e,
- 0x2051, 0x2054, 0x2057, 0x205a, 0x205d, 0x2060, 0x2063, 0x2066,
- 0x2069, 0x206c, 0x206f, 0x2072, 0x2075, 0x2078, 0x207b, 0x207e,
- 0x2081, 0x2084, 0x2087, 0x208a, 0x208d, 0x2090, 0x2093, 0x2097,
- 0x209b, 0x209f, 0x20a3, 0x20a7, 0x20ab, 0x20ae, 0x20b1, 0x20b4,
- 0x20b7, 0x20ba, 0x20bd, 0x20c0, 0x20c3, 0x20c6, 0x20c9, 0x20cc,
- 0x20cf, 0x20d2, 0x20d5, 0x20d8, 0x20db, 0x20de, 0x20e1, 0x20e4,
- 0x20e7, 0x20ea, 0x20ed, 0x20f0, 0x20f3, 0x20f6, 0x20f9, 0x20fc,
- 0x20ff, 0x2102, 0x2105, 0x2108, 0x210b, 0x210e, 0x2111, 0x2114,
- 0x2117, 0x211a, 0x211d, 0x2120, 0x2123, 0x2126, 0x2129, 0x212c,
- 0x212f, 0x2132, 0x2135, 0x2138, 0x213b, 0x213e, 0x2141, 0x2144,
- 0x2147, 0x214a, 0x214d, 0x2150, 0x2153, 0x2156, 0x2159, 0x215c,
- 0x215f, 0x2162, 0x2165, 0x2168, 0x216b, 0x216e, 0x2171, 0x2174,
- 0x2177, 0x217a, 0x217d, 0x2180, 0x2183, 0x2186, 0x2189, 0x218c,
- 0x218f, 0x2192, 0x2195, 0x2198, 0x219b, 0x219e, 0x21a1, 0x21a4,
- 0x21a7, 0x21aa, 0x21ad, 0x21b0, 0x21b3, 0x21b6, 0x21b9, 0x21bc,
- 0x21bf, 0x21c2, 0x21c5, 0x21c8, 0x21cb, 0x21ce, 0x21d1, 0x21d4,
- 0x21d7, 0x21da, 0x21dd, 0x21e0, 0x21e3, 0x21e6, 0x21e9, 0x21ec,
- 0x21ef, 0x21f2, 0x21f5, 0x21f8, 0x21fb, 0x21fe, 0x2201, 0x2204,
- 0x2207, 0x220a, 0x220d, 0x2210, 0x2213, 0x2216, 0x2219, 0x221c,
- 0x221f, 0x2222, 0x2225, 0x2228, 0x222b, 0x222e, 0x2231, 0x2234,
- 0x2237, 0x223a, 0x223d, 0x2240, 0x2243, 0x2246, 0x2249, 0x224c,
- 0x224f, 0x2252, 0x2255, 0x2259, 0x225d, 0x2261, 0x2264, 0x2267,
- 0x226a, 0x226d, 0x2270, 0x2273, 0x2276, 0x2279, 0x227c, 0x227f,
-
- 0x2282, 0x2285, 0x2288, 0x228b, 0x228e, 0x2291, 0x2294, 0x2297,
- 0x229a, 0x229d, 0x22a0, 0x22a3, 0x22a6, 0x22a9, 0x22ac, 0x22af,
- 0x22b2, 0x22b5, 0x22b8, 0x22bb, 0x22be, 0x22c1, 0x22c4, 0x22c7,
- 0x22ca, 0x22cd, 0x22d0, 0x22d3, 0x22d6, 0x22d9, 0x22dc, 0x22df,
- 0x22e2, 0x22e5, 0x22e8, 0x22eb, 0x22ee, 0x22f1, 0x22f4, 0x22f7,
- 0x22fa, 0x22fd, 0x2300, 0x2303, 0x2306, 0x2309, 0x230c, 0x230f,
- 0x2312, 0x2315, 0x2318, 0x231b, 0x231e, 0x2321, 0x2324, 0x2327,
- 0x232a, 0x232d, 0x2330, 0x2333, 0x2336, 0x2339, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x233c, 0x2340, 0x2344, 0x2348, 0x234c, 0x2350, 0x2354, 0x2358,
- 0x235c, 0x2360, 0x2364, 0x2368, 0x236c, 0x2370, 0x2374, 0x2378,
- 0x237c, 0x2380, 0x2384, 0x2388, 0x238c, 0x2390, 0x2394, 0x2398,
- 0x239c, 0x23a0, 0x23a4, 0x23a8, 0x23ac, 0x23b0, 0x23b4, 0x23b8,
- 0x23bc, 0x23c0, 0x23c4, 0x23c8, 0x23cc, 0x23d0, 0x23d4, 0x23d8,
- 0x23dc, 0x23e0, 0x23e4, 0x23e8, 0x23ec, 0x23f0, 0x23f4, 0x23f8,
- 0x23fc, 0x2400, 0x2404, 0x2408, 0x240c, 0x2410, 0x2414, 0x2418,
- 0x241c, 0x2420, 0x2424, 0x2428, 0x242c, 0x2430, 0x2434, 0x2438,
- 0xffff, 0xffff, 0x243c, 0x2440, 0x2444, 0x2448, 0x244c, 0x2450,
- 0x2454, 0x2458, 0x245c, 0x2460, 0x2464, 0x2468, 0x246c, 0x2470,
- 0x2474, 0x2478, 0x247c, 0x2480, 0x2484, 0x2488, 0x248c, 0x2490,
- 0x2494, 0x2498, 0x249c, 0x24a0, 0x24a4, 0x24a8, 0x24ac, 0x24b0,
- 0x24b4, 0x24b8, 0x24bc, 0x24c0, 0x24c4, 0x24c8, 0x24cc, 0x24d0,
- 0x24d4, 0x24d8, 0x24dc, 0x24e0, 0x24e4, 0x24e8, 0x24ec, 0x24f0,
- 0x24f4, 0x24f8, 0x24fc, 0x2500, 0x2504, 0x2508, 0x250c, 0x2510,
+ 0xffff, 0xffff, 0xffff, 0x1dc0, 0x1dc3, 0x1dc6, 0x1dc9, 0x1dcc,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x1dcf, 0xffff, 0x1dd2,
+ 0x1dd5, 0x1dd7, 0x1dd9, 0x1ddb, 0x1ddd, 0x1ddf, 0x1de1, 0x1de3,
+ 0x1de5, 0x1de7, 0x1de9, 0x1dec, 0x1def, 0x1df2, 0x1df5, 0x1df8,
+ 0x1dfb, 0x1dfe, 0x1e01, 0x1e04, 0x1e07, 0x1e0a, 0x1e0d, 0xffff,
+ 0x1e10, 0x1e13, 0x1e16, 0x1e19, 0x1e1c, 0xffff, 0x1e1f, 0xffff,
+ 0x1e22, 0x1e25, 0xffff, 0x1e28, 0x1e2b, 0xffff, 0x1e2e, 0x1e31,
+ 0x1e34, 0x1e37, 0x1e3a, 0x1e3d, 0x1e40, 0x1e43, 0x1e46, 0x1e49,
+ 0x1e4c, 0x1e4e, 0x1e50, 0x1e52, 0x1e54, 0x1e56, 0x1e58, 0x1e5a,
+ 0x1e5c, 0x1e5e, 0x1e60, 0x1e62, 0x1e64, 0x1e66, 0x1e68, 0x1e6a,
+ 0x1e6c, 0x1e6e, 0x1e70, 0x1e72, 0x1e74, 0x1e76, 0x1e78, 0x1e7a,
+ 0x1e7c, 0x1e7e, 0x1e80, 0x1e82, 0x1e84, 0x1e86, 0x1e88, 0x1e8a,
+ 0x1e8c, 0x1e8e, 0x1e90, 0x1e92, 0x1e94, 0x1e96, 0x1e98, 0x1e9a,
+ 0x1e9c, 0x1e9e, 0x1ea0, 0x1ea2, 0x1ea4, 0x1ea6, 0x1ea8, 0x1eaa,
+ 0x1eac, 0x1eae, 0x1eb0, 0x1eb2, 0x1eb4, 0x1eb6, 0x1eb8, 0x1eba,
+ 0x1ebc, 0x1ebe, 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6, 0x1ec8, 0x1eca,
+ 0x1ecc, 0x1ece, 0x1ed0, 0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8, 0x1eda,
+ 0x1edc, 0x1ede, 0x1ee0, 0x1ee2, 0x1ee4, 0x1ee6, 0x1ee8, 0x1eea,
+ 0x1eec, 0x1eee, 0x1ef0, 0x1ef2, 0x1ef4, 0x1ef6, 0x1ef8, 0x1efa,
+ 0x1efc, 0x1efe, 0x1f00, 0x1f02, 0x1f04, 0x1f06, 0x1f08, 0x1f0a,
+ 0x1f0c, 0x1f0e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0x1f10, 0x1f12, 0x1f14, 0x1f16, 0x1f18,
+ 0x1f1a, 0x1f1c, 0x1f1e, 0x1f20, 0x1f22, 0x1f24, 0x1f26, 0x1f28,
+ 0x1f2a, 0x1f2c, 0x1f2e, 0x1f30, 0x1f32, 0x1f34, 0x1f36, 0x1f38,
+ 0x1f3a, 0x1f3c, 0x1f3e, 0x1f41, 0x1f44, 0x1f47, 0x1f4a, 0x1f4d,
+ 0x1f50, 0x1f53, 0x1f56, 0x1f59, 0x1f5c, 0x1f5f, 0x1f62, 0x1f65,
+ 0x1f68, 0x1f6b, 0x1f6e, 0x1f71, 0x1f74, 0x1f76, 0x1f78, 0x1f7a,
+
+ 0x1f7c, 0x1f7f, 0x1f82, 0x1f85, 0x1f88, 0x1f8b, 0x1f8e, 0x1f91,
+ 0x1f94, 0x1f97, 0x1f9a, 0x1f9d, 0x1fa0, 0x1fa3, 0x1fa6, 0x1fa9,
+ 0x1fac, 0x1faf, 0x1fb2, 0x1fb5, 0x1fb8, 0x1fbb, 0x1fbe, 0x1fc1,
+ 0x1fc4, 0x1fc7, 0x1fca, 0x1fcd, 0x1fd0, 0x1fd3, 0x1fd6, 0x1fd9,
+ 0x1fdc, 0x1fdf, 0x1fe2, 0x1fe5, 0x1fe8, 0x1feb, 0x1fee, 0x1ff1,
+ 0x1ff4, 0x1ff7, 0x1ffa, 0x1ffd, 0x2000, 0x2003, 0x2006, 0x2009,
+ 0x200c, 0x200f, 0x2012, 0x2015, 0x2018, 0x201b, 0x201e, 0x2021,
+ 0x2024, 0x2027, 0x202a, 0x202d, 0x2030, 0x2033, 0x2036, 0x2039,
+ 0x203c, 0x203f, 0x2042, 0x2045, 0x2048, 0x204b, 0x204e, 0x2051,
+ 0x2054, 0x2057, 0x205a, 0x205d, 0x2060, 0x2063, 0x2066, 0x2069,
+ 0x206c, 0x206f, 0x2072, 0x2075, 0x2078, 0x207b, 0x207e, 0x2081,
+ 0x2084, 0x2087, 0x208a, 0x208d, 0x2090, 0x2093, 0x2096, 0x209a,
+ 0x209e, 0x20a2, 0x20a6, 0x20aa, 0x20ae, 0x20b1, 0x20b4, 0x20b7,
+ 0x20ba, 0x20bd, 0x20c0, 0x20c3, 0x20c6, 0x20c9, 0x20cc, 0x20cf,
+ 0x20d2, 0x20d5, 0x20d8, 0x20db, 0x20de, 0x20e1, 0x20e4, 0x20e7,
+ 0x20ea, 0x20ed, 0x20f0, 0x20f3, 0x20f6, 0x20f9, 0x20fc, 0x20ff,
+ 0x2102, 0x2105, 0x2108, 0x210b, 0x210e, 0x2111, 0x2114, 0x2117,
+ 0x211a, 0x211d, 0x2120, 0x2123, 0x2126, 0x2129, 0x212c, 0x212f,
+ 0x2132, 0x2135, 0x2138, 0x213b, 0x213e, 0x2141, 0x2144, 0x2147,
+ 0x214a, 0x214d, 0x2150, 0x2153, 0x2156, 0x2159, 0x215c, 0x215f,
+ 0x2162, 0x2165, 0x2168, 0x216b, 0x216e, 0x2171, 0x2174, 0x2177,
+ 0x217a, 0x217d, 0x2180, 0x2183, 0x2186, 0x2189, 0x218c, 0x218f,
+ 0x2192, 0x2195, 0x2198, 0x219b, 0x219e, 0x21a1, 0x21a4, 0x21a7,
+ 0x21aa, 0x21ad, 0x21b0, 0x21b3, 0x21b6, 0x21b9, 0x21bc, 0x21bf,
+ 0x21c2, 0x21c5, 0x21c8, 0x21cb, 0x21ce, 0x21d1, 0x21d4, 0x21d7,
+ 0x21da, 0x21dd, 0x21e0, 0x21e3, 0x21e6, 0x21e9, 0x21ec, 0x21ef,
+ 0x21f2, 0x21f5, 0x21f8, 0x21fb, 0x21fe, 0x2201, 0x2204, 0x2207,
+ 0x220a, 0x220d, 0x2210, 0x2213, 0x2216, 0x2219, 0x221c, 0x221f,
+ 0x2222, 0x2225, 0x2228, 0x222b, 0x222e, 0x2231, 0x2234, 0x2237,
+ 0x223a, 0x223d, 0x2240, 0x2243, 0x2246, 0x2249, 0x224c, 0x224f,
+ 0x2252, 0x2255, 0x2258, 0x225c, 0x2260, 0x2264, 0x2267, 0x226a,
+ 0x226d, 0x2270, 0x2273, 0x2276, 0x2279, 0x227c, 0x227f, 0x2282,
+
+ 0x2285, 0x2288, 0x228b, 0x228e, 0x2291, 0x2294, 0x2297, 0x229a,
+ 0x229d, 0x22a0, 0x22a3, 0x22a6, 0x22a9, 0x22ac, 0x22af, 0x22b2,
+ 0x22b5, 0x22b8, 0x22bb, 0x22be, 0x22c1, 0x22c4, 0x22c7, 0x22ca,
+ 0x22cd, 0x22d0, 0x22d3, 0x22d6, 0x22d9, 0x22dc, 0x22df, 0x22e2,
+ 0x22e5, 0x22e8, 0x22eb, 0x22ee, 0x22f1, 0x22f4, 0x22f7, 0x22fa,
+ 0x22fd, 0x2300, 0x2303, 0x2306, 0x2309, 0x230c, 0x230f, 0x2312,
+ 0x2315, 0x2318, 0x231b, 0x231e, 0x2321, 0x2324, 0x2327, 0x232a,
+ 0x232d, 0x2330, 0x2333, 0x2336, 0x2339, 0x233c, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x233f, 0x2343, 0x2347, 0x234b, 0x234f, 0x2353, 0x2357, 0x235b,
+ 0x235f, 0x2363, 0x2367, 0x236b, 0x236f, 0x2373, 0x2377, 0x237b,
+ 0x237f, 0x2383, 0x2387, 0x238b, 0x238f, 0x2393, 0x2397, 0x239b,
+ 0x239f, 0x23a3, 0x23a7, 0x23ab, 0x23af, 0x23b3, 0x23b7, 0x23bb,
+ 0x23bf, 0x23c3, 0x23c7, 0x23cb, 0x23cf, 0x23d3, 0x23d7, 0x23db,
+ 0x23df, 0x23e3, 0x23e7, 0x23eb, 0x23ef, 0x23f3, 0x23f7, 0x23fb,
+ 0x23ff, 0x2403, 0x2407, 0x240b, 0x240f, 0x2413, 0x2417, 0x241b,
+ 0x241f, 0x2423, 0x2427, 0x242b, 0x242f, 0x2433, 0x2437, 0x243b,
+ 0xffff, 0xffff, 0x243f, 0x2443, 0x2447, 0x244b, 0x244f, 0x2453,
+ 0x2457, 0x245b, 0x245f, 0x2463, 0x2467, 0x246b, 0x246f, 0x2473,
+ 0x2477, 0x247b, 0x247f, 0x2483, 0x2487, 0x248b, 0x248f, 0x2493,
+ 0x2497, 0x249b, 0x249f, 0x24a3, 0x24a7, 0x24ab, 0x24af, 0x24b3,
+ 0x24b7, 0x24bb, 0x24bf, 0x24c3, 0x24c7, 0x24cb, 0x24cf, 0x24d3,
+ 0x24d7, 0x24db, 0x24df, 0x24e3, 0x24e7, 0x24eb, 0x24ef, 0x24f3,
+ 0x24f7, 0x24fb, 0x24ff, 0x2503, 0x2507, 0x250b, 0x250f, 0x2513,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x2514, 0x2518, 0x251c, 0x2521, 0x2526, 0x252b, 0x2530, 0x2535,
- 0x253a, 0x253f, 0x2543, 0x2556, 0x255f, 0xffff, 0xffff, 0xffff,
+ 0x2517, 0x251b, 0x251f, 0x2524, 0x2529, 0x252e, 0x2533, 0x2538,
+ 0x253d, 0x2542, 0x2546, 0x2559, 0x2562, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x2564, 0x2566, 0x2568, 0x256a, 0x256c, 0x256e, 0x2570, 0x2572,
- 0x2574, 0x2576, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x2567, 0x2569, 0x256b, 0x256d, 0x256f, 0x2571, 0x2573, 0x2575,
+ 0x2577, 0x2579, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x2578, 0x257a, 0x257c, 0x257e, 0x2580, 0x2582, 0x2584, 0x2586,
- 0x2588, 0x258a, 0x258c, 0x258e, 0x2590, 0x2592, 0x2594, 0x2596,
- 0x2598, 0x259a, 0x259c, 0x259e, 0x25a0, 0xffff, 0xffff, 0x25a2,
- 0x25a4, 0x25a6, 0x25a8, 0x25aa, 0x25ac, 0x25ae, 0x25b0, 0x25b2,
- 0x25b4, 0x25b6, 0x25b8, 0xffff, 0x25ba, 0x25bc, 0x25be, 0x25c0,
- 0x25c2, 0x25c4, 0x25c6, 0x25c8, 0x25ca, 0x25cc, 0x25ce, 0x25d0,
- 0x25d2, 0x25d4, 0x25d6, 0x25d8, 0x25da, 0x25dc, 0x25de, 0xffff,
- 0x25e0, 0x25e2, 0x25e4, 0x25e6, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x25e8, 0x25eb, 0x25ee, 0xffff, 0x25f1, 0xffff, 0x25f4, 0x25f7,
- 0x25fa, 0x25fd, 0x2600, 0x2603, 0x2606, 0x2609, 0x260c, 0x260f,
- 0x2612, 0x2614, 0x2616, 0x2618, 0x261a, 0x261c, 0x261e, 0x2620,
- 0x2622, 0x2624, 0x2626, 0x2628, 0x262a, 0x262c, 0x262e, 0x2630,
- 0x2632, 0x2634, 0x2636, 0x2638, 0x263a, 0x263c, 0x263e, 0x2640,
- 0x2642, 0x2644, 0x2646, 0x2648, 0x264a, 0x264c, 0x264e, 0x2650,
- 0x2652, 0x2654, 0x2656, 0x2658, 0x265a, 0x265c, 0x265e, 0x2660,
- 0x2662, 0x2664, 0x2666, 0x2668, 0x266a, 0x266c, 0x266e, 0x2670,
- 0x2672, 0x2674, 0x2676, 0x2678, 0x267a, 0x267c, 0x267e, 0x2680,
- 0x2682, 0x2684, 0x2686, 0x2688, 0x268a, 0x268c, 0x268e, 0x2690,
- 0x2692, 0x2694, 0x2696, 0x2698, 0x269a, 0x269c, 0x269e, 0x26a0,
- 0x26a2, 0x26a4, 0x26a6, 0x26a8, 0x26aa, 0x26ac, 0x26ae, 0x26b0,
- 0x26b2, 0x26b4, 0x26b6, 0x26b8, 0x26ba, 0x26bc, 0x26be, 0x26c0,
- 0x26c2, 0x26c4, 0x26c6, 0x26c8, 0x26ca, 0x26cc, 0x26ce, 0x26d0,
- 0x26d2, 0x26d4, 0x26d6, 0x26d8, 0x26da, 0x26dc, 0x26de, 0x26e0,
- 0x26e2, 0x26e4, 0x26e6, 0x26e8, 0x26ea, 0x26ec, 0x26ee, 0x26f0,
- 0x26f2, 0x26f4, 0x26f6, 0x26f8, 0x26fa, 0x26fc, 0x26ff, 0x2702,
- 0x2705, 0x2708, 0x270b, 0x270e, 0x2711, 0xffff, 0xffff, 0xffff,
+ 0x257b, 0x257d, 0x257f, 0x2581, 0x2583, 0x2585, 0x2587, 0x2589,
+ 0x258b, 0x258d, 0x258f, 0x2591, 0x2593, 0x2595, 0x2597, 0x2599,
+ 0x259b, 0x259d, 0x259f, 0x25a1, 0x25a3, 0xffff, 0xffff, 0x25a5,
+ 0x25a7, 0x25a9, 0x25ab, 0x25ad, 0x25af, 0x25b1, 0x25b3, 0x25b5,
+ 0x25b7, 0x25b9, 0x25bb, 0xffff, 0x25bd, 0x25bf, 0x25c1, 0x25c3,
+ 0x25c5, 0x25c7, 0x25c9, 0x25cb, 0x25cd, 0x25cf, 0x25d1, 0x25d3,
+ 0x25d5, 0x25d7, 0x25d9, 0x25db, 0x25dd, 0x25df, 0x25e1, 0xffff,
+ 0x25e3, 0x25e5, 0x25e7, 0x25e9, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x25eb, 0x25ee, 0x25f1, 0xffff, 0x25f4, 0xffff, 0x25f7, 0x25fa,
+ 0x25fd, 0x2600, 0x2603, 0x2606, 0x2609, 0x260c, 0x260f, 0x2612,
+ 0x2615, 0x2617, 0x2619, 0x261b, 0x261d, 0x261f, 0x2621, 0x2623,
+ 0x2625, 0x2627, 0x2629, 0x262b, 0x262d, 0x262f, 0x2631, 0x2633,
+ 0x2635, 0x2637, 0x2639, 0x263b, 0x263d, 0x263f, 0x2641, 0x2643,
+ 0x2645, 0x2647, 0x2649, 0x264b, 0x264d, 0x264f, 0x2651, 0x2653,
+ 0x2655, 0x2657, 0x2659, 0x265b, 0x265d, 0x265f, 0x2661, 0x2663,
+ 0x2665, 0x2667, 0x2669, 0x266b, 0x266d, 0x266f, 0x2671, 0x2673,
+ 0x2675, 0x2677, 0x2679, 0x267b, 0x267d, 0x267f, 0x2681, 0x2683,
+ 0x2685, 0x2687, 0x2689, 0x268b, 0x268d, 0x268f, 0x2691, 0x2693,
+ 0x2695, 0x2697, 0x2699, 0x269b, 0x269d, 0x269f, 0x26a1, 0x26a3,
+ 0x26a5, 0x26a7, 0x26a9, 0x26ab, 0x26ad, 0x26af, 0x26b1, 0x26b3,
+ 0x26b5, 0x26b7, 0x26b9, 0x26bb, 0x26bd, 0x26bf, 0x26c1, 0x26c3,
+ 0x26c5, 0x26c7, 0x26c9, 0x26cb, 0x26cd, 0x26cf, 0x26d1, 0x26d3,
+ 0x26d5, 0x26d7, 0x26d9, 0x26db, 0x26dd, 0x26df, 0x26e1, 0x26e3,
+ 0x26e5, 0x26e7, 0x26e9, 0x26eb, 0x26ed, 0x26ef, 0x26f1, 0x26f3,
+ 0x26f5, 0x26f7, 0x26f9, 0x26fb, 0x26fd, 0x26ff, 0x2702, 0x2705,
+ 0x2708, 0x270b, 0x270e, 0x2711, 0x2714, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x2714, 0x2716, 0x2718, 0x271a, 0x271c, 0x271e, 0x2720,
- 0x2722, 0x2724, 0x2726, 0x2728, 0x272a, 0x272c, 0x272e, 0x2730,
- 0x2732, 0x2734, 0x2736, 0x2738, 0x273a, 0x273c, 0x273e, 0x2740,
- 0x2742, 0x2744, 0x2746, 0x2748, 0x274a, 0x274c, 0x274e, 0x2750,
- 0x2752, 0x2754, 0x2756, 0x2758, 0x275a, 0x275c, 0x275e, 0x2760,
- 0x2762, 0x2764, 0x2766, 0x2768, 0x276a, 0x276c, 0x276e, 0x2770,
- 0x2772, 0x2774, 0x2776, 0x2778, 0x277a, 0x277c, 0x277e, 0x2780,
- 0x2782, 0x2784, 0x2786, 0x2788, 0x278a, 0x278c, 0x278e, 0x2790,
- 0x2792, 0x2794, 0x2796, 0x2798, 0x279a, 0x279c, 0x279e, 0x27a0,
- 0x27a2, 0x27a4, 0x27a6, 0x27a8, 0x27aa, 0x27ac, 0x27ae, 0x27b0,
- 0x27b2, 0x27b4, 0x27b6, 0x27b8, 0x27ba, 0x27bc, 0x27be, 0x27c0,
- 0x27c2, 0x27c4, 0x27c6, 0x27c8, 0x27ca, 0x27cc, 0x27ce, 0x27d0,
- 0x27d2, 0x27d4, 0x27d6, 0x27d8, 0x27da, 0x27dc, 0x27de, 0x27e0,
- 0x27e2, 0x27e4, 0x27e6, 0x27e8, 0x27ea, 0x27ec, 0x27ee, 0x27f0,
- 0x27f2, 0x27f4, 0x27f6, 0x27f8, 0x27fa, 0x27fc, 0x27fe, 0x2800,
- 0x2802, 0x2804, 0x2806, 0x2808, 0x280a, 0x280c, 0x280e, 0x2810,
- 0x2812, 0x2814, 0x2816, 0x2818, 0x281a, 0x281c, 0x281e, 0x2820,
- 0x2822, 0x2824, 0x2826, 0x2828, 0x282a, 0x282c, 0x282e, 0x2830,
- 0x2832, 0x2834, 0x2836, 0x2838, 0x283a, 0x283c, 0x283e, 0x2840,
- 0x2842, 0x2844, 0x2846, 0x2848, 0x284a, 0x284c, 0x284e, 0x2850,
- 0x2852, 0x2854, 0x2856, 0x2858, 0x285a, 0x285c, 0x285e, 0x2860,
- 0x2862, 0x2864, 0x2866, 0x2868, 0x286a, 0x286c, 0x286e, 0x2870,
- 0x2872, 0x2874, 0x2876, 0x2878, 0x287a, 0x287c, 0x287e, 0x2880,
- 0x2882, 0x2884, 0x2886, 0x2888, 0x288a, 0x288c, 0x288e, 0xffff,
- 0xffff, 0xffff, 0x2890, 0x2892, 0x2894, 0x2896, 0x2898, 0x289a,
- 0xffff, 0xffff, 0x289c, 0x289e, 0x28a0, 0x28a2, 0x28a4, 0x28a6,
- 0xffff, 0xffff, 0x28a8, 0x28aa, 0x28ac, 0x28ae, 0x28b0, 0x28b2,
- 0xffff, 0xffff, 0x28b4, 0x28b6, 0x28b8, 0xffff, 0xffff, 0xffff,
- 0x28ba, 0x28bc, 0x28be, 0x28c0, 0x28c2, 0x28c4, 0x28c6, 0xffff,
- 0x28c8, 0x28ca, 0x28cc, 0x28ce, 0x28d0, 0x28d2, 0x28d4, 0xffff,
+ 0xffff, 0x2717, 0x2719, 0x271b, 0x271d, 0x271f, 0x2721, 0x2723,
+ 0x2725, 0x2727, 0x2729, 0x272b, 0x272d, 0x272f, 0x2731, 0x2733,
+ 0x2735, 0x2737, 0x2739, 0x273b, 0x273d, 0x273f, 0x2741, 0x2743,
+ 0x2745, 0x2747, 0x2749, 0x274b, 0x274d, 0x274f, 0x2751, 0x2753,
+ 0x2755, 0x2757, 0x2759, 0x275b, 0x275d, 0x275f, 0x2761, 0x2763,
+ 0x2765, 0x2767, 0x2769, 0x276b, 0x276d, 0x276f, 0x2771, 0x2773,
+ 0x2775, 0x2777, 0x2779, 0x277b, 0x277d, 0x277f, 0x2781, 0x2783,
+ 0x2785, 0x2787, 0x2789, 0x278b, 0x278d, 0x278f, 0x2791, 0x2793,
+ 0x2795, 0x2797, 0x2799, 0x279b, 0x279d, 0x279f, 0x27a1, 0x27a3,
+ 0x27a5, 0x27a7, 0x27a9, 0x27ab, 0x27ad, 0x27af, 0x27b1, 0x27b3,
+ 0x27b5, 0x27b7, 0x27b9, 0x27bb, 0x27bd, 0x27bf, 0x27c1, 0x27c3,
+ 0x27c5, 0x27c7, 0x27c9, 0x27cb, 0x27cd, 0x27cf, 0x27d1, 0x27d3,
+ 0x27d5, 0x27d7, 0x27d9, 0x27db, 0x27dd, 0x27df, 0x27e1, 0x27e3,
+ 0x27e5, 0x27e7, 0x27e9, 0x27eb, 0x27ed, 0x27ef, 0x27f1, 0x27f3,
+ 0x27f5, 0x27f7, 0x27f9, 0x27fb, 0x27fd, 0x27ff, 0x2801, 0x2803,
+ 0x2805, 0x2807, 0x2809, 0x280b, 0x280d, 0x280f, 0x2811, 0x2813,
+ 0x2815, 0x2817, 0x2819, 0x281b, 0x281d, 0x281f, 0x2821, 0x2823,
+ 0x2825, 0x2827, 0x2829, 0x282b, 0x282d, 0x282f, 0x2831, 0x2833,
+ 0x2835, 0x2837, 0x2839, 0x283b, 0x283d, 0x283f, 0x2841, 0x2843,
+ 0x2845, 0x2847, 0x2849, 0x284b, 0x284d, 0x284f, 0x2851, 0x2853,
+ 0x2855, 0x2857, 0x2859, 0x285b, 0x285d, 0x285f, 0x2861, 0x2863,
+ 0x2865, 0x2867, 0x2869, 0x286b, 0x286d, 0x286f, 0x2871, 0x2873,
+ 0x2875, 0x2877, 0x2879, 0x287b, 0x287d, 0x287f, 0x2881, 0x2883,
+ 0x2885, 0x2887, 0x2889, 0x288b, 0x288d, 0x288f, 0x2891, 0xffff,
+ 0xffff, 0xffff, 0x2893, 0x2895, 0x2897, 0x2899, 0x289b, 0x289d,
+ 0xffff, 0xffff, 0x289f, 0x28a1, 0x28a3, 0x28a5, 0x28a7, 0x28a9,
+ 0xffff, 0xffff, 0x28ab, 0x28ad, 0x28af, 0x28b1, 0x28b3, 0x28b5,
+ 0xffff, 0xffff, 0x28b7, 0x28b9, 0x28bb, 0xffff, 0xffff, 0xffff,
+ 0x28bd, 0x28bf, 0x28c1, 0x28c3, 0x28c5, 0x28c7, 0x28c9, 0xffff,
+ 0x28cb, 0x28cd, 0x28cf, 0x28d1, 0x28d3, 0x28d5, 0x28d7, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10452,9 +10960,9 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x28d6, 0xffff, 0x28db, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0x28d9, 0xffff, 0x28de, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x28e0, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0x28e3, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10471,7 +10979,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x28e5, 0x28ea,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x28e8, 0x28ed,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10508,7 +11016,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x28ef, 0x28f4, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0x28f2, 0x28f7, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10555,7 +11063,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x28f9, 0x28fe, 0xffff, 0x2903, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0x28fc, 0x2901, 0xffff, 0x2906, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10588,7 +11096,7 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x2908, 0x290d, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0x290b, 0x2910, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10609,8 +11117,8 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x2912, 0x2917,
- 0x291c, 0x2921, 0x2926, 0x292b, 0x2930, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x2915, 0x291a,
+ 0x291f, 0x2924, 0x2929, 0x292e, 0x2933, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10621,8 +11129,8 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x2935, 0x293a, 0x293f, 0x2944, 0x2949,
- 0x294e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0x2938, 0x293d, 0x2942, 0x2947, 0x294c,
+ 0x2951, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10631,162 +11139,162 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x2953, 0x2955, 0x2957, 0x2959, 0x295b, 0x295d, 0x295f, 0x2961,
- 0x2963, 0x2965, 0x2967, 0x2969, 0x296b, 0x296d, 0x296f, 0x2971,
- 0x2973, 0x2975, 0x2977, 0x2979, 0x297b, 0x297d, 0x297f, 0x2981,
- 0x2983, 0x2985, 0x2987, 0x2989, 0x298b, 0x298d, 0x298f, 0x2991,
- 0x2993, 0x2995, 0x2997, 0x2999, 0x299b, 0x299d, 0x299f, 0x29a1,
- 0x29a3, 0x29a5, 0x29a7, 0x29a9, 0x29ab, 0x29ad, 0x29af, 0x29b1,
- 0x29b3, 0x29b5, 0x29b7, 0x29b9, 0x29bb, 0x29bd, 0x29bf, 0x29c1,
- 0x29c3, 0x29c5, 0x29c7, 0x29c9, 0x29cb, 0x29cd, 0x29cf, 0x29d1,
- 0x29d3, 0x29d5, 0x29d7, 0x29d9, 0x29db, 0x29dd, 0x29df, 0x29e1,
- 0x29e3, 0x29e5, 0x29e7, 0x29e9, 0x29eb, 0x29ed, 0x29ef, 0x29f1,
- 0x29f3, 0x29f5, 0x29f7, 0x29f9, 0x29fb, 0xffff, 0x29fd, 0x29ff,
- 0x2a01, 0x2a03, 0x2a05, 0x2a07, 0x2a09, 0x2a0b, 0x2a0d, 0x2a0f,
- 0x2a11, 0x2a13, 0x2a15, 0x2a17, 0x2a19, 0x2a1b, 0x2a1d, 0x2a1f,
- 0x2a21, 0x2a23, 0x2a25, 0x2a27, 0x2a29, 0x2a2b, 0x2a2d, 0x2a2f,
- 0x2a31, 0x2a33, 0x2a35, 0x2a37, 0x2a39, 0x2a3b, 0x2a3d, 0x2a3f,
- 0x2a41, 0x2a43, 0x2a45, 0x2a47, 0x2a49, 0x2a4b, 0x2a4d, 0x2a4f,
- 0x2a51, 0x2a53, 0x2a55, 0x2a57, 0x2a59, 0x2a5b, 0x2a5d, 0x2a5f,
- 0x2a61, 0x2a63, 0x2a65, 0x2a67, 0x2a69, 0x2a6b, 0x2a6d, 0x2a6f,
- 0x2a71, 0x2a73, 0x2a75, 0x2a77, 0x2a79, 0x2a7b, 0x2a7d, 0x2a7f,
- 0x2a81, 0x2a83, 0x2a85, 0x2a87, 0x2a89, 0xffff, 0x2a8b, 0x2a8d,
- 0xffff, 0xffff, 0x2a8f, 0xffff, 0xffff, 0x2a91, 0x2a93, 0xffff,
- 0xffff, 0x2a95, 0x2a97, 0x2a99, 0x2a9b, 0xffff, 0x2a9d, 0x2a9f,
- 0x2aa1, 0x2aa3, 0x2aa5, 0x2aa7, 0x2aa9, 0x2aab, 0x2aad, 0x2aaf,
- 0x2ab1, 0x2ab3, 0xffff, 0x2ab5, 0xffff, 0x2ab7, 0x2ab9, 0x2abb,
- 0x2abd, 0x2abf, 0x2ac1, 0x2ac3, 0xffff, 0x2ac5, 0x2ac7, 0x2ac9,
- 0x2acb, 0x2acd, 0x2acf, 0x2ad1, 0x2ad3, 0x2ad5, 0x2ad7, 0x2ad9,
- 0x2adb, 0x2add, 0x2adf, 0x2ae1, 0x2ae3, 0x2ae5, 0x2ae7, 0x2ae9,
- 0x2aeb, 0x2aed, 0x2aef, 0x2af1, 0x2af3, 0x2af5, 0x2af7, 0x2af9,
- 0x2afb, 0x2afd, 0x2aff, 0x2b01, 0x2b03, 0x2b05, 0x2b07, 0x2b09,
- 0x2b0b, 0x2b0d, 0x2b0f, 0x2b11, 0x2b13, 0x2b15, 0x2b17, 0x2b19,
- 0x2b1b, 0x2b1d, 0x2b1f, 0x2b21, 0x2b23, 0x2b25, 0x2b27, 0x2b29,
- 0x2b2b, 0x2b2d, 0x2b2f, 0x2b31, 0x2b33, 0x2b35, 0x2b37, 0x2b39,
+ 0x2956, 0x2958, 0x295a, 0x295c, 0x295e, 0x2960, 0x2962, 0x2964,
+ 0x2966, 0x2968, 0x296a, 0x296c, 0x296e, 0x2970, 0x2972, 0x2974,
+ 0x2976, 0x2978, 0x297a, 0x297c, 0x297e, 0x2980, 0x2982, 0x2984,
+ 0x2986, 0x2988, 0x298a, 0x298c, 0x298e, 0x2990, 0x2992, 0x2994,
+ 0x2996, 0x2998, 0x299a, 0x299c, 0x299e, 0x29a0, 0x29a2, 0x29a4,
+ 0x29a6, 0x29a8, 0x29aa, 0x29ac, 0x29ae, 0x29b0, 0x29b2, 0x29b4,
+ 0x29b6, 0x29b8, 0x29ba, 0x29bc, 0x29be, 0x29c0, 0x29c2, 0x29c4,
+ 0x29c6, 0x29c8, 0x29ca, 0x29cc, 0x29ce, 0x29d0, 0x29d2, 0x29d4,
+ 0x29d6, 0x29d8, 0x29da, 0x29dc, 0x29de, 0x29e0, 0x29e2, 0x29e4,
+ 0x29e6, 0x29e8, 0x29ea, 0x29ec, 0x29ee, 0x29f0, 0x29f2, 0x29f4,
+ 0x29f6, 0x29f8, 0x29fa, 0x29fc, 0x29fe, 0xffff, 0x2a00, 0x2a02,
+ 0x2a04, 0x2a06, 0x2a08, 0x2a0a, 0x2a0c, 0x2a0e, 0x2a10, 0x2a12,
+ 0x2a14, 0x2a16, 0x2a18, 0x2a1a, 0x2a1c, 0x2a1e, 0x2a20, 0x2a22,
+ 0x2a24, 0x2a26, 0x2a28, 0x2a2a, 0x2a2c, 0x2a2e, 0x2a30, 0x2a32,
+ 0x2a34, 0x2a36, 0x2a38, 0x2a3a, 0x2a3c, 0x2a3e, 0x2a40, 0x2a42,
+ 0x2a44, 0x2a46, 0x2a48, 0x2a4a, 0x2a4c, 0x2a4e, 0x2a50, 0x2a52,
+ 0x2a54, 0x2a56, 0x2a58, 0x2a5a, 0x2a5c, 0x2a5e, 0x2a60, 0x2a62,
+ 0x2a64, 0x2a66, 0x2a68, 0x2a6a, 0x2a6c, 0x2a6e, 0x2a70, 0x2a72,
+ 0x2a74, 0x2a76, 0x2a78, 0x2a7a, 0x2a7c, 0x2a7e, 0x2a80, 0x2a82,
+ 0x2a84, 0x2a86, 0x2a88, 0x2a8a, 0x2a8c, 0xffff, 0x2a8e, 0x2a90,
+ 0xffff, 0xffff, 0x2a92, 0xffff, 0xffff, 0x2a94, 0x2a96, 0xffff,
+ 0xffff, 0x2a98, 0x2a9a, 0x2a9c, 0x2a9e, 0xffff, 0x2aa0, 0x2aa2,
+ 0x2aa4, 0x2aa6, 0x2aa8, 0x2aaa, 0x2aac, 0x2aae, 0x2ab0, 0x2ab2,
+ 0x2ab4, 0x2ab6, 0xffff, 0x2ab8, 0xffff, 0x2aba, 0x2abc, 0x2abe,
+ 0x2ac0, 0x2ac2, 0x2ac4, 0x2ac6, 0xffff, 0x2ac8, 0x2aca, 0x2acc,
+ 0x2ace, 0x2ad0, 0x2ad2, 0x2ad4, 0x2ad6, 0x2ad8, 0x2ada, 0x2adc,
+ 0x2ade, 0x2ae0, 0x2ae2, 0x2ae4, 0x2ae6, 0x2ae8, 0x2aea, 0x2aec,
+ 0x2aee, 0x2af0, 0x2af2, 0x2af4, 0x2af6, 0x2af8, 0x2afa, 0x2afc,
+ 0x2afe, 0x2b00, 0x2b02, 0x2b04, 0x2b06, 0x2b08, 0x2b0a, 0x2b0c,
+ 0x2b0e, 0x2b10, 0x2b12, 0x2b14, 0x2b16, 0x2b18, 0x2b1a, 0x2b1c,
+ 0x2b1e, 0x2b20, 0x2b22, 0x2b24, 0x2b26, 0x2b28, 0x2b2a, 0x2b2c,
+ 0x2b2e, 0x2b30, 0x2b32, 0x2b34, 0x2b36, 0x2b38, 0x2b3a, 0x2b3c,
- 0x2b3b, 0x2b3d, 0x2b3f, 0x2b41, 0x2b43, 0x2b45, 0xffff, 0x2b47,
- 0x2b49, 0x2b4b, 0x2b4d, 0xffff, 0xffff, 0x2b4f, 0x2b51, 0x2b53,
- 0x2b55, 0x2b57, 0x2b59, 0x2b5b, 0x2b5d, 0xffff, 0x2b5f, 0x2b61,
- 0x2b63, 0x2b65, 0x2b67, 0x2b69, 0x2b6b, 0xffff, 0x2b6d, 0x2b6f,
- 0x2b71, 0x2b73, 0x2b75, 0x2b77, 0x2b79, 0x2b7b, 0x2b7d, 0x2b7f,
- 0x2b81, 0x2b83, 0x2b85, 0x2b87, 0x2b89, 0x2b8b, 0x2b8d, 0x2b8f,
- 0x2b91, 0x2b93, 0x2b95, 0x2b97, 0x2b99, 0x2b9b, 0x2b9d, 0x2b9f,
- 0x2ba1, 0x2ba3, 0xffff, 0x2ba5, 0x2ba7, 0x2ba9, 0x2bab, 0xffff,
- 0x2bad, 0x2baf, 0x2bb1, 0x2bb3, 0x2bb5, 0xffff, 0x2bb7, 0xffff,
- 0xffff, 0xffff, 0x2bb9, 0x2bbb, 0x2bbd, 0x2bbf, 0x2bc1, 0x2bc3,
- 0x2bc5, 0xffff, 0x2bc7, 0x2bc9, 0x2bcb, 0x2bcd, 0x2bcf, 0x2bd1,
- 0x2bd3, 0x2bd5, 0x2bd7, 0x2bd9, 0x2bdb, 0x2bdd, 0x2bdf, 0x2be1,
- 0x2be3, 0x2be5, 0x2be7, 0x2be9, 0x2beb, 0x2bed, 0x2bef, 0x2bf1,
- 0x2bf3, 0x2bf5, 0x2bf7, 0x2bf9, 0x2bfb, 0x2bfd, 0x2bff, 0x2c01,
- 0x2c03, 0x2c05, 0x2c07, 0x2c09, 0x2c0b, 0x2c0d, 0x2c0f, 0x2c11,
- 0x2c13, 0x2c15, 0x2c17, 0x2c19, 0x2c1b, 0x2c1d, 0x2c1f, 0x2c21,
- 0x2c23, 0x2c25, 0x2c27, 0x2c29, 0x2c2b, 0x2c2d, 0x2c2f, 0x2c31,
- 0x2c33, 0x2c35, 0x2c37, 0x2c39, 0x2c3b, 0x2c3d, 0x2c3f, 0x2c41,
- 0x2c43, 0x2c45, 0x2c47, 0x2c49, 0x2c4b, 0x2c4d, 0x2c4f, 0x2c51,
- 0x2c53, 0x2c55, 0x2c57, 0x2c59, 0x2c5b, 0x2c5d, 0x2c5f, 0x2c61,
- 0x2c63, 0x2c65, 0x2c67, 0x2c69, 0x2c6b, 0x2c6d, 0x2c6f, 0x2c71,
- 0x2c73, 0x2c75, 0x2c77, 0x2c79, 0x2c7b, 0x2c7d, 0x2c7f, 0x2c81,
- 0x2c83, 0x2c85, 0x2c87, 0x2c89, 0x2c8b, 0x2c8d, 0x2c8f, 0x2c91,
- 0x2c93, 0x2c95, 0x2c97, 0x2c99, 0x2c9b, 0x2c9d, 0x2c9f, 0x2ca1,
- 0x2ca3, 0x2ca5, 0x2ca7, 0x2ca9, 0x2cab, 0x2cad, 0x2caf, 0x2cb1,
- 0x2cb3, 0x2cb5, 0x2cb7, 0x2cb9, 0x2cbb, 0x2cbd, 0x2cbf, 0x2cc1,
- 0x2cc3, 0x2cc5, 0x2cc7, 0x2cc9, 0x2ccb, 0x2ccd, 0x2ccf, 0x2cd1,
- 0x2cd3, 0x2cd5, 0x2cd7, 0x2cd9, 0x2cdb, 0x2cdd, 0x2cdf, 0x2ce1,
- 0x2ce3, 0x2ce5, 0x2ce7, 0x2ce9, 0x2ceb, 0x2ced, 0x2cef, 0x2cf1,
- 0x2cf3, 0x2cf5, 0x2cf7, 0x2cf9, 0x2cfb, 0x2cfd, 0x2cff, 0x2d01,
- 0x2d03, 0x2d05, 0x2d07, 0x2d09, 0x2d0b, 0x2d0d, 0x2d0f, 0x2d11,
- 0x2d13, 0x2d15, 0x2d17, 0x2d19, 0x2d1b, 0x2d1d, 0x2d1f, 0x2d21,
-
- 0x2d23, 0x2d25, 0x2d27, 0x2d29, 0x2d2b, 0x2d2d, 0x2d2f, 0x2d31,
- 0x2d33, 0x2d35, 0x2d37, 0x2d39, 0x2d3b, 0x2d3d, 0x2d3f, 0x2d41,
- 0x2d43, 0x2d45, 0x2d47, 0x2d49, 0x2d4b, 0x2d4d, 0x2d4f, 0x2d51,
- 0x2d53, 0x2d55, 0x2d57, 0x2d59, 0x2d5b, 0x2d5d, 0x2d5f, 0x2d61,
- 0x2d63, 0x2d65, 0x2d67, 0x2d69, 0x2d6b, 0x2d6d, 0x2d6f, 0x2d71,
- 0x2d73, 0x2d75, 0x2d77, 0x2d79, 0x2d7b, 0x2d7d, 0x2d7f, 0x2d81,
- 0x2d83, 0x2d85, 0x2d87, 0x2d89, 0x2d8b, 0x2d8d, 0x2d8f, 0x2d91,
- 0x2d93, 0x2d95, 0x2d97, 0x2d99, 0x2d9b, 0x2d9d, 0x2d9f, 0x2da1,
- 0x2da3, 0x2da5, 0x2da7, 0x2da9, 0x2dab, 0x2dad, 0x2daf, 0x2db1,
- 0x2db3, 0x2db5, 0x2db7, 0x2db9, 0x2dbb, 0x2dbd, 0x2dbf, 0x2dc1,
- 0x2dc3, 0x2dc5, 0x2dc7, 0x2dc9, 0x2dcb, 0x2dcd, 0x2dcf, 0x2dd1,
- 0x2dd3, 0x2dd5, 0x2dd7, 0x2dd9, 0x2ddb, 0x2ddd, 0x2ddf, 0x2de1,
- 0x2de3, 0x2de5, 0x2de7, 0x2de9, 0x2deb, 0x2ded, 0x2def, 0x2df1,
- 0x2df3, 0x2df5, 0x2df7, 0x2df9, 0x2dfb, 0x2dfd, 0x2dff, 0x2e01,
- 0x2e03, 0x2e05, 0x2e07, 0x2e09, 0x2e0b, 0x2e0d, 0x2e0f, 0x2e11,
- 0x2e13, 0x2e15, 0x2e17, 0x2e19, 0x2e1b, 0x2e1d, 0x2e1f, 0x2e21,
- 0x2e23, 0x2e25, 0x2e27, 0x2e29, 0x2e2b, 0x2e2d, 0x2e2f, 0x2e31,
- 0x2e33, 0x2e35, 0x2e37, 0x2e39, 0x2e3b, 0x2e3d, 0x2e3f, 0x2e41,
- 0x2e43, 0x2e45, 0x2e47, 0x2e49, 0x2e4b, 0x2e4d, 0x2e4f, 0x2e51,
- 0x2e53, 0x2e55, 0x2e57, 0x2e59, 0x2e5b, 0x2e5d, 0x2e5f, 0x2e61,
- 0x2e63, 0x2e65, 0x2e67, 0x2e69, 0x2e6b, 0x2e6d, 0xffff, 0xffff,
- 0x2e6f, 0x2e71, 0x2e73, 0x2e75, 0x2e77, 0x2e79, 0x2e7b, 0x2e7d,
- 0x2e7f, 0x2e81, 0x2e83, 0x2e85, 0x2e87, 0x2e89, 0x2e8b, 0x2e8d,
- 0x2e8f, 0x2e91, 0x2e93, 0x2e95, 0x2e97, 0x2e99, 0x2e9b, 0x2e9d,
- 0x2e9f, 0x2ea1, 0x2ea3, 0x2ea5, 0x2ea7, 0x2ea9, 0x2eab, 0x2ead,
- 0x2eaf, 0x2eb1, 0x2eb3, 0x2eb5, 0x2eb7, 0x2eb9, 0x2ebb, 0x2ebd,
- 0x2ebf, 0x2ec1, 0x2ec3, 0x2ec5, 0x2ec7, 0x2ec9, 0x2ecb, 0x2ecd,
- 0x2ecf, 0x2ed1, 0x2ed3, 0x2ed5, 0x2ed7, 0x2ed9, 0x2edb, 0x2edd,
- 0x2edf, 0x2ee1, 0x2ee3, 0x2ee5, 0x2ee7, 0x2ee9, 0x2eeb, 0x2eed,
- 0x2eef, 0x2ef1, 0x2ef3, 0x2ef5, 0x2ef7, 0x2ef9, 0x2efb, 0x2efd,
- 0x2eff, 0x2f01, 0x2f03, 0x2f05, 0x2f07, 0x2f09, 0x2f0b, 0x2f0d,
- 0x2f0f, 0x2f11, 0x2f13, 0x2f15, 0x2f17, 0x2f19, 0x2f1b, 0x2f1d,
-
- 0x2f1f, 0x2f21, 0x2f23, 0x2f25, 0x2f27, 0x2f29, 0x2f2b, 0x2f2d,
- 0x2f2f, 0x2f31, 0x2f33, 0x2f35, 0x2f37, 0x2f39, 0x2f3b, 0x2f3d,
- 0x2f3f, 0x2f41, 0x2f43, 0x2f45, 0x2f47, 0x2f49, 0x2f4b, 0x2f4d,
- 0x2f4f, 0x2f51, 0x2f53, 0x2f55, 0x2f57, 0x2f59, 0x2f5b, 0x2f5d,
- 0x2f5f, 0x2f61, 0x2f63, 0x2f65, 0x2f67, 0x2f69, 0x2f6b, 0x2f6d,
- 0x2f6f, 0x2f71, 0x2f73, 0x2f75, 0x2f77, 0x2f79, 0x2f7b, 0x2f7d,
- 0x2f7f, 0x2f81, 0x2f83, 0x2f85, 0x2f87, 0x2f89, 0x2f8b, 0x2f8d,
- 0x2f8f, 0x2f91, 0x2f93, 0x2f95, 0x2f97, 0x2f99, 0x2f9b, 0x2f9d,
- 0x2f9f, 0x2fa1, 0x2fa3, 0x2fa5, 0x2fa7, 0x2fa9, 0x2fab, 0x2fad,
- 0x2faf, 0x2fb1, 0x2fb3, 0x2fb5, 0x2fb7, 0x2fb9, 0x2fbb, 0x2fbd,
- 0x2fbf, 0x2fc1, 0x2fc3, 0x2fc5, 0x2fc7, 0x2fc9, 0x2fcb, 0x2fcd,
- 0x2fcf, 0x2fd1, 0x2fd3, 0x2fd5, 0x2fd7, 0x2fd9, 0x2fdb, 0x2fdd,
- 0x2fdf, 0x2fe1, 0x2fe3, 0x2fe5, 0x2fe7, 0x2fe9, 0x2feb, 0x2fed,
- 0x2fef, 0x2ff1, 0x2ff3, 0x2ff5, 0x2ff7, 0x2ff9, 0x2ffb, 0x2ffd,
- 0x2fff, 0x3001, 0x3003, 0x3005, 0x3007, 0x3009, 0x300b, 0x300d,
- 0x300f, 0x3011, 0x3013, 0x3015, 0x3017, 0x3019, 0x301b, 0x301d,
- 0x301f, 0x3021, 0x3023, 0x3025, 0x3027, 0x3029, 0x302b, 0x302d,
- 0x302f, 0x3031, 0x3033, 0x3035, 0x3037, 0x3039, 0x303b, 0x303d,
- 0x303f, 0x3041, 0x3043, 0x3045, 0x3047, 0x3049, 0x304b, 0x304d,
- 0x304f, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305b, 0x305d,
- 0x305f, 0x3061, 0x3063, 0x3065, 0x3067, 0x3069, 0x306b, 0x306d,
- 0x306f, 0x3071, 0x3073, 0x3075, 0x3077, 0x3079, 0x307b, 0x307d,
- 0x307f, 0x3081, 0x3083, 0x3085, 0x3087, 0x3089, 0x308b, 0x308d,
- 0x308f, 0x3091, 0x3093, 0x3095, 0x3097, 0x3099, 0x309b, 0x309d,
- 0x309f, 0x30a1, 0x30a3, 0x30a5, 0x30a7, 0x30a9, 0x30ab, 0x30ad,
- 0x30af, 0x30b1, 0x30b3, 0x30b5, 0xffff, 0xffff, 0x30b7, 0x30b9,
- 0x30bb, 0x30bd, 0x30bf, 0x30c1, 0x30c3, 0x30c5, 0x30c7, 0x30c9,
- 0x30cb, 0x30cd, 0x30cf, 0x30d1, 0x30d3, 0x30d5, 0x30d7, 0x30d9,
- 0x30db, 0x30dd, 0x30df, 0x30e1, 0x30e3, 0x30e5, 0x30e7, 0x30e9,
- 0x30eb, 0x30ed, 0x30ef, 0x30f1, 0x30f3, 0x30f5, 0x30f7, 0x30f9,
- 0x30fb, 0x30fd, 0x30ff, 0x3101, 0x3103, 0x3105, 0x3107, 0x3109,
- 0x310b, 0x310d, 0x310f, 0x3111, 0x3113, 0x3115, 0x3117, 0x3119,
+ 0x2b3e, 0x2b40, 0x2b42, 0x2b44, 0x2b46, 0x2b48, 0xffff, 0x2b4a,
+ 0x2b4c, 0x2b4e, 0x2b50, 0xffff, 0xffff, 0x2b52, 0x2b54, 0x2b56,
+ 0x2b58, 0x2b5a, 0x2b5c, 0x2b5e, 0x2b60, 0xffff, 0x2b62, 0x2b64,
+ 0x2b66, 0x2b68, 0x2b6a, 0x2b6c, 0x2b6e, 0xffff, 0x2b70, 0x2b72,
+ 0x2b74, 0x2b76, 0x2b78, 0x2b7a, 0x2b7c, 0x2b7e, 0x2b80, 0x2b82,
+ 0x2b84, 0x2b86, 0x2b88, 0x2b8a, 0x2b8c, 0x2b8e, 0x2b90, 0x2b92,
+ 0x2b94, 0x2b96, 0x2b98, 0x2b9a, 0x2b9c, 0x2b9e, 0x2ba0, 0x2ba2,
+ 0x2ba4, 0x2ba6, 0xffff, 0x2ba8, 0x2baa, 0x2bac, 0x2bae, 0xffff,
+ 0x2bb0, 0x2bb2, 0x2bb4, 0x2bb6, 0x2bb8, 0xffff, 0x2bba, 0xffff,
+ 0xffff, 0xffff, 0x2bbc, 0x2bbe, 0x2bc0, 0x2bc2, 0x2bc4, 0x2bc6,
+ 0x2bc8, 0xffff, 0x2bca, 0x2bcc, 0x2bce, 0x2bd0, 0x2bd2, 0x2bd4,
+ 0x2bd6, 0x2bd8, 0x2bda, 0x2bdc, 0x2bde, 0x2be0, 0x2be2, 0x2be4,
+ 0x2be6, 0x2be8, 0x2bea, 0x2bec, 0x2bee, 0x2bf0, 0x2bf2, 0x2bf4,
+ 0x2bf6, 0x2bf8, 0x2bfa, 0x2bfc, 0x2bfe, 0x2c00, 0x2c02, 0x2c04,
+ 0x2c06, 0x2c08, 0x2c0a, 0x2c0c, 0x2c0e, 0x2c10, 0x2c12, 0x2c14,
+ 0x2c16, 0x2c18, 0x2c1a, 0x2c1c, 0x2c1e, 0x2c20, 0x2c22, 0x2c24,
+ 0x2c26, 0x2c28, 0x2c2a, 0x2c2c, 0x2c2e, 0x2c30, 0x2c32, 0x2c34,
+ 0x2c36, 0x2c38, 0x2c3a, 0x2c3c, 0x2c3e, 0x2c40, 0x2c42, 0x2c44,
+ 0x2c46, 0x2c48, 0x2c4a, 0x2c4c, 0x2c4e, 0x2c50, 0x2c52, 0x2c54,
+ 0x2c56, 0x2c58, 0x2c5a, 0x2c5c, 0x2c5e, 0x2c60, 0x2c62, 0x2c64,
+ 0x2c66, 0x2c68, 0x2c6a, 0x2c6c, 0x2c6e, 0x2c70, 0x2c72, 0x2c74,
+ 0x2c76, 0x2c78, 0x2c7a, 0x2c7c, 0x2c7e, 0x2c80, 0x2c82, 0x2c84,
+ 0x2c86, 0x2c88, 0x2c8a, 0x2c8c, 0x2c8e, 0x2c90, 0x2c92, 0x2c94,
+ 0x2c96, 0x2c98, 0x2c9a, 0x2c9c, 0x2c9e, 0x2ca0, 0x2ca2, 0x2ca4,
+ 0x2ca6, 0x2ca8, 0x2caa, 0x2cac, 0x2cae, 0x2cb0, 0x2cb2, 0x2cb4,
+ 0x2cb6, 0x2cb8, 0x2cba, 0x2cbc, 0x2cbe, 0x2cc0, 0x2cc2, 0x2cc4,
+ 0x2cc6, 0x2cc8, 0x2cca, 0x2ccc, 0x2cce, 0x2cd0, 0x2cd2, 0x2cd4,
+ 0x2cd6, 0x2cd8, 0x2cda, 0x2cdc, 0x2cde, 0x2ce0, 0x2ce2, 0x2ce4,
+ 0x2ce6, 0x2ce8, 0x2cea, 0x2cec, 0x2cee, 0x2cf0, 0x2cf2, 0x2cf4,
+ 0x2cf6, 0x2cf8, 0x2cfa, 0x2cfc, 0x2cfe, 0x2d00, 0x2d02, 0x2d04,
+ 0x2d06, 0x2d08, 0x2d0a, 0x2d0c, 0x2d0e, 0x2d10, 0x2d12, 0x2d14,
+ 0x2d16, 0x2d18, 0x2d1a, 0x2d1c, 0x2d1e, 0x2d20, 0x2d22, 0x2d24,
+
+ 0x2d26, 0x2d28, 0x2d2a, 0x2d2c, 0x2d2e, 0x2d30, 0x2d32, 0x2d34,
+ 0x2d36, 0x2d38, 0x2d3a, 0x2d3c, 0x2d3e, 0x2d40, 0x2d42, 0x2d44,
+ 0x2d46, 0x2d48, 0x2d4a, 0x2d4c, 0x2d4e, 0x2d50, 0x2d52, 0x2d54,
+ 0x2d56, 0x2d58, 0x2d5a, 0x2d5c, 0x2d5e, 0x2d60, 0x2d62, 0x2d64,
+ 0x2d66, 0x2d68, 0x2d6a, 0x2d6c, 0x2d6e, 0x2d70, 0x2d72, 0x2d74,
+ 0x2d76, 0x2d78, 0x2d7a, 0x2d7c, 0x2d7e, 0x2d80, 0x2d82, 0x2d84,
+ 0x2d86, 0x2d88, 0x2d8a, 0x2d8c, 0x2d8e, 0x2d90, 0x2d92, 0x2d94,
+ 0x2d96, 0x2d98, 0x2d9a, 0x2d9c, 0x2d9e, 0x2da0, 0x2da2, 0x2da4,
+ 0x2da6, 0x2da8, 0x2daa, 0x2dac, 0x2dae, 0x2db0, 0x2db2, 0x2db4,
+ 0x2db6, 0x2db8, 0x2dba, 0x2dbc, 0x2dbe, 0x2dc0, 0x2dc2, 0x2dc4,
+ 0x2dc6, 0x2dc8, 0x2dca, 0x2dcc, 0x2dce, 0x2dd0, 0x2dd2, 0x2dd4,
+ 0x2dd6, 0x2dd8, 0x2dda, 0x2ddc, 0x2dde, 0x2de0, 0x2de2, 0x2de4,
+ 0x2de6, 0x2de8, 0x2dea, 0x2dec, 0x2dee, 0x2df0, 0x2df2, 0x2df4,
+ 0x2df6, 0x2df8, 0x2dfa, 0x2dfc, 0x2dfe, 0x2e00, 0x2e02, 0x2e04,
+ 0x2e06, 0x2e08, 0x2e0a, 0x2e0c, 0x2e0e, 0x2e10, 0x2e12, 0x2e14,
+ 0x2e16, 0x2e18, 0x2e1a, 0x2e1c, 0x2e1e, 0x2e20, 0x2e22, 0x2e24,
+ 0x2e26, 0x2e28, 0x2e2a, 0x2e2c, 0x2e2e, 0x2e30, 0x2e32, 0x2e34,
+ 0x2e36, 0x2e38, 0x2e3a, 0x2e3c, 0x2e3e, 0x2e40, 0x2e42, 0x2e44,
+ 0x2e46, 0x2e48, 0x2e4a, 0x2e4c, 0x2e4e, 0x2e50, 0x2e52, 0x2e54,
+ 0x2e56, 0x2e58, 0x2e5a, 0x2e5c, 0x2e5e, 0x2e60, 0x2e62, 0x2e64,
+ 0x2e66, 0x2e68, 0x2e6a, 0x2e6c, 0x2e6e, 0x2e70, 0xffff, 0xffff,
+ 0x2e72, 0x2e74, 0x2e76, 0x2e78, 0x2e7a, 0x2e7c, 0x2e7e, 0x2e80,
+ 0x2e82, 0x2e84, 0x2e86, 0x2e88, 0x2e8a, 0x2e8c, 0x2e8e, 0x2e90,
+ 0x2e92, 0x2e94, 0x2e96, 0x2e98, 0x2e9a, 0x2e9c, 0x2e9e, 0x2ea0,
+ 0x2ea2, 0x2ea4, 0x2ea6, 0x2ea8, 0x2eaa, 0x2eac, 0x2eae, 0x2eb0,
+ 0x2eb2, 0x2eb4, 0x2eb6, 0x2eb8, 0x2eba, 0x2ebc, 0x2ebe, 0x2ec0,
+ 0x2ec2, 0x2ec4, 0x2ec6, 0x2ec8, 0x2eca, 0x2ecc, 0x2ece, 0x2ed0,
+ 0x2ed2, 0x2ed4, 0x2ed6, 0x2ed8, 0x2eda, 0x2edc, 0x2ede, 0x2ee0,
+ 0x2ee2, 0x2ee4, 0x2ee6, 0x2ee8, 0x2eea, 0x2eec, 0x2eee, 0x2ef0,
+ 0x2ef2, 0x2ef4, 0x2ef6, 0x2ef8, 0x2efa, 0x2efc, 0x2efe, 0x2f00,
+ 0x2f02, 0x2f04, 0x2f06, 0x2f08, 0x2f0a, 0x2f0c, 0x2f0e, 0x2f10,
+ 0x2f12, 0x2f14, 0x2f16, 0x2f18, 0x2f1a, 0x2f1c, 0x2f1e, 0x2f20,
+
+ 0x2f22, 0x2f24, 0x2f26, 0x2f28, 0x2f2a, 0x2f2c, 0x2f2e, 0x2f30,
+ 0x2f32, 0x2f34, 0x2f36, 0x2f38, 0x2f3a, 0x2f3c, 0x2f3e, 0x2f40,
+ 0x2f42, 0x2f44, 0x2f46, 0x2f48, 0x2f4a, 0x2f4c, 0x2f4e, 0x2f50,
+ 0x2f52, 0x2f54, 0x2f56, 0x2f58, 0x2f5a, 0x2f5c, 0x2f5e, 0x2f60,
+ 0x2f62, 0x2f64, 0x2f66, 0x2f68, 0x2f6a, 0x2f6c, 0x2f6e, 0x2f70,
+ 0x2f72, 0x2f74, 0x2f76, 0x2f78, 0x2f7a, 0x2f7c, 0x2f7e, 0x2f80,
+ 0x2f82, 0x2f84, 0x2f86, 0x2f88, 0x2f8a, 0x2f8c, 0x2f8e, 0x2f90,
+ 0x2f92, 0x2f94, 0x2f96, 0x2f98, 0x2f9a, 0x2f9c, 0x2f9e, 0x2fa0,
+ 0x2fa2, 0x2fa4, 0x2fa6, 0x2fa8, 0x2faa, 0x2fac, 0x2fae, 0x2fb0,
+ 0x2fb2, 0x2fb4, 0x2fb6, 0x2fb8, 0x2fba, 0x2fbc, 0x2fbe, 0x2fc0,
+ 0x2fc2, 0x2fc4, 0x2fc6, 0x2fc8, 0x2fca, 0x2fcc, 0x2fce, 0x2fd0,
+ 0x2fd2, 0x2fd4, 0x2fd6, 0x2fd8, 0x2fda, 0x2fdc, 0x2fde, 0x2fe0,
+ 0x2fe2, 0x2fe4, 0x2fe6, 0x2fe8, 0x2fea, 0x2fec, 0x2fee, 0x2ff0,
+ 0x2ff2, 0x2ff4, 0x2ff6, 0x2ff8, 0x2ffa, 0x2ffc, 0x2ffe, 0x3000,
+ 0x3002, 0x3004, 0x3006, 0x3008, 0x300a, 0x300c, 0x300e, 0x3010,
+ 0x3012, 0x3014, 0x3016, 0x3018, 0x301a, 0x301c, 0x301e, 0x3020,
+ 0x3022, 0x3024, 0x3026, 0x3028, 0x302a, 0x302c, 0x302e, 0x3030,
+ 0x3032, 0x3034, 0x3036, 0x3038, 0x303a, 0x303c, 0x303e, 0x3040,
+ 0x3042, 0x3044, 0x3046, 0x3048, 0x304a, 0x304c, 0x304e, 0x3050,
+ 0x3052, 0x3054, 0x3056, 0x3058, 0x305a, 0x305c, 0x305e, 0x3060,
+ 0x3062, 0x3064, 0x3066, 0x3068, 0x306a, 0x306c, 0x306e, 0x3070,
+ 0x3072, 0x3074, 0x3076, 0x3078, 0x307a, 0x307c, 0x307e, 0x3080,
+ 0x3082, 0x3084, 0x3086, 0x3088, 0x308a, 0x308c, 0x308e, 0x3090,
+ 0x3092, 0x3094, 0x3096, 0x3098, 0x309a, 0x309c, 0x309e, 0x30a0,
+ 0x30a2, 0x30a4, 0x30a6, 0x30a8, 0x30aa, 0x30ac, 0x30ae, 0x30b0,
+ 0x30b2, 0x30b4, 0x30b6, 0x30b8, 0xffff, 0xffff, 0x30ba, 0x30bc,
+ 0x30be, 0x30c0, 0x30c2, 0x30c4, 0x30c6, 0x30c8, 0x30ca, 0x30cc,
+ 0x30ce, 0x30d0, 0x30d2, 0x30d4, 0x30d6, 0x30d8, 0x30da, 0x30dc,
+ 0x30de, 0x30e0, 0x30e2, 0x30e4, 0x30e6, 0x30e8, 0x30ea, 0x30ec,
+ 0x30ee, 0x30f0, 0x30f2, 0x30f4, 0x30f6, 0x30f8, 0x30fa, 0x30fc,
+ 0x30fe, 0x3100, 0x3102, 0x3104, 0x3106, 0x3108, 0x310a, 0x310c,
+ 0x310e, 0x3110, 0x3112, 0x3114, 0x3116, 0x3118, 0x311a, 0x311c,
- 0x311b, 0x311d, 0x311f, 0x3121, 0xffff, 0x3123, 0x3125, 0x3127,
- 0x3129, 0x312b, 0x312d, 0x312f, 0x3131, 0x3133, 0x3135, 0x3137,
- 0x3139, 0x313b, 0x313d, 0x313f, 0x3141, 0x3143, 0x3145, 0x3147,
- 0x3149, 0x314b, 0x314d, 0x314f, 0x3151, 0x3153, 0x3155, 0x3157,
- 0xffff, 0x3159, 0x315b, 0xffff, 0x315d, 0xffff, 0xffff, 0x315f,
- 0xffff, 0x3161, 0x3163, 0x3165, 0x3167, 0x3169, 0x316b, 0x316d,
- 0x316f, 0x3171, 0x3173, 0xffff, 0x3175, 0x3177, 0x3179, 0x317b,
- 0xffff, 0x317d, 0xffff, 0x317f, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x3181, 0xffff, 0xffff, 0xffff, 0xffff, 0x3183,
- 0xffff, 0x3185, 0xffff, 0x3187, 0xffff, 0x3189, 0x318b, 0x318d,
- 0xffff, 0x318f, 0x3191, 0xffff, 0x3193, 0xffff, 0xffff, 0x3195,
- 0xffff, 0x3197, 0xffff, 0x3199, 0xffff, 0x319b, 0xffff, 0x319d,
- 0xffff, 0x319f, 0x31a1, 0xffff, 0x31a3, 0xffff, 0xffff, 0x31a5,
- 0x31a7, 0x31a9, 0x31ab, 0xffff, 0x31ad, 0x31af, 0x31b1, 0x31b3,
- 0x31b5, 0x31b7, 0x31b9, 0xffff, 0x31bb, 0x31bd, 0x31bf, 0x31c1,
- 0xffff, 0x31c3, 0x31c5, 0x31c7, 0x31c9, 0xffff, 0x31cb, 0xffff,
- 0x31cd, 0x31cf, 0x31d1, 0x31d3, 0x31d5, 0x31d7, 0x31d9, 0x31db,
- 0x31dd, 0x31df, 0xffff, 0x31e1, 0x31e3, 0x31e5, 0x31e7, 0x31e9,
- 0x31eb, 0x31ed, 0x31ef, 0x31f1, 0x31f3, 0x31f5, 0x31f7, 0x31f9,
- 0x31fb, 0x31fd, 0x31ff, 0x3201, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x3203, 0x3205, 0x3207, 0xffff, 0x3209, 0x320b, 0x320d,
- 0x320f, 0x3211, 0xffff, 0x3213, 0x3215, 0x3217, 0x3219, 0x321b,
- 0x321d, 0x321f, 0x3221, 0x3223, 0x3225, 0x3227, 0x3229, 0x322b,
- 0x322d, 0x322f, 0x3231, 0x3233, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x311e, 0x3120, 0x3122, 0x3124, 0xffff, 0x3126, 0x3128, 0x312a,
+ 0x312c, 0x312e, 0x3130, 0x3132, 0x3134, 0x3136, 0x3138, 0x313a,
+ 0x313c, 0x313e, 0x3140, 0x3142, 0x3144, 0x3146, 0x3148, 0x314a,
+ 0x314c, 0x314e, 0x3150, 0x3152, 0x3154, 0x3156, 0x3158, 0x315a,
+ 0xffff, 0x315c, 0x315e, 0xffff, 0x3160, 0xffff, 0xffff, 0x3162,
+ 0xffff, 0x3164, 0x3166, 0x3168, 0x316a, 0x316c, 0x316e, 0x3170,
+ 0x3172, 0x3174, 0x3176, 0xffff, 0x3178, 0x317a, 0x317c, 0x317e,
+ 0xffff, 0x3180, 0xffff, 0x3182, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0x3184, 0xffff, 0xffff, 0xffff, 0xffff, 0x3186,
+ 0xffff, 0x3188, 0xffff, 0x318a, 0xffff, 0x318c, 0x318e, 0x3190,
+ 0xffff, 0x3192, 0x3194, 0xffff, 0x3196, 0xffff, 0xffff, 0x3198,
+ 0xffff, 0x319a, 0xffff, 0x319c, 0xffff, 0x319e, 0xffff, 0x31a0,
+ 0xffff, 0x31a2, 0x31a4, 0xffff, 0x31a6, 0xffff, 0xffff, 0x31a8,
+ 0x31aa, 0x31ac, 0x31ae, 0xffff, 0x31b0, 0x31b2, 0x31b4, 0x31b6,
+ 0x31b8, 0x31ba, 0x31bc, 0xffff, 0x31be, 0x31c0, 0x31c2, 0x31c4,
+ 0xffff, 0x31c6, 0x31c8, 0x31ca, 0x31cc, 0xffff, 0x31ce, 0xffff,
+ 0x31d0, 0x31d2, 0x31d4, 0x31d6, 0x31d8, 0x31da, 0x31dc, 0x31de,
+ 0x31e0, 0x31e2, 0xffff, 0x31e4, 0x31e6, 0x31e8, 0x31ea, 0x31ec,
+ 0x31ee, 0x31f0, 0x31f2, 0x31f4, 0x31f6, 0x31f8, 0x31fa, 0x31fc,
+ 0x31fe, 0x3200, 0x3202, 0x3204, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0x3206, 0x3208, 0x320a, 0xffff, 0x320c, 0x320e, 0x3210,
+ 0x3212, 0x3214, 0xffff, 0x3216, 0x3218, 0x321a, 0x321c, 0x321e,
+ 0x3220, 0x3222, 0x3224, 0x3226, 0x3228, 0x322a, 0x322c, 0x322e,
+ 0x3230, 0x3232, 0x3234, 0x3236, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10796,25 +11304,25 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3235, 0x3238, 0x323b, 0x323e, 0x3241, 0x3244, 0x3247, 0x324a,
- 0x324d, 0x3250, 0x3253, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3256, 0x325a, 0x325e, 0x3262, 0x3266, 0x326a, 0x326e, 0x3272,
- 0x3276, 0x327a, 0x327e, 0x3282, 0x3286, 0x328a, 0x328e, 0x3292,
- 0x3296, 0x329a, 0x329e, 0x32a2, 0x32a6, 0x32aa, 0x32ae, 0x32b2,
- 0x32b6, 0x32ba, 0x32be, 0x32c2, 0x32c4, 0x32c6, 0x32c9, 0xffff,
- 0x32cc, 0x32ce, 0x32d0, 0x32d2, 0x32d4, 0x32d6, 0x32d8, 0x32da,
- 0x32dc, 0x32de, 0x32e0, 0x32e2, 0x32e4, 0x32e6, 0x32e8, 0x32ea,
- 0x32ec, 0x32ee, 0x32f0, 0x32f2, 0x32f4, 0x32f6, 0x32f8, 0x32fa,
- 0x32fc, 0x32fe, 0x3300, 0x3303, 0x3306, 0x3309, 0x330c, 0x3310,
+ 0x3238, 0x323b, 0x323e, 0x3241, 0x3244, 0x3247, 0x324a, 0x324d,
+ 0x3250, 0x3253, 0x3256, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x3259, 0x325d, 0x3261, 0x3265, 0x3269, 0x326d, 0x3271, 0x3275,
+ 0x3279, 0x327d, 0x3281, 0x3285, 0x3289, 0x328d, 0x3291, 0x3295,
+ 0x3299, 0x329d, 0x32a1, 0x32a5, 0x32a9, 0x32ad, 0x32b1, 0x32b5,
+ 0x32b9, 0x32bd, 0x32c1, 0x32c5, 0x32c7, 0x32c9, 0x32cc, 0xffff,
+ 0x32cf, 0x32d1, 0x32d3, 0x32d5, 0x32d7, 0x32d9, 0x32db, 0x32dd,
+ 0x32df, 0x32e1, 0x32e3, 0x32e5, 0x32e7, 0x32e9, 0x32eb, 0x32ed,
+ 0x32ef, 0x32f1, 0x32f3, 0x32f5, 0x32f7, 0x32f9, 0x32fb, 0x32fd,
+ 0x32ff, 0x3301, 0x3303, 0x3306, 0x3309, 0x330c, 0x330f, 0x3313,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x3313, 0x3316, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0x3316, 0x3319, 0x331c, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3319, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x331f, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10829,17 +11337,17 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x331c, 0x331f, 0x3322, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x3322, 0x3325, 0x3328, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3324, 0x3326, 0x3328, 0x332a, 0x332c, 0x332e, 0x3330, 0x3332,
- 0x3334, 0x3336, 0x3338, 0x333a, 0x333c, 0x333e, 0x3340, 0x3342,
- 0x3344, 0x3346, 0x3348, 0x334a, 0x334c, 0x334e, 0x3350, 0x3352,
- 0x3354, 0x3356, 0x3358, 0x335a, 0x335c, 0x335e, 0x3360, 0x3362,
- 0x3364, 0x3366, 0x3368, 0x336a, 0x336c, 0x336e, 0x3370, 0x3372,
- 0x3374, 0x3376, 0x3378, 0x337a, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x337c, 0x3380, 0x3384, 0x3388, 0x338c, 0x3390, 0x3394, 0x3398,
- 0x339c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x33a0, 0x33a2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x332a, 0x332c, 0x332e, 0x3330, 0x3332, 0x3334, 0x3336, 0x3338,
+ 0x333a, 0x333c, 0x333e, 0x3340, 0x3342, 0x3344, 0x3346, 0x3348,
+ 0x334a, 0x334c, 0x334e, 0x3350, 0x3352, 0x3354, 0x3356, 0x3358,
+ 0x335a, 0x335c, 0x335e, 0x3360, 0x3362, 0x3364, 0x3366, 0x3368,
+ 0x336a, 0x336c, 0x336e, 0x3370, 0x3372, 0x3374, 0x3376, 0x3378,
+ 0x337a, 0x337c, 0x337e, 0x3380, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x3382, 0x3386, 0x338a, 0x338e, 0x3392, 0x3396, 0x339a, 0x339e,
+ 0x33a2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x33a6, 0x33a8, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -10862,76 +11370,76 @@ static const unsigned short uc_decomposition_trie[] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x33a4, 0x33a6, 0x33a8, 0x33aa, 0x33ad, 0x33af, 0x33b1, 0x33b3,
- 0x33b5, 0x33b7, 0x33b9, 0x33bb, 0x33bd, 0x33bf, 0x33c2, 0x33c4,
- 0x33c6, 0x33c8, 0x33ca, 0x33cd, 0x33cf, 0x33d1, 0x33d3, 0x33d6,
- 0x33d8, 0x33da, 0x33dc, 0x33de, 0x33e0, 0x33e3, 0x33e5, 0x33e7,
- 0x33e9, 0x33eb, 0x33ed, 0x33ef, 0x33f1, 0x33f3, 0x33f5, 0x33f7,
- 0x33f9, 0x33fb, 0x33fd, 0x33ff, 0x3401, 0x3403, 0x3405, 0x3407,
- 0x3409, 0x340b, 0x340d, 0x340f, 0x3411, 0x3414, 0x3416, 0x3418,
- 0x341a, 0x341d, 0x341f, 0x3421, 0x3423, 0x3425, 0x3427, 0x3429,
- 0x342b, 0x342d, 0x342f, 0x3431, 0x3433, 0x3435, 0x3437, 0x3439,
- 0x343b, 0x343d, 0x343f, 0x3441, 0x3443, 0x3445, 0x3447, 0x3449,
- 0x344b, 0x344d, 0x344f, 0x3451, 0x3453, 0x3455, 0x3457, 0x3459,
- 0x345b, 0x345d, 0x3460, 0x3462, 0x3464, 0x3466, 0x3468, 0x346a,
- 0x346c, 0x346f, 0x3472, 0x3474, 0x3476, 0x3478, 0x347a, 0x347c,
- 0x347e, 0x3480, 0x3482, 0x3484, 0x3486, 0x3489, 0x348b, 0x348d,
- 0x348f, 0x3491, 0x3494, 0x3496, 0x3498, 0x349a, 0x349c, 0x349e,
- 0x34a0, 0x34a2, 0x34a4, 0x34a6, 0x34a9, 0x34ab, 0x34ae, 0x34b0,
- 0x34b2, 0x34b4, 0x34b6, 0x34b8, 0x34ba, 0x34bc, 0x34be, 0x34c0,
- 0x34c2, 0x34c4, 0x34c7, 0x34c9, 0x34cb, 0x34cd, 0x34cf, 0x34d1,
- 0x34d4, 0x34d6, 0x34d9, 0x34dc, 0x34de, 0x34e0, 0x34e2, 0x34e4,
- 0x34e7, 0x34ea, 0x34ec, 0x34ee, 0x34f0, 0x34f2, 0x34f4, 0x34f6,
- 0x34f8, 0x34fa, 0x34fc, 0x34fe, 0x3500, 0x3503, 0x3505, 0x3507,
- 0x3509, 0x350b, 0x350d, 0x350f, 0x3511, 0x3513, 0x3515, 0x3517,
- 0x3519, 0x351b, 0x351d, 0x351f, 0x3521, 0x3523, 0x3525, 0x3527,
- 0x3529, 0x352c, 0x352e, 0x3530, 0x3532, 0x3534, 0x3536, 0x3539,
- 0x353b, 0x353d, 0x353f, 0x3541, 0x3543, 0x3545, 0x3547, 0x3549,
- 0x354b, 0x354d, 0x354f, 0x3552, 0x3554, 0x3556, 0x3558, 0x355a,
- 0x355c, 0x355e, 0x3560, 0x3562, 0x3564, 0x3566, 0x3568, 0x356a,
- 0x356c, 0x356e, 0x3570, 0x3572, 0x3574, 0x3576, 0x3579, 0x357b,
- 0x357d, 0x357f, 0x3581, 0x3583, 0x3586, 0x3588, 0x358a, 0x358c,
- 0x358e, 0x3590, 0x3592, 0x3594, 0x3596, 0x3599, 0x359b, 0x359d,
- 0x359f, 0x35a2, 0x35a4, 0x35a6, 0x35a8, 0x35aa, 0x35ac, 0x35ae,
- 0x35b1, 0x35b4, 0x35b7, 0x35b9, 0x35bc, 0x35be, 0x35c0, 0x35c2,
+ 0x33aa, 0x33ac, 0x33ae, 0x33b0, 0x33b3, 0x33b5, 0x33b7, 0x33b9,
+ 0x33bb, 0x33bd, 0x33bf, 0x33c1, 0x33c3, 0x33c5, 0x33c8, 0x33ca,
+ 0x33cc, 0x33ce, 0x33d0, 0x33d3, 0x33d5, 0x33d7, 0x33d9, 0x33dc,
+ 0x33de, 0x33e0, 0x33e2, 0x33e4, 0x33e6, 0x33e9, 0x33eb, 0x33ed,
+ 0x33ef, 0x33f1, 0x33f3, 0x33f5, 0x33f7, 0x33f9, 0x33fb, 0x33fd,
+ 0x33ff, 0x3401, 0x3403, 0x3405, 0x3407, 0x3409, 0x340b, 0x340d,
+ 0x340f, 0x3411, 0x3413, 0x3415, 0x3417, 0x341a, 0x341c, 0x341e,
+ 0x3420, 0x3423, 0x3425, 0x3427, 0x3429, 0x342b, 0x342d, 0x342f,
+ 0x3431, 0x3433, 0x3435, 0x3437, 0x3439, 0x343b, 0x343d, 0x343f,
+ 0x3441, 0x3443, 0x3445, 0x3447, 0x3449, 0x344b, 0x344d, 0x344f,
+ 0x3451, 0x3453, 0x3455, 0x3457, 0x3459, 0x345b, 0x345d, 0x345f,
+ 0x3461, 0x3463, 0x3466, 0x3468, 0x346a, 0x346c, 0x346e, 0x3470,
+ 0x3472, 0x3475, 0x3478, 0x347a, 0x347c, 0x347e, 0x3480, 0x3482,
+ 0x3484, 0x3486, 0x3488, 0x348a, 0x348c, 0x348f, 0x3491, 0x3493,
+ 0x3495, 0x3497, 0x349a, 0x349c, 0x349e, 0x34a0, 0x34a2, 0x34a4,
+ 0x34a6, 0x34a8, 0x34aa, 0x34ac, 0x34af, 0x34b1, 0x34b4, 0x34b6,
+ 0x34b8, 0x34ba, 0x34bc, 0x34be, 0x34c0, 0x34c2, 0x34c4, 0x34c6,
+ 0x34c8, 0x34ca, 0x34cd, 0x34cf, 0x34d1, 0x34d3, 0x34d5, 0x34d7,
+ 0x34da, 0x34dc, 0x34df, 0x34e2, 0x34e4, 0x34e6, 0x34e8, 0x34ea,
+ 0x34ed, 0x34f0, 0x34f2, 0x34f4, 0x34f6, 0x34f8, 0x34fa, 0x34fc,
+ 0x34fe, 0x3500, 0x3502, 0x3504, 0x3506, 0x3509, 0x350b, 0x350d,
+ 0x350f, 0x3511, 0x3513, 0x3515, 0x3517, 0x3519, 0x351b, 0x351d,
+ 0x351f, 0x3521, 0x3523, 0x3525, 0x3527, 0x3529, 0x352b, 0x352d,
+ 0x352f, 0x3532, 0x3534, 0x3536, 0x3538, 0x353a, 0x353c, 0x353f,
+ 0x3541, 0x3543, 0x3545, 0x3547, 0x3549, 0x354b, 0x354d, 0x354f,
+ 0x3551, 0x3553, 0x3555, 0x3558, 0x355a, 0x355c, 0x355e, 0x3560,
+ 0x3562, 0x3564, 0x3566, 0x3568, 0x356a, 0x356c, 0x356e, 0x3570,
+ 0x3572, 0x3574, 0x3576, 0x3578, 0x357a, 0x357c, 0x357f, 0x3581,
+ 0x3583, 0x3585, 0x3587, 0x3589, 0x358c, 0x358e, 0x3590, 0x3592,
+ 0x3594, 0x3596, 0x3598, 0x359a, 0x359c, 0x359f, 0x35a1, 0x35a3,
+ 0x35a5, 0x35a8, 0x35aa, 0x35ac, 0x35ae, 0x35b0, 0x35b2, 0x35b4,
+ 0x35b7, 0x35ba, 0x35bd, 0x35bf, 0x35c2, 0x35c4, 0x35c6, 0x35c8,
- 0x35c4, 0x35c6, 0x35c8, 0x35ca, 0x35cc, 0x35ce, 0x35d0, 0x35d3,
- 0x35d5, 0x35d7, 0x35d9, 0x35db, 0x35dd, 0x35df, 0x35e2, 0x35e4,
- 0x35e6, 0x35e9, 0x35ec, 0x35ee, 0x35f0, 0x35f2, 0x35f4, 0x35f6,
- 0x35f8, 0x35fa, 0x35fc, 0x35fe, 0x3601, 0x3603, 0x3606, 0x3608,
- 0x360b, 0x360d, 0x360f, 0x3611, 0x3614, 0x3616, 0x3618, 0x361b,
- 0x361e, 0x3620, 0x3622, 0x3624, 0x3626, 0x3628, 0x362a, 0x362c,
- 0x362e, 0x3630, 0x3632, 0x3634, 0x3636, 0x3638, 0x363b, 0x363d,
- 0x3640, 0x3642, 0x3645, 0x3647, 0x364a, 0x364d, 0x3650, 0x3652,
- 0x3654, 0x3656, 0x3659, 0x365c, 0x365f, 0x3662, 0x3664, 0x3666,
- 0x3668, 0x366a, 0x366c, 0x366e, 0x3670, 0x3672, 0x3675, 0x3677,
- 0x3679, 0x367b, 0x367d, 0x3680, 0x3682, 0x3685, 0x3688, 0x368a,
- 0x368c, 0x368e, 0x3690, 0x3692, 0x3694, 0x3697, 0x369a, 0x369d,
- 0x369f, 0x36a1, 0x36a4, 0x36a6, 0x36a8, 0x36aa, 0x36ad, 0x36af,
- 0x36b1, 0x36b3, 0x36b5, 0x36b7, 0x36ba, 0x36bc, 0x36be, 0x36c0,
- 0x36c2, 0x36c4, 0x36c6, 0x36c9, 0x36cc, 0x36ce, 0x36d1, 0x36d3,
- 0x36d6, 0x36d8, 0x36da, 0x36dc, 0x36df, 0x36e2, 0x36e4, 0x36e7,
- 0x36e9, 0x36ec, 0x36ee, 0x36f0, 0x36f2, 0x36f4, 0x36f6, 0x36f8,
- 0x36fb, 0x36fe, 0x3701, 0x3704, 0x3706, 0x3708, 0x370a, 0x370c,
- 0x370e, 0x3710, 0x3712, 0x3714, 0x3716, 0x3718, 0x371a, 0x371c,
- 0x371f, 0x3721, 0x3723, 0x3725, 0x3727, 0x3729, 0x372b, 0x372d,
- 0x372f, 0x3731, 0x3733, 0x3735, 0x3737, 0x373a, 0x373d, 0x3740,
- 0x3742, 0x3744, 0x3746, 0x3748, 0x374b, 0x374d, 0x3750, 0x3752,
- 0x3754, 0x3757, 0x375a, 0x375c, 0x375e, 0x3760, 0x3762, 0x3764,
- 0x3766, 0x3768, 0x376a, 0x376c, 0x376e, 0x3770, 0x3772, 0x3774,
- 0x3776, 0x3778, 0x377a, 0x377c, 0x377e, 0x3780, 0x3783, 0x3785,
- 0x3787, 0x3789, 0x378b, 0x378d, 0x3790, 0x3793, 0x3795, 0x3797,
- 0x3799, 0x379b, 0x379d, 0x379f, 0x37a2, 0x37a4, 0x37a6, 0x37a8,
- 0x37aa, 0x37ad, 0x37b0, 0x37b2, 0x37b4, 0x37b6, 0x37b9, 0x37bb,
- 0x37bd, 0x37c0, 0x37c3, 0x37c5, 0x37c7, 0x37c9, 0x37cc, 0x37ce,
- 0x37d0, 0x37d2, 0x37d4, 0x37d6, 0x37d8, 0x37da, 0x37dd, 0x37df,
- 0x37e1, 0x37e3, 0x37e6, 0x37e8, 0x37ea, 0x37ec, 0x37ee, 0x37f1,
- 0x37f4, 0x37f6, 0x37f8, 0x37fa, 0x37fd, 0x37ff, 0x3802, 0x3804,
+ 0x35ca, 0x35cc, 0x35ce, 0x35d0, 0x35d2, 0x35d4, 0x35d6, 0x35d9,
+ 0x35db, 0x35dd, 0x35df, 0x35e1, 0x35e3, 0x35e5, 0x35e8, 0x35ea,
+ 0x35ec, 0x35ef, 0x35f2, 0x35f4, 0x35f6, 0x35f8, 0x35fa, 0x35fc,
+ 0x35fe, 0x3600, 0x3602, 0x3604, 0x3607, 0x3609, 0x360c, 0x360e,
+ 0x3611, 0x3613, 0x3615, 0x3617, 0x361a, 0x361c, 0x361e, 0x3621,
+ 0x3624, 0x3626, 0x3628, 0x362a, 0x362c, 0x362e, 0x3630, 0x3632,
+ 0x3634, 0x3636, 0x3638, 0x363a, 0x363c, 0x363e, 0x3641, 0x3643,
+ 0x3646, 0x3648, 0x364b, 0x364d, 0x3650, 0x3653, 0x3656, 0x3658,
+ 0x365a, 0x365c, 0x365f, 0x3662, 0x3665, 0x3668, 0x366a, 0x366c,
+ 0x366e, 0x3670, 0x3672, 0x3674, 0x3676, 0x3678, 0x367b, 0x367d,
+ 0x367f, 0x3681, 0x3683, 0x3686, 0x3688, 0x368b, 0x368e, 0x3690,
+ 0x3692, 0x3694, 0x3696, 0x3698, 0x369a, 0x369d, 0x36a0, 0x36a3,
+ 0x36a5, 0x36a7, 0x36aa, 0x36ac, 0x36ae, 0x36b0, 0x36b3, 0x36b5,
+ 0x36b7, 0x36b9, 0x36bb, 0x36bd, 0x36c0, 0x36c2, 0x36c4, 0x36c6,
+ 0x36c8, 0x36ca, 0x36cc, 0x36cf, 0x36d2, 0x36d4, 0x36d7, 0x36d9,
+ 0x36dc, 0x36de, 0x36e0, 0x36e2, 0x36e5, 0x36e8, 0x36ea, 0x36ed,
+ 0x36ef, 0x36f2, 0x36f4, 0x36f6, 0x36f8, 0x36fa, 0x36fc, 0x36fe,
+ 0x3701, 0x3704, 0x3707, 0x370a, 0x370c, 0x370e, 0x3710, 0x3712,
+ 0x3714, 0x3716, 0x3718, 0x371a, 0x371c, 0x371e, 0x3720, 0x3722,
+ 0x3725, 0x3727, 0x3729, 0x372b, 0x372d, 0x372f, 0x3731, 0x3733,
+ 0x3735, 0x3737, 0x3739, 0x373b, 0x373d, 0x3740, 0x3743, 0x3746,
+ 0x3748, 0x374a, 0x374c, 0x374e, 0x3751, 0x3753, 0x3756, 0x3758,
+ 0x375a, 0x375d, 0x3760, 0x3762, 0x3764, 0x3766, 0x3768, 0x376a,
+ 0x376c, 0x376e, 0x3770, 0x3772, 0x3774, 0x3776, 0x3778, 0x377a,
+ 0x377c, 0x377e, 0x3780, 0x3782, 0x3784, 0x3786, 0x3789, 0x378b,
+ 0x378d, 0x378f, 0x3791, 0x3793, 0x3796, 0x3799, 0x379b, 0x379d,
+ 0x379f, 0x37a1, 0x37a3, 0x37a5, 0x37a8, 0x37aa, 0x37ac, 0x37ae,
+ 0x37b0, 0x37b3, 0x37b6, 0x37b8, 0x37ba, 0x37bc, 0x37bf, 0x37c1,
+ 0x37c3, 0x37c6, 0x37c9, 0x37cb, 0x37cd, 0x37cf, 0x37d2, 0x37d4,
+ 0x37d6, 0x37d8, 0x37da, 0x37dc, 0x37de, 0x37e0, 0x37e3, 0x37e5,
+ 0x37e7, 0x37e9, 0x37ec, 0x37ee, 0x37f0, 0x37f2, 0x37f4, 0x37f7,
+ 0x37fa, 0x37fc, 0x37fe, 0x3800, 0x3803, 0x3805, 0x3808, 0x380a,
- 0x3806, 0x3808, 0x380b, 0x380d, 0x380f, 0x3811, 0x3813, 0x3815,
- 0x3817, 0x3819, 0x381c, 0x381e, 0x3820, 0x3822, 0x3824, 0x3826,
- 0x3828, 0x382b, 0x382d, 0x3830, 0x3833, 0x3836, 0x3838, 0x383a,
- 0x383c, 0x383e, 0x3840, 0x3842, 0x3844, 0x3846, 0xffff, 0xffff,
+ 0x380c, 0x380e, 0x3811, 0x3813, 0x3815, 0x3817, 0x3819, 0x381b,
+ 0x381d, 0x381f, 0x3822, 0x3824, 0x3826, 0x3828, 0x382a, 0x382c,
+ 0x382e, 0x3831, 0x3833, 0x3836, 0x3839, 0x383c, 0x383e, 0x3840,
+ 0x3842, 0x3844, 0x3846, 0x3848, 0x384a, 0x384c, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
@@ -11678,1100 +12186,1100 @@ static const unsigned short uc_decomposition_map[] = {
0x30e1, 0x108, 0x30e2, 0x108, 0x30e4, 0x108, 0x30e6, 0x108,
0x30e8, 0x108, 0x30e9, 0x108, 0x30ea, 0x108, 0x30eb, 0x108,
0x30ec, 0x108, 0x30ed, 0x108, 0x30ef, 0x108, 0x30f0, 0x108,
- 0x30f1, 0x108, 0x30f2, 0x40f, 0x30a2, 0x30d1, 0x30fc, 0x30c8,
- 0x40f, 0x30a2, 0x30eb, 0x30d5, 0x30a1, 0x40f, 0x30a2, 0x30f3,
- 0x30da, 0x30a2, 0x30f, 0x30a2, 0x30fc, 0x30eb, 0x40f, 0x30a4,
- 0x30cb, 0x30f3, 0x30b0, 0x30f, 0x30a4, 0x30f3, 0x30c1, 0x30f,
- 0x30a6, 0x30a9, 0x30f3, 0x50f, 0x30a8, 0x30b9, 0x30af, 0x30fc,
- 0x30c9, 0x40f, 0x30a8, 0x30fc, 0x30ab, 0x30fc, 0x30f, 0x30aa,
- 0x30f3, 0x30b9, 0x30f, 0x30aa, 0x30fc, 0x30e0, 0x30f, 0x30ab,
- 0x30a4, 0x30ea, 0x40f, 0x30ab, 0x30e9, 0x30c3, 0x30c8, 0x40f,
- 0x30ab, 0x30ed, 0x30ea, 0x30fc, 0x30f, 0x30ac, 0x30ed, 0x30f3,
- 0x30f, 0x30ac, 0x30f3, 0x30de, 0x20f, 0x30ae, 0x30ac, 0x30f,
- 0x30ae, 0x30cb, 0x30fc, 0x40f, 0x30ad, 0x30e5, 0x30ea, 0x30fc,
- 0x40f, 0x30ae, 0x30eb, 0x30c0, 0x30fc, 0x20f, 0x30ad, 0x30ed,
- 0x50f, 0x30ad, 0x30ed, 0x30b0, 0x30e9, 0x30e0, 0x60f, 0x30ad,
- 0x30ed, 0x30e1, 0x30fc, 0x30c8, 0x30eb, 0x50f, 0x30ad, 0x30ed,
- 0x30ef, 0x30c3, 0x30c8, 0x30f, 0x30b0, 0x30e9, 0x30e0, 0x50f,
- 0x30b0, 0x30e9, 0x30e0, 0x30c8, 0x30f3, 0x50f, 0x30af, 0x30eb,
- 0x30bc, 0x30a4, 0x30ed, 0x40f, 0x30af, 0x30ed, 0x30fc, 0x30cd,
- 0x30f, 0x30b1, 0x30fc, 0x30b9, 0x30f, 0x30b3, 0x30eb, 0x30ca,
- 0x30f, 0x30b3, 0x30fc, 0x30dd, 0x40f, 0x30b5, 0x30a4, 0x30af,
- 0x30eb, 0x50f, 0x30b5, 0x30f3, 0x30c1, 0x30fc, 0x30e0, 0x40f,
- 0x30b7, 0x30ea, 0x30f3, 0x30b0, 0x30f, 0x30bb, 0x30f3, 0x30c1,
- 0x30f, 0x30bb, 0x30f3, 0x30c8, 0x30f, 0x30c0, 0x30fc, 0x30b9,
- 0x20f, 0x30c7, 0x30b7, 0x20f, 0x30c9, 0x30eb, 0x20f, 0x30c8,
- 0x30f3, 0x20f, 0x30ca, 0x30ce, 0x30f, 0x30ce, 0x30c3, 0x30c8,
- 0x30f, 0x30cf, 0x30a4, 0x30c4, 0x50f, 0x30d1, 0x30fc, 0x30bb,
- 0x30f3, 0x30c8, 0x30f, 0x30d1, 0x30fc, 0x30c4, 0x40f, 0x30d0,
- 0x30fc, 0x30ec, 0x30eb, 0x50f, 0x30d4, 0x30a2, 0x30b9, 0x30c8,
- 0x30eb, 0x30f, 0x30d4, 0x30af, 0x30eb, 0x20f, 0x30d4, 0x30b3,
- 0x20f, 0x30d3, 0x30eb, 0x50f, 0x30d5, 0x30a1, 0x30e9, 0x30c3,
- 0x30c9, 0x40f, 0x30d5, 0x30a3, 0x30fc, 0x30c8, 0x50f, 0x30d6,
- 0x30c3, 0x30b7, 0x30a7, 0x30eb, 0x30f, 0x30d5, 0x30e9, 0x30f3,
- 0x50f, 0x30d8, 0x30af, 0x30bf, 0x30fc, 0x30eb, 0x20f, 0x30da,
- 0x30bd, 0x30f, 0x30da, 0x30cb, 0x30d2, 0x30f, 0x30d8, 0x30eb,
- 0x30c4, 0x30f, 0x30da, 0x30f3, 0x30b9, 0x30f, 0x30da, 0x30fc,
- 0x30b8, 0x30f, 0x30d9, 0x30fc, 0x30bf, 0x40f, 0x30dd, 0x30a4,
- 0x30f3, 0x30c8, 0x30f, 0x30dc, 0x30eb, 0x30c8, 0x20f, 0x30db,
- 0x30f3, 0x30f, 0x30dd, 0x30f3, 0x30c9, 0x30f, 0x30db, 0x30fc,
- 0x30eb, 0x30f, 0x30db, 0x30fc, 0x30f3, 0x40f, 0x30de, 0x30a4,
- 0x30af, 0x30ed, 0x30f, 0x30de, 0x30a4, 0x30eb, 0x30f, 0x30de,
- 0x30c3, 0x30cf, 0x30f, 0x30de, 0x30eb, 0x30af, 0x50f, 0x30de,
- 0x30f3, 0x30b7, 0x30e7, 0x30f3, 0x40f, 0x30df, 0x30af, 0x30ed,
- 0x30f3, 0x20f, 0x30df, 0x30ea, 0x50f, 0x30df, 0x30ea, 0x30d0,
- 0x30fc, 0x30eb, 0x20f, 0x30e1, 0x30ac, 0x40f, 0x30e1, 0x30ac,
- 0x30c8, 0x30f3, 0x40f, 0x30e1, 0x30fc, 0x30c8, 0x30eb, 0x30f,
- 0x30e4, 0x30fc, 0x30c9, 0x30f, 0x30e4, 0x30fc, 0x30eb, 0x30f,
- 0x30e6, 0x30a2, 0x30f3, 0x40f, 0x30ea, 0x30c3, 0x30c8, 0x30eb,
- 0x20f, 0x30ea, 0x30e9, 0x30f, 0x30eb, 0x30d4, 0x30fc, 0x40f,
- 0x30eb, 0x30fc, 0x30d6, 0x30eb, 0x20f, 0x30ec, 0x30e0, 0x50f,
- 0x30ec, 0x30f3, 0x30c8, 0x30b2, 0x30f3, 0x30f, 0x30ef, 0x30c3,
- 0x30c8, 0x210, 0x30, 0x70b9, 0x210, 0x31, 0x70b9, 0x210,
- 0x32, 0x70b9, 0x210, 0x33, 0x70b9, 0x210, 0x34, 0x70b9,
- 0x210, 0x35, 0x70b9, 0x210, 0x36, 0x70b9, 0x210, 0x37,
- 0x70b9, 0x210, 0x38, 0x70b9, 0x210, 0x39, 0x70b9, 0x310,
- 0x31, 0x30, 0x70b9, 0x310, 0x31, 0x31, 0x70b9, 0x310,
- 0x31, 0x32, 0x70b9, 0x310, 0x31, 0x33, 0x70b9, 0x310,
- 0x31, 0x34, 0x70b9, 0x310, 0x31, 0x35, 0x70b9, 0x310,
- 0x31, 0x36, 0x70b9, 0x310, 0x31, 0x37, 0x70b9, 0x310,
- 0x31, 0x38, 0x70b9, 0x310, 0x31, 0x39, 0x70b9, 0x310,
- 0x32, 0x30, 0x70b9, 0x310, 0x32, 0x31, 0x70b9, 0x310,
- 0x32, 0x32, 0x70b9, 0x310, 0x32, 0x33, 0x70b9, 0x310,
- 0x32, 0x34, 0x70b9, 0x30f, 0x68, 0x50, 0x61, 0x20f,
- 0x64, 0x61, 0x20f, 0x41, 0x55, 0x30f, 0x62, 0x61,
- 0x72, 0x20f, 0x6f, 0x56, 0x20f, 0x70, 0x63, 0x20f,
- 0x64, 0x6d, 0x30f, 0x64, 0x6d, 0xb2, 0x30f, 0x64,
- 0x6d, 0xb3, 0x20f, 0x49, 0x55, 0x20f, 0x5e73, 0x6210,
- 0x20f, 0x662d, 0x548c, 0x20f, 0x5927, 0x6b63, 0x20f, 0x660e,
- 0x6cbb, 0x40f, 0x682a, 0x5f0f, 0x4f1a, 0x793e, 0x20f, 0x70,
- 0x41, 0x20f, 0x6e, 0x41, 0x20f, 0x3bc, 0x41, 0x20f,
- 0x6d, 0x41, 0x20f, 0x6b, 0x41, 0x20f, 0x4b, 0x42,
- 0x20f, 0x4d, 0x42, 0x20f, 0x47, 0x42, 0x30f, 0x63,
- 0x61, 0x6c, 0x40f, 0x6b, 0x63, 0x61, 0x6c, 0x20f,
- 0x70, 0x46, 0x20f, 0x6e, 0x46, 0x20f, 0x3bc, 0x46,
- 0x20f, 0x3bc, 0x67, 0x20f, 0x6d, 0x67, 0x20f, 0x6b,
- 0x67, 0x20f, 0x48, 0x7a, 0x30f, 0x6b, 0x48, 0x7a,
- 0x30f, 0x4d, 0x48, 0x7a, 0x30f, 0x47, 0x48, 0x7a,
- 0x30f, 0x54, 0x48, 0x7a, 0x20f, 0x3bc, 0x2113, 0x20f,
- 0x6d, 0x2113, 0x20f, 0x64, 0x2113, 0x20f, 0x6b, 0x2113,
- 0x20f, 0x66, 0x6d, 0x20f, 0x6e, 0x6d, 0x20f, 0x3bc,
- 0x6d, 0x20f, 0x6d, 0x6d, 0x20f, 0x63, 0x6d, 0x20f,
- 0x6b, 0x6d, 0x30f, 0x6d, 0x6d, 0xb2, 0x30f, 0x63,
- 0x6d, 0xb2, 0x20f, 0x6d, 0xb2, 0x30f, 0x6b, 0x6d,
- 0xb2, 0x30f, 0x6d, 0x6d, 0xb3, 0x30f, 0x63, 0x6d,
- 0xb3, 0x20f, 0x6d, 0xb3, 0x30f, 0x6b, 0x6d, 0xb3,
- 0x30f, 0x6d, 0x2215, 0x73, 0x40f, 0x6d, 0x2215, 0x73,
- 0xb2, 0x20f, 0x50, 0x61, 0x30f, 0x6b, 0x50, 0x61,
- 0x30f, 0x4d, 0x50, 0x61, 0x30f, 0x47, 0x50, 0x61,
- 0x30f, 0x72, 0x61, 0x64, 0x50f, 0x72, 0x61, 0x64,
- 0x2215, 0x73, 0x60f, 0x72, 0x61, 0x64, 0x2215, 0x73,
- 0xb2, 0x20f, 0x70, 0x73, 0x20f, 0x6e, 0x73, 0x20f,
- 0x3bc, 0x73, 0x20f, 0x6d, 0x73, 0x20f, 0x70, 0x56,
- 0x20f, 0x6e, 0x56, 0x20f, 0x3bc, 0x56, 0x20f, 0x6d,
- 0x56, 0x20f, 0x6b, 0x56, 0x20f, 0x4d, 0x56, 0x20f,
- 0x70, 0x57, 0x20f, 0x6e, 0x57, 0x20f, 0x3bc, 0x57,
- 0x20f, 0x6d, 0x57, 0x20f, 0x6b, 0x57, 0x20f, 0x4d,
- 0x57, 0x20f, 0x6b, 0x3a9, 0x20f, 0x4d, 0x3a9, 0x40f,
- 0x61, 0x2e, 0x6d, 0x2e, 0x20f, 0x42, 0x71, 0x20f,
- 0x63, 0x63, 0x20f, 0x63, 0x64, 0x40f, 0x43, 0x2215,
- 0x6b, 0x67, 0x30f, 0x43, 0x6f, 0x2e, 0x20f, 0x64,
- 0x42, 0x20f, 0x47, 0x79, 0x20f, 0x68, 0x61, 0x20f,
- 0x48, 0x50, 0x20f, 0x69, 0x6e, 0x20f, 0x4b, 0x4b,
- 0x20f, 0x4b, 0x4d, 0x20f, 0x6b, 0x74, 0x20f, 0x6c,
- 0x6d, 0x20f, 0x6c, 0x6e, 0x30f, 0x6c, 0x6f, 0x67,
- 0x20f, 0x6c, 0x78, 0x20f, 0x6d, 0x62, 0x30f, 0x6d,
- 0x69, 0x6c, 0x30f, 0x6d, 0x6f, 0x6c, 0x20f, 0x50,
- 0x48, 0x40f, 0x70, 0x2e, 0x6d, 0x2e, 0x30f, 0x50,
- 0x50, 0x4d, 0x20f, 0x50, 0x52, 0x20f, 0x73, 0x72,
- 0x20f, 0x53, 0x76, 0x20f, 0x57, 0x62, 0x30f, 0x56,
- 0x2215, 0x6d, 0x30f, 0x41, 0x2215, 0x6d, 0x210, 0x31,
- 0x65e5, 0x210, 0x32, 0x65e5, 0x210, 0x33, 0x65e5, 0x210,
- 0x34, 0x65e5, 0x210, 0x35, 0x65e5, 0x210, 0x36, 0x65e5,
- 0x210, 0x37, 0x65e5, 0x210, 0x38, 0x65e5, 0x210, 0x39,
- 0x65e5, 0x310, 0x31, 0x30, 0x65e5, 0x310, 0x31, 0x31,
- 0x65e5, 0x310, 0x31, 0x32, 0x65e5, 0x310, 0x31, 0x33,
- 0x65e5, 0x310, 0x31, 0x34, 0x65e5, 0x310, 0x31, 0x35,
- 0x65e5, 0x310, 0x31, 0x36, 0x65e5, 0x310, 0x31, 0x37,
- 0x65e5, 0x310, 0x31, 0x38, 0x65e5, 0x310, 0x31, 0x39,
- 0x65e5, 0x310, 0x32, 0x30, 0x65e5, 0x310, 0x32, 0x31,
- 0x65e5, 0x310, 0x32, 0x32, 0x65e5, 0x310, 0x32, 0x33,
- 0x65e5, 0x310, 0x32, 0x34, 0x65e5, 0x310, 0x32, 0x35,
- 0x65e5, 0x310, 0x32, 0x36, 0x65e5, 0x310, 0x32, 0x37,
- 0x65e5, 0x310, 0x32, 0x38, 0x65e5, 0x310, 0x32, 0x39,
- 0x65e5, 0x310, 0x33, 0x30, 0x65e5, 0x310, 0x33, 0x31,
- 0x65e5, 0x30f, 0x67, 0x61, 0x6c, 0x109, 0x44a, 0x109,
- 0x44c, 0x109, 0xa76f, 0x109, 0x126, 0x109, 0x153, 0x109,
- 0xa727, 0x109, 0xab37, 0x109, 0x26b, 0x109, 0xab52, 0x101,
- 0x8c48, 0x101, 0x66f4, 0x101, 0x8eca, 0x101, 0x8cc8, 0x101,
- 0x6ed1, 0x101, 0x4e32, 0x101, 0x53e5, 0x101, 0x9f9c, 0x101,
- 0x9f9c, 0x101, 0x5951, 0x101, 0x91d1, 0x101, 0x5587, 0x101,
- 0x5948, 0x101, 0x61f6, 0x101, 0x7669, 0x101, 0x7f85, 0x101,
- 0x863f, 0x101, 0x87ba, 0x101, 0x88f8, 0x101, 0x908f, 0x101,
- 0x6a02, 0x101, 0x6d1b, 0x101, 0x70d9, 0x101, 0x73de, 0x101,
- 0x843d, 0x101, 0x916a, 0x101, 0x99f1, 0x101, 0x4e82, 0x101,
- 0x5375, 0x101, 0x6b04, 0x101, 0x721b, 0x101, 0x862d, 0x101,
- 0x9e1e, 0x101, 0x5d50, 0x101, 0x6feb, 0x101, 0x85cd, 0x101,
- 0x8964, 0x101, 0x62c9, 0x101, 0x81d8, 0x101, 0x881f, 0x101,
- 0x5eca, 0x101, 0x6717, 0x101, 0x6d6a, 0x101, 0x72fc, 0x101,
- 0x90ce, 0x101, 0x4f86, 0x101, 0x51b7, 0x101, 0x52de, 0x101,
- 0x64c4, 0x101, 0x6ad3, 0x101, 0x7210, 0x101, 0x76e7, 0x101,
- 0x8001, 0x101, 0x8606, 0x101, 0x865c, 0x101, 0x8def, 0x101,
- 0x9732, 0x101, 0x9b6f, 0x101, 0x9dfa, 0x101, 0x788c, 0x101,
- 0x797f, 0x101, 0x7da0, 0x101, 0x83c9, 0x101, 0x9304, 0x101,
- 0x9e7f, 0x101, 0x8ad6, 0x101, 0x58df, 0x101, 0x5f04, 0x101,
- 0x7c60, 0x101, 0x807e, 0x101, 0x7262, 0x101, 0x78ca, 0x101,
- 0x8cc2, 0x101, 0x96f7, 0x101, 0x58d8, 0x101, 0x5c62, 0x101,
- 0x6a13, 0x101, 0x6dda, 0x101, 0x6f0f, 0x101, 0x7d2f, 0x101,
- 0x7e37, 0x101, 0x964b, 0x101, 0x52d2, 0x101, 0x808b, 0x101,
- 0x51dc, 0x101, 0x51cc, 0x101, 0x7a1c, 0x101, 0x7dbe, 0x101,
- 0x83f1, 0x101, 0x9675, 0x101, 0x8b80, 0x101, 0x62cf, 0x101,
- 0x6a02, 0x101, 0x8afe, 0x101, 0x4e39, 0x101, 0x5be7, 0x101,
- 0x6012, 0x101, 0x7387, 0x101, 0x7570, 0x101, 0x5317, 0x101,
- 0x78fb, 0x101, 0x4fbf, 0x101, 0x5fa9, 0x101, 0x4e0d, 0x101,
- 0x6ccc, 0x101, 0x6578, 0x101, 0x7d22, 0x101, 0x53c3, 0x101,
- 0x585e, 0x101, 0x7701, 0x101, 0x8449, 0x101, 0x8aaa, 0x101,
- 0x6bba, 0x101, 0x8fb0, 0x101, 0x6c88, 0x101, 0x62fe, 0x101,
- 0x82e5, 0x101, 0x63a0, 0x101, 0x7565, 0x101, 0x4eae, 0x101,
- 0x5169, 0x101, 0x51c9, 0x101, 0x6881, 0x101, 0x7ce7, 0x101,
- 0x826f, 0x101, 0x8ad2, 0x101, 0x91cf, 0x101, 0x52f5, 0x101,
- 0x5442, 0x101, 0x5973, 0x101, 0x5eec, 0x101, 0x65c5, 0x101,
- 0x6ffe, 0x101, 0x792a, 0x101, 0x95ad, 0x101, 0x9a6a, 0x101,
- 0x9e97, 0x101, 0x9ece, 0x101, 0x529b, 0x101, 0x66c6, 0x101,
- 0x6b77, 0x101, 0x8f62, 0x101, 0x5e74, 0x101, 0x6190, 0x101,
- 0x6200, 0x101, 0x649a, 0x101, 0x6f23, 0x101, 0x7149, 0x101,
- 0x7489, 0x101, 0x79ca, 0x101, 0x7df4, 0x101, 0x806f, 0x101,
- 0x8f26, 0x101, 0x84ee, 0x101, 0x9023, 0x101, 0x934a, 0x101,
- 0x5217, 0x101, 0x52a3, 0x101, 0x54bd, 0x101, 0x70c8, 0x101,
- 0x88c2, 0x101, 0x8aaa, 0x101, 0x5ec9, 0x101, 0x5ff5, 0x101,
- 0x637b, 0x101, 0x6bae, 0x101, 0x7c3e, 0x101, 0x7375, 0x101,
- 0x4ee4, 0x101, 0x56f9, 0x101, 0x5be7, 0x101, 0x5dba, 0x101,
- 0x601c, 0x101, 0x73b2, 0x101, 0x7469, 0x101, 0x7f9a, 0x101,
- 0x8046, 0x101, 0x9234, 0x101, 0x96f6, 0x101, 0x9748, 0x101,
- 0x9818, 0x101, 0x4f8b, 0x101, 0x79ae, 0x101, 0x91b4, 0x101,
- 0x96b8, 0x101, 0x60e1, 0x101, 0x4e86, 0x101, 0x50da, 0x101,
- 0x5bee, 0x101, 0x5c3f, 0x101, 0x6599, 0x101, 0x6a02, 0x101,
- 0x71ce, 0x101, 0x7642, 0x101, 0x84fc, 0x101, 0x907c, 0x101,
- 0x9f8d, 0x101, 0x6688, 0x101, 0x962e, 0x101, 0x5289, 0x101,
- 0x677b, 0x101, 0x67f3, 0x101, 0x6d41, 0x101, 0x6e9c, 0x101,
- 0x7409, 0x101, 0x7559, 0x101, 0x786b, 0x101, 0x7d10, 0x101,
- 0x985e, 0x101, 0x516d, 0x101, 0x622e, 0x101, 0x9678, 0x101,
- 0x502b, 0x101, 0x5d19, 0x101, 0x6dea, 0x101, 0x8f2a, 0x101,
- 0x5f8b, 0x101, 0x6144, 0x101, 0x6817, 0x101, 0x7387, 0x101,
- 0x9686, 0x101, 0x5229, 0x101, 0x540f, 0x101, 0x5c65, 0x101,
- 0x6613, 0x101, 0x674e, 0x101, 0x68a8, 0x101, 0x6ce5, 0x101,
- 0x7406, 0x101, 0x75e2, 0x101, 0x7f79, 0x101, 0x88cf, 0x101,
- 0x88e1, 0x101, 0x91cc, 0x101, 0x96e2, 0x101, 0x533f, 0x101,
- 0x6eba, 0x101, 0x541d, 0x101, 0x71d0, 0x101, 0x7498, 0x101,
- 0x85fa, 0x101, 0x96a3, 0x101, 0x9c57, 0x101, 0x9e9f, 0x101,
- 0x6797, 0x101, 0x6dcb, 0x101, 0x81e8, 0x101, 0x7acb, 0x101,
- 0x7b20, 0x101, 0x7c92, 0x101, 0x72c0, 0x101, 0x7099, 0x101,
- 0x8b58, 0x101, 0x4ec0, 0x101, 0x8336, 0x101, 0x523a, 0x101,
- 0x5207, 0x101, 0x5ea6, 0x101, 0x62d3, 0x101, 0x7cd6, 0x101,
- 0x5b85, 0x101, 0x6d1e, 0x101, 0x66b4, 0x101, 0x8f3b, 0x101,
- 0x884c, 0x101, 0x964d, 0x101, 0x898b, 0x101, 0x5ed3, 0x101,
- 0x5140, 0x101, 0x55c0, 0x101, 0x585a, 0x101, 0x6674, 0x101,
- 0x51de, 0x101, 0x732a, 0x101, 0x76ca, 0x101, 0x793c, 0x101,
- 0x795e, 0x101, 0x7965, 0x101, 0x798f, 0x101, 0x9756, 0x101,
- 0x7cbe, 0x101, 0x7fbd, 0x101, 0x8612, 0x101, 0x8af8, 0x101,
- 0x9038, 0x101, 0x90fd, 0x101, 0x98ef, 0x101, 0x98fc, 0x101,
- 0x9928, 0x101, 0x9db4, 0x101, 0x90de, 0x101, 0x96b7, 0x101,
- 0x4fae, 0x101, 0x50e7, 0x101, 0x514d, 0x101, 0x52c9, 0x101,
- 0x52e4, 0x101, 0x5351, 0x101, 0x559d, 0x101, 0x5606, 0x101,
- 0x5668, 0x101, 0x5840, 0x101, 0x58a8, 0x101, 0x5c64, 0x101,
- 0x5c6e, 0x101, 0x6094, 0x101, 0x6168, 0x101, 0x618e, 0x101,
- 0x61f2, 0x101, 0x654f, 0x101, 0x65e2, 0x101, 0x6691, 0x101,
- 0x6885, 0x101, 0x6d77, 0x101, 0x6e1a, 0x101, 0x6f22, 0x101,
- 0x716e, 0x101, 0x722b, 0x101, 0x7422, 0x101, 0x7891, 0x101,
- 0x793e, 0x101, 0x7949, 0x101, 0x7948, 0x101, 0x7950, 0x101,
- 0x7956, 0x101, 0x795d, 0x101, 0x798d, 0x101, 0x798e, 0x101,
- 0x7a40, 0x101, 0x7a81, 0x101, 0x7bc0, 0x101, 0x7df4, 0x101,
- 0x7e09, 0x101, 0x7e41, 0x101, 0x7f72, 0x101, 0x8005, 0x101,
- 0x81ed, 0x101, 0x8279, 0x101, 0x8279, 0x101, 0x8457, 0x101,
- 0x8910, 0x101, 0x8996, 0x101, 0x8b01, 0x101, 0x8b39, 0x101,
- 0x8cd3, 0x101, 0x8d08, 0x101, 0x8fb6, 0x101, 0x9038, 0x101,
- 0x96e3, 0x101, 0x97ff, 0x101, 0x983b, 0x101, 0x6075, 0x201,
- 0xd850, 0xdeee, 0x101, 0x8218, 0x101, 0x4e26, 0x101, 0x51b5,
- 0x101, 0x5168, 0x101, 0x4f80, 0x101, 0x5145, 0x101, 0x5180,
- 0x101, 0x52c7, 0x101, 0x52fa, 0x101, 0x559d, 0x101, 0x5555,
- 0x101, 0x5599, 0x101, 0x55e2, 0x101, 0x585a, 0x101, 0x58b3,
- 0x101, 0x5944, 0x101, 0x5954, 0x101, 0x5a62, 0x101, 0x5b28,
- 0x101, 0x5ed2, 0x101, 0x5ed9, 0x101, 0x5f69, 0x101, 0x5fad,
- 0x101, 0x60d8, 0x101, 0x614e, 0x101, 0x6108, 0x101, 0x618e,
- 0x101, 0x6160, 0x101, 0x61f2, 0x101, 0x6234, 0x101, 0x63c4,
- 0x101, 0x641c, 0x101, 0x6452, 0x101, 0x6556, 0x101, 0x6674,
- 0x101, 0x6717, 0x101, 0x671b, 0x101, 0x6756, 0x101, 0x6b79,
- 0x101, 0x6bba, 0x101, 0x6d41, 0x101, 0x6edb, 0x101, 0x6ecb,
- 0x101, 0x6f22, 0x101, 0x701e, 0x101, 0x716e, 0x101, 0x77a7,
- 0x101, 0x7235, 0x101, 0x72af, 0x101, 0x732a, 0x101, 0x7471,
- 0x101, 0x7506, 0x101, 0x753b, 0x101, 0x761d, 0x101, 0x761f,
- 0x101, 0x76ca, 0x101, 0x76db, 0x101, 0x76f4, 0x101, 0x774a,
- 0x101, 0x7740, 0x101, 0x78cc, 0x101, 0x7ab1, 0x101, 0x7bc0,
- 0x101, 0x7c7b, 0x101, 0x7d5b, 0x101, 0x7df4, 0x101, 0x7f3e,
- 0x101, 0x8005, 0x101, 0x8352, 0x101, 0x83ef, 0x101, 0x8779,
- 0x101, 0x8941, 0x101, 0x8986, 0x101, 0x8996, 0x101, 0x8abf,
- 0x101, 0x8af8, 0x101, 0x8acb, 0x101, 0x8b01, 0x101, 0x8afe,
- 0x101, 0x8aed, 0x101, 0x8b39, 0x101, 0x8b8a, 0x101, 0x8d08,
- 0x101, 0x8f38, 0x101, 0x9072, 0x101, 0x9199, 0x101, 0x9276,
- 0x101, 0x967c, 0x101, 0x96e3, 0x101, 0x9756, 0x101, 0x97db,
- 0x101, 0x97ff, 0x101, 0x980b, 0x101, 0x983b, 0x101, 0x9b12,
- 0x101, 0x9f9c, 0x201, 0xd84a, 0xdc4a, 0x201, 0xd84a, 0xdc44,
- 0x201, 0xd84c, 0xdfd5, 0x101, 0x3b9d, 0x101, 0x4018, 0x101,
- 0x4039, 0x201, 0xd854, 0xde49, 0x201, 0xd857, 0xdcd0, 0x201,
- 0xd85f, 0xded3, 0x101, 0x9f43, 0x101, 0x9f8e, 0x210, 0x66,
- 0x66, 0x210, 0x66, 0x69, 0x210, 0x66, 0x6c, 0x310,
- 0x66, 0x66, 0x69, 0x310, 0x66, 0x66, 0x6c, 0x210,
- 0x17f, 0x74, 0x210, 0x73, 0x74, 0x210, 0x574, 0x576,
- 0x210, 0x574, 0x565, 0x210, 0x574, 0x56b, 0x210, 0x57e,
- 0x576, 0x210, 0x574, 0x56d, 0x201, 0x5d9, 0x5b4, 0x201,
- 0x5f2, 0x5b7, 0x102, 0x5e2, 0x102, 0x5d0, 0x102, 0x5d3,
- 0x102, 0x5d4, 0x102, 0x5db, 0x102, 0x5dc, 0x102, 0x5dd,
- 0x102, 0x5e8, 0x102, 0x5ea, 0x102, 0x2b, 0x201, 0x5e9,
- 0x5c1, 0x201, 0x5e9, 0x5c2, 0x201, 0xfb49, 0x5c1, 0x201,
- 0xfb49, 0x5c2, 0x201, 0x5d0, 0x5b7, 0x201, 0x5d0, 0x5b8,
- 0x201, 0x5d0, 0x5bc, 0x201, 0x5d1, 0x5bc, 0x201, 0x5d2,
- 0x5bc, 0x201, 0x5d3, 0x5bc, 0x201, 0x5d4, 0x5bc, 0x201,
- 0x5d5, 0x5bc, 0x201, 0x5d6, 0x5bc, 0x201, 0x5d8, 0x5bc,
- 0x201, 0x5d9, 0x5bc, 0x201, 0x5da, 0x5bc, 0x201, 0x5db,
- 0x5bc, 0x201, 0x5dc, 0x5bc, 0x201, 0x5de, 0x5bc, 0x201,
- 0x5e0, 0x5bc, 0x201, 0x5e1, 0x5bc, 0x201, 0x5e3, 0x5bc,
- 0x201, 0x5e4, 0x5bc, 0x201, 0x5e6, 0x5bc, 0x201, 0x5e7,
- 0x5bc, 0x201, 0x5e8, 0x5bc, 0x201, 0x5e9, 0x5bc, 0x201,
- 0x5ea, 0x5bc, 0x201, 0x5d5, 0x5b9, 0x201, 0x5d1, 0x5bf,
- 0x201, 0x5db, 0x5bf, 0x201, 0x5e4, 0x5bf, 0x210, 0x5d0,
- 0x5dc, 0x107, 0x671, 0x106, 0x671, 0x107, 0x67b, 0x106,
- 0x67b, 0x104, 0x67b, 0x105, 0x67b, 0x107, 0x67e, 0x106,
- 0x67e, 0x104, 0x67e, 0x105, 0x67e, 0x107, 0x680, 0x106,
- 0x680, 0x104, 0x680, 0x105, 0x680, 0x107, 0x67a, 0x106,
- 0x67a, 0x104, 0x67a, 0x105, 0x67a, 0x107, 0x67f, 0x106,
- 0x67f, 0x104, 0x67f, 0x105, 0x67f, 0x107, 0x679, 0x106,
- 0x679, 0x104, 0x679, 0x105, 0x679, 0x107, 0x6a4, 0x106,
- 0x6a4, 0x104, 0x6a4, 0x105, 0x6a4, 0x107, 0x6a6, 0x106,
- 0x6a6, 0x104, 0x6a6, 0x105, 0x6a6, 0x107, 0x684, 0x106,
- 0x684, 0x104, 0x684, 0x105, 0x684, 0x107, 0x683, 0x106,
- 0x683, 0x104, 0x683, 0x105, 0x683, 0x107, 0x686, 0x106,
- 0x686, 0x104, 0x686, 0x105, 0x686, 0x107, 0x687, 0x106,
- 0x687, 0x104, 0x687, 0x105, 0x687, 0x107, 0x68d, 0x106,
- 0x68d, 0x107, 0x68c, 0x106, 0x68c, 0x107, 0x68e, 0x106,
- 0x68e, 0x107, 0x688, 0x106, 0x688, 0x107, 0x698, 0x106,
- 0x698, 0x107, 0x691, 0x106, 0x691, 0x107, 0x6a9, 0x106,
- 0x6a9, 0x104, 0x6a9, 0x105, 0x6a9, 0x107, 0x6af, 0x106,
- 0x6af, 0x104, 0x6af, 0x105, 0x6af, 0x107, 0x6b3, 0x106,
- 0x6b3, 0x104, 0x6b3, 0x105, 0x6b3, 0x107, 0x6b1, 0x106,
- 0x6b1, 0x104, 0x6b1, 0x105, 0x6b1, 0x107, 0x6ba, 0x106,
- 0x6ba, 0x107, 0x6bb, 0x106, 0x6bb, 0x104, 0x6bb, 0x105,
- 0x6bb, 0x107, 0x6c0, 0x106, 0x6c0, 0x107, 0x6c1, 0x106,
- 0x6c1, 0x104, 0x6c1, 0x105, 0x6c1, 0x107, 0x6be, 0x106,
- 0x6be, 0x104, 0x6be, 0x105, 0x6be, 0x107, 0x6d2, 0x106,
- 0x6d2, 0x107, 0x6d3, 0x106, 0x6d3, 0x107, 0x6ad, 0x106,
- 0x6ad, 0x104, 0x6ad, 0x105, 0x6ad, 0x107, 0x6c7, 0x106,
- 0x6c7, 0x107, 0x6c6, 0x106, 0x6c6, 0x107, 0x6c8, 0x106,
- 0x6c8, 0x107, 0x677, 0x107, 0x6cb, 0x106, 0x6cb, 0x107,
- 0x6c5, 0x106, 0x6c5, 0x107, 0x6c9, 0x106, 0x6c9, 0x107,
- 0x6d0, 0x106, 0x6d0, 0x104, 0x6d0, 0x105, 0x6d0, 0x104,
- 0x649, 0x105, 0x649, 0x207, 0x626, 0x627, 0x206, 0x626,
- 0x627, 0x207, 0x626, 0x6d5, 0x206, 0x626, 0x6d5, 0x207,
- 0x626, 0x648, 0x206, 0x626, 0x648, 0x207, 0x626, 0x6c7,
- 0x206, 0x626, 0x6c7, 0x207, 0x626, 0x6c6, 0x206, 0x626,
- 0x6c6, 0x207, 0x626, 0x6c8, 0x206, 0x626, 0x6c8, 0x207,
- 0x626, 0x6d0, 0x206, 0x626, 0x6d0, 0x204, 0x626, 0x6d0,
- 0x207, 0x626, 0x649, 0x206, 0x626, 0x649, 0x204, 0x626,
- 0x649, 0x107, 0x6cc, 0x106, 0x6cc, 0x104, 0x6cc, 0x105,
- 0x6cc, 0x207, 0x626, 0x62c, 0x207, 0x626, 0x62d, 0x207,
- 0x626, 0x645, 0x207, 0x626, 0x649, 0x207, 0x626, 0x64a,
- 0x207, 0x628, 0x62c, 0x207, 0x628, 0x62d, 0x207, 0x628,
- 0x62e, 0x207, 0x628, 0x645, 0x207, 0x628, 0x649, 0x207,
- 0x628, 0x64a, 0x207, 0x62a, 0x62c, 0x207, 0x62a, 0x62d,
- 0x207, 0x62a, 0x62e, 0x207, 0x62a, 0x645, 0x207, 0x62a,
- 0x649, 0x207, 0x62a, 0x64a, 0x207, 0x62b, 0x62c, 0x207,
- 0x62b, 0x645, 0x207, 0x62b, 0x649, 0x207, 0x62b, 0x64a,
- 0x207, 0x62c, 0x62d, 0x207, 0x62c, 0x645, 0x207, 0x62d,
- 0x62c, 0x207, 0x62d, 0x645, 0x207, 0x62e, 0x62c, 0x207,
- 0x62e, 0x62d, 0x207, 0x62e, 0x645, 0x207, 0x633, 0x62c,
- 0x207, 0x633, 0x62d, 0x207, 0x633, 0x62e, 0x207, 0x633,
- 0x645, 0x207, 0x635, 0x62d, 0x207, 0x635, 0x645, 0x207,
- 0x636, 0x62c, 0x207, 0x636, 0x62d, 0x207, 0x636, 0x62e,
- 0x207, 0x636, 0x645, 0x207, 0x637, 0x62d, 0x207, 0x637,
- 0x645, 0x207, 0x638, 0x645, 0x207, 0x639, 0x62c, 0x207,
- 0x639, 0x645, 0x207, 0x63a, 0x62c, 0x207, 0x63a, 0x645,
- 0x207, 0x641, 0x62c, 0x207, 0x641, 0x62d, 0x207, 0x641,
- 0x62e, 0x207, 0x641, 0x645, 0x207, 0x641, 0x649, 0x207,
- 0x641, 0x64a, 0x207, 0x642, 0x62d, 0x207, 0x642, 0x645,
- 0x207, 0x642, 0x649, 0x207, 0x642, 0x64a, 0x207, 0x643,
- 0x627, 0x207, 0x643, 0x62c, 0x207, 0x643, 0x62d, 0x207,
- 0x643, 0x62e, 0x207, 0x643, 0x644, 0x207, 0x643, 0x645,
- 0x207, 0x643, 0x649, 0x207, 0x643, 0x64a, 0x207, 0x644,
- 0x62c, 0x207, 0x644, 0x62d, 0x207, 0x644, 0x62e, 0x207,
- 0x644, 0x645, 0x207, 0x644, 0x649, 0x207, 0x644, 0x64a,
- 0x207, 0x645, 0x62c, 0x207, 0x645, 0x62d, 0x207, 0x645,
- 0x62e, 0x207, 0x645, 0x645, 0x207, 0x645, 0x649, 0x207,
- 0x645, 0x64a, 0x207, 0x646, 0x62c, 0x207, 0x646, 0x62d,
- 0x207, 0x646, 0x62e, 0x207, 0x646, 0x645, 0x207, 0x646,
- 0x649, 0x207, 0x646, 0x64a, 0x207, 0x647, 0x62c, 0x207,
- 0x647, 0x645, 0x207, 0x647, 0x649, 0x207, 0x647, 0x64a,
- 0x207, 0x64a, 0x62c, 0x207, 0x64a, 0x62d, 0x207, 0x64a,
- 0x62e, 0x207, 0x64a, 0x645, 0x207, 0x64a, 0x649, 0x207,
- 0x64a, 0x64a, 0x207, 0x630, 0x670, 0x207, 0x631, 0x670,
- 0x207, 0x649, 0x670, 0x307, 0x20, 0x64c, 0x651, 0x307,
- 0x20, 0x64d, 0x651, 0x307, 0x20, 0x64e, 0x651, 0x307,
- 0x20, 0x64f, 0x651, 0x307, 0x20, 0x650, 0x651, 0x307,
- 0x20, 0x651, 0x670, 0x206, 0x626, 0x631, 0x206, 0x626,
- 0x632, 0x206, 0x626, 0x645, 0x206, 0x626, 0x646, 0x206,
- 0x626, 0x649, 0x206, 0x626, 0x64a, 0x206, 0x628, 0x631,
- 0x206, 0x628, 0x632, 0x206, 0x628, 0x645, 0x206, 0x628,
- 0x646, 0x206, 0x628, 0x649, 0x206, 0x628, 0x64a, 0x206,
- 0x62a, 0x631, 0x206, 0x62a, 0x632, 0x206, 0x62a, 0x645,
- 0x206, 0x62a, 0x646, 0x206, 0x62a, 0x649, 0x206, 0x62a,
- 0x64a, 0x206, 0x62b, 0x631, 0x206, 0x62b, 0x632, 0x206,
- 0x62b, 0x645, 0x206, 0x62b, 0x646, 0x206, 0x62b, 0x649,
- 0x206, 0x62b, 0x64a, 0x206, 0x641, 0x649, 0x206, 0x641,
- 0x64a, 0x206, 0x642, 0x649, 0x206, 0x642, 0x64a, 0x206,
- 0x643, 0x627, 0x206, 0x643, 0x644, 0x206, 0x643, 0x645,
- 0x206, 0x643, 0x649, 0x206, 0x643, 0x64a, 0x206, 0x644,
- 0x645, 0x206, 0x644, 0x649, 0x206, 0x644, 0x64a, 0x206,
- 0x645, 0x627, 0x206, 0x645, 0x645, 0x206, 0x646, 0x631,
- 0x206, 0x646, 0x632, 0x206, 0x646, 0x645, 0x206, 0x646,
- 0x646, 0x206, 0x646, 0x649, 0x206, 0x646, 0x64a, 0x206,
- 0x649, 0x670, 0x206, 0x64a, 0x631, 0x206, 0x64a, 0x632,
- 0x206, 0x64a, 0x645, 0x206, 0x64a, 0x646, 0x206, 0x64a,
- 0x649, 0x206, 0x64a, 0x64a, 0x204, 0x626, 0x62c, 0x204,
- 0x626, 0x62d, 0x204, 0x626, 0x62e, 0x204, 0x626, 0x645,
- 0x204, 0x626, 0x647, 0x204, 0x628, 0x62c, 0x204, 0x628,
- 0x62d, 0x204, 0x628, 0x62e, 0x204, 0x628, 0x645, 0x204,
- 0x628, 0x647, 0x204, 0x62a, 0x62c, 0x204, 0x62a, 0x62d,
- 0x204, 0x62a, 0x62e, 0x204, 0x62a, 0x645, 0x204, 0x62a,
- 0x647, 0x204, 0x62b, 0x645, 0x204, 0x62c, 0x62d, 0x204,
- 0x62c, 0x645, 0x204, 0x62d, 0x62c, 0x204, 0x62d, 0x645,
- 0x204, 0x62e, 0x62c, 0x204, 0x62e, 0x645, 0x204, 0x633,
- 0x62c, 0x204, 0x633, 0x62d, 0x204, 0x633, 0x62e, 0x204,
- 0x633, 0x645, 0x204, 0x635, 0x62d, 0x204, 0x635, 0x62e,
- 0x204, 0x635, 0x645, 0x204, 0x636, 0x62c, 0x204, 0x636,
- 0x62d, 0x204, 0x636, 0x62e, 0x204, 0x636, 0x645, 0x204,
- 0x637, 0x62d, 0x204, 0x638, 0x645, 0x204, 0x639, 0x62c,
- 0x204, 0x639, 0x645, 0x204, 0x63a, 0x62c, 0x204, 0x63a,
- 0x645, 0x204, 0x641, 0x62c, 0x204, 0x641, 0x62d, 0x204,
- 0x641, 0x62e, 0x204, 0x641, 0x645, 0x204, 0x642, 0x62d,
- 0x204, 0x642, 0x645, 0x204, 0x643, 0x62c, 0x204, 0x643,
- 0x62d, 0x204, 0x643, 0x62e, 0x204, 0x643, 0x644, 0x204,
- 0x643, 0x645, 0x204, 0x644, 0x62c, 0x204, 0x644, 0x62d,
- 0x204, 0x644, 0x62e, 0x204, 0x644, 0x645, 0x204, 0x644,
- 0x647, 0x204, 0x645, 0x62c, 0x204, 0x645, 0x62d, 0x204,
- 0x645, 0x62e, 0x204, 0x645, 0x645, 0x204, 0x646, 0x62c,
- 0x204, 0x646, 0x62d, 0x204, 0x646, 0x62e, 0x204, 0x646,
- 0x645, 0x204, 0x646, 0x647, 0x204, 0x647, 0x62c, 0x204,
- 0x647, 0x645, 0x204, 0x647, 0x670, 0x204, 0x64a, 0x62c,
- 0x204, 0x64a, 0x62d, 0x204, 0x64a, 0x62e, 0x204, 0x64a,
- 0x645, 0x204, 0x64a, 0x647, 0x205, 0x626, 0x645, 0x205,
- 0x626, 0x647, 0x205, 0x628, 0x645, 0x205, 0x628, 0x647,
- 0x205, 0x62a, 0x645, 0x205, 0x62a, 0x647, 0x205, 0x62b,
- 0x645, 0x205, 0x62b, 0x647, 0x205, 0x633, 0x645, 0x205,
- 0x633, 0x647, 0x205, 0x634, 0x645, 0x205, 0x634, 0x647,
- 0x205, 0x643, 0x644, 0x205, 0x643, 0x645, 0x205, 0x644,
- 0x645, 0x205, 0x646, 0x645, 0x205, 0x646, 0x647, 0x205,
- 0x64a, 0x645, 0x205, 0x64a, 0x647, 0x305, 0x640, 0x64e,
- 0x651, 0x305, 0x640, 0x64f, 0x651, 0x305, 0x640, 0x650,
- 0x651, 0x207, 0x637, 0x649, 0x207, 0x637, 0x64a, 0x207,
- 0x639, 0x649, 0x207, 0x639, 0x64a, 0x207, 0x63a, 0x649,
- 0x207, 0x63a, 0x64a, 0x207, 0x633, 0x649, 0x207, 0x633,
- 0x64a, 0x207, 0x634, 0x649, 0x207, 0x634, 0x64a, 0x207,
- 0x62d, 0x649, 0x207, 0x62d, 0x64a, 0x207, 0x62c, 0x649,
- 0x207, 0x62c, 0x64a, 0x207, 0x62e, 0x649, 0x207, 0x62e,
- 0x64a, 0x207, 0x635, 0x649, 0x207, 0x635, 0x64a, 0x207,
- 0x636, 0x649, 0x207, 0x636, 0x64a, 0x207, 0x634, 0x62c,
- 0x207, 0x634, 0x62d, 0x207, 0x634, 0x62e, 0x207, 0x634,
- 0x645, 0x207, 0x634, 0x631, 0x207, 0x633, 0x631, 0x207,
- 0x635, 0x631, 0x207, 0x636, 0x631, 0x206, 0x637, 0x649,
- 0x206, 0x637, 0x64a, 0x206, 0x639, 0x649, 0x206, 0x639,
- 0x64a, 0x206, 0x63a, 0x649, 0x206, 0x63a, 0x64a, 0x206,
- 0x633, 0x649, 0x206, 0x633, 0x64a, 0x206, 0x634, 0x649,
- 0x206, 0x634, 0x64a, 0x206, 0x62d, 0x649, 0x206, 0x62d,
- 0x64a, 0x206, 0x62c, 0x649, 0x206, 0x62c, 0x64a, 0x206,
- 0x62e, 0x649, 0x206, 0x62e, 0x64a, 0x206, 0x635, 0x649,
- 0x206, 0x635, 0x64a, 0x206, 0x636, 0x649, 0x206, 0x636,
- 0x64a, 0x206, 0x634, 0x62c, 0x206, 0x634, 0x62d, 0x206,
- 0x634, 0x62e, 0x206, 0x634, 0x645, 0x206, 0x634, 0x631,
- 0x206, 0x633, 0x631, 0x206, 0x635, 0x631, 0x206, 0x636,
- 0x631, 0x204, 0x634, 0x62c, 0x204, 0x634, 0x62d, 0x204,
- 0x634, 0x62e, 0x204, 0x634, 0x645, 0x204, 0x633, 0x647,
- 0x204, 0x634, 0x647, 0x204, 0x637, 0x645, 0x205, 0x633,
- 0x62c, 0x205, 0x633, 0x62d, 0x205, 0x633, 0x62e, 0x205,
- 0x634, 0x62c, 0x205, 0x634, 0x62d, 0x205, 0x634, 0x62e,
- 0x205, 0x637, 0x645, 0x205, 0x638, 0x645, 0x206, 0x627,
- 0x64b, 0x207, 0x627, 0x64b, 0x304, 0x62a, 0x62c, 0x645,
- 0x306, 0x62a, 0x62d, 0x62c, 0x304, 0x62a, 0x62d, 0x62c,
- 0x304, 0x62a, 0x62d, 0x645, 0x304, 0x62a, 0x62e, 0x645,
- 0x304, 0x62a, 0x645, 0x62c, 0x304, 0x62a, 0x645, 0x62d,
- 0x304, 0x62a, 0x645, 0x62e, 0x306, 0x62c, 0x645, 0x62d,
- 0x304, 0x62c, 0x645, 0x62d, 0x306, 0x62d, 0x645, 0x64a,
- 0x306, 0x62d, 0x645, 0x649, 0x304, 0x633, 0x62d, 0x62c,
- 0x304, 0x633, 0x62c, 0x62d, 0x306, 0x633, 0x62c, 0x649,
- 0x306, 0x633, 0x645, 0x62d, 0x304, 0x633, 0x645, 0x62d,
- 0x304, 0x633, 0x645, 0x62c, 0x306, 0x633, 0x645, 0x645,
- 0x304, 0x633, 0x645, 0x645, 0x306, 0x635, 0x62d, 0x62d,
- 0x304, 0x635, 0x62d, 0x62d, 0x306, 0x635, 0x645, 0x645,
- 0x306, 0x634, 0x62d, 0x645, 0x304, 0x634, 0x62d, 0x645,
- 0x306, 0x634, 0x62c, 0x64a, 0x306, 0x634, 0x645, 0x62e,
- 0x304, 0x634, 0x645, 0x62e, 0x306, 0x634, 0x645, 0x645,
- 0x304, 0x634, 0x645, 0x645, 0x306, 0x636, 0x62d, 0x649,
- 0x306, 0x636, 0x62e, 0x645, 0x304, 0x636, 0x62e, 0x645,
- 0x306, 0x637, 0x645, 0x62d, 0x304, 0x637, 0x645, 0x62d,
- 0x304, 0x637, 0x645, 0x645, 0x306, 0x637, 0x645, 0x64a,
- 0x306, 0x639, 0x62c, 0x645, 0x306, 0x639, 0x645, 0x645,
- 0x304, 0x639, 0x645, 0x645, 0x306, 0x639, 0x645, 0x649,
- 0x306, 0x63a, 0x645, 0x645, 0x306, 0x63a, 0x645, 0x64a,
- 0x306, 0x63a, 0x645, 0x649, 0x306, 0x641, 0x62e, 0x645,
- 0x304, 0x641, 0x62e, 0x645, 0x306, 0x642, 0x645, 0x62d,
- 0x306, 0x642, 0x645, 0x645, 0x306, 0x644, 0x62d, 0x645,
- 0x306, 0x644, 0x62d, 0x64a, 0x306, 0x644, 0x62d, 0x649,
- 0x304, 0x644, 0x62c, 0x62c, 0x306, 0x644, 0x62c, 0x62c,
- 0x306, 0x644, 0x62e, 0x645, 0x304, 0x644, 0x62e, 0x645,
- 0x306, 0x644, 0x645, 0x62d, 0x304, 0x644, 0x645, 0x62d,
- 0x304, 0x645, 0x62d, 0x62c, 0x304, 0x645, 0x62d, 0x645,
- 0x306, 0x645, 0x62d, 0x64a, 0x304, 0x645, 0x62c, 0x62d,
- 0x304, 0x645, 0x62c, 0x645, 0x304, 0x645, 0x62e, 0x62c,
- 0x304, 0x645, 0x62e, 0x645, 0x304, 0x645, 0x62c, 0x62e,
- 0x304, 0x647, 0x645, 0x62c, 0x304, 0x647, 0x645, 0x645,
- 0x304, 0x646, 0x62d, 0x645, 0x306, 0x646, 0x62d, 0x649,
- 0x306, 0x646, 0x62c, 0x645, 0x304, 0x646, 0x62c, 0x645,
- 0x306, 0x646, 0x62c, 0x649, 0x306, 0x646, 0x645, 0x64a,
- 0x306, 0x646, 0x645, 0x649, 0x306, 0x64a, 0x645, 0x645,
- 0x304, 0x64a, 0x645, 0x645, 0x306, 0x628, 0x62e, 0x64a,
- 0x306, 0x62a, 0x62c, 0x64a, 0x306, 0x62a, 0x62c, 0x649,
- 0x306, 0x62a, 0x62e, 0x64a, 0x306, 0x62a, 0x62e, 0x649,
- 0x306, 0x62a, 0x645, 0x64a, 0x306, 0x62a, 0x645, 0x649,
- 0x306, 0x62c, 0x645, 0x64a, 0x306, 0x62c, 0x62d, 0x649,
- 0x306, 0x62c, 0x645, 0x649, 0x306, 0x633, 0x62e, 0x649,
- 0x306, 0x635, 0x62d, 0x64a, 0x306, 0x634, 0x62d, 0x64a,
- 0x306, 0x636, 0x62d, 0x64a, 0x306, 0x644, 0x62c, 0x64a,
- 0x306, 0x644, 0x645, 0x64a, 0x306, 0x64a, 0x62d, 0x64a,
- 0x306, 0x64a, 0x62c, 0x64a, 0x306, 0x64a, 0x645, 0x64a,
- 0x306, 0x645, 0x645, 0x64a, 0x306, 0x642, 0x645, 0x64a,
- 0x306, 0x646, 0x62d, 0x64a, 0x304, 0x642, 0x645, 0x62d,
- 0x304, 0x644, 0x62d, 0x645, 0x306, 0x639, 0x645, 0x64a,
- 0x306, 0x643, 0x645, 0x64a, 0x304, 0x646, 0x62c, 0x62d,
- 0x306, 0x645, 0x62e, 0x64a, 0x304, 0x644, 0x62c, 0x645,
- 0x306, 0x643, 0x645, 0x645, 0x306, 0x644, 0x62c, 0x645,
- 0x306, 0x646, 0x62c, 0x62d, 0x306, 0x62c, 0x62d, 0x64a,
- 0x306, 0x62d, 0x62c, 0x64a, 0x306, 0x645, 0x62c, 0x64a,
- 0x306, 0x641, 0x645, 0x64a, 0x306, 0x628, 0x62d, 0x64a,
- 0x304, 0x643, 0x645, 0x645, 0x304, 0x639, 0x62c, 0x645,
- 0x304, 0x635, 0x645, 0x645, 0x306, 0x633, 0x62e, 0x64a,
- 0x306, 0x646, 0x62c, 0x64a, 0x307, 0x635, 0x644, 0x6d2,
- 0x307, 0x642, 0x644, 0x6d2, 0x407, 0x627, 0x644, 0x644,
- 0x647, 0x407, 0x627, 0x643, 0x628, 0x631, 0x407, 0x645,
- 0x62d, 0x645, 0x62f, 0x407, 0x635, 0x644, 0x639, 0x645,
- 0x407, 0x631, 0x633, 0x648, 0x644, 0x407, 0x639, 0x644,
- 0x64a, 0x647, 0x407, 0x648, 0x633, 0x644, 0x645, 0x307,
- 0x635, 0x644, 0x649, 0x1207, 0x635, 0x644, 0x649, 0x20,
- 0x627, 0x644, 0x644, 0x647, 0x20, 0x639, 0x644, 0x64a,
- 0x647, 0x20, 0x648, 0x633, 0x644, 0x645, 0x807, 0x62c,
- 0x644, 0x20, 0x62c, 0x644, 0x627, 0x644, 0x647, 0x407,
- 0x631, 0x6cc, 0x627, 0x644, 0x10b, 0x2c, 0x10b, 0x3001,
- 0x10b, 0x3002, 0x10b, 0x3a, 0x10b, 0x3b, 0x10b, 0x21,
- 0x10b, 0x3f, 0x10b, 0x3016, 0x10b, 0x3017, 0x10b, 0x2026,
- 0x10b, 0x2025, 0x10b, 0x2014, 0x10b, 0x2013, 0x10b, 0x5f,
- 0x10b, 0x5f, 0x10b, 0x28, 0x10b, 0x29, 0x10b, 0x7b,
- 0x10b, 0x7d, 0x10b, 0x3014, 0x10b, 0x3015, 0x10b, 0x3010,
- 0x10b, 0x3011, 0x10b, 0x300a, 0x10b, 0x300b, 0x10b, 0x3008,
- 0x10b, 0x3009, 0x10b, 0x300c, 0x10b, 0x300d, 0x10b, 0x300e,
- 0x10b, 0x300f, 0x10b, 0x5b, 0x10b, 0x5d, 0x110, 0x203e,
- 0x110, 0x203e, 0x110, 0x203e, 0x110, 0x203e, 0x110, 0x5f,
- 0x110, 0x5f, 0x110, 0x5f, 0x10e, 0x2c, 0x10e, 0x3001,
- 0x10e, 0x2e, 0x10e, 0x3b, 0x10e, 0x3a, 0x10e, 0x3f,
- 0x10e, 0x21, 0x10e, 0x2014, 0x10e, 0x28, 0x10e, 0x29,
- 0x10e, 0x7b, 0x10e, 0x7d, 0x10e, 0x3014, 0x10e, 0x3015,
- 0x10e, 0x23, 0x10e, 0x26, 0x10e, 0x2a, 0x10e, 0x2b,
- 0x10e, 0x2d, 0x10e, 0x3c, 0x10e, 0x3e, 0x10e, 0x3d,
- 0x10e, 0x5c, 0x10e, 0x24, 0x10e, 0x25, 0x10e, 0x40,
- 0x207, 0x20, 0x64b, 0x205, 0x640, 0x64b, 0x207, 0x20,
- 0x64c, 0x207, 0x20, 0x64d, 0x207, 0x20, 0x64e, 0x205,
- 0x640, 0x64e, 0x207, 0x20, 0x64f, 0x205, 0x640, 0x64f,
- 0x207, 0x20, 0x650, 0x205, 0x640, 0x650, 0x207, 0x20,
- 0x651, 0x205, 0x640, 0x651, 0x207, 0x20, 0x652, 0x205,
- 0x640, 0x652, 0x107, 0x621, 0x107, 0x622, 0x106, 0x622,
- 0x107, 0x623, 0x106, 0x623, 0x107, 0x624, 0x106, 0x624,
- 0x107, 0x625, 0x106, 0x625, 0x107, 0x626, 0x106, 0x626,
- 0x104, 0x626, 0x105, 0x626, 0x107, 0x627, 0x106, 0x627,
- 0x107, 0x628, 0x106, 0x628, 0x104, 0x628, 0x105, 0x628,
- 0x107, 0x629, 0x106, 0x629, 0x107, 0x62a, 0x106, 0x62a,
- 0x104, 0x62a, 0x105, 0x62a, 0x107, 0x62b, 0x106, 0x62b,
- 0x104, 0x62b, 0x105, 0x62b, 0x107, 0x62c, 0x106, 0x62c,
- 0x104, 0x62c, 0x105, 0x62c, 0x107, 0x62d, 0x106, 0x62d,
- 0x104, 0x62d, 0x105, 0x62d, 0x107, 0x62e, 0x106, 0x62e,
- 0x104, 0x62e, 0x105, 0x62e, 0x107, 0x62f, 0x106, 0x62f,
- 0x107, 0x630, 0x106, 0x630, 0x107, 0x631, 0x106, 0x631,
- 0x107, 0x632, 0x106, 0x632, 0x107, 0x633, 0x106, 0x633,
- 0x104, 0x633, 0x105, 0x633, 0x107, 0x634, 0x106, 0x634,
- 0x104, 0x634, 0x105, 0x634, 0x107, 0x635, 0x106, 0x635,
- 0x104, 0x635, 0x105, 0x635, 0x107, 0x636, 0x106, 0x636,
- 0x104, 0x636, 0x105, 0x636, 0x107, 0x637, 0x106, 0x637,
- 0x104, 0x637, 0x105, 0x637, 0x107, 0x638, 0x106, 0x638,
- 0x104, 0x638, 0x105, 0x638, 0x107, 0x639, 0x106, 0x639,
- 0x104, 0x639, 0x105, 0x639, 0x107, 0x63a, 0x106, 0x63a,
- 0x104, 0x63a, 0x105, 0x63a, 0x107, 0x641, 0x106, 0x641,
- 0x104, 0x641, 0x105, 0x641, 0x107, 0x642, 0x106, 0x642,
- 0x104, 0x642, 0x105, 0x642, 0x107, 0x643, 0x106, 0x643,
- 0x104, 0x643, 0x105, 0x643, 0x107, 0x644, 0x106, 0x644,
- 0x104, 0x644, 0x105, 0x644, 0x107, 0x645, 0x106, 0x645,
- 0x104, 0x645, 0x105, 0x645, 0x107, 0x646, 0x106, 0x646,
- 0x104, 0x646, 0x105, 0x646, 0x107, 0x647, 0x106, 0x647,
- 0x104, 0x647, 0x105, 0x647, 0x107, 0x648, 0x106, 0x648,
- 0x107, 0x649, 0x106, 0x649, 0x107, 0x64a, 0x106, 0x64a,
- 0x104, 0x64a, 0x105, 0x64a, 0x207, 0x644, 0x622, 0x206,
- 0x644, 0x622, 0x207, 0x644, 0x623, 0x206, 0x644, 0x623,
- 0x207, 0x644, 0x625, 0x206, 0x644, 0x625, 0x207, 0x644,
- 0x627, 0x206, 0x644, 0x627, 0x10c, 0x21, 0x10c, 0x22,
- 0x10c, 0x23, 0x10c, 0x24, 0x10c, 0x25, 0x10c, 0x26,
- 0x10c, 0x27, 0x10c, 0x28, 0x10c, 0x29, 0x10c, 0x2a,
- 0x10c, 0x2b, 0x10c, 0x2c, 0x10c, 0x2d, 0x10c, 0x2e,
- 0x10c, 0x2f, 0x10c, 0x30, 0x10c, 0x31, 0x10c, 0x32,
- 0x10c, 0x33, 0x10c, 0x34, 0x10c, 0x35, 0x10c, 0x36,
- 0x10c, 0x37, 0x10c, 0x38, 0x10c, 0x39, 0x10c, 0x3a,
- 0x10c, 0x3b, 0x10c, 0x3c, 0x10c, 0x3d, 0x10c, 0x3e,
- 0x10c, 0x3f, 0x10c, 0x40, 0x10c, 0x41, 0x10c, 0x42,
- 0x10c, 0x43, 0x10c, 0x44, 0x10c, 0x45, 0x10c, 0x46,
- 0x10c, 0x47, 0x10c, 0x48, 0x10c, 0x49, 0x10c, 0x4a,
- 0x10c, 0x4b, 0x10c, 0x4c, 0x10c, 0x4d, 0x10c, 0x4e,
- 0x10c, 0x4f, 0x10c, 0x50, 0x10c, 0x51, 0x10c, 0x52,
- 0x10c, 0x53, 0x10c, 0x54, 0x10c, 0x55, 0x10c, 0x56,
- 0x10c, 0x57, 0x10c, 0x58, 0x10c, 0x59, 0x10c, 0x5a,
- 0x10c, 0x5b, 0x10c, 0x5c, 0x10c, 0x5d, 0x10c, 0x5e,
- 0x10c, 0x5f, 0x10c, 0x60, 0x10c, 0x61, 0x10c, 0x62,
- 0x10c, 0x63, 0x10c, 0x64, 0x10c, 0x65, 0x10c, 0x66,
- 0x10c, 0x67, 0x10c, 0x68, 0x10c, 0x69, 0x10c, 0x6a,
- 0x10c, 0x6b, 0x10c, 0x6c, 0x10c, 0x6d, 0x10c, 0x6e,
- 0x10c, 0x6f, 0x10c, 0x70, 0x10c, 0x71, 0x10c, 0x72,
- 0x10c, 0x73, 0x10c, 0x74, 0x10c, 0x75, 0x10c, 0x76,
- 0x10c, 0x77, 0x10c, 0x78, 0x10c, 0x79, 0x10c, 0x7a,
- 0x10c, 0x7b, 0x10c, 0x7c, 0x10c, 0x7d, 0x10c, 0x7e,
- 0x10c, 0x2985, 0x10c, 0x2986, 0x10d, 0x3002, 0x10d, 0x300c,
- 0x10d, 0x300d, 0x10d, 0x3001, 0x10d, 0x30fb, 0x10d, 0x30f2,
- 0x10d, 0x30a1, 0x10d, 0x30a3, 0x10d, 0x30a5, 0x10d, 0x30a7,
- 0x10d, 0x30a9, 0x10d, 0x30e3, 0x10d, 0x30e5, 0x10d, 0x30e7,
- 0x10d, 0x30c3, 0x10d, 0x30fc, 0x10d, 0x30a2, 0x10d, 0x30a4,
- 0x10d, 0x30a6, 0x10d, 0x30a8, 0x10d, 0x30aa, 0x10d, 0x30ab,
- 0x10d, 0x30ad, 0x10d, 0x30af, 0x10d, 0x30b1, 0x10d, 0x30b3,
- 0x10d, 0x30b5, 0x10d, 0x30b7, 0x10d, 0x30b9, 0x10d, 0x30bb,
- 0x10d, 0x30bd, 0x10d, 0x30bf, 0x10d, 0x30c1, 0x10d, 0x30c4,
- 0x10d, 0x30c6, 0x10d, 0x30c8, 0x10d, 0x30ca, 0x10d, 0x30cb,
- 0x10d, 0x30cc, 0x10d, 0x30cd, 0x10d, 0x30ce, 0x10d, 0x30cf,
- 0x10d, 0x30d2, 0x10d, 0x30d5, 0x10d, 0x30d8, 0x10d, 0x30db,
- 0x10d, 0x30de, 0x10d, 0x30df, 0x10d, 0x30e0, 0x10d, 0x30e1,
- 0x10d, 0x30e2, 0x10d, 0x30e4, 0x10d, 0x30e6, 0x10d, 0x30e8,
- 0x10d, 0x30e9, 0x10d, 0x30ea, 0x10d, 0x30eb, 0x10d, 0x30ec,
- 0x10d, 0x30ed, 0x10d, 0x30ef, 0x10d, 0x30f3, 0x10d, 0x3099,
- 0x10d, 0x309a, 0x10d, 0x3164, 0x10d, 0x3131, 0x10d, 0x3132,
- 0x10d, 0x3133, 0x10d, 0x3134, 0x10d, 0x3135, 0x10d, 0x3136,
- 0x10d, 0x3137, 0x10d, 0x3138, 0x10d, 0x3139, 0x10d, 0x313a,
- 0x10d, 0x313b, 0x10d, 0x313c, 0x10d, 0x313d, 0x10d, 0x313e,
- 0x10d, 0x313f, 0x10d, 0x3140, 0x10d, 0x3141, 0x10d, 0x3142,
- 0x10d, 0x3143, 0x10d, 0x3144, 0x10d, 0x3145, 0x10d, 0x3146,
- 0x10d, 0x3147, 0x10d, 0x3148, 0x10d, 0x3149, 0x10d, 0x314a,
- 0x10d, 0x314b, 0x10d, 0x314c, 0x10d, 0x314d, 0x10d, 0x314e,
- 0x10d, 0x314f, 0x10d, 0x3150, 0x10d, 0x3151, 0x10d, 0x3152,
- 0x10d, 0x3153, 0x10d, 0x3154, 0x10d, 0x3155, 0x10d, 0x3156,
- 0x10d, 0x3157, 0x10d, 0x3158, 0x10d, 0x3159, 0x10d, 0x315a,
- 0x10d, 0x315b, 0x10d, 0x315c, 0x10d, 0x315d, 0x10d, 0x315e,
- 0x10d, 0x315f, 0x10d, 0x3160, 0x10d, 0x3161, 0x10d, 0x3162,
- 0x10d, 0x3163, 0x10c, 0xa2, 0x10c, 0xa3, 0x10c, 0xac,
- 0x10c, 0xaf, 0x10c, 0xa6, 0x10c, 0xa5, 0x10c, 0x20a9,
- 0x10d, 0x2502, 0x10d, 0x2190, 0x10d, 0x2191, 0x10d, 0x2192,
- 0x10d, 0x2193, 0x10d, 0x25a0, 0x10d, 0x25cb, 0x401, 0xd804,
- 0xdc99, 0xd804, 0xdcba, 0x401, 0xd804, 0xdc9b, 0xd804, 0xdcba,
- 0x401, 0xd804, 0xdca5, 0xd804, 0xdcba, 0x401, 0xd804, 0xdd31,
- 0xd804, 0xdd27, 0x401, 0xd804, 0xdd32, 0xd804, 0xdd27, 0x401,
- 0xd804, 0xdf47, 0xd804, 0xdf3e, 0x401, 0xd804, 0xdf47, 0xd804,
- 0xdf57, 0x401, 0xd805, 0xdcb9, 0xd805, 0xdcba, 0x401, 0xd805,
- 0xdcb9, 0xd805, 0xdcb0, 0x401, 0xd805, 0xdcb9, 0xd805, 0xdcbd,
- 0x401, 0xd805, 0xddb8, 0xd805, 0xddaf, 0x401, 0xd805, 0xddb9,
- 0xd805, 0xddaf, 0x401, 0xd834, 0xdd57, 0xd834, 0xdd65, 0x401,
- 0xd834, 0xdd58, 0xd834, 0xdd65, 0x401, 0xd834, 0xdd5f, 0xd834,
- 0xdd6e, 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd6f, 0x401, 0xd834,
- 0xdd5f, 0xd834, 0xdd70, 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd71,
- 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd72, 0x401, 0xd834, 0xddb9,
- 0xd834, 0xdd65, 0x401, 0xd834, 0xddba, 0xd834, 0xdd65, 0x401,
- 0xd834, 0xddbb, 0xd834, 0xdd6e, 0x401, 0xd834, 0xddbc, 0xd834,
- 0xdd6e, 0x401, 0xd834, 0xddbb, 0xd834, 0xdd6f, 0x401, 0xd834,
- 0xddbc, 0xd834, 0xdd6f, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x69, 0x102,
- 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
- 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
- 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
- 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
- 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x43, 0x102,
- 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
- 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102,
- 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102,
- 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, 0x53, 0x102,
- 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
- 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
- 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
- 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
- 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
- 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
- 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
- 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
- 0x7a, 0x102, 0x41, 0x102, 0x43, 0x102, 0x44, 0x102,
- 0x47, 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x53, 0x102,
- 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
- 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
- 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x66, 0x102,
- 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102,
- 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x61, 0x102,
- 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
- 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
- 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
- 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
- 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
- 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
- 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x44, 0x102,
- 0x45, 0x102, 0x46, 0x102, 0x47, 0x102, 0x49, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4f, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102,
- 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x131, 0x102, 0x237, 0x102,
- 0x391, 0x102, 0x392, 0x102, 0x393, 0x102, 0x394, 0x102,
- 0x395, 0x102, 0x396, 0x102, 0x397, 0x102, 0x398, 0x102,
- 0x399, 0x102, 0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102,
- 0x39d, 0x102, 0x39e, 0x102, 0x39f, 0x102, 0x3a0, 0x102,
- 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3, 0x102, 0x3a4, 0x102,
- 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7, 0x102, 0x3a8, 0x102,
- 0x3a9, 0x102, 0x2207, 0x102, 0x3b1, 0x102, 0x3b2, 0x102,
- 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5, 0x102, 0x3b6, 0x102,
- 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9, 0x102, 0x3ba, 0x102,
- 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd, 0x102, 0x3be, 0x102,
- 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1, 0x102, 0x3c2, 0x102,
- 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5, 0x102, 0x3c6, 0x102,
- 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9, 0x102, 0x2202, 0x102,
- 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0, 0x102, 0x3d5, 0x102,
- 0x3f1, 0x102, 0x3d6, 0x102, 0x391, 0x102, 0x392, 0x102,
- 0x393, 0x102, 0x394, 0x102, 0x395, 0x102, 0x396, 0x102,
- 0x397, 0x102, 0x398, 0x102, 0x399, 0x102, 0x39a, 0x102,
- 0x39b, 0x102, 0x39c, 0x102, 0x39d, 0x102, 0x39e, 0x102,
- 0x39f, 0x102, 0x3a0, 0x102, 0x3a1, 0x102, 0x3f4, 0x102,
- 0x3a3, 0x102, 0x3a4, 0x102, 0x3a5, 0x102, 0x3a6, 0x102,
- 0x3a7, 0x102, 0x3a8, 0x102, 0x3a9, 0x102, 0x2207, 0x102,
- 0x3b1, 0x102, 0x3b2, 0x102, 0x3b3, 0x102, 0x3b4, 0x102,
- 0x3b5, 0x102, 0x3b6, 0x102, 0x3b7, 0x102, 0x3b8, 0x102,
- 0x3b9, 0x102, 0x3ba, 0x102, 0x3bb, 0x102, 0x3bc, 0x102,
- 0x3bd, 0x102, 0x3be, 0x102, 0x3bf, 0x102, 0x3c0, 0x102,
- 0x3c1, 0x102, 0x3c2, 0x102, 0x3c3, 0x102, 0x3c4, 0x102,
- 0x3c5, 0x102, 0x3c6, 0x102, 0x3c7, 0x102, 0x3c8, 0x102,
- 0x3c9, 0x102, 0x2202, 0x102, 0x3f5, 0x102, 0x3d1, 0x102,
- 0x3f0, 0x102, 0x3d5, 0x102, 0x3f1, 0x102, 0x3d6, 0x102,
- 0x391, 0x102, 0x392, 0x102, 0x393, 0x102, 0x394, 0x102,
- 0x395, 0x102, 0x396, 0x102, 0x397, 0x102, 0x398, 0x102,
- 0x399, 0x102, 0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102,
- 0x39d, 0x102, 0x39e, 0x102, 0x39f, 0x102, 0x3a0, 0x102,
- 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3, 0x102, 0x3a4, 0x102,
- 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7, 0x102, 0x3a8, 0x102,
- 0x3a9, 0x102, 0x2207, 0x102, 0x3b1, 0x102, 0x3b2, 0x102,
- 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5, 0x102, 0x3b6, 0x102,
- 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9, 0x102, 0x3ba, 0x102,
- 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd, 0x102, 0x3be, 0x102,
- 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1, 0x102, 0x3c2, 0x102,
- 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5, 0x102, 0x3c6, 0x102,
- 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9, 0x102, 0x2202, 0x102,
- 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0, 0x102, 0x3d5, 0x102,
- 0x3f1, 0x102, 0x3d6, 0x102, 0x391, 0x102, 0x392, 0x102,
- 0x393, 0x102, 0x394, 0x102, 0x395, 0x102, 0x396, 0x102,
- 0x397, 0x102, 0x398, 0x102, 0x399, 0x102, 0x39a, 0x102,
- 0x39b, 0x102, 0x39c, 0x102, 0x39d, 0x102, 0x39e, 0x102,
- 0x39f, 0x102, 0x3a0, 0x102, 0x3a1, 0x102, 0x3f4, 0x102,
- 0x3a3, 0x102, 0x3a4, 0x102, 0x3a5, 0x102, 0x3a6, 0x102,
- 0x3a7, 0x102, 0x3a8, 0x102, 0x3a9, 0x102, 0x2207, 0x102,
- 0x3b1, 0x102, 0x3b2, 0x102, 0x3b3, 0x102, 0x3b4, 0x102,
- 0x3b5, 0x102, 0x3b6, 0x102, 0x3b7, 0x102, 0x3b8, 0x102,
- 0x3b9, 0x102, 0x3ba, 0x102, 0x3bb, 0x102, 0x3bc, 0x102,
- 0x3bd, 0x102, 0x3be, 0x102, 0x3bf, 0x102, 0x3c0, 0x102,
- 0x3c1, 0x102, 0x3c2, 0x102, 0x3c3, 0x102, 0x3c4, 0x102,
- 0x3c5, 0x102, 0x3c6, 0x102, 0x3c7, 0x102, 0x3c8, 0x102,
- 0x3c9, 0x102, 0x2202, 0x102, 0x3f5, 0x102, 0x3d1, 0x102,
- 0x3f0, 0x102, 0x3d5, 0x102, 0x3f1, 0x102, 0x3d6, 0x102,
- 0x391, 0x102, 0x392, 0x102, 0x393, 0x102, 0x394, 0x102,
- 0x395, 0x102, 0x396, 0x102, 0x397, 0x102, 0x398, 0x102,
- 0x399, 0x102, 0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102,
- 0x39d, 0x102, 0x39e, 0x102, 0x39f, 0x102, 0x3a0, 0x102,
- 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3, 0x102, 0x3a4, 0x102,
- 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7, 0x102, 0x3a8, 0x102,
- 0x3a9, 0x102, 0x2207, 0x102, 0x3b1, 0x102, 0x3b2, 0x102,
- 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5, 0x102, 0x3b6, 0x102,
- 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9, 0x102, 0x3ba, 0x102,
- 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd, 0x102, 0x3be, 0x102,
- 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1, 0x102, 0x3c2, 0x102,
- 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5, 0x102, 0x3c6, 0x102,
- 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9, 0x102, 0x2202, 0x102,
- 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0, 0x102, 0x3d5, 0x102,
- 0x3f1, 0x102, 0x3d6, 0x102, 0x3dc, 0x102, 0x3dd, 0x102,
- 0x30, 0x102, 0x31, 0x102, 0x32, 0x102, 0x33, 0x102,
- 0x34, 0x102, 0x35, 0x102, 0x36, 0x102, 0x37, 0x102,
- 0x38, 0x102, 0x39, 0x102, 0x30, 0x102, 0x31, 0x102,
- 0x32, 0x102, 0x33, 0x102, 0x34, 0x102, 0x35, 0x102,
- 0x36, 0x102, 0x37, 0x102, 0x38, 0x102, 0x39, 0x102,
- 0x30, 0x102, 0x31, 0x102, 0x32, 0x102, 0x33, 0x102,
- 0x34, 0x102, 0x35, 0x102, 0x36, 0x102, 0x37, 0x102,
- 0x38, 0x102, 0x39, 0x102, 0x30, 0x102, 0x31, 0x102,
- 0x32, 0x102, 0x33, 0x102, 0x34, 0x102, 0x35, 0x102,
- 0x36, 0x102, 0x37, 0x102, 0x38, 0x102, 0x39, 0x102,
- 0x30, 0x102, 0x31, 0x102, 0x32, 0x102, 0x33, 0x102,
- 0x34, 0x102, 0x35, 0x102, 0x36, 0x102, 0x37, 0x102,
- 0x38, 0x102, 0x39, 0x102, 0x627, 0x102, 0x628, 0x102,
- 0x62c, 0x102, 0x62f, 0x102, 0x648, 0x102, 0x632, 0x102,
- 0x62d, 0x102, 0x637, 0x102, 0x64a, 0x102, 0x643, 0x102,
- 0x644, 0x102, 0x645, 0x102, 0x646, 0x102, 0x633, 0x102,
- 0x639, 0x102, 0x641, 0x102, 0x635, 0x102, 0x642, 0x102,
- 0x631, 0x102, 0x634, 0x102, 0x62a, 0x102, 0x62b, 0x102,
- 0x62e, 0x102, 0x630, 0x102, 0x636, 0x102, 0x638, 0x102,
- 0x63a, 0x102, 0x66e, 0x102, 0x6ba, 0x102, 0x6a1, 0x102,
- 0x66f, 0x102, 0x628, 0x102, 0x62c, 0x102, 0x647, 0x102,
- 0x62d, 0x102, 0x64a, 0x102, 0x643, 0x102, 0x644, 0x102,
- 0x645, 0x102, 0x646, 0x102, 0x633, 0x102, 0x639, 0x102,
- 0x641, 0x102, 0x635, 0x102, 0x642, 0x102, 0x634, 0x102,
- 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102, 0x636, 0x102,
- 0x63a, 0x102, 0x62c, 0x102, 0x62d, 0x102, 0x64a, 0x102,
- 0x644, 0x102, 0x646, 0x102, 0x633, 0x102, 0x639, 0x102,
- 0x635, 0x102, 0x642, 0x102, 0x634, 0x102, 0x62e, 0x102,
- 0x636, 0x102, 0x63a, 0x102, 0x6ba, 0x102, 0x66f, 0x102,
- 0x628, 0x102, 0x62c, 0x102, 0x647, 0x102, 0x62d, 0x102,
- 0x637, 0x102, 0x64a, 0x102, 0x643, 0x102, 0x645, 0x102,
- 0x646, 0x102, 0x633, 0x102, 0x639, 0x102, 0x641, 0x102,
- 0x635, 0x102, 0x642, 0x102, 0x634, 0x102, 0x62a, 0x102,
- 0x62b, 0x102, 0x62e, 0x102, 0x636, 0x102, 0x638, 0x102,
- 0x63a, 0x102, 0x66e, 0x102, 0x6a1, 0x102, 0x627, 0x102,
- 0x628, 0x102, 0x62c, 0x102, 0x62f, 0x102, 0x647, 0x102,
- 0x648, 0x102, 0x632, 0x102, 0x62d, 0x102, 0x637, 0x102,
- 0x64a, 0x102, 0x644, 0x102, 0x645, 0x102, 0x646, 0x102,
- 0x633, 0x102, 0x639, 0x102, 0x641, 0x102, 0x635, 0x102,
- 0x642, 0x102, 0x631, 0x102, 0x634, 0x102, 0x62a, 0x102,
- 0x62b, 0x102, 0x62e, 0x102, 0x630, 0x102, 0x636, 0x102,
- 0x638, 0x102, 0x63a, 0x102, 0x628, 0x102, 0x62c, 0x102,
- 0x62f, 0x102, 0x648, 0x102, 0x632, 0x102, 0x62d, 0x102,
- 0x637, 0x102, 0x64a, 0x102, 0x644, 0x102, 0x645, 0x102,
- 0x646, 0x102, 0x633, 0x102, 0x639, 0x102, 0x641, 0x102,
- 0x635, 0x102, 0x642, 0x102, 0x631, 0x102, 0x634, 0x102,
- 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102, 0x630, 0x102,
- 0x636, 0x102, 0x638, 0x102, 0x63a, 0x210, 0x30, 0x2e,
- 0x210, 0x30, 0x2c, 0x210, 0x31, 0x2c, 0x210, 0x32,
- 0x2c, 0x210, 0x33, 0x2c, 0x210, 0x34, 0x2c, 0x210,
- 0x35, 0x2c, 0x210, 0x36, 0x2c, 0x210, 0x37, 0x2c,
- 0x210, 0x38, 0x2c, 0x210, 0x39, 0x2c, 0x310, 0x28,
- 0x41, 0x29, 0x310, 0x28, 0x42, 0x29, 0x310, 0x28,
- 0x43, 0x29, 0x310, 0x28, 0x44, 0x29, 0x310, 0x28,
- 0x45, 0x29, 0x310, 0x28, 0x46, 0x29, 0x310, 0x28,
- 0x47, 0x29, 0x310, 0x28, 0x48, 0x29, 0x310, 0x28,
- 0x49, 0x29, 0x310, 0x28, 0x4a, 0x29, 0x310, 0x28,
- 0x4b, 0x29, 0x310, 0x28, 0x4c, 0x29, 0x310, 0x28,
- 0x4d, 0x29, 0x310, 0x28, 0x4e, 0x29, 0x310, 0x28,
- 0x4f, 0x29, 0x310, 0x28, 0x50, 0x29, 0x310, 0x28,
- 0x51, 0x29, 0x310, 0x28, 0x52, 0x29, 0x310, 0x28,
- 0x53, 0x29, 0x310, 0x28, 0x54, 0x29, 0x310, 0x28,
- 0x55, 0x29, 0x310, 0x28, 0x56, 0x29, 0x310, 0x28,
- 0x57, 0x29, 0x310, 0x28, 0x58, 0x29, 0x310, 0x28,
- 0x59, 0x29, 0x310, 0x28, 0x5a, 0x29, 0x310, 0x3014,
- 0x53, 0x3015, 0x108, 0x43, 0x108, 0x52, 0x208, 0x43,
- 0x44, 0x208, 0x57, 0x5a, 0x10f, 0x41, 0x10f, 0x42,
- 0x10f, 0x43, 0x10f, 0x44, 0x10f, 0x45, 0x10f, 0x46,
- 0x10f, 0x47, 0x10f, 0x48, 0x10f, 0x49, 0x10f, 0x4a,
- 0x10f, 0x4b, 0x10f, 0x4c, 0x10f, 0x4d, 0x10f, 0x4e,
- 0x10f, 0x4f, 0x10f, 0x50, 0x10f, 0x51, 0x10f, 0x52,
- 0x10f, 0x53, 0x10f, 0x54, 0x10f, 0x55, 0x10f, 0x56,
- 0x10f, 0x57, 0x10f, 0x58, 0x10f, 0x59, 0x10f, 0x5a,
- 0x20f, 0x48, 0x56, 0x20f, 0x4d, 0x56, 0x20f, 0x53,
- 0x44, 0x20f, 0x53, 0x53, 0x30f, 0x50, 0x50, 0x56,
- 0x20f, 0x57, 0x43, 0x209, 0x4d, 0x43, 0x209, 0x4d,
- 0x44, 0x20f, 0x44, 0x4a, 0x20f, 0x307b, 0x304b, 0x20f,
- 0x30b3, 0x30b3, 0x10f, 0x30b5, 0x10f, 0x624b, 0x10f, 0x5b57,
- 0x10f, 0x53cc, 0x10f, 0x30c7, 0x10f, 0x4e8c, 0x10f, 0x591a,
- 0x10f, 0x89e3, 0x10f, 0x5929, 0x10f, 0x4ea4, 0x10f, 0x6620,
- 0x10f, 0x7121, 0x10f, 0x6599, 0x10f, 0x524d, 0x10f, 0x5f8c,
- 0x10f, 0x518d, 0x10f, 0x65b0, 0x10f, 0x521d, 0x10f, 0x7d42,
- 0x10f, 0x751f, 0x10f, 0x8ca9, 0x10f, 0x58f0, 0x10f, 0x5439,
- 0x10f, 0x6f14, 0x10f, 0x6295, 0x10f, 0x6355, 0x10f, 0x4e00,
- 0x10f, 0x4e09, 0x10f, 0x904a, 0x10f, 0x5de6, 0x10f, 0x4e2d,
- 0x10f, 0x53f3, 0x10f, 0x6307, 0x10f, 0x8d70, 0x10f, 0x6253,
- 0x10f, 0x7981, 0x10f, 0x7a7a, 0x10f, 0x5408, 0x10f, 0x6e80,
- 0x10f, 0x6709, 0x10f, 0x6708, 0x10f, 0x7533, 0x10f, 0x5272,
- 0x10f, 0x55b6, 0x10f, 0x914d, 0x310, 0x3014, 0x672c, 0x3015,
- 0x310, 0x3014, 0x4e09, 0x3015, 0x310, 0x3014, 0x4e8c, 0x3015,
- 0x310, 0x3014, 0x5b89, 0x3015, 0x310, 0x3014, 0x70b9, 0x3015,
- 0x310, 0x3014, 0x6253, 0x3015, 0x310, 0x3014, 0x76d7, 0x3015,
- 0x310, 0x3014, 0x52dd, 0x3015, 0x310, 0x3014, 0x6557, 0x3015,
- 0x108, 0x5f97, 0x108, 0x53ef, 0x101, 0x4e3d, 0x101, 0x4e38,
- 0x101, 0x4e41, 0x201, 0xd840, 0xdd22, 0x101, 0x4f60, 0x101,
- 0x4fae, 0x101, 0x4fbb, 0x101, 0x5002, 0x101, 0x507a, 0x101,
- 0x5099, 0x101, 0x50e7, 0x101, 0x50cf, 0x101, 0x349e, 0x201,
- 0xd841, 0xde3a, 0x101, 0x514d, 0x101, 0x5154, 0x101, 0x5164,
- 0x101, 0x5177, 0x201, 0xd841, 0xdd1c, 0x101, 0x34b9, 0x101,
- 0x5167, 0x101, 0x518d, 0x201, 0xd841, 0xdd4b, 0x101, 0x5197,
- 0x101, 0x51a4, 0x101, 0x4ecc, 0x101, 0x51ac, 0x101, 0x51b5,
- 0x201, 0xd864, 0xdddf, 0x101, 0x51f5, 0x101, 0x5203, 0x101,
- 0x34df, 0x101, 0x523b, 0x101, 0x5246, 0x101, 0x5272, 0x101,
- 0x5277, 0x101, 0x3515, 0x101, 0x52c7, 0x101, 0x52c9, 0x101,
- 0x52e4, 0x101, 0x52fa, 0x101, 0x5305, 0x101, 0x5306, 0x101,
- 0x5317, 0x101, 0x5349, 0x101, 0x5351, 0x101, 0x535a, 0x101,
- 0x5373, 0x101, 0x537d, 0x101, 0x537f, 0x101, 0x537f, 0x101,
- 0x537f, 0x201, 0xd842, 0xde2c, 0x101, 0x7070, 0x101, 0x53ca,
- 0x101, 0x53df, 0x201, 0xd842, 0xdf63, 0x101, 0x53eb, 0x101,
- 0x53f1, 0x101, 0x5406, 0x101, 0x549e, 0x101, 0x5438, 0x101,
- 0x5448, 0x101, 0x5468, 0x101, 0x54a2, 0x101, 0x54f6, 0x101,
- 0x5510, 0x101, 0x5553, 0x101, 0x5563, 0x101, 0x5584, 0x101,
- 0x5584, 0x101, 0x5599, 0x101, 0x55ab, 0x101, 0x55b3, 0x101,
- 0x55c2, 0x101, 0x5716, 0x101, 0x5606, 0x101, 0x5717, 0x101,
- 0x5651, 0x101, 0x5674, 0x101, 0x5207, 0x101, 0x58ee, 0x101,
- 0x57ce, 0x101, 0x57f4, 0x101, 0x580d, 0x101, 0x578b, 0x101,
- 0x5832, 0x101, 0x5831, 0x101, 0x58ac, 0x201, 0xd845, 0xdce4,
- 0x101, 0x58f2, 0x101, 0x58f7, 0x101, 0x5906, 0x101, 0x591a,
- 0x101, 0x5922, 0x101, 0x5962, 0x201, 0xd845, 0xdea8, 0x201,
- 0xd845, 0xdeea, 0x101, 0x59ec, 0x101, 0x5a1b, 0x101, 0x5a27,
- 0x101, 0x59d8, 0x101, 0x5a66, 0x101, 0x36ee, 0x101, 0x36fc,
- 0x101, 0x5b08, 0x101, 0x5b3e, 0x101, 0x5b3e, 0x201, 0xd846,
- 0xddc8, 0x101, 0x5bc3, 0x101, 0x5bd8, 0x101, 0x5be7, 0x101,
- 0x5bf3, 0x201, 0xd846, 0xdf18, 0x101, 0x5bff, 0x101, 0x5c06,
- 0x101, 0x5f53, 0x101, 0x5c22, 0x101, 0x3781, 0x101, 0x5c60,
- 0x101, 0x5c6e, 0x101, 0x5cc0, 0x101, 0x5c8d, 0x201, 0xd847,
- 0xdde4, 0x101, 0x5d43, 0x201, 0xd847, 0xdde6, 0x101, 0x5d6e,
- 0x101, 0x5d6b, 0x101, 0x5d7c, 0x101, 0x5de1, 0x101, 0x5de2,
- 0x101, 0x382f, 0x101, 0x5dfd, 0x101, 0x5e28, 0x101, 0x5e3d,
- 0x101, 0x5e69, 0x101, 0x3862, 0x201, 0xd848, 0xdd83, 0x101,
- 0x387c, 0x101, 0x5eb0, 0x101, 0x5eb3, 0x101, 0x5eb6, 0x101,
- 0x5eca, 0x201, 0xd868, 0xdf92, 0x101, 0x5efe, 0x201, 0xd848,
- 0xdf31, 0x201, 0xd848, 0xdf31, 0x101, 0x8201, 0x101, 0x5f22,
- 0x101, 0x5f22, 0x101, 0x38c7, 0x201, 0xd84c, 0xdeb8, 0x201,
- 0xd858, 0xddda, 0x101, 0x5f62, 0x101, 0x5f6b, 0x101, 0x38e3,
- 0x101, 0x5f9a, 0x101, 0x5fcd, 0x101, 0x5fd7, 0x101, 0x5ff9,
- 0x101, 0x6081, 0x101, 0x393a, 0x101, 0x391c, 0x101, 0x6094,
- 0x201, 0xd849, 0xded4, 0x101, 0x60c7, 0x101, 0x6148, 0x101,
- 0x614c, 0x101, 0x614e, 0x101, 0x614c, 0x101, 0x617a, 0x101,
- 0x618e, 0x101, 0x61b2, 0x101, 0x61a4, 0x101, 0x61af, 0x101,
- 0x61de, 0x101, 0x61f2, 0x101, 0x61f6, 0x101, 0x6210, 0x101,
- 0x621b, 0x101, 0x625d, 0x101, 0x62b1, 0x101, 0x62d4, 0x101,
- 0x6350, 0x201, 0xd84a, 0xdf0c, 0x101, 0x633d, 0x101, 0x62fc,
- 0x101, 0x6368, 0x101, 0x6383, 0x101, 0x63e4, 0x201, 0xd84a,
- 0xdff1, 0x101, 0x6422, 0x101, 0x63c5, 0x101, 0x63a9, 0x101,
- 0x3a2e, 0x101, 0x6469, 0x101, 0x647e, 0x101, 0x649d, 0x101,
- 0x6477, 0x101, 0x3a6c, 0x101, 0x654f, 0x101, 0x656c, 0x201,
- 0xd84c, 0xdc0a, 0x101, 0x65e3, 0x101, 0x66f8, 0x101, 0x6649,
- 0x101, 0x3b19, 0x101, 0x6691, 0x101, 0x3b08, 0x101, 0x3ae4,
- 0x101, 0x5192, 0x101, 0x5195, 0x101, 0x6700, 0x101, 0x669c,
- 0x101, 0x80ad, 0x101, 0x43d9, 0x101, 0x6717, 0x101, 0x671b,
- 0x101, 0x6721, 0x101, 0x675e, 0x101, 0x6753, 0x201, 0xd84c,
- 0xdfc3, 0x101, 0x3b49, 0x101, 0x67fa, 0x101, 0x6785, 0x101,
- 0x6852, 0x101, 0x6885, 0x201, 0xd84d, 0xdc6d, 0x101, 0x688e,
- 0x101, 0x681f, 0x101, 0x6914, 0x101, 0x3b9d, 0x101, 0x6942,
- 0x101, 0x69a3, 0x101, 0x69ea, 0x101, 0x6aa8, 0x201, 0xd84d,
- 0xdea3, 0x101, 0x6adb, 0x101, 0x3c18, 0x101, 0x6b21, 0x201,
- 0xd84e, 0xdca7, 0x101, 0x6b54, 0x101, 0x3c4e, 0x101, 0x6b72,
- 0x101, 0x6b9f, 0x101, 0x6bba, 0x101, 0x6bbb, 0x201, 0xd84e,
- 0xde8d, 0x201, 0xd847, 0xdd0b, 0x201, 0xd84e, 0xdefa, 0x101,
- 0x6c4e, 0x201, 0xd84f, 0xdcbc, 0x101, 0x6cbf, 0x101, 0x6ccd,
- 0x101, 0x6c67, 0x101, 0x6d16, 0x101, 0x6d3e, 0x101, 0x6d77,
- 0x101, 0x6d41, 0x101, 0x6d69, 0x101, 0x6d78, 0x101, 0x6d85,
- 0x201, 0xd84f, 0xdd1e, 0x101, 0x6d34, 0x101, 0x6e2f, 0x101,
- 0x6e6e, 0x101, 0x3d33, 0x101, 0x6ecb, 0x101, 0x6ec7, 0x201,
- 0xd84f, 0xded1, 0x101, 0x6df9, 0x101, 0x6f6e, 0x201, 0xd84f,
- 0xdf5e, 0x201, 0xd84f, 0xdf8e, 0x101, 0x6fc6, 0x101, 0x7039,
- 0x101, 0x701e, 0x101, 0x701b, 0x101, 0x3d96, 0x101, 0x704a,
- 0x101, 0x707d, 0x101, 0x7077, 0x101, 0x70ad, 0x201, 0xd841,
- 0xdd25, 0x101, 0x7145, 0x201, 0xd850, 0xde63, 0x101, 0x719c,
- 0x201, 0xd850, 0xdfab, 0x101, 0x7228, 0x101, 0x7235, 0x101,
- 0x7250, 0x201, 0xd851, 0xde08, 0x101, 0x7280, 0x101, 0x7295,
- 0x201, 0xd851, 0xdf35, 0x201, 0xd852, 0xdc14, 0x101, 0x737a,
- 0x101, 0x738b, 0x101, 0x3eac, 0x101, 0x73a5, 0x101, 0x3eb8,
- 0x101, 0x3eb8, 0x101, 0x7447, 0x101, 0x745c, 0x101, 0x7471,
- 0x101, 0x7485, 0x101, 0x74ca, 0x101, 0x3f1b, 0x101, 0x7524,
- 0x201, 0xd853, 0xdc36, 0x101, 0x753e, 0x201, 0xd853, 0xdc92,
- 0x101, 0x7570, 0x201, 0xd848, 0xdd9f, 0x101, 0x7610, 0x201,
- 0xd853, 0xdfa1, 0x201, 0xd853, 0xdfb8, 0x201, 0xd854, 0xdc44,
- 0x101, 0x3ffc, 0x101, 0x4008, 0x101, 0x76f4, 0x201, 0xd854,
- 0xdcf3, 0x201, 0xd854, 0xdcf2, 0x201, 0xd854, 0xdd19, 0x201,
- 0xd854, 0xdd33, 0x101, 0x771e, 0x101, 0x771f, 0x101, 0x771f,
- 0x101, 0x774a, 0x101, 0x4039, 0x101, 0x778b, 0x101, 0x4046,
- 0x101, 0x4096, 0x201, 0xd855, 0xdc1d, 0x101, 0x784e, 0x101,
- 0x788c, 0x101, 0x78cc, 0x101, 0x40e3, 0x201, 0xd855, 0xde26,
- 0x101, 0x7956, 0x201, 0xd855, 0xde9a, 0x201, 0xd855, 0xdec5,
- 0x101, 0x798f, 0x101, 0x79eb, 0x101, 0x412f, 0x101, 0x7a40,
- 0x101, 0x7a4a, 0x101, 0x7a4f, 0x201, 0xd856, 0xdd7c, 0x201,
- 0xd856, 0xdea7, 0x201, 0xd856, 0xdea7, 0x101, 0x7aee, 0x101,
- 0x4202, 0x201, 0xd856, 0xdfab, 0x101, 0x7bc6, 0x101, 0x7bc9,
- 0x101, 0x4227, 0x201, 0xd857, 0xdc80, 0x101, 0x7cd2, 0x101,
- 0x42a0, 0x101, 0x7ce8, 0x101, 0x7ce3, 0x101, 0x7d00, 0x201,
- 0xd857, 0xdf86, 0x101, 0x7d63, 0x101, 0x4301, 0x101, 0x7dc7,
- 0x101, 0x7e02, 0x101, 0x7e45, 0x101, 0x4334, 0x201, 0xd858,
- 0xde28, 0x201, 0xd858, 0xde47, 0x101, 0x4359, 0x201, 0xd858,
- 0xded9, 0x101, 0x7f7a, 0x201, 0xd858, 0xdf3e, 0x101, 0x7f95,
- 0x101, 0x7ffa, 0x101, 0x8005, 0x201, 0xd859, 0xdcda, 0x201,
- 0xd859, 0xdd23, 0x101, 0x8060, 0x201, 0xd859, 0xdda8, 0x101,
- 0x8070, 0x201, 0xd84c, 0xdf5f, 0x101, 0x43d5, 0x101, 0x80b2,
- 0x101, 0x8103, 0x101, 0x440b, 0x101, 0x813e, 0x101, 0x5ab5,
- 0x201, 0xd859, 0xdfa7, 0x201, 0xd859, 0xdfb5, 0x201, 0xd84c,
- 0xdf93, 0x201, 0xd84c, 0xdf9c, 0x101, 0x8201, 0x101, 0x8204,
- 0x101, 0x8f9e, 0x101, 0x446b, 0x101, 0x8291, 0x101, 0x828b,
- 0x101, 0x829d, 0x101, 0x52b3, 0x101, 0x82b1, 0x101, 0x82b3,
- 0x101, 0x82bd, 0x101, 0x82e6, 0x201, 0xd85a, 0xdf3c, 0x101,
- 0x82e5, 0x101, 0x831d, 0x101, 0x8363, 0x101, 0x83ad, 0x101,
- 0x8323, 0x101, 0x83bd, 0x101, 0x83e7, 0x101, 0x8457, 0x101,
- 0x8353, 0x101, 0x83ca, 0x101, 0x83cc, 0x101, 0x83dc, 0x201,
- 0xd85b, 0xdc36, 0x201, 0xd85b, 0xdd6b, 0x201, 0xd85b, 0xdcd5,
- 0x101, 0x452b, 0x101, 0x84f1, 0x101, 0x84f3, 0x101, 0x8516,
- 0x201, 0xd85c, 0xdfca, 0x101, 0x8564, 0x201, 0xd85b, 0xdf2c,
- 0x101, 0x455d, 0x101, 0x4561, 0x201, 0xd85b, 0xdfb1, 0x201,
- 0xd85c, 0xdcd2, 0x101, 0x456b, 0x101, 0x8650, 0x101, 0x865c,
- 0x101, 0x8667, 0x101, 0x8669, 0x101, 0x86a9, 0x101, 0x8688,
- 0x101, 0x870e, 0x101, 0x86e2, 0x101, 0x8779, 0x101, 0x8728,
- 0x101, 0x876b, 0x101, 0x8786, 0x101, 0x45d7, 0x101, 0x87e1,
- 0x101, 0x8801, 0x101, 0x45f9, 0x101, 0x8860, 0x101, 0x8863,
- 0x201, 0xd85d, 0xde67, 0x101, 0x88d7, 0x101, 0x88de, 0x101,
- 0x4635, 0x101, 0x88fa, 0x101, 0x34bb, 0x201, 0xd85e, 0xdcae,
- 0x201, 0xd85e, 0xdd66, 0x101, 0x46be, 0x101, 0x46c7, 0x101,
- 0x8aa0, 0x101, 0x8aed, 0x101, 0x8b8a, 0x101, 0x8c55, 0x201,
- 0xd85f, 0xdca8, 0x101, 0x8cab, 0x101, 0x8cc1, 0x101, 0x8d1b,
- 0x101, 0x8d77, 0x201, 0xd85f, 0xdf2f, 0x201, 0xd842, 0xdc04,
- 0x101, 0x8dcb, 0x101, 0x8dbc, 0x101, 0x8df0, 0x201, 0xd842,
- 0xdcde, 0x101, 0x8ed4, 0x101, 0x8f38, 0x201, 0xd861, 0xddd2,
- 0x201, 0xd861, 0xdded, 0x101, 0x9094, 0x101, 0x90f1, 0x101,
- 0x9111, 0x201, 0xd861, 0xdf2e, 0x101, 0x911b, 0x101, 0x9238,
- 0x101, 0x92d7, 0x101, 0x92d8, 0x101, 0x927c, 0x101, 0x93f9,
- 0x101, 0x9415, 0x201, 0xd862, 0xdffa, 0x101, 0x958b, 0x101,
- 0x4995, 0x101, 0x95b7, 0x201, 0xd863, 0xdd77, 0x101, 0x49e6,
- 0x101, 0x96c3, 0x101, 0x5db2, 0x101, 0x9723, 0x201, 0xd864,
- 0xdd45, 0x201, 0xd864, 0xde1a, 0x101, 0x4a6e, 0x101, 0x4a76,
- 0x101, 0x97e0, 0x201, 0xd865, 0xdc0a, 0x101, 0x4ab2, 0x201,
- 0xd865, 0xdc96, 0x101, 0x980b, 0x101, 0x980b, 0x101, 0x9829,
- 0x201, 0xd865, 0xddb6, 0x101, 0x98e2, 0x101, 0x4b33, 0x101,
- 0x9929, 0x101, 0x99a7, 0x101, 0x99c2, 0x101, 0x99fe, 0x101,
- 0x4bce, 0x201, 0xd866, 0xdf30, 0x101, 0x9b12, 0x101, 0x9c40,
- 0x101, 0x9cfd, 0x101, 0x4cce, 0x101, 0x4ced, 0x101, 0x9d67,
- 0x201, 0xd868, 0xdcce, 0x101, 0x4cf8, 0x201, 0xd868, 0xdd05,
- 0x201, 0xd868, 0xde0e, 0x201, 0xd868, 0xde91, 0x101, 0x9ebb,
- 0x101, 0x4d56, 0x101, 0x9ef9, 0x101, 0x9efe, 0x101, 0x9f05,
- 0x101, 0x9f0f, 0x101, 0x9f16, 0x101, 0x9f3b, 0x201, 0xd869,
- 0xde00
+ 0x30f1, 0x108, 0x30f2, 0x20f, 0x4ee4, 0x548c, 0x40f, 0x30a2,
+ 0x30d1, 0x30fc, 0x30c8, 0x40f, 0x30a2, 0x30eb, 0x30d5, 0x30a1,
+ 0x40f, 0x30a2, 0x30f3, 0x30da, 0x30a2, 0x30f, 0x30a2, 0x30fc,
+ 0x30eb, 0x40f, 0x30a4, 0x30cb, 0x30f3, 0x30b0, 0x30f, 0x30a4,
+ 0x30f3, 0x30c1, 0x30f, 0x30a6, 0x30a9, 0x30f3, 0x50f, 0x30a8,
+ 0x30b9, 0x30af, 0x30fc, 0x30c9, 0x40f, 0x30a8, 0x30fc, 0x30ab,
+ 0x30fc, 0x30f, 0x30aa, 0x30f3, 0x30b9, 0x30f, 0x30aa, 0x30fc,
+ 0x30e0, 0x30f, 0x30ab, 0x30a4, 0x30ea, 0x40f, 0x30ab, 0x30e9,
+ 0x30c3, 0x30c8, 0x40f, 0x30ab, 0x30ed, 0x30ea, 0x30fc, 0x30f,
+ 0x30ac, 0x30ed, 0x30f3, 0x30f, 0x30ac, 0x30f3, 0x30de, 0x20f,
+ 0x30ae, 0x30ac, 0x30f, 0x30ae, 0x30cb, 0x30fc, 0x40f, 0x30ad,
+ 0x30e5, 0x30ea, 0x30fc, 0x40f, 0x30ae, 0x30eb, 0x30c0, 0x30fc,
+ 0x20f, 0x30ad, 0x30ed, 0x50f, 0x30ad, 0x30ed, 0x30b0, 0x30e9,
+ 0x30e0, 0x60f, 0x30ad, 0x30ed, 0x30e1, 0x30fc, 0x30c8, 0x30eb,
+ 0x50f, 0x30ad, 0x30ed, 0x30ef, 0x30c3, 0x30c8, 0x30f, 0x30b0,
+ 0x30e9, 0x30e0, 0x50f, 0x30b0, 0x30e9, 0x30e0, 0x30c8, 0x30f3,
+ 0x50f, 0x30af, 0x30eb, 0x30bc, 0x30a4, 0x30ed, 0x40f, 0x30af,
+ 0x30ed, 0x30fc, 0x30cd, 0x30f, 0x30b1, 0x30fc, 0x30b9, 0x30f,
+ 0x30b3, 0x30eb, 0x30ca, 0x30f, 0x30b3, 0x30fc, 0x30dd, 0x40f,
+ 0x30b5, 0x30a4, 0x30af, 0x30eb, 0x50f, 0x30b5, 0x30f3, 0x30c1,
+ 0x30fc, 0x30e0, 0x40f, 0x30b7, 0x30ea, 0x30f3, 0x30b0, 0x30f,
+ 0x30bb, 0x30f3, 0x30c1, 0x30f, 0x30bb, 0x30f3, 0x30c8, 0x30f,
+ 0x30c0, 0x30fc, 0x30b9, 0x20f, 0x30c7, 0x30b7, 0x20f, 0x30c9,
+ 0x30eb, 0x20f, 0x30c8, 0x30f3, 0x20f, 0x30ca, 0x30ce, 0x30f,
+ 0x30ce, 0x30c3, 0x30c8, 0x30f, 0x30cf, 0x30a4, 0x30c4, 0x50f,
+ 0x30d1, 0x30fc, 0x30bb, 0x30f3, 0x30c8, 0x30f, 0x30d1, 0x30fc,
+ 0x30c4, 0x40f, 0x30d0, 0x30fc, 0x30ec, 0x30eb, 0x50f, 0x30d4,
+ 0x30a2, 0x30b9, 0x30c8, 0x30eb, 0x30f, 0x30d4, 0x30af, 0x30eb,
+ 0x20f, 0x30d4, 0x30b3, 0x20f, 0x30d3, 0x30eb, 0x50f, 0x30d5,
+ 0x30a1, 0x30e9, 0x30c3, 0x30c9, 0x40f, 0x30d5, 0x30a3, 0x30fc,
+ 0x30c8, 0x50f, 0x30d6, 0x30c3, 0x30b7, 0x30a7, 0x30eb, 0x30f,
+ 0x30d5, 0x30e9, 0x30f3, 0x50f, 0x30d8, 0x30af, 0x30bf, 0x30fc,
+ 0x30eb, 0x20f, 0x30da, 0x30bd, 0x30f, 0x30da, 0x30cb, 0x30d2,
+ 0x30f, 0x30d8, 0x30eb, 0x30c4, 0x30f, 0x30da, 0x30f3, 0x30b9,
+ 0x30f, 0x30da, 0x30fc, 0x30b8, 0x30f, 0x30d9, 0x30fc, 0x30bf,
+ 0x40f, 0x30dd, 0x30a4, 0x30f3, 0x30c8, 0x30f, 0x30dc, 0x30eb,
+ 0x30c8, 0x20f, 0x30db, 0x30f3, 0x30f, 0x30dd, 0x30f3, 0x30c9,
+ 0x30f, 0x30db, 0x30fc, 0x30eb, 0x30f, 0x30db, 0x30fc, 0x30f3,
+ 0x40f, 0x30de, 0x30a4, 0x30af, 0x30ed, 0x30f, 0x30de, 0x30a4,
+ 0x30eb, 0x30f, 0x30de, 0x30c3, 0x30cf, 0x30f, 0x30de, 0x30eb,
+ 0x30af, 0x50f, 0x30de, 0x30f3, 0x30b7, 0x30e7, 0x30f3, 0x40f,
+ 0x30df, 0x30af, 0x30ed, 0x30f3, 0x20f, 0x30df, 0x30ea, 0x50f,
+ 0x30df, 0x30ea, 0x30d0, 0x30fc, 0x30eb, 0x20f, 0x30e1, 0x30ac,
+ 0x40f, 0x30e1, 0x30ac, 0x30c8, 0x30f3, 0x40f, 0x30e1, 0x30fc,
+ 0x30c8, 0x30eb, 0x30f, 0x30e4, 0x30fc, 0x30c9, 0x30f, 0x30e4,
+ 0x30fc, 0x30eb, 0x30f, 0x30e6, 0x30a2, 0x30f3, 0x40f, 0x30ea,
+ 0x30c3, 0x30c8, 0x30eb, 0x20f, 0x30ea, 0x30e9, 0x30f, 0x30eb,
+ 0x30d4, 0x30fc, 0x40f, 0x30eb, 0x30fc, 0x30d6, 0x30eb, 0x20f,
+ 0x30ec, 0x30e0, 0x50f, 0x30ec, 0x30f3, 0x30c8, 0x30b2, 0x30f3,
+ 0x30f, 0x30ef, 0x30c3, 0x30c8, 0x210, 0x30, 0x70b9, 0x210,
+ 0x31, 0x70b9, 0x210, 0x32, 0x70b9, 0x210, 0x33, 0x70b9,
+ 0x210, 0x34, 0x70b9, 0x210, 0x35, 0x70b9, 0x210, 0x36,
+ 0x70b9, 0x210, 0x37, 0x70b9, 0x210, 0x38, 0x70b9, 0x210,
+ 0x39, 0x70b9, 0x310, 0x31, 0x30, 0x70b9, 0x310, 0x31,
+ 0x31, 0x70b9, 0x310, 0x31, 0x32, 0x70b9, 0x310, 0x31,
+ 0x33, 0x70b9, 0x310, 0x31, 0x34, 0x70b9, 0x310, 0x31,
+ 0x35, 0x70b9, 0x310, 0x31, 0x36, 0x70b9, 0x310, 0x31,
+ 0x37, 0x70b9, 0x310, 0x31, 0x38, 0x70b9, 0x310, 0x31,
+ 0x39, 0x70b9, 0x310, 0x32, 0x30, 0x70b9, 0x310, 0x32,
+ 0x31, 0x70b9, 0x310, 0x32, 0x32, 0x70b9, 0x310, 0x32,
+ 0x33, 0x70b9, 0x310, 0x32, 0x34, 0x70b9, 0x30f, 0x68,
+ 0x50, 0x61, 0x20f, 0x64, 0x61, 0x20f, 0x41, 0x55,
+ 0x30f, 0x62, 0x61, 0x72, 0x20f, 0x6f, 0x56, 0x20f,
+ 0x70, 0x63, 0x20f, 0x64, 0x6d, 0x30f, 0x64, 0x6d,
+ 0xb2, 0x30f, 0x64, 0x6d, 0xb3, 0x20f, 0x49, 0x55,
+ 0x20f, 0x5e73, 0x6210, 0x20f, 0x662d, 0x548c, 0x20f, 0x5927,
+ 0x6b63, 0x20f, 0x660e, 0x6cbb, 0x40f, 0x682a, 0x5f0f, 0x4f1a,
+ 0x793e, 0x20f, 0x70, 0x41, 0x20f, 0x6e, 0x41, 0x20f,
+ 0x3bc, 0x41, 0x20f, 0x6d, 0x41, 0x20f, 0x6b, 0x41,
+ 0x20f, 0x4b, 0x42, 0x20f, 0x4d, 0x42, 0x20f, 0x47,
+ 0x42, 0x30f, 0x63, 0x61, 0x6c, 0x40f, 0x6b, 0x63,
+ 0x61, 0x6c, 0x20f, 0x70, 0x46, 0x20f, 0x6e, 0x46,
+ 0x20f, 0x3bc, 0x46, 0x20f, 0x3bc, 0x67, 0x20f, 0x6d,
+ 0x67, 0x20f, 0x6b, 0x67, 0x20f, 0x48, 0x7a, 0x30f,
+ 0x6b, 0x48, 0x7a, 0x30f, 0x4d, 0x48, 0x7a, 0x30f,
+ 0x47, 0x48, 0x7a, 0x30f, 0x54, 0x48, 0x7a, 0x20f,
+ 0x3bc, 0x2113, 0x20f, 0x6d, 0x2113, 0x20f, 0x64, 0x2113,
+ 0x20f, 0x6b, 0x2113, 0x20f, 0x66, 0x6d, 0x20f, 0x6e,
+ 0x6d, 0x20f, 0x3bc, 0x6d, 0x20f, 0x6d, 0x6d, 0x20f,
+ 0x63, 0x6d, 0x20f, 0x6b, 0x6d, 0x30f, 0x6d, 0x6d,
+ 0xb2, 0x30f, 0x63, 0x6d, 0xb2, 0x20f, 0x6d, 0xb2,
+ 0x30f, 0x6b, 0x6d, 0xb2, 0x30f, 0x6d, 0x6d, 0xb3,
+ 0x30f, 0x63, 0x6d, 0xb3, 0x20f, 0x6d, 0xb3, 0x30f,
+ 0x6b, 0x6d, 0xb3, 0x30f, 0x6d, 0x2215, 0x73, 0x40f,
+ 0x6d, 0x2215, 0x73, 0xb2, 0x20f, 0x50, 0x61, 0x30f,
+ 0x6b, 0x50, 0x61, 0x30f, 0x4d, 0x50, 0x61, 0x30f,
+ 0x47, 0x50, 0x61, 0x30f, 0x72, 0x61, 0x64, 0x50f,
+ 0x72, 0x61, 0x64, 0x2215, 0x73, 0x60f, 0x72, 0x61,
+ 0x64, 0x2215, 0x73, 0xb2, 0x20f, 0x70, 0x73, 0x20f,
+ 0x6e, 0x73, 0x20f, 0x3bc, 0x73, 0x20f, 0x6d, 0x73,
+ 0x20f, 0x70, 0x56, 0x20f, 0x6e, 0x56, 0x20f, 0x3bc,
+ 0x56, 0x20f, 0x6d, 0x56, 0x20f, 0x6b, 0x56, 0x20f,
+ 0x4d, 0x56, 0x20f, 0x70, 0x57, 0x20f, 0x6e, 0x57,
+ 0x20f, 0x3bc, 0x57, 0x20f, 0x6d, 0x57, 0x20f, 0x6b,
+ 0x57, 0x20f, 0x4d, 0x57, 0x20f, 0x6b, 0x3a9, 0x20f,
+ 0x4d, 0x3a9, 0x40f, 0x61, 0x2e, 0x6d, 0x2e, 0x20f,
+ 0x42, 0x71, 0x20f, 0x63, 0x63, 0x20f, 0x63, 0x64,
+ 0x40f, 0x43, 0x2215, 0x6b, 0x67, 0x30f, 0x43, 0x6f,
+ 0x2e, 0x20f, 0x64, 0x42, 0x20f, 0x47, 0x79, 0x20f,
+ 0x68, 0x61, 0x20f, 0x48, 0x50, 0x20f, 0x69, 0x6e,
+ 0x20f, 0x4b, 0x4b, 0x20f, 0x4b, 0x4d, 0x20f, 0x6b,
+ 0x74, 0x20f, 0x6c, 0x6d, 0x20f, 0x6c, 0x6e, 0x30f,
+ 0x6c, 0x6f, 0x67, 0x20f, 0x6c, 0x78, 0x20f, 0x6d,
+ 0x62, 0x30f, 0x6d, 0x69, 0x6c, 0x30f, 0x6d, 0x6f,
+ 0x6c, 0x20f, 0x50, 0x48, 0x40f, 0x70, 0x2e, 0x6d,
+ 0x2e, 0x30f, 0x50, 0x50, 0x4d, 0x20f, 0x50, 0x52,
+ 0x20f, 0x73, 0x72, 0x20f, 0x53, 0x76, 0x20f, 0x57,
+ 0x62, 0x30f, 0x56, 0x2215, 0x6d, 0x30f, 0x41, 0x2215,
+ 0x6d, 0x210, 0x31, 0x65e5, 0x210, 0x32, 0x65e5, 0x210,
+ 0x33, 0x65e5, 0x210, 0x34, 0x65e5, 0x210, 0x35, 0x65e5,
+ 0x210, 0x36, 0x65e5, 0x210, 0x37, 0x65e5, 0x210, 0x38,
+ 0x65e5, 0x210, 0x39, 0x65e5, 0x310, 0x31, 0x30, 0x65e5,
+ 0x310, 0x31, 0x31, 0x65e5, 0x310, 0x31, 0x32, 0x65e5,
+ 0x310, 0x31, 0x33, 0x65e5, 0x310, 0x31, 0x34, 0x65e5,
+ 0x310, 0x31, 0x35, 0x65e5, 0x310, 0x31, 0x36, 0x65e5,
+ 0x310, 0x31, 0x37, 0x65e5, 0x310, 0x31, 0x38, 0x65e5,
+ 0x310, 0x31, 0x39, 0x65e5, 0x310, 0x32, 0x30, 0x65e5,
+ 0x310, 0x32, 0x31, 0x65e5, 0x310, 0x32, 0x32, 0x65e5,
+ 0x310, 0x32, 0x33, 0x65e5, 0x310, 0x32, 0x34, 0x65e5,
+ 0x310, 0x32, 0x35, 0x65e5, 0x310, 0x32, 0x36, 0x65e5,
+ 0x310, 0x32, 0x37, 0x65e5, 0x310, 0x32, 0x38, 0x65e5,
+ 0x310, 0x32, 0x39, 0x65e5, 0x310, 0x33, 0x30, 0x65e5,
+ 0x310, 0x33, 0x31, 0x65e5, 0x30f, 0x67, 0x61, 0x6c,
+ 0x109, 0x44a, 0x109, 0x44c, 0x109, 0xa76f, 0x109, 0x126,
+ 0x109, 0x153, 0x109, 0xa727, 0x109, 0xab37, 0x109, 0x26b,
+ 0x109, 0xab52, 0x101, 0x8c48, 0x101, 0x66f4, 0x101, 0x8eca,
+ 0x101, 0x8cc8, 0x101, 0x6ed1, 0x101, 0x4e32, 0x101, 0x53e5,
+ 0x101, 0x9f9c, 0x101, 0x9f9c, 0x101, 0x5951, 0x101, 0x91d1,
+ 0x101, 0x5587, 0x101, 0x5948, 0x101, 0x61f6, 0x101, 0x7669,
+ 0x101, 0x7f85, 0x101, 0x863f, 0x101, 0x87ba, 0x101, 0x88f8,
+ 0x101, 0x908f, 0x101, 0x6a02, 0x101, 0x6d1b, 0x101, 0x70d9,
+ 0x101, 0x73de, 0x101, 0x843d, 0x101, 0x916a, 0x101, 0x99f1,
+ 0x101, 0x4e82, 0x101, 0x5375, 0x101, 0x6b04, 0x101, 0x721b,
+ 0x101, 0x862d, 0x101, 0x9e1e, 0x101, 0x5d50, 0x101, 0x6feb,
+ 0x101, 0x85cd, 0x101, 0x8964, 0x101, 0x62c9, 0x101, 0x81d8,
+ 0x101, 0x881f, 0x101, 0x5eca, 0x101, 0x6717, 0x101, 0x6d6a,
+ 0x101, 0x72fc, 0x101, 0x90ce, 0x101, 0x4f86, 0x101, 0x51b7,
+ 0x101, 0x52de, 0x101, 0x64c4, 0x101, 0x6ad3, 0x101, 0x7210,
+ 0x101, 0x76e7, 0x101, 0x8001, 0x101, 0x8606, 0x101, 0x865c,
+ 0x101, 0x8def, 0x101, 0x9732, 0x101, 0x9b6f, 0x101, 0x9dfa,
+ 0x101, 0x788c, 0x101, 0x797f, 0x101, 0x7da0, 0x101, 0x83c9,
+ 0x101, 0x9304, 0x101, 0x9e7f, 0x101, 0x8ad6, 0x101, 0x58df,
+ 0x101, 0x5f04, 0x101, 0x7c60, 0x101, 0x807e, 0x101, 0x7262,
+ 0x101, 0x78ca, 0x101, 0x8cc2, 0x101, 0x96f7, 0x101, 0x58d8,
+ 0x101, 0x5c62, 0x101, 0x6a13, 0x101, 0x6dda, 0x101, 0x6f0f,
+ 0x101, 0x7d2f, 0x101, 0x7e37, 0x101, 0x964b, 0x101, 0x52d2,
+ 0x101, 0x808b, 0x101, 0x51dc, 0x101, 0x51cc, 0x101, 0x7a1c,
+ 0x101, 0x7dbe, 0x101, 0x83f1, 0x101, 0x9675, 0x101, 0x8b80,
+ 0x101, 0x62cf, 0x101, 0x6a02, 0x101, 0x8afe, 0x101, 0x4e39,
+ 0x101, 0x5be7, 0x101, 0x6012, 0x101, 0x7387, 0x101, 0x7570,
+ 0x101, 0x5317, 0x101, 0x78fb, 0x101, 0x4fbf, 0x101, 0x5fa9,
+ 0x101, 0x4e0d, 0x101, 0x6ccc, 0x101, 0x6578, 0x101, 0x7d22,
+ 0x101, 0x53c3, 0x101, 0x585e, 0x101, 0x7701, 0x101, 0x8449,
+ 0x101, 0x8aaa, 0x101, 0x6bba, 0x101, 0x8fb0, 0x101, 0x6c88,
+ 0x101, 0x62fe, 0x101, 0x82e5, 0x101, 0x63a0, 0x101, 0x7565,
+ 0x101, 0x4eae, 0x101, 0x5169, 0x101, 0x51c9, 0x101, 0x6881,
+ 0x101, 0x7ce7, 0x101, 0x826f, 0x101, 0x8ad2, 0x101, 0x91cf,
+ 0x101, 0x52f5, 0x101, 0x5442, 0x101, 0x5973, 0x101, 0x5eec,
+ 0x101, 0x65c5, 0x101, 0x6ffe, 0x101, 0x792a, 0x101, 0x95ad,
+ 0x101, 0x9a6a, 0x101, 0x9e97, 0x101, 0x9ece, 0x101, 0x529b,
+ 0x101, 0x66c6, 0x101, 0x6b77, 0x101, 0x8f62, 0x101, 0x5e74,
+ 0x101, 0x6190, 0x101, 0x6200, 0x101, 0x649a, 0x101, 0x6f23,
+ 0x101, 0x7149, 0x101, 0x7489, 0x101, 0x79ca, 0x101, 0x7df4,
+ 0x101, 0x806f, 0x101, 0x8f26, 0x101, 0x84ee, 0x101, 0x9023,
+ 0x101, 0x934a, 0x101, 0x5217, 0x101, 0x52a3, 0x101, 0x54bd,
+ 0x101, 0x70c8, 0x101, 0x88c2, 0x101, 0x8aaa, 0x101, 0x5ec9,
+ 0x101, 0x5ff5, 0x101, 0x637b, 0x101, 0x6bae, 0x101, 0x7c3e,
+ 0x101, 0x7375, 0x101, 0x4ee4, 0x101, 0x56f9, 0x101, 0x5be7,
+ 0x101, 0x5dba, 0x101, 0x601c, 0x101, 0x73b2, 0x101, 0x7469,
+ 0x101, 0x7f9a, 0x101, 0x8046, 0x101, 0x9234, 0x101, 0x96f6,
+ 0x101, 0x9748, 0x101, 0x9818, 0x101, 0x4f8b, 0x101, 0x79ae,
+ 0x101, 0x91b4, 0x101, 0x96b8, 0x101, 0x60e1, 0x101, 0x4e86,
+ 0x101, 0x50da, 0x101, 0x5bee, 0x101, 0x5c3f, 0x101, 0x6599,
+ 0x101, 0x6a02, 0x101, 0x71ce, 0x101, 0x7642, 0x101, 0x84fc,
+ 0x101, 0x907c, 0x101, 0x9f8d, 0x101, 0x6688, 0x101, 0x962e,
+ 0x101, 0x5289, 0x101, 0x677b, 0x101, 0x67f3, 0x101, 0x6d41,
+ 0x101, 0x6e9c, 0x101, 0x7409, 0x101, 0x7559, 0x101, 0x786b,
+ 0x101, 0x7d10, 0x101, 0x985e, 0x101, 0x516d, 0x101, 0x622e,
+ 0x101, 0x9678, 0x101, 0x502b, 0x101, 0x5d19, 0x101, 0x6dea,
+ 0x101, 0x8f2a, 0x101, 0x5f8b, 0x101, 0x6144, 0x101, 0x6817,
+ 0x101, 0x7387, 0x101, 0x9686, 0x101, 0x5229, 0x101, 0x540f,
+ 0x101, 0x5c65, 0x101, 0x6613, 0x101, 0x674e, 0x101, 0x68a8,
+ 0x101, 0x6ce5, 0x101, 0x7406, 0x101, 0x75e2, 0x101, 0x7f79,
+ 0x101, 0x88cf, 0x101, 0x88e1, 0x101, 0x91cc, 0x101, 0x96e2,
+ 0x101, 0x533f, 0x101, 0x6eba, 0x101, 0x541d, 0x101, 0x71d0,
+ 0x101, 0x7498, 0x101, 0x85fa, 0x101, 0x96a3, 0x101, 0x9c57,
+ 0x101, 0x9e9f, 0x101, 0x6797, 0x101, 0x6dcb, 0x101, 0x81e8,
+ 0x101, 0x7acb, 0x101, 0x7b20, 0x101, 0x7c92, 0x101, 0x72c0,
+ 0x101, 0x7099, 0x101, 0x8b58, 0x101, 0x4ec0, 0x101, 0x8336,
+ 0x101, 0x523a, 0x101, 0x5207, 0x101, 0x5ea6, 0x101, 0x62d3,
+ 0x101, 0x7cd6, 0x101, 0x5b85, 0x101, 0x6d1e, 0x101, 0x66b4,
+ 0x101, 0x8f3b, 0x101, 0x884c, 0x101, 0x964d, 0x101, 0x898b,
+ 0x101, 0x5ed3, 0x101, 0x5140, 0x101, 0x55c0, 0x101, 0x585a,
+ 0x101, 0x6674, 0x101, 0x51de, 0x101, 0x732a, 0x101, 0x76ca,
+ 0x101, 0x793c, 0x101, 0x795e, 0x101, 0x7965, 0x101, 0x798f,
+ 0x101, 0x9756, 0x101, 0x7cbe, 0x101, 0x7fbd, 0x101, 0x8612,
+ 0x101, 0x8af8, 0x101, 0x9038, 0x101, 0x90fd, 0x101, 0x98ef,
+ 0x101, 0x98fc, 0x101, 0x9928, 0x101, 0x9db4, 0x101, 0x90de,
+ 0x101, 0x96b7, 0x101, 0x4fae, 0x101, 0x50e7, 0x101, 0x514d,
+ 0x101, 0x52c9, 0x101, 0x52e4, 0x101, 0x5351, 0x101, 0x559d,
+ 0x101, 0x5606, 0x101, 0x5668, 0x101, 0x5840, 0x101, 0x58a8,
+ 0x101, 0x5c64, 0x101, 0x5c6e, 0x101, 0x6094, 0x101, 0x6168,
+ 0x101, 0x618e, 0x101, 0x61f2, 0x101, 0x654f, 0x101, 0x65e2,
+ 0x101, 0x6691, 0x101, 0x6885, 0x101, 0x6d77, 0x101, 0x6e1a,
+ 0x101, 0x6f22, 0x101, 0x716e, 0x101, 0x722b, 0x101, 0x7422,
+ 0x101, 0x7891, 0x101, 0x793e, 0x101, 0x7949, 0x101, 0x7948,
+ 0x101, 0x7950, 0x101, 0x7956, 0x101, 0x795d, 0x101, 0x798d,
+ 0x101, 0x798e, 0x101, 0x7a40, 0x101, 0x7a81, 0x101, 0x7bc0,
+ 0x101, 0x7df4, 0x101, 0x7e09, 0x101, 0x7e41, 0x101, 0x7f72,
+ 0x101, 0x8005, 0x101, 0x81ed, 0x101, 0x8279, 0x101, 0x8279,
+ 0x101, 0x8457, 0x101, 0x8910, 0x101, 0x8996, 0x101, 0x8b01,
+ 0x101, 0x8b39, 0x101, 0x8cd3, 0x101, 0x8d08, 0x101, 0x8fb6,
+ 0x101, 0x9038, 0x101, 0x96e3, 0x101, 0x97ff, 0x101, 0x983b,
+ 0x101, 0x6075, 0x201, 0xd850, 0xdeee, 0x101, 0x8218, 0x101,
+ 0x4e26, 0x101, 0x51b5, 0x101, 0x5168, 0x101, 0x4f80, 0x101,
+ 0x5145, 0x101, 0x5180, 0x101, 0x52c7, 0x101, 0x52fa, 0x101,
+ 0x559d, 0x101, 0x5555, 0x101, 0x5599, 0x101, 0x55e2, 0x101,
+ 0x585a, 0x101, 0x58b3, 0x101, 0x5944, 0x101, 0x5954, 0x101,
+ 0x5a62, 0x101, 0x5b28, 0x101, 0x5ed2, 0x101, 0x5ed9, 0x101,
+ 0x5f69, 0x101, 0x5fad, 0x101, 0x60d8, 0x101, 0x614e, 0x101,
+ 0x6108, 0x101, 0x618e, 0x101, 0x6160, 0x101, 0x61f2, 0x101,
+ 0x6234, 0x101, 0x63c4, 0x101, 0x641c, 0x101, 0x6452, 0x101,
+ 0x6556, 0x101, 0x6674, 0x101, 0x6717, 0x101, 0x671b, 0x101,
+ 0x6756, 0x101, 0x6b79, 0x101, 0x6bba, 0x101, 0x6d41, 0x101,
+ 0x6edb, 0x101, 0x6ecb, 0x101, 0x6f22, 0x101, 0x701e, 0x101,
+ 0x716e, 0x101, 0x77a7, 0x101, 0x7235, 0x101, 0x72af, 0x101,
+ 0x732a, 0x101, 0x7471, 0x101, 0x7506, 0x101, 0x753b, 0x101,
+ 0x761d, 0x101, 0x761f, 0x101, 0x76ca, 0x101, 0x76db, 0x101,
+ 0x76f4, 0x101, 0x774a, 0x101, 0x7740, 0x101, 0x78cc, 0x101,
+ 0x7ab1, 0x101, 0x7bc0, 0x101, 0x7c7b, 0x101, 0x7d5b, 0x101,
+ 0x7df4, 0x101, 0x7f3e, 0x101, 0x8005, 0x101, 0x8352, 0x101,
+ 0x83ef, 0x101, 0x8779, 0x101, 0x8941, 0x101, 0x8986, 0x101,
+ 0x8996, 0x101, 0x8abf, 0x101, 0x8af8, 0x101, 0x8acb, 0x101,
+ 0x8b01, 0x101, 0x8afe, 0x101, 0x8aed, 0x101, 0x8b39, 0x101,
+ 0x8b8a, 0x101, 0x8d08, 0x101, 0x8f38, 0x101, 0x9072, 0x101,
+ 0x9199, 0x101, 0x9276, 0x101, 0x967c, 0x101, 0x96e3, 0x101,
+ 0x9756, 0x101, 0x97db, 0x101, 0x97ff, 0x101, 0x980b, 0x101,
+ 0x983b, 0x101, 0x9b12, 0x101, 0x9f9c, 0x201, 0xd84a, 0xdc4a,
+ 0x201, 0xd84a, 0xdc44, 0x201, 0xd84c, 0xdfd5, 0x101, 0x3b9d,
+ 0x101, 0x4018, 0x101, 0x4039, 0x201, 0xd854, 0xde49, 0x201,
+ 0xd857, 0xdcd0, 0x201, 0xd85f, 0xded3, 0x101, 0x9f43, 0x101,
+ 0x9f8e, 0x210, 0x66, 0x66, 0x210, 0x66, 0x69, 0x210,
+ 0x66, 0x6c, 0x310, 0x66, 0x66, 0x69, 0x310, 0x66,
+ 0x66, 0x6c, 0x210, 0x17f, 0x74, 0x210, 0x73, 0x74,
+ 0x210, 0x574, 0x576, 0x210, 0x574, 0x565, 0x210, 0x574,
+ 0x56b, 0x210, 0x57e, 0x576, 0x210, 0x574, 0x56d, 0x201,
+ 0x5d9, 0x5b4, 0x201, 0x5f2, 0x5b7, 0x102, 0x5e2, 0x102,
+ 0x5d0, 0x102, 0x5d3, 0x102, 0x5d4, 0x102, 0x5db, 0x102,
+ 0x5dc, 0x102, 0x5dd, 0x102, 0x5e8, 0x102, 0x5ea, 0x102,
+ 0x2b, 0x201, 0x5e9, 0x5c1, 0x201, 0x5e9, 0x5c2, 0x201,
+ 0xfb49, 0x5c1, 0x201, 0xfb49, 0x5c2, 0x201, 0x5d0, 0x5b7,
+ 0x201, 0x5d0, 0x5b8, 0x201, 0x5d0, 0x5bc, 0x201, 0x5d1,
+ 0x5bc, 0x201, 0x5d2, 0x5bc, 0x201, 0x5d3, 0x5bc, 0x201,
+ 0x5d4, 0x5bc, 0x201, 0x5d5, 0x5bc, 0x201, 0x5d6, 0x5bc,
+ 0x201, 0x5d8, 0x5bc, 0x201, 0x5d9, 0x5bc, 0x201, 0x5da,
+ 0x5bc, 0x201, 0x5db, 0x5bc, 0x201, 0x5dc, 0x5bc, 0x201,
+ 0x5de, 0x5bc, 0x201, 0x5e0, 0x5bc, 0x201, 0x5e1, 0x5bc,
+ 0x201, 0x5e3, 0x5bc, 0x201, 0x5e4, 0x5bc, 0x201, 0x5e6,
+ 0x5bc, 0x201, 0x5e7, 0x5bc, 0x201, 0x5e8, 0x5bc, 0x201,
+ 0x5e9, 0x5bc, 0x201, 0x5ea, 0x5bc, 0x201, 0x5d5, 0x5b9,
+ 0x201, 0x5d1, 0x5bf, 0x201, 0x5db, 0x5bf, 0x201, 0x5e4,
+ 0x5bf, 0x210, 0x5d0, 0x5dc, 0x107, 0x671, 0x106, 0x671,
+ 0x107, 0x67b, 0x106, 0x67b, 0x104, 0x67b, 0x105, 0x67b,
+ 0x107, 0x67e, 0x106, 0x67e, 0x104, 0x67e, 0x105, 0x67e,
+ 0x107, 0x680, 0x106, 0x680, 0x104, 0x680, 0x105, 0x680,
+ 0x107, 0x67a, 0x106, 0x67a, 0x104, 0x67a, 0x105, 0x67a,
+ 0x107, 0x67f, 0x106, 0x67f, 0x104, 0x67f, 0x105, 0x67f,
+ 0x107, 0x679, 0x106, 0x679, 0x104, 0x679, 0x105, 0x679,
+ 0x107, 0x6a4, 0x106, 0x6a4, 0x104, 0x6a4, 0x105, 0x6a4,
+ 0x107, 0x6a6, 0x106, 0x6a6, 0x104, 0x6a6, 0x105, 0x6a6,
+ 0x107, 0x684, 0x106, 0x684, 0x104, 0x684, 0x105, 0x684,
+ 0x107, 0x683, 0x106, 0x683, 0x104, 0x683, 0x105, 0x683,
+ 0x107, 0x686, 0x106, 0x686, 0x104, 0x686, 0x105, 0x686,
+ 0x107, 0x687, 0x106, 0x687, 0x104, 0x687, 0x105, 0x687,
+ 0x107, 0x68d, 0x106, 0x68d, 0x107, 0x68c, 0x106, 0x68c,
+ 0x107, 0x68e, 0x106, 0x68e, 0x107, 0x688, 0x106, 0x688,
+ 0x107, 0x698, 0x106, 0x698, 0x107, 0x691, 0x106, 0x691,
+ 0x107, 0x6a9, 0x106, 0x6a9, 0x104, 0x6a9, 0x105, 0x6a9,
+ 0x107, 0x6af, 0x106, 0x6af, 0x104, 0x6af, 0x105, 0x6af,
+ 0x107, 0x6b3, 0x106, 0x6b3, 0x104, 0x6b3, 0x105, 0x6b3,
+ 0x107, 0x6b1, 0x106, 0x6b1, 0x104, 0x6b1, 0x105, 0x6b1,
+ 0x107, 0x6ba, 0x106, 0x6ba, 0x107, 0x6bb, 0x106, 0x6bb,
+ 0x104, 0x6bb, 0x105, 0x6bb, 0x107, 0x6c0, 0x106, 0x6c0,
+ 0x107, 0x6c1, 0x106, 0x6c1, 0x104, 0x6c1, 0x105, 0x6c1,
+ 0x107, 0x6be, 0x106, 0x6be, 0x104, 0x6be, 0x105, 0x6be,
+ 0x107, 0x6d2, 0x106, 0x6d2, 0x107, 0x6d3, 0x106, 0x6d3,
+ 0x107, 0x6ad, 0x106, 0x6ad, 0x104, 0x6ad, 0x105, 0x6ad,
+ 0x107, 0x6c7, 0x106, 0x6c7, 0x107, 0x6c6, 0x106, 0x6c6,
+ 0x107, 0x6c8, 0x106, 0x6c8, 0x107, 0x677, 0x107, 0x6cb,
+ 0x106, 0x6cb, 0x107, 0x6c5, 0x106, 0x6c5, 0x107, 0x6c9,
+ 0x106, 0x6c9, 0x107, 0x6d0, 0x106, 0x6d0, 0x104, 0x6d0,
+ 0x105, 0x6d0, 0x104, 0x649, 0x105, 0x649, 0x207, 0x626,
+ 0x627, 0x206, 0x626, 0x627, 0x207, 0x626, 0x6d5, 0x206,
+ 0x626, 0x6d5, 0x207, 0x626, 0x648, 0x206, 0x626, 0x648,
+ 0x207, 0x626, 0x6c7, 0x206, 0x626, 0x6c7, 0x207, 0x626,
+ 0x6c6, 0x206, 0x626, 0x6c6, 0x207, 0x626, 0x6c8, 0x206,
+ 0x626, 0x6c8, 0x207, 0x626, 0x6d0, 0x206, 0x626, 0x6d0,
+ 0x204, 0x626, 0x6d0, 0x207, 0x626, 0x649, 0x206, 0x626,
+ 0x649, 0x204, 0x626, 0x649, 0x107, 0x6cc, 0x106, 0x6cc,
+ 0x104, 0x6cc, 0x105, 0x6cc, 0x207, 0x626, 0x62c, 0x207,
+ 0x626, 0x62d, 0x207, 0x626, 0x645, 0x207, 0x626, 0x649,
+ 0x207, 0x626, 0x64a, 0x207, 0x628, 0x62c, 0x207, 0x628,
+ 0x62d, 0x207, 0x628, 0x62e, 0x207, 0x628, 0x645, 0x207,
+ 0x628, 0x649, 0x207, 0x628, 0x64a, 0x207, 0x62a, 0x62c,
+ 0x207, 0x62a, 0x62d, 0x207, 0x62a, 0x62e, 0x207, 0x62a,
+ 0x645, 0x207, 0x62a, 0x649, 0x207, 0x62a, 0x64a, 0x207,
+ 0x62b, 0x62c, 0x207, 0x62b, 0x645, 0x207, 0x62b, 0x649,
+ 0x207, 0x62b, 0x64a, 0x207, 0x62c, 0x62d, 0x207, 0x62c,
+ 0x645, 0x207, 0x62d, 0x62c, 0x207, 0x62d, 0x645, 0x207,
+ 0x62e, 0x62c, 0x207, 0x62e, 0x62d, 0x207, 0x62e, 0x645,
+ 0x207, 0x633, 0x62c, 0x207, 0x633, 0x62d, 0x207, 0x633,
+ 0x62e, 0x207, 0x633, 0x645, 0x207, 0x635, 0x62d, 0x207,
+ 0x635, 0x645, 0x207, 0x636, 0x62c, 0x207, 0x636, 0x62d,
+ 0x207, 0x636, 0x62e, 0x207, 0x636, 0x645, 0x207, 0x637,
+ 0x62d, 0x207, 0x637, 0x645, 0x207, 0x638, 0x645, 0x207,
+ 0x639, 0x62c, 0x207, 0x639, 0x645, 0x207, 0x63a, 0x62c,
+ 0x207, 0x63a, 0x645, 0x207, 0x641, 0x62c, 0x207, 0x641,
+ 0x62d, 0x207, 0x641, 0x62e, 0x207, 0x641, 0x645, 0x207,
+ 0x641, 0x649, 0x207, 0x641, 0x64a, 0x207, 0x642, 0x62d,
+ 0x207, 0x642, 0x645, 0x207, 0x642, 0x649, 0x207, 0x642,
+ 0x64a, 0x207, 0x643, 0x627, 0x207, 0x643, 0x62c, 0x207,
+ 0x643, 0x62d, 0x207, 0x643, 0x62e, 0x207, 0x643, 0x644,
+ 0x207, 0x643, 0x645, 0x207, 0x643, 0x649, 0x207, 0x643,
+ 0x64a, 0x207, 0x644, 0x62c, 0x207, 0x644, 0x62d, 0x207,
+ 0x644, 0x62e, 0x207, 0x644, 0x645, 0x207, 0x644, 0x649,
+ 0x207, 0x644, 0x64a, 0x207, 0x645, 0x62c, 0x207, 0x645,
+ 0x62d, 0x207, 0x645, 0x62e, 0x207, 0x645, 0x645, 0x207,
+ 0x645, 0x649, 0x207, 0x645, 0x64a, 0x207, 0x646, 0x62c,
+ 0x207, 0x646, 0x62d, 0x207, 0x646, 0x62e, 0x207, 0x646,
+ 0x645, 0x207, 0x646, 0x649, 0x207, 0x646, 0x64a, 0x207,
+ 0x647, 0x62c, 0x207, 0x647, 0x645, 0x207, 0x647, 0x649,
+ 0x207, 0x647, 0x64a, 0x207, 0x64a, 0x62c, 0x207, 0x64a,
+ 0x62d, 0x207, 0x64a, 0x62e, 0x207, 0x64a, 0x645, 0x207,
+ 0x64a, 0x649, 0x207, 0x64a, 0x64a, 0x207, 0x630, 0x670,
+ 0x207, 0x631, 0x670, 0x207, 0x649, 0x670, 0x307, 0x20,
+ 0x64c, 0x651, 0x307, 0x20, 0x64d, 0x651, 0x307, 0x20,
+ 0x64e, 0x651, 0x307, 0x20, 0x64f, 0x651, 0x307, 0x20,
+ 0x650, 0x651, 0x307, 0x20, 0x651, 0x670, 0x206, 0x626,
+ 0x631, 0x206, 0x626, 0x632, 0x206, 0x626, 0x645, 0x206,
+ 0x626, 0x646, 0x206, 0x626, 0x649, 0x206, 0x626, 0x64a,
+ 0x206, 0x628, 0x631, 0x206, 0x628, 0x632, 0x206, 0x628,
+ 0x645, 0x206, 0x628, 0x646, 0x206, 0x628, 0x649, 0x206,
+ 0x628, 0x64a, 0x206, 0x62a, 0x631, 0x206, 0x62a, 0x632,
+ 0x206, 0x62a, 0x645, 0x206, 0x62a, 0x646, 0x206, 0x62a,
+ 0x649, 0x206, 0x62a, 0x64a, 0x206, 0x62b, 0x631, 0x206,
+ 0x62b, 0x632, 0x206, 0x62b, 0x645, 0x206, 0x62b, 0x646,
+ 0x206, 0x62b, 0x649, 0x206, 0x62b, 0x64a, 0x206, 0x641,
+ 0x649, 0x206, 0x641, 0x64a, 0x206, 0x642, 0x649, 0x206,
+ 0x642, 0x64a, 0x206, 0x643, 0x627, 0x206, 0x643, 0x644,
+ 0x206, 0x643, 0x645, 0x206, 0x643, 0x649, 0x206, 0x643,
+ 0x64a, 0x206, 0x644, 0x645, 0x206, 0x644, 0x649, 0x206,
+ 0x644, 0x64a, 0x206, 0x645, 0x627, 0x206, 0x645, 0x645,
+ 0x206, 0x646, 0x631, 0x206, 0x646, 0x632, 0x206, 0x646,
+ 0x645, 0x206, 0x646, 0x646, 0x206, 0x646, 0x649, 0x206,
+ 0x646, 0x64a, 0x206, 0x649, 0x670, 0x206, 0x64a, 0x631,
+ 0x206, 0x64a, 0x632, 0x206, 0x64a, 0x645, 0x206, 0x64a,
+ 0x646, 0x206, 0x64a, 0x649, 0x206, 0x64a, 0x64a, 0x204,
+ 0x626, 0x62c, 0x204, 0x626, 0x62d, 0x204, 0x626, 0x62e,
+ 0x204, 0x626, 0x645, 0x204, 0x626, 0x647, 0x204, 0x628,
+ 0x62c, 0x204, 0x628, 0x62d, 0x204, 0x628, 0x62e, 0x204,
+ 0x628, 0x645, 0x204, 0x628, 0x647, 0x204, 0x62a, 0x62c,
+ 0x204, 0x62a, 0x62d, 0x204, 0x62a, 0x62e, 0x204, 0x62a,
+ 0x645, 0x204, 0x62a, 0x647, 0x204, 0x62b, 0x645, 0x204,
+ 0x62c, 0x62d, 0x204, 0x62c, 0x645, 0x204, 0x62d, 0x62c,
+ 0x204, 0x62d, 0x645, 0x204, 0x62e, 0x62c, 0x204, 0x62e,
+ 0x645, 0x204, 0x633, 0x62c, 0x204, 0x633, 0x62d, 0x204,
+ 0x633, 0x62e, 0x204, 0x633, 0x645, 0x204, 0x635, 0x62d,
+ 0x204, 0x635, 0x62e, 0x204, 0x635, 0x645, 0x204, 0x636,
+ 0x62c, 0x204, 0x636, 0x62d, 0x204, 0x636, 0x62e, 0x204,
+ 0x636, 0x645, 0x204, 0x637, 0x62d, 0x204, 0x638, 0x645,
+ 0x204, 0x639, 0x62c, 0x204, 0x639, 0x645, 0x204, 0x63a,
+ 0x62c, 0x204, 0x63a, 0x645, 0x204, 0x641, 0x62c, 0x204,
+ 0x641, 0x62d, 0x204, 0x641, 0x62e, 0x204, 0x641, 0x645,
+ 0x204, 0x642, 0x62d, 0x204, 0x642, 0x645, 0x204, 0x643,
+ 0x62c, 0x204, 0x643, 0x62d, 0x204, 0x643, 0x62e, 0x204,
+ 0x643, 0x644, 0x204, 0x643, 0x645, 0x204, 0x644, 0x62c,
+ 0x204, 0x644, 0x62d, 0x204, 0x644, 0x62e, 0x204, 0x644,
+ 0x645, 0x204, 0x644, 0x647, 0x204, 0x645, 0x62c, 0x204,
+ 0x645, 0x62d, 0x204, 0x645, 0x62e, 0x204, 0x645, 0x645,
+ 0x204, 0x646, 0x62c, 0x204, 0x646, 0x62d, 0x204, 0x646,
+ 0x62e, 0x204, 0x646, 0x645, 0x204, 0x646, 0x647, 0x204,
+ 0x647, 0x62c, 0x204, 0x647, 0x645, 0x204, 0x647, 0x670,
+ 0x204, 0x64a, 0x62c, 0x204, 0x64a, 0x62d, 0x204, 0x64a,
+ 0x62e, 0x204, 0x64a, 0x645, 0x204, 0x64a, 0x647, 0x205,
+ 0x626, 0x645, 0x205, 0x626, 0x647, 0x205, 0x628, 0x645,
+ 0x205, 0x628, 0x647, 0x205, 0x62a, 0x645, 0x205, 0x62a,
+ 0x647, 0x205, 0x62b, 0x645, 0x205, 0x62b, 0x647, 0x205,
+ 0x633, 0x645, 0x205, 0x633, 0x647, 0x205, 0x634, 0x645,
+ 0x205, 0x634, 0x647, 0x205, 0x643, 0x644, 0x205, 0x643,
+ 0x645, 0x205, 0x644, 0x645, 0x205, 0x646, 0x645, 0x205,
+ 0x646, 0x647, 0x205, 0x64a, 0x645, 0x205, 0x64a, 0x647,
+ 0x305, 0x640, 0x64e, 0x651, 0x305, 0x640, 0x64f, 0x651,
+ 0x305, 0x640, 0x650, 0x651, 0x207, 0x637, 0x649, 0x207,
+ 0x637, 0x64a, 0x207, 0x639, 0x649, 0x207, 0x639, 0x64a,
+ 0x207, 0x63a, 0x649, 0x207, 0x63a, 0x64a, 0x207, 0x633,
+ 0x649, 0x207, 0x633, 0x64a, 0x207, 0x634, 0x649, 0x207,
+ 0x634, 0x64a, 0x207, 0x62d, 0x649, 0x207, 0x62d, 0x64a,
+ 0x207, 0x62c, 0x649, 0x207, 0x62c, 0x64a, 0x207, 0x62e,
+ 0x649, 0x207, 0x62e, 0x64a, 0x207, 0x635, 0x649, 0x207,
+ 0x635, 0x64a, 0x207, 0x636, 0x649, 0x207, 0x636, 0x64a,
+ 0x207, 0x634, 0x62c, 0x207, 0x634, 0x62d, 0x207, 0x634,
+ 0x62e, 0x207, 0x634, 0x645, 0x207, 0x634, 0x631, 0x207,
+ 0x633, 0x631, 0x207, 0x635, 0x631, 0x207, 0x636, 0x631,
+ 0x206, 0x637, 0x649, 0x206, 0x637, 0x64a, 0x206, 0x639,
+ 0x649, 0x206, 0x639, 0x64a, 0x206, 0x63a, 0x649, 0x206,
+ 0x63a, 0x64a, 0x206, 0x633, 0x649, 0x206, 0x633, 0x64a,
+ 0x206, 0x634, 0x649, 0x206, 0x634, 0x64a, 0x206, 0x62d,
+ 0x649, 0x206, 0x62d, 0x64a, 0x206, 0x62c, 0x649, 0x206,
+ 0x62c, 0x64a, 0x206, 0x62e, 0x649, 0x206, 0x62e, 0x64a,
+ 0x206, 0x635, 0x649, 0x206, 0x635, 0x64a, 0x206, 0x636,
+ 0x649, 0x206, 0x636, 0x64a, 0x206, 0x634, 0x62c, 0x206,
+ 0x634, 0x62d, 0x206, 0x634, 0x62e, 0x206, 0x634, 0x645,
+ 0x206, 0x634, 0x631, 0x206, 0x633, 0x631, 0x206, 0x635,
+ 0x631, 0x206, 0x636, 0x631, 0x204, 0x634, 0x62c, 0x204,
+ 0x634, 0x62d, 0x204, 0x634, 0x62e, 0x204, 0x634, 0x645,
+ 0x204, 0x633, 0x647, 0x204, 0x634, 0x647, 0x204, 0x637,
+ 0x645, 0x205, 0x633, 0x62c, 0x205, 0x633, 0x62d, 0x205,
+ 0x633, 0x62e, 0x205, 0x634, 0x62c, 0x205, 0x634, 0x62d,
+ 0x205, 0x634, 0x62e, 0x205, 0x637, 0x645, 0x205, 0x638,
+ 0x645, 0x206, 0x627, 0x64b, 0x207, 0x627, 0x64b, 0x304,
+ 0x62a, 0x62c, 0x645, 0x306, 0x62a, 0x62d, 0x62c, 0x304,
+ 0x62a, 0x62d, 0x62c, 0x304, 0x62a, 0x62d, 0x645, 0x304,
+ 0x62a, 0x62e, 0x645, 0x304, 0x62a, 0x645, 0x62c, 0x304,
+ 0x62a, 0x645, 0x62d, 0x304, 0x62a, 0x645, 0x62e, 0x306,
+ 0x62c, 0x645, 0x62d, 0x304, 0x62c, 0x645, 0x62d, 0x306,
+ 0x62d, 0x645, 0x64a, 0x306, 0x62d, 0x645, 0x649, 0x304,
+ 0x633, 0x62d, 0x62c, 0x304, 0x633, 0x62c, 0x62d, 0x306,
+ 0x633, 0x62c, 0x649, 0x306, 0x633, 0x645, 0x62d, 0x304,
+ 0x633, 0x645, 0x62d, 0x304, 0x633, 0x645, 0x62c, 0x306,
+ 0x633, 0x645, 0x645, 0x304, 0x633, 0x645, 0x645, 0x306,
+ 0x635, 0x62d, 0x62d, 0x304, 0x635, 0x62d, 0x62d, 0x306,
+ 0x635, 0x645, 0x645, 0x306, 0x634, 0x62d, 0x645, 0x304,
+ 0x634, 0x62d, 0x645, 0x306, 0x634, 0x62c, 0x64a, 0x306,
+ 0x634, 0x645, 0x62e, 0x304, 0x634, 0x645, 0x62e, 0x306,
+ 0x634, 0x645, 0x645, 0x304, 0x634, 0x645, 0x645, 0x306,
+ 0x636, 0x62d, 0x649, 0x306, 0x636, 0x62e, 0x645, 0x304,
+ 0x636, 0x62e, 0x645, 0x306, 0x637, 0x645, 0x62d, 0x304,
+ 0x637, 0x645, 0x62d, 0x304, 0x637, 0x645, 0x645, 0x306,
+ 0x637, 0x645, 0x64a, 0x306, 0x639, 0x62c, 0x645, 0x306,
+ 0x639, 0x645, 0x645, 0x304, 0x639, 0x645, 0x645, 0x306,
+ 0x639, 0x645, 0x649, 0x306, 0x63a, 0x645, 0x645, 0x306,
+ 0x63a, 0x645, 0x64a, 0x306, 0x63a, 0x645, 0x649, 0x306,
+ 0x641, 0x62e, 0x645, 0x304, 0x641, 0x62e, 0x645, 0x306,
+ 0x642, 0x645, 0x62d, 0x306, 0x642, 0x645, 0x645, 0x306,
+ 0x644, 0x62d, 0x645, 0x306, 0x644, 0x62d, 0x64a, 0x306,
+ 0x644, 0x62d, 0x649, 0x304, 0x644, 0x62c, 0x62c, 0x306,
+ 0x644, 0x62c, 0x62c, 0x306, 0x644, 0x62e, 0x645, 0x304,
+ 0x644, 0x62e, 0x645, 0x306, 0x644, 0x645, 0x62d, 0x304,
+ 0x644, 0x645, 0x62d, 0x304, 0x645, 0x62d, 0x62c, 0x304,
+ 0x645, 0x62d, 0x645, 0x306, 0x645, 0x62d, 0x64a, 0x304,
+ 0x645, 0x62c, 0x62d, 0x304, 0x645, 0x62c, 0x645, 0x304,
+ 0x645, 0x62e, 0x62c, 0x304, 0x645, 0x62e, 0x645, 0x304,
+ 0x645, 0x62c, 0x62e, 0x304, 0x647, 0x645, 0x62c, 0x304,
+ 0x647, 0x645, 0x645, 0x304, 0x646, 0x62d, 0x645, 0x306,
+ 0x646, 0x62d, 0x649, 0x306, 0x646, 0x62c, 0x645, 0x304,
+ 0x646, 0x62c, 0x645, 0x306, 0x646, 0x62c, 0x649, 0x306,
+ 0x646, 0x645, 0x64a, 0x306, 0x646, 0x645, 0x649, 0x306,
+ 0x64a, 0x645, 0x645, 0x304, 0x64a, 0x645, 0x645, 0x306,
+ 0x628, 0x62e, 0x64a, 0x306, 0x62a, 0x62c, 0x64a, 0x306,
+ 0x62a, 0x62c, 0x649, 0x306, 0x62a, 0x62e, 0x64a, 0x306,
+ 0x62a, 0x62e, 0x649, 0x306, 0x62a, 0x645, 0x64a, 0x306,
+ 0x62a, 0x645, 0x649, 0x306, 0x62c, 0x645, 0x64a, 0x306,
+ 0x62c, 0x62d, 0x649, 0x306, 0x62c, 0x645, 0x649, 0x306,
+ 0x633, 0x62e, 0x649, 0x306, 0x635, 0x62d, 0x64a, 0x306,
+ 0x634, 0x62d, 0x64a, 0x306, 0x636, 0x62d, 0x64a, 0x306,
+ 0x644, 0x62c, 0x64a, 0x306, 0x644, 0x645, 0x64a, 0x306,
+ 0x64a, 0x62d, 0x64a, 0x306, 0x64a, 0x62c, 0x64a, 0x306,
+ 0x64a, 0x645, 0x64a, 0x306, 0x645, 0x645, 0x64a, 0x306,
+ 0x642, 0x645, 0x64a, 0x306, 0x646, 0x62d, 0x64a, 0x304,
+ 0x642, 0x645, 0x62d, 0x304, 0x644, 0x62d, 0x645, 0x306,
+ 0x639, 0x645, 0x64a, 0x306, 0x643, 0x645, 0x64a, 0x304,
+ 0x646, 0x62c, 0x62d, 0x306, 0x645, 0x62e, 0x64a, 0x304,
+ 0x644, 0x62c, 0x645, 0x306, 0x643, 0x645, 0x645, 0x306,
+ 0x644, 0x62c, 0x645, 0x306, 0x646, 0x62c, 0x62d, 0x306,
+ 0x62c, 0x62d, 0x64a, 0x306, 0x62d, 0x62c, 0x64a, 0x306,
+ 0x645, 0x62c, 0x64a, 0x306, 0x641, 0x645, 0x64a, 0x306,
+ 0x628, 0x62d, 0x64a, 0x304, 0x643, 0x645, 0x645, 0x304,
+ 0x639, 0x62c, 0x645, 0x304, 0x635, 0x645, 0x645, 0x306,
+ 0x633, 0x62e, 0x64a, 0x306, 0x646, 0x62c, 0x64a, 0x307,
+ 0x635, 0x644, 0x6d2, 0x307, 0x642, 0x644, 0x6d2, 0x407,
+ 0x627, 0x644, 0x644, 0x647, 0x407, 0x627, 0x643, 0x628,
+ 0x631, 0x407, 0x645, 0x62d, 0x645, 0x62f, 0x407, 0x635,
+ 0x644, 0x639, 0x645, 0x407, 0x631, 0x633, 0x648, 0x644,
+ 0x407, 0x639, 0x644, 0x64a, 0x647, 0x407, 0x648, 0x633,
+ 0x644, 0x645, 0x307, 0x635, 0x644, 0x649, 0x1207, 0x635,
+ 0x644, 0x649, 0x20, 0x627, 0x644, 0x644, 0x647, 0x20,
+ 0x639, 0x644, 0x64a, 0x647, 0x20, 0x648, 0x633, 0x644,
+ 0x645, 0x807, 0x62c, 0x644, 0x20, 0x62c, 0x644, 0x627,
+ 0x644, 0x647, 0x407, 0x631, 0x6cc, 0x627, 0x644, 0x10b,
+ 0x2c, 0x10b, 0x3001, 0x10b, 0x3002, 0x10b, 0x3a, 0x10b,
+ 0x3b, 0x10b, 0x21, 0x10b, 0x3f, 0x10b, 0x3016, 0x10b,
+ 0x3017, 0x10b, 0x2026, 0x10b, 0x2025, 0x10b, 0x2014, 0x10b,
+ 0x2013, 0x10b, 0x5f, 0x10b, 0x5f, 0x10b, 0x28, 0x10b,
+ 0x29, 0x10b, 0x7b, 0x10b, 0x7d, 0x10b, 0x3014, 0x10b,
+ 0x3015, 0x10b, 0x3010, 0x10b, 0x3011, 0x10b, 0x300a, 0x10b,
+ 0x300b, 0x10b, 0x3008, 0x10b, 0x3009, 0x10b, 0x300c, 0x10b,
+ 0x300d, 0x10b, 0x300e, 0x10b, 0x300f, 0x10b, 0x5b, 0x10b,
+ 0x5d, 0x110, 0x203e, 0x110, 0x203e, 0x110, 0x203e, 0x110,
+ 0x203e, 0x110, 0x5f, 0x110, 0x5f, 0x110, 0x5f, 0x10e,
+ 0x2c, 0x10e, 0x3001, 0x10e, 0x2e, 0x10e, 0x3b, 0x10e,
+ 0x3a, 0x10e, 0x3f, 0x10e, 0x21, 0x10e, 0x2014, 0x10e,
+ 0x28, 0x10e, 0x29, 0x10e, 0x7b, 0x10e, 0x7d, 0x10e,
+ 0x3014, 0x10e, 0x3015, 0x10e, 0x23, 0x10e, 0x26, 0x10e,
+ 0x2a, 0x10e, 0x2b, 0x10e, 0x2d, 0x10e, 0x3c, 0x10e,
+ 0x3e, 0x10e, 0x3d, 0x10e, 0x5c, 0x10e, 0x24, 0x10e,
+ 0x25, 0x10e, 0x40, 0x207, 0x20, 0x64b, 0x205, 0x640,
+ 0x64b, 0x207, 0x20, 0x64c, 0x207, 0x20, 0x64d, 0x207,
+ 0x20, 0x64e, 0x205, 0x640, 0x64e, 0x207, 0x20, 0x64f,
+ 0x205, 0x640, 0x64f, 0x207, 0x20, 0x650, 0x205, 0x640,
+ 0x650, 0x207, 0x20, 0x651, 0x205, 0x640, 0x651, 0x207,
+ 0x20, 0x652, 0x205, 0x640, 0x652, 0x107, 0x621, 0x107,
+ 0x622, 0x106, 0x622, 0x107, 0x623, 0x106, 0x623, 0x107,
+ 0x624, 0x106, 0x624, 0x107, 0x625, 0x106, 0x625, 0x107,
+ 0x626, 0x106, 0x626, 0x104, 0x626, 0x105, 0x626, 0x107,
+ 0x627, 0x106, 0x627, 0x107, 0x628, 0x106, 0x628, 0x104,
+ 0x628, 0x105, 0x628, 0x107, 0x629, 0x106, 0x629, 0x107,
+ 0x62a, 0x106, 0x62a, 0x104, 0x62a, 0x105, 0x62a, 0x107,
+ 0x62b, 0x106, 0x62b, 0x104, 0x62b, 0x105, 0x62b, 0x107,
+ 0x62c, 0x106, 0x62c, 0x104, 0x62c, 0x105, 0x62c, 0x107,
+ 0x62d, 0x106, 0x62d, 0x104, 0x62d, 0x105, 0x62d, 0x107,
+ 0x62e, 0x106, 0x62e, 0x104, 0x62e, 0x105, 0x62e, 0x107,
+ 0x62f, 0x106, 0x62f, 0x107, 0x630, 0x106, 0x630, 0x107,
+ 0x631, 0x106, 0x631, 0x107, 0x632, 0x106, 0x632, 0x107,
+ 0x633, 0x106, 0x633, 0x104, 0x633, 0x105, 0x633, 0x107,
+ 0x634, 0x106, 0x634, 0x104, 0x634, 0x105, 0x634, 0x107,
+ 0x635, 0x106, 0x635, 0x104, 0x635, 0x105, 0x635, 0x107,
+ 0x636, 0x106, 0x636, 0x104, 0x636, 0x105, 0x636, 0x107,
+ 0x637, 0x106, 0x637, 0x104, 0x637, 0x105, 0x637, 0x107,
+ 0x638, 0x106, 0x638, 0x104, 0x638, 0x105, 0x638, 0x107,
+ 0x639, 0x106, 0x639, 0x104, 0x639, 0x105, 0x639, 0x107,
+ 0x63a, 0x106, 0x63a, 0x104, 0x63a, 0x105, 0x63a, 0x107,
+ 0x641, 0x106, 0x641, 0x104, 0x641, 0x105, 0x641, 0x107,
+ 0x642, 0x106, 0x642, 0x104, 0x642, 0x105, 0x642, 0x107,
+ 0x643, 0x106, 0x643, 0x104, 0x643, 0x105, 0x643, 0x107,
+ 0x644, 0x106, 0x644, 0x104, 0x644, 0x105, 0x644, 0x107,
+ 0x645, 0x106, 0x645, 0x104, 0x645, 0x105, 0x645, 0x107,
+ 0x646, 0x106, 0x646, 0x104, 0x646, 0x105, 0x646, 0x107,
+ 0x647, 0x106, 0x647, 0x104, 0x647, 0x105, 0x647, 0x107,
+ 0x648, 0x106, 0x648, 0x107, 0x649, 0x106, 0x649, 0x107,
+ 0x64a, 0x106, 0x64a, 0x104, 0x64a, 0x105, 0x64a, 0x207,
+ 0x644, 0x622, 0x206, 0x644, 0x622, 0x207, 0x644, 0x623,
+ 0x206, 0x644, 0x623, 0x207, 0x644, 0x625, 0x206, 0x644,
+ 0x625, 0x207, 0x644, 0x627, 0x206, 0x644, 0x627, 0x10c,
+ 0x21, 0x10c, 0x22, 0x10c, 0x23, 0x10c, 0x24, 0x10c,
+ 0x25, 0x10c, 0x26, 0x10c, 0x27, 0x10c, 0x28, 0x10c,
+ 0x29, 0x10c, 0x2a, 0x10c, 0x2b, 0x10c, 0x2c, 0x10c,
+ 0x2d, 0x10c, 0x2e, 0x10c, 0x2f, 0x10c, 0x30, 0x10c,
+ 0x31, 0x10c, 0x32, 0x10c, 0x33, 0x10c, 0x34, 0x10c,
+ 0x35, 0x10c, 0x36, 0x10c, 0x37, 0x10c, 0x38, 0x10c,
+ 0x39, 0x10c, 0x3a, 0x10c, 0x3b, 0x10c, 0x3c, 0x10c,
+ 0x3d, 0x10c, 0x3e, 0x10c, 0x3f, 0x10c, 0x40, 0x10c,
+ 0x41, 0x10c, 0x42, 0x10c, 0x43, 0x10c, 0x44, 0x10c,
+ 0x45, 0x10c, 0x46, 0x10c, 0x47, 0x10c, 0x48, 0x10c,
+ 0x49, 0x10c, 0x4a, 0x10c, 0x4b, 0x10c, 0x4c, 0x10c,
+ 0x4d, 0x10c, 0x4e, 0x10c, 0x4f, 0x10c, 0x50, 0x10c,
+ 0x51, 0x10c, 0x52, 0x10c, 0x53, 0x10c, 0x54, 0x10c,
+ 0x55, 0x10c, 0x56, 0x10c, 0x57, 0x10c, 0x58, 0x10c,
+ 0x59, 0x10c, 0x5a, 0x10c, 0x5b, 0x10c, 0x5c, 0x10c,
+ 0x5d, 0x10c, 0x5e, 0x10c, 0x5f, 0x10c, 0x60, 0x10c,
+ 0x61, 0x10c, 0x62, 0x10c, 0x63, 0x10c, 0x64, 0x10c,
+ 0x65, 0x10c, 0x66, 0x10c, 0x67, 0x10c, 0x68, 0x10c,
+ 0x69, 0x10c, 0x6a, 0x10c, 0x6b, 0x10c, 0x6c, 0x10c,
+ 0x6d, 0x10c, 0x6e, 0x10c, 0x6f, 0x10c, 0x70, 0x10c,
+ 0x71, 0x10c, 0x72, 0x10c, 0x73, 0x10c, 0x74, 0x10c,
+ 0x75, 0x10c, 0x76, 0x10c, 0x77, 0x10c, 0x78, 0x10c,
+ 0x79, 0x10c, 0x7a, 0x10c, 0x7b, 0x10c, 0x7c, 0x10c,
+ 0x7d, 0x10c, 0x7e, 0x10c, 0x2985, 0x10c, 0x2986, 0x10d,
+ 0x3002, 0x10d, 0x300c, 0x10d, 0x300d, 0x10d, 0x3001, 0x10d,
+ 0x30fb, 0x10d, 0x30f2, 0x10d, 0x30a1, 0x10d, 0x30a3, 0x10d,
+ 0x30a5, 0x10d, 0x30a7, 0x10d, 0x30a9, 0x10d, 0x30e3, 0x10d,
+ 0x30e5, 0x10d, 0x30e7, 0x10d, 0x30c3, 0x10d, 0x30fc, 0x10d,
+ 0x30a2, 0x10d, 0x30a4, 0x10d, 0x30a6, 0x10d, 0x30a8, 0x10d,
+ 0x30aa, 0x10d, 0x30ab, 0x10d, 0x30ad, 0x10d, 0x30af, 0x10d,
+ 0x30b1, 0x10d, 0x30b3, 0x10d, 0x30b5, 0x10d, 0x30b7, 0x10d,
+ 0x30b9, 0x10d, 0x30bb, 0x10d, 0x30bd, 0x10d, 0x30bf, 0x10d,
+ 0x30c1, 0x10d, 0x30c4, 0x10d, 0x30c6, 0x10d, 0x30c8, 0x10d,
+ 0x30ca, 0x10d, 0x30cb, 0x10d, 0x30cc, 0x10d, 0x30cd, 0x10d,
+ 0x30ce, 0x10d, 0x30cf, 0x10d, 0x30d2, 0x10d, 0x30d5, 0x10d,
+ 0x30d8, 0x10d, 0x30db, 0x10d, 0x30de, 0x10d, 0x30df, 0x10d,
+ 0x30e0, 0x10d, 0x30e1, 0x10d, 0x30e2, 0x10d, 0x30e4, 0x10d,
+ 0x30e6, 0x10d, 0x30e8, 0x10d, 0x30e9, 0x10d, 0x30ea, 0x10d,
+ 0x30eb, 0x10d, 0x30ec, 0x10d, 0x30ed, 0x10d, 0x30ef, 0x10d,
+ 0x30f3, 0x10d, 0x3099, 0x10d, 0x309a, 0x10d, 0x3164, 0x10d,
+ 0x3131, 0x10d, 0x3132, 0x10d, 0x3133, 0x10d, 0x3134, 0x10d,
+ 0x3135, 0x10d, 0x3136, 0x10d, 0x3137, 0x10d, 0x3138, 0x10d,
+ 0x3139, 0x10d, 0x313a, 0x10d, 0x313b, 0x10d, 0x313c, 0x10d,
+ 0x313d, 0x10d, 0x313e, 0x10d, 0x313f, 0x10d, 0x3140, 0x10d,
+ 0x3141, 0x10d, 0x3142, 0x10d, 0x3143, 0x10d, 0x3144, 0x10d,
+ 0x3145, 0x10d, 0x3146, 0x10d, 0x3147, 0x10d, 0x3148, 0x10d,
+ 0x3149, 0x10d, 0x314a, 0x10d, 0x314b, 0x10d, 0x314c, 0x10d,
+ 0x314d, 0x10d, 0x314e, 0x10d, 0x314f, 0x10d, 0x3150, 0x10d,
+ 0x3151, 0x10d, 0x3152, 0x10d, 0x3153, 0x10d, 0x3154, 0x10d,
+ 0x3155, 0x10d, 0x3156, 0x10d, 0x3157, 0x10d, 0x3158, 0x10d,
+ 0x3159, 0x10d, 0x315a, 0x10d, 0x315b, 0x10d, 0x315c, 0x10d,
+ 0x315d, 0x10d, 0x315e, 0x10d, 0x315f, 0x10d, 0x3160, 0x10d,
+ 0x3161, 0x10d, 0x3162, 0x10d, 0x3163, 0x10c, 0xa2, 0x10c,
+ 0xa3, 0x10c, 0xac, 0x10c, 0xaf, 0x10c, 0xa6, 0x10c,
+ 0xa5, 0x10c, 0x20a9, 0x10d, 0x2502, 0x10d, 0x2190, 0x10d,
+ 0x2191, 0x10d, 0x2192, 0x10d, 0x2193, 0x10d, 0x25a0, 0x10d,
+ 0x25cb, 0x401, 0xd804, 0xdc99, 0xd804, 0xdcba, 0x401, 0xd804,
+ 0xdc9b, 0xd804, 0xdcba, 0x401, 0xd804, 0xdca5, 0xd804, 0xdcba,
+ 0x401, 0xd804, 0xdd31, 0xd804, 0xdd27, 0x401, 0xd804, 0xdd32,
+ 0xd804, 0xdd27, 0x401, 0xd804, 0xdf47, 0xd804, 0xdf3e, 0x401,
+ 0xd804, 0xdf47, 0xd804, 0xdf57, 0x401, 0xd805, 0xdcb9, 0xd805,
+ 0xdcba, 0x401, 0xd805, 0xdcb9, 0xd805, 0xdcb0, 0x401, 0xd805,
+ 0xdcb9, 0xd805, 0xdcbd, 0x401, 0xd805, 0xddb8, 0xd805, 0xddaf,
+ 0x401, 0xd805, 0xddb9, 0xd805, 0xddaf, 0x401, 0xd834, 0xdd57,
+ 0xd834, 0xdd65, 0x401, 0xd834, 0xdd58, 0xd834, 0xdd65, 0x401,
+ 0xd834, 0xdd5f, 0xd834, 0xdd6e, 0x401, 0xd834, 0xdd5f, 0xd834,
+ 0xdd6f, 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd70, 0x401, 0xd834,
+ 0xdd5f, 0xd834, 0xdd71, 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd72,
+ 0x401, 0xd834, 0xddb9, 0xd834, 0xdd65, 0x401, 0xd834, 0xddba,
+ 0xd834, 0xdd65, 0x401, 0xd834, 0xddbb, 0xd834, 0xdd6e, 0x401,
+ 0xd834, 0xddbc, 0xd834, 0xdd6e, 0x401, 0xd834, 0xddbb, 0xd834,
+ 0xdd6f, 0x401, 0xd834, 0xddbc, 0xd834, 0xdd6f, 0x102, 0x41,
+ 0x102, 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45,
+ 0x102, 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49,
+ 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d,
+ 0x102, 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51,
+ 0x102, 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55,
+ 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59,
+ 0x102, 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63,
+ 0x102, 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67,
+ 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b,
+ 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f,
+ 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73,
+ 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77,
+ 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41,
+ 0x102, 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45,
+ 0x102, 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49,
+ 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d,
+ 0x102, 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51,
+ 0x102, 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55,
+ 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59,
+ 0x102, 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63,
+ 0x102, 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67,
+ 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c,
+ 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70,
+ 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74,
+ 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78,
+ 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42,
+ 0x102, 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46,
+ 0x102, 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a,
+ 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e,
+ 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52,
+ 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56,
+ 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a,
+ 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64,
+ 0x102, 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68,
+ 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c,
+ 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70,
+ 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74,
+ 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78,
+ 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x43,
+ 0x102, 0x44, 0x102, 0x47, 0x102, 0x4a, 0x102, 0x4b,
+ 0x102, 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51,
+ 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56,
+ 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a,
+ 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64,
+ 0x102, 0x66, 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a,
+ 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e,
+ 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73,
+ 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77,
+ 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41,
+ 0x102, 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45,
+ 0x102, 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49,
+ 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d,
+ 0x102, 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51,
+ 0x102, 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55,
+ 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59,
+ 0x102, 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63,
+ 0x102, 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67,
+ 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b,
+ 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f,
+ 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73,
+ 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77,
+ 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41,
+ 0x102, 0x42, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46,
+ 0x102, 0x47, 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c,
+ 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102, 0x50,
+ 0x102, 0x51, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55,
+ 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59,
+ 0x102, 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64,
+ 0x102, 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68,
+ 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c,
+ 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70,
+ 0x102, 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74,
+ 0x102, 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78,
+ 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42,
+ 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47,
+ 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c,
+ 0x102, 0x4d, 0x102, 0x4f, 0x102, 0x53, 0x102, 0x54,
+ 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102, 0x58,
+ 0x102, 0x59, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63,
+ 0x102, 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67,
+ 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b,
+ 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f,
+ 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73,
+ 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77,
+ 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41,
+ 0x102, 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45,
+ 0x102, 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49,
+ 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d,
+ 0x102, 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51,
+ 0x102, 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55,
+ 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59,
+ 0x102, 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63,
+ 0x102, 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67,
+ 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b,
+ 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f,
+ 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73,
+ 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77,
+ 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41,
+ 0x102, 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45,
+ 0x102, 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49,
+ 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d,
+ 0x102, 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51,
+ 0x102, 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55,
+ 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59,
+ 0x102, 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63,
+ 0x102, 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67,
+ 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b,
+ 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f,
+ 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73,
+ 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77,
+ 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41,
+ 0x102, 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45,
+ 0x102, 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49,
+ 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d,
+ 0x102, 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51,
+ 0x102, 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55,
+ 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59,
+ 0x102, 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63,
+ 0x102, 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67,
+ 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b,
+ 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f,
+ 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73,
+ 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77,
+ 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41,
+ 0x102, 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45,
+ 0x102, 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49,
+ 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d,
+ 0x102, 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51,
+ 0x102, 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55,
+ 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59,
+ 0x102, 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63,
+ 0x102, 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67,
+ 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b,
+ 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f,
+ 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73,
+ 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77,
+ 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41,
+ 0x102, 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45,
+ 0x102, 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49,
+ 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d,
+ 0x102, 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51,
+ 0x102, 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55,
+ 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59,
+ 0x102, 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63,
+ 0x102, 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67,
+ 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b,
+ 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f,
+ 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73,
+ 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77,
+ 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x41,
+ 0x102, 0x42, 0x102, 0x43, 0x102, 0x44, 0x102, 0x45,
+ 0x102, 0x46, 0x102, 0x47, 0x102, 0x48, 0x102, 0x49,
+ 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d,
+ 0x102, 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51,
+ 0x102, 0x52, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55,
+ 0x102, 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59,
+ 0x102, 0x5a, 0x102, 0x61, 0x102, 0x62, 0x102, 0x63,
+ 0x102, 0x64, 0x102, 0x65, 0x102, 0x66, 0x102, 0x67,
+ 0x102, 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b,
+ 0x102, 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x6f,
+ 0x102, 0x70, 0x102, 0x71, 0x102, 0x72, 0x102, 0x73,
+ 0x102, 0x74, 0x102, 0x75, 0x102, 0x76, 0x102, 0x77,
+ 0x102, 0x78, 0x102, 0x79, 0x102, 0x7a, 0x102, 0x131,
+ 0x102, 0x237, 0x102, 0x391, 0x102, 0x392, 0x102, 0x393,
+ 0x102, 0x394, 0x102, 0x395, 0x102, 0x396, 0x102, 0x397,
+ 0x102, 0x398, 0x102, 0x399, 0x102, 0x39a, 0x102, 0x39b,
+ 0x102, 0x39c, 0x102, 0x39d, 0x102, 0x39e, 0x102, 0x39f,
+ 0x102, 0x3a0, 0x102, 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3,
+ 0x102, 0x3a4, 0x102, 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7,
+ 0x102, 0x3a8, 0x102, 0x3a9, 0x102, 0x2207, 0x102, 0x3b1,
+ 0x102, 0x3b2, 0x102, 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5,
+ 0x102, 0x3b6, 0x102, 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9,
+ 0x102, 0x3ba, 0x102, 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd,
+ 0x102, 0x3be, 0x102, 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1,
+ 0x102, 0x3c2, 0x102, 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5,
+ 0x102, 0x3c6, 0x102, 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9,
+ 0x102, 0x2202, 0x102, 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0,
+ 0x102, 0x3d5, 0x102, 0x3f1, 0x102, 0x3d6, 0x102, 0x391,
+ 0x102, 0x392, 0x102, 0x393, 0x102, 0x394, 0x102, 0x395,
+ 0x102, 0x396, 0x102, 0x397, 0x102, 0x398, 0x102, 0x399,
+ 0x102, 0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102, 0x39d,
+ 0x102, 0x39e, 0x102, 0x39f, 0x102, 0x3a0, 0x102, 0x3a1,
+ 0x102, 0x3f4, 0x102, 0x3a3, 0x102, 0x3a4, 0x102, 0x3a5,
+ 0x102, 0x3a6, 0x102, 0x3a7, 0x102, 0x3a8, 0x102, 0x3a9,
+ 0x102, 0x2207, 0x102, 0x3b1, 0x102, 0x3b2, 0x102, 0x3b3,
+ 0x102, 0x3b4, 0x102, 0x3b5, 0x102, 0x3b6, 0x102, 0x3b7,
+ 0x102, 0x3b8, 0x102, 0x3b9, 0x102, 0x3ba, 0x102, 0x3bb,
+ 0x102, 0x3bc, 0x102, 0x3bd, 0x102, 0x3be, 0x102, 0x3bf,
+ 0x102, 0x3c0, 0x102, 0x3c1, 0x102, 0x3c2, 0x102, 0x3c3,
+ 0x102, 0x3c4, 0x102, 0x3c5, 0x102, 0x3c6, 0x102, 0x3c7,
+ 0x102, 0x3c8, 0x102, 0x3c9, 0x102, 0x2202, 0x102, 0x3f5,
+ 0x102, 0x3d1, 0x102, 0x3f0, 0x102, 0x3d5, 0x102, 0x3f1,
+ 0x102, 0x3d6, 0x102, 0x391, 0x102, 0x392, 0x102, 0x393,
+ 0x102, 0x394, 0x102, 0x395, 0x102, 0x396, 0x102, 0x397,
+ 0x102, 0x398, 0x102, 0x399, 0x102, 0x39a, 0x102, 0x39b,
+ 0x102, 0x39c, 0x102, 0x39d, 0x102, 0x39e, 0x102, 0x39f,
+ 0x102, 0x3a0, 0x102, 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3,
+ 0x102, 0x3a4, 0x102, 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7,
+ 0x102, 0x3a8, 0x102, 0x3a9, 0x102, 0x2207, 0x102, 0x3b1,
+ 0x102, 0x3b2, 0x102, 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5,
+ 0x102, 0x3b6, 0x102, 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9,
+ 0x102, 0x3ba, 0x102, 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd,
+ 0x102, 0x3be, 0x102, 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1,
+ 0x102, 0x3c2, 0x102, 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5,
+ 0x102, 0x3c6, 0x102, 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9,
+ 0x102, 0x2202, 0x102, 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0,
+ 0x102, 0x3d5, 0x102, 0x3f1, 0x102, 0x3d6, 0x102, 0x391,
+ 0x102, 0x392, 0x102, 0x393, 0x102, 0x394, 0x102, 0x395,
+ 0x102, 0x396, 0x102, 0x397, 0x102, 0x398, 0x102, 0x399,
+ 0x102, 0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102, 0x39d,
+ 0x102, 0x39e, 0x102, 0x39f, 0x102, 0x3a0, 0x102, 0x3a1,
+ 0x102, 0x3f4, 0x102, 0x3a3, 0x102, 0x3a4, 0x102, 0x3a5,
+ 0x102, 0x3a6, 0x102, 0x3a7, 0x102, 0x3a8, 0x102, 0x3a9,
+ 0x102, 0x2207, 0x102, 0x3b1, 0x102, 0x3b2, 0x102, 0x3b3,
+ 0x102, 0x3b4, 0x102, 0x3b5, 0x102, 0x3b6, 0x102, 0x3b7,
+ 0x102, 0x3b8, 0x102, 0x3b9, 0x102, 0x3ba, 0x102, 0x3bb,
+ 0x102, 0x3bc, 0x102, 0x3bd, 0x102, 0x3be, 0x102, 0x3bf,
+ 0x102, 0x3c0, 0x102, 0x3c1, 0x102, 0x3c2, 0x102, 0x3c3,
+ 0x102, 0x3c4, 0x102, 0x3c5, 0x102, 0x3c6, 0x102, 0x3c7,
+ 0x102, 0x3c8, 0x102, 0x3c9, 0x102, 0x2202, 0x102, 0x3f5,
+ 0x102, 0x3d1, 0x102, 0x3f0, 0x102, 0x3d5, 0x102, 0x3f1,
+ 0x102, 0x3d6, 0x102, 0x391, 0x102, 0x392, 0x102, 0x393,
+ 0x102, 0x394, 0x102, 0x395, 0x102, 0x396, 0x102, 0x397,
+ 0x102, 0x398, 0x102, 0x399, 0x102, 0x39a, 0x102, 0x39b,
+ 0x102, 0x39c, 0x102, 0x39d, 0x102, 0x39e, 0x102, 0x39f,
+ 0x102, 0x3a0, 0x102, 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3,
+ 0x102, 0x3a4, 0x102, 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7,
+ 0x102, 0x3a8, 0x102, 0x3a9, 0x102, 0x2207, 0x102, 0x3b1,
+ 0x102, 0x3b2, 0x102, 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5,
+ 0x102, 0x3b6, 0x102, 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9,
+ 0x102, 0x3ba, 0x102, 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd,
+ 0x102, 0x3be, 0x102, 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1,
+ 0x102, 0x3c2, 0x102, 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5,
+ 0x102, 0x3c6, 0x102, 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9,
+ 0x102, 0x2202, 0x102, 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0,
+ 0x102, 0x3d5, 0x102, 0x3f1, 0x102, 0x3d6, 0x102, 0x3dc,
+ 0x102, 0x3dd, 0x102, 0x30, 0x102, 0x31, 0x102, 0x32,
+ 0x102, 0x33, 0x102, 0x34, 0x102, 0x35, 0x102, 0x36,
+ 0x102, 0x37, 0x102, 0x38, 0x102, 0x39, 0x102, 0x30,
+ 0x102, 0x31, 0x102, 0x32, 0x102, 0x33, 0x102, 0x34,
+ 0x102, 0x35, 0x102, 0x36, 0x102, 0x37, 0x102, 0x38,
+ 0x102, 0x39, 0x102, 0x30, 0x102, 0x31, 0x102, 0x32,
+ 0x102, 0x33, 0x102, 0x34, 0x102, 0x35, 0x102, 0x36,
+ 0x102, 0x37, 0x102, 0x38, 0x102, 0x39, 0x102, 0x30,
+ 0x102, 0x31, 0x102, 0x32, 0x102, 0x33, 0x102, 0x34,
+ 0x102, 0x35, 0x102, 0x36, 0x102, 0x37, 0x102, 0x38,
+ 0x102, 0x39, 0x102, 0x30, 0x102, 0x31, 0x102, 0x32,
+ 0x102, 0x33, 0x102, 0x34, 0x102, 0x35, 0x102, 0x36,
+ 0x102, 0x37, 0x102, 0x38, 0x102, 0x39, 0x102, 0x627,
+ 0x102, 0x628, 0x102, 0x62c, 0x102, 0x62f, 0x102, 0x648,
+ 0x102, 0x632, 0x102, 0x62d, 0x102, 0x637, 0x102, 0x64a,
+ 0x102, 0x643, 0x102, 0x644, 0x102, 0x645, 0x102, 0x646,
+ 0x102, 0x633, 0x102, 0x639, 0x102, 0x641, 0x102, 0x635,
+ 0x102, 0x642, 0x102, 0x631, 0x102, 0x634, 0x102, 0x62a,
+ 0x102, 0x62b, 0x102, 0x62e, 0x102, 0x630, 0x102, 0x636,
+ 0x102, 0x638, 0x102, 0x63a, 0x102, 0x66e, 0x102, 0x6ba,
+ 0x102, 0x6a1, 0x102, 0x66f, 0x102, 0x628, 0x102, 0x62c,
+ 0x102, 0x647, 0x102, 0x62d, 0x102, 0x64a, 0x102, 0x643,
+ 0x102, 0x644, 0x102, 0x645, 0x102, 0x646, 0x102, 0x633,
+ 0x102, 0x639, 0x102, 0x641, 0x102, 0x635, 0x102, 0x642,
+ 0x102, 0x634, 0x102, 0x62a, 0x102, 0x62b, 0x102, 0x62e,
+ 0x102, 0x636, 0x102, 0x63a, 0x102, 0x62c, 0x102, 0x62d,
+ 0x102, 0x64a, 0x102, 0x644, 0x102, 0x646, 0x102, 0x633,
+ 0x102, 0x639, 0x102, 0x635, 0x102, 0x642, 0x102, 0x634,
+ 0x102, 0x62e, 0x102, 0x636, 0x102, 0x63a, 0x102, 0x6ba,
+ 0x102, 0x66f, 0x102, 0x628, 0x102, 0x62c, 0x102, 0x647,
+ 0x102, 0x62d, 0x102, 0x637, 0x102, 0x64a, 0x102, 0x643,
+ 0x102, 0x645, 0x102, 0x646, 0x102, 0x633, 0x102, 0x639,
+ 0x102, 0x641, 0x102, 0x635, 0x102, 0x642, 0x102, 0x634,
+ 0x102, 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102, 0x636,
+ 0x102, 0x638, 0x102, 0x63a, 0x102, 0x66e, 0x102, 0x6a1,
+ 0x102, 0x627, 0x102, 0x628, 0x102, 0x62c, 0x102, 0x62f,
+ 0x102, 0x647, 0x102, 0x648, 0x102, 0x632, 0x102, 0x62d,
+ 0x102, 0x637, 0x102, 0x64a, 0x102, 0x644, 0x102, 0x645,
+ 0x102, 0x646, 0x102, 0x633, 0x102, 0x639, 0x102, 0x641,
+ 0x102, 0x635, 0x102, 0x642, 0x102, 0x631, 0x102, 0x634,
+ 0x102, 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102, 0x630,
+ 0x102, 0x636, 0x102, 0x638, 0x102, 0x63a, 0x102, 0x628,
+ 0x102, 0x62c, 0x102, 0x62f, 0x102, 0x648, 0x102, 0x632,
+ 0x102, 0x62d, 0x102, 0x637, 0x102, 0x64a, 0x102, 0x644,
+ 0x102, 0x645, 0x102, 0x646, 0x102, 0x633, 0x102, 0x639,
+ 0x102, 0x641, 0x102, 0x635, 0x102, 0x642, 0x102, 0x631,
+ 0x102, 0x634, 0x102, 0x62a, 0x102, 0x62b, 0x102, 0x62e,
+ 0x102, 0x630, 0x102, 0x636, 0x102, 0x638, 0x102, 0x63a,
+ 0x210, 0x30, 0x2e, 0x210, 0x30, 0x2c, 0x210, 0x31,
+ 0x2c, 0x210, 0x32, 0x2c, 0x210, 0x33, 0x2c, 0x210,
+ 0x34, 0x2c, 0x210, 0x35, 0x2c, 0x210, 0x36, 0x2c,
+ 0x210, 0x37, 0x2c, 0x210, 0x38, 0x2c, 0x210, 0x39,
+ 0x2c, 0x310, 0x28, 0x41, 0x29, 0x310, 0x28, 0x42,
+ 0x29, 0x310, 0x28, 0x43, 0x29, 0x310, 0x28, 0x44,
+ 0x29, 0x310, 0x28, 0x45, 0x29, 0x310, 0x28, 0x46,
+ 0x29, 0x310, 0x28, 0x47, 0x29, 0x310, 0x28, 0x48,
+ 0x29, 0x310, 0x28, 0x49, 0x29, 0x310, 0x28, 0x4a,
+ 0x29, 0x310, 0x28, 0x4b, 0x29, 0x310, 0x28, 0x4c,
+ 0x29, 0x310, 0x28, 0x4d, 0x29, 0x310, 0x28, 0x4e,
+ 0x29, 0x310, 0x28, 0x4f, 0x29, 0x310, 0x28, 0x50,
+ 0x29, 0x310, 0x28, 0x51, 0x29, 0x310, 0x28, 0x52,
+ 0x29, 0x310, 0x28, 0x53, 0x29, 0x310, 0x28, 0x54,
+ 0x29, 0x310, 0x28, 0x55, 0x29, 0x310, 0x28, 0x56,
+ 0x29, 0x310, 0x28, 0x57, 0x29, 0x310, 0x28, 0x58,
+ 0x29, 0x310, 0x28, 0x59, 0x29, 0x310, 0x28, 0x5a,
+ 0x29, 0x310, 0x3014, 0x53, 0x3015, 0x108, 0x43, 0x108,
+ 0x52, 0x208, 0x43, 0x44, 0x208, 0x57, 0x5a, 0x10f,
+ 0x41, 0x10f, 0x42, 0x10f, 0x43, 0x10f, 0x44, 0x10f,
+ 0x45, 0x10f, 0x46, 0x10f, 0x47, 0x10f, 0x48, 0x10f,
+ 0x49, 0x10f, 0x4a, 0x10f, 0x4b, 0x10f, 0x4c, 0x10f,
+ 0x4d, 0x10f, 0x4e, 0x10f, 0x4f, 0x10f, 0x50, 0x10f,
+ 0x51, 0x10f, 0x52, 0x10f, 0x53, 0x10f, 0x54, 0x10f,
+ 0x55, 0x10f, 0x56, 0x10f, 0x57, 0x10f, 0x58, 0x10f,
+ 0x59, 0x10f, 0x5a, 0x20f, 0x48, 0x56, 0x20f, 0x4d,
+ 0x56, 0x20f, 0x53, 0x44, 0x20f, 0x53, 0x53, 0x30f,
+ 0x50, 0x50, 0x56, 0x20f, 0x57, 0x43, 0x209, 0x4d,
+ 0x43, 0x209, 0x4d, 0x44, 0x209, 0x4d, 0x52, 0x20f,
+ 0x44, 0x4a, 0x20f, 0x307b, 0x304b, 0x20f, 0x30b3, 0x30b3,
+ 0x10f, 0x30b5, 0x10f, 0x624b, 0x10f, 0x5b57, 0x10f, 0x53cc,
+ 0x10f, 0x30c7, 0x10f, 0x4e8c, 0x10f, 0x591a, 0x10f, 0x89e3,
+ 0x10f, 0x5929, 0x10f, 0x4ea4, 0x10f, 0x6620, 0x10f, 0x7121,
+ 0x10f, 0x6599, 0x10f, 0x524d, 0x10f, 0x5f8c, 0x10f, 0x518d,
+ 0x10f, 0x65b0, 0x10f, 0x521d, 0x10f, 0x7d42, 0x10f, 0x751f,
+ 0x10f, 0x8ca9, 0x10f, 0x58f0, 0x10f, 0x5439, 0x10f, 0x6f14,
+ 0x10f, 0x6295, 0x10f, 0x6355, 0x10f, 0x4e00, 0x10f, 0x4e09,
+ 0x10f, 0x904a, 0x10f, 0x5de6, 0x10f, 0x4e2d, 0x10f, 0x53f3,
+ 0x10f, 0x6307, 0x10f, 0x8d70, 0x10f, 0x6253, 0x10f, 0x7981,
+ 0x10f, 0x7a7a, 0x10f, 0x5408, 0x10f, 0x6e80, 0x10f, 0x6709,
+ 0x10f, 0x6708, 0x10f, 0x7533, 0x10f, 0x5272, 0x10f, 0x55b6,
+ 0x10f, 0x914d, 0x310, 0x3014, 0x672c, 0x3015, 0x310, 0x3014,
+ 0x4e09, 0x3015, 0x310, 0x3014, 0x4e8c, 0x3015, 0x310, 0x3014,
+ 0x5b89, 0x3015, 0x310, 0x3014, 0x70b9, 0x3015, 0x310, 0x3014,
+ 0x6253, 0x3015, 0x310, 0x3014, 0x76d7, 0x3015, 0x310, 0x3014,
+ 0x52dd, 0x3015, 0x310, 0x3014, 0x6557, 0x3015, 0x108, 0x5f97,
+ 0x108, 0x53ef, 0x101, 0x4e3d, 0x101, 0x4e38, 0x101, 0x4e41,
+ 0x201, 0xd840, 0xdd22, 0x101, 0x4f60, 0x101, 0x4fae, 0x101,
+ 0x4fbb, 0x101, 0x5002, 0x101, 0x507a, 0x101, 0x5099, 0x101,
+ 0x50e7, 0x101, 0x50cf, 0x101, 0x349e, 0x201, 0xd841, 0xde3a,
+ 0x101, 0x514d, 0x101, 0x5154, 0x101, 0x5164, 0x101, 0x5177,
+ 0x201, 0xd841, 0xdd1c, 0x101, 0x34b9, 0x101, 0x5167, 0x101,
+ 0x518d, 0x201, 0xd841, 0xdd4b, 0x101, 0x5197, 0x101, 0x51a4,
+ 0x101, 0x4ecc, 0x101, 0x51ac, 0x101, 0x51b5, 0x201, 0xd864,
+ 0xdddf, 0x101, 0x51f5, 0x101, 0x5203, 0x101, 0x34df, 0x101,
+ 0x523b, 0x101, 0x5246, 0x101, 0x5272, 0x101, 0x5277, 0x101,
+ 0x3515, 0x101, 0x52c7, 0x101, 0x52c9, 0x101, 0x52e4, 0x101,
+ 0x52fa, 0x101, 0x5305, 0x101, 0x5306, 0x101, 0x5317, 0x101,
+ 0x5349, 0x101, 0x5351, 0x101, 0x535a, 0x101, 0x5373, 0x101,
+ 0x537d, 0x101, 0x537f, 0x101, 0x537f, 0x101, 0x537f, 0x201,
+ 0xd842, 0xde2c, 0x101, 0x7070, 0x101, 0x53ca, 0x101, 0x53df,
+ 0x201, 0xd842, 0xdf63, 0x101, 0x53eb, 0x101, 0x53f1, 0x101,
+ 0x5406, 0x101, 0x549e, 0x101, 0x5438, 0x101, 0x5448, 0x101,
+ 0x5468, 0x101, 0x54a2, 0x101, 0x54f6, 0x101, 0x5510, 0x101,
+ 0x5553, 0x101, 0x5563, 0x101, 0x5584, 0x101, 0x5584, 0x101,
+ 0x5599, 0x101, 0x55ab, 0x101, 0x55b3, 0x101, 0x55c2, 0x101,
+ 0x5716, 0x101, 0x5606, 0x101, 0x5717, 0x101, 0x5651, 0x101,
+ 0x5674, 0x101, 0x5207, 0x101, 0x58ee, 0x101, 0x57ce, 0x101,
+ 0x57f4, 0x101, 0x580d, 0x101, 0x578b, 0x101, 0x5832, 0x101,
+ 0x5831, 0x101, 0x58ac, 0x201, 0xd845, 0xdce4, 0x101, 0x58f2,
+ 0x101, 0x58f7, 0x101, 0x5906, 0x101, 0x591a, 0x101, 0x5922,
+ 0x101, 0x5962, 0x201, 0xd845, 0xdea8, 0x201, 0xd845, 0xdeea,
+ 0x101, 0x59ec, 0x101, 0x5a1b, 0x101, 0x5a27, 0x101, 0x59d8,
+ 0x101, 0x5a66, 0x101, 0x36ee, 0x101, 0x36fc, 0x101, 0x5b08,
+ 0x101, 0x5b3e, 0x101, 0x5b3e, 0x201, 0xd846, 0xddc8, 0x101,
+ 0x5bc3, 0x101, 0x5bd8, 0x101, 0x5be7, 0x101, 0x5bf3, 0x201,
+ 0xd846, 0xdf18, 0x101, 0x5bff, 0x101, 0x5c06, 0x101, 0x5f53,
+ 0x101, 0x5c22, 0x101, 0x3781, 0x101, 0x5c60, 0x101, 0x5c6e,
+ 0x101, 0x5cc0, 0x101, 0x5c8d, 0x201, 0xd847, 0xdde4, 0x101,
+ 0x5d43, 0x201, 0xd847, 0xdde6, 0x101, 0x5d6e, 0x101, 0x5d6b,
+ 0x101, 0x5d7c, 0x101, 0x5de1, 0x101, 0x5de2, 0x101, 0x382f,
+ 0x101, 0x5dfd, 0x101, 0x5e28, 0x101, 0x5e3d, 0x101, 0x5e69,
+ 0x101, 0x3862, 0x201, 0xd848, 0xdd83, 0x101, 0x387c, 0x101,
+ 0x5eb0, 0x101, 0x5eb3, 0x101, 0x5eb6, 0x101, 0x5eca, 0x201,
+ 0xd868, 0xdf92, 0x101, 0x5efe, 0x201, 0xd848, 0xdf31, 0x201,
+ 0xd848, 0xdf31, 0x101, 0x8201, 0x101, 0x5f22, 0x101, 0x5f22,
+ 0x101, 0x38c7, 0x201, 0xd84c, 0xdeb8, 0x201, 0xd858, 0xddda,
+ 0x101, 0x5f62, 0x101, 0x5f6b, 0x101, 0x38e3, 0x101, 0x5f9a,
+ 0x101, 0x5fcd, 0x101, 0x5fd7, 0x101, 0x5ff9, 0x101, 0x6081,
+ 0x101, 0x393a, 0x101, 0x391c, 0x101, 0x6094, 0x201, 0xd849,
+ 0xded4, 0x101, 0x60c7, 0x101, 0x6148, 0x101, 0x614c, 0x101,
+ 0x614e, 0x101, 0x614c, 0x101, 0x617a, 0x101, 0x618e, 0x101,
+ 0x61b2, 0x101, 0x61a4, 0x101, 0x61af, 0x101, 0x61de, 0x101,
+ 0x61f2, 0x101, 0x61f6, 0x101, 0x6210, 0x101, 0x621b, 0x101,
+ 0x625d, 0x101, 0x62b1, 0x101, 0x62d4, 0x101, 0x6350, 0x201,
+ 0xd84a, 0xdf0c, 0x101, 0x633d, 0x101, 0x62fc, 0x101, 0x6368,
+ 0x101, 0x6383, 0x101, 0x63e4, 0x201, 0xd84a, 0xdff1, 0x101,
+ 0x6422, 0x101, 0x63c5, 0x101, 0x63a9, 0x101, 0x3a2e, 0x101,
+ 0x6469, 0x101, 0x647e, 0x101, 0x649d, 0x101, 0x6477, 0x101,
+ 0x3a6c, 0x101, 0x654f, 0x101, 0x656c, 0x201, 0xd84c, 0xdc0a,
+ 0x101, 0x65e3, 0x101, 0x66f8, 0x101, 0x6649, 0x101, 0x3b19,
+ 0x101, 0x6691, 0x101, 0x3b08, 0x101, 0x3ae4, 0x101, 0x5192,
+ 0x101, 0x5195, 0x101, 0x6700, 0x101, 0x669c, 0x101, 0x80ad,
+ 0x101, 0x43d9, 0x101, 0x6717, 0x101, 0x671b, 0x101, 0x6721,
+ 0x101, 0x675e, 0x101, 0x6753, 0x201, 0xd84c, 0xdfc3, 0x101,
+ 0x3b49, 0x101, 0x67fa, 0x101, 0x6785, 0x101, 0x6852, 0x101,
+ 0x6885, 0x201, 0xd84d, 0xdc6d, 0x101, 0x688e, 0x101, 0x681f,
+ 0x101, 0x6914, 0x101, 0x3b9d, 0x101, 0x6942, 0x101, 0x69a3,
+ 0x101, 0x69ea, 0x101, 0x6aa8, 0x201, 0xd84d, 0xdea3, 0x101,
+ 0x6adb, 0x101, 0x3c18, 0x101, 0x6b21, 0x201, 0xd84e, 0xdca7,
+ 0x101, 0x6b54, 0x101, 0x3c4e, 0x101, 0x6b72, 0x101, 0x6b9f,
+ 0x101, 0x6bba, 0x101, 0x6bbb, 0x201, 0xd84e, 0xde8d, 0x201,
+ 0xd847, 0xdd0b, 0x201, 0xd84e, 0xdefa, 0x101, 0x6c4e, 0x201,
+ 0xd84f, 0xdcbc, 0x101, 0x6cbf, 0x101, 0x6ccd, 0x101, 0x6c67,
+ 0x101, 0x6d16, 0x101, 0x6d3e, 0x101, 0x6d77, 0x101, 0x6d41,
+ 0x101, 0x6d69, 0x101, 0x6d78, 0x101, 0x6d85, 0x201, 0xd84f,
+ 0xdd1e, 0x101, 0x6d34, 0x101, 0x6e2f, 0x101, 0x6e6e, 0x101,
+ 0x3d33, 0x101, 0x6ecb, 0x101, 0x6ec7, 0x201, 0xd84f, 0xded1,
+ 0x101, 0x6df9, 0x101, 0x6f6e, 0x201, 0xd84f, 0xdf5e, 0x201,
+ 0xd84f, 0xdf8e, 0x101, 0x6fc6, 0x101, 0x7039, 0x101, 0x701e,
+ 0x101, 0x701b, 0x101, 0x3d96, 0x101, 0x704a, 0x101, 0x707d,
+ 0x101, 0x7077, 0x101, 0x70ad, 0x201, 0xd841, 0xdd25, 0x101,
+ 0x7145, 0x201, 0xd850, 0xde63, 0x101, 0x719c, 0x201, 0xd850,
+ 0xdfab, 0x101, 0x7228, 0x101, 0x7235, 0x101, 0x7250, 0x201,
+ 0xd851, 0xde08, 0x101, 0x7280, 0x101, 0x7295, 0x201, 0xd851,
+ 0xdf35, 0x201, 0xd852, 0xdc14, 0x101, 0x737a, 0x101, 0x738b,
+ 0x101, 0x3eac, 0x101, 0x73a5, 0x101, 0x3eb8, 0x101, 0x3eb8,
+ 0x101, 0x7447, 0x101, 0x745c, 0x101, 0x7471, 0x101, 0x7485,
+ 0x101, 0x74ca, 0x101, 0x3f1b, 0x101, 0x7524, 0x201, 0xd853,
+ 0xdc36, 0x101, 0x753e, 0x201, 0xd853, 0xdc92, 0x101, 0x7570,
+ 0x201, 0xd848, 0xdd9f, 0x101, 0x7610, 0x201, 0xd853, 0xdfa1,
+ 0x201, 0xd853, 0xdfb8, 0x201, 0xd854, 0xdc44, 0x101, 0x3ffc,
+ 0x101, 0x4008, 0x101, 0x76f4, 0x201, 0xd854, 0xdcf3, 0x201,
+ 0xd854, 0xdcf2, 0x201, 0xd854, 0xdd19, 0x201, 0xd854, 0xdd33,
+ 0x101, 0x771e, 0x101, 0x771f, 0x101, 0x771f, 0x101, 0x774a,
+ 0x101, 0x4039, 0x101, 0x778b, 0x101, 0x4046, 0x101, 0x4096,
+ 0x201, 0xd855, 0xdc1d, 0x101, 0x784e, 0x101, 0x788c, 0x101,
+ 0x78cc, 0x101, 0x40e3, 0x201, 0xd855, 0xde26, 0x101, 0x7956,
+ 0x201, 0xd855, 0xde9a, 0x201, 0xd855, 0xdec5, 0x101, 0x798f,
+ 0x101, 0x79eb, 0x101, 0x412f, 0x101, 0x7a40, 0x101, 0x7a4a,
+ 0x101, 0x7a4f, 0x201, 0xd856, 0xdd7c, 0x201, 0xd856, 0xdea7,
+ 0x201, 0xd856, 0xdea7, 0x101, 0x7aee, 0x101, 0x4202, 0x201,
+ 0xd856, 0xdfab, 0x101, 0x7bc6, 0x101, 0x7bc9, 0x101, 0x4227,
+ 0x201, 0xd857, 0xdc80, 0x101, 0x7cd2, 0x101, 0x42a0, 0x101,
+ 0x7ce8, 0x101, 0x7ce3, 0x101, 0x7d00, 0x201, 0xd857, 0xdf86,
+ 0x101, 0x7d63, 0x101, 0x4301, 0x101, 0x7dc7, 0x101, 0x7e02,
+ 0x101, 0x7e45, 0x101, 0x4334, 0x201, 0xd858, 0xde28, 0x201,
+ 0xd858, 0xde47, 0x101, 0x4359, 0x201, 0xd858, 0xded9, 0x101,
+ 0x7f7a, 0x201, 0xd858, 0xdf3e, 0x101, 0x7f95, 0x101, 0x7ffa,
+ 0x101, 0x8005, 0x201, 0xd859, 0xdcda, 0x201, 0xd859, 0xdd23,
+ 0x101, 0x8060, 0x201, 0xd859, 0xdda8, 0x101, 0x8070, 0x201,
+ 0xd84c, 0xdf5f, 0x101, 0x43d5, 0x101, 0x80b2, 0x101, 0x8103,
+ 0x101, 0x440b, 0x101, 0x813e, 0x101, 0x5ab5, 0x201, 0xd859,
+ 0xdfa7, 0x201, 0xd859, 0xdfb5, 0x201, 0xd84c, 0xdf93, 0x201,
+ 0xd84c, 0xdf9c, 0x101, 0x8201, 0x101, 0x8204, 0x101, 0x8f9e,
+ 0x101, 0x446b, 0x101, 0x8291, 0x101, 0x828b, 0x101, 0x829d,
+ 0x101, 0x52b3, 0x101, 0x82b1, 0x101, 0x82b3, 0x101, 0x82bd,
+ 0x101, 0x82e6, 0x201, 0xd85a, 0xdf3c, 0x101, 0x82e5, 0x101,
+ 0x831d, 0x101, 0x8363, 0x101, 0x83ad, 0x101, 0x8323, 0x101,
+ 0x83bd, 0x101, 0x83e7, 0x101, 0x8457, 0x101, 0x8353, 0x101,
+ 0x83ca, 0x101, 0x83cc, 0x101, 0x83dc, 0x201, 0xd85b, 0xdc36,
+ 0x201, 0xd85b, 0xdd6b, 0x201, 0xd85b, 0xdcd5, 0x101, 0x452b,
+ 0x101, 0x84f1, 0x101, 0x84f3, 0x101, 0x8516, 0x201, 0xd85c,
+ 0xdfca, 0x101, 0x8564, 0x201, 0xd85b, 0xdf2c, 0x101, 0x455d,
+ 0x101, 0x4561, 0x201, 0xd85b, 0xdfb1, 0x201, 0xd85c, 0xdcd2,
+ 0x101, 0x456b, 0x101, 0x8650, 0x101, 0x865c, 0x101, 0x8667,
+ 0x101, 0x8669, 0x101, 0x86a9, 0x101, 0x8688, 0x101, 0x870e,
+ 0x101, 0x86e2, 0x101, 0x8779, 0x101, 0x8728, 0x101, 0x876b,
+ 0x101, 0x8786, 0x101, 0x45d7, 0x101, 0x87e1, 0x101, 0x8801,
+ 0x101, 0x45f9, 0x101, 0x8860, 0x101, 0x8863, 0x201, 0xd85d,
+ 0xde67, 0x101, 0x88d7, 0x101, 0x88de, 0x101, 0x4635, 0x101,
+ 0x88fa, 0x101, 0x34bb, 0x201, 0xd85e, 0xdcae, 0x201, 0xd85e,
+ 0xdd66, 0x101, 0x46be, 0x101, 0x46c7, 0x101, 0x8aa0, 0x101,
+ 0x8aed, 0x101, 0x8b8a, 0x101, 0x8c55, 0x201, 0xd85f, 0xdca8,
+ 0x101, 0x8cab, 0x101, 0x8cc1, 0x101, 0x8d1b, 0x101, 0x8d77,
+ 0x201, 0xd85f, 0xdf2f, 0x201, 0xd842, 0xdc04, 0x101, 0x8dcb,
+ 0x101, 0x8dbc, 0x101, 0x8df0, 0x201, 0xd842, 0xdcde, 0x101,
+ 0x8ed4, 0x101, 0x8f38, 0x201, 0xd861, 0xddd2, 0x201, 0xd861,
+ 0xdded, 0x101, 0x9094, 0x101, 0x90f1, 0x101, 0x9111, 0x201,
+ 0xd861, 0xdf2e, 0x101, 0x911b, 0x101, 0x9238, 0x101, 0x92d7,
+ 0x101, 0x92d8, 0x101, 0x927c, 0x101, 0x93f9, 0x101, 0x9415,
+ 0x201, 0xd862, 0xdffa, 0x101, 0x958b, 0x101, 0x4995, 0x101,
+ 0x95b7, 0x201, 0xd863, 0xdd77, 0x101, 0x49e6, 0x101, 0x96c3,
+ 0x101, 0x5db2, 0x101, 0x9723, 0x201, 0xd864, 0xdd45, 0x201,
+ 0xd864, 0xde1a, 0x101, 0x4a6e, 0x101, 0x4a76, 0x101, 0x97e0,
+ 0x201, 0xd865, 0xdc0a, 0x101, 0x4ab2, 0x201, 0xd865, 0xdc96,
+ 0x101, 0x980b, 0x101, 0x980b, 0x101, 0x9829, 0x201, 0xd865,
+ 0xddb6, 0x101, 0x98e2, 0x101, 0x4b33, 0x101, 0x9929, 0x101,
+ 0x99a7, 0x101, 0x99c2, 0x101, 0x99fe, 0x101, 0x4bce, 0x201,
+ 0xd866, 0xdf30, 0x101, 0x9b12, 0x101, 0x9c40, 0x101, 0x9cfd,
+ 0x101, 0x4cce, 0x101, 0x4ced, 0x101, 0x9d67, 0x201, 0xd868,
+ 0xdcce, 0x101, 0x4cf8, 0x201, 0xd868, 0xdd05, 0x201, 0xd868,
+ 0xde0e, 0x201, 0xd868, 0xde91, 0x101, 0x9ebb, 0x101, 0x4d56,
+ 0x101, 0x9ef9, 0x101, 0x9efe, 0x101, 0x9f05, 0x101, 0x9f0f,
+ 0x101, 0x9f16, 0x101, 0x9f3b, 0x201, 0xd869, 0xde00
};
static const unsigned short uc_ligature_trie[] = {
diff --git a/src/corelib/text/qunicodetables_p.h b/src/corelib/text/qunicodetables_p.h
index c453ef53e7..81efc09773 100644
--- a/src/corelib/text/qunicodetables_p.h
+++ b/src/corelib/text/qunicodetables_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -37,7 +37,7 @@
**
****************************************************************************/
-/* This file is autogenerated from the Unicode 10.0 database. Do not edit */
+/* This file is autogenerated from the Unicode 12.1 database. Do not edit */
//
// W A R N I N G
@@ -59,7 +59,7 @@
QT_BEGIN_NAMESPACE
-#define UNICODE_DATA_VERSION QChar::Unicode_10_0
+#define UNICODE_DATA_VERSION QChar::Unicode_12_1
namespace QUnicodeTables {
@@ -122,7 +122,8 @@ enum GraphemeBreakClass {
Graphemebreak_E_Modifier,
Graphemebreak_Glue_After_Zwj,
Graphemebreak_E_Base_GAZ,
- NumGraphemeBreakClasses,
+
+ NumGraphemeBreakClasses
};
enum WordBreakClass {
@@ -148,7 +149,9 @@ enum WordBreakClass {
WordBreak_E_Modifier,
WordBreak_Glue_After_Zwj,
WordBreak_E_Base_GAZ,
- NumWordBreakClasses,
+ WordBreak_WSegSpace,
+
+ NumWordBreakClasses
};
enum SentenceBreakClass {
@@ -166,6 +169,7 @@ enum SentenceBreakClass {
SentenceBreak_SContinue,
SentenceBreak_STerm,
SentenceBreak_Close,
+
NumSentenceBreakClasses
};
@@ -181,6 +185,7 @@ enum LineBreakClass {
LineBreak_EB, LineBreak_EM, LineBreak_ZWJ,
LineBreak_SA, LineBreak_SG, LineBreak_SP,
LineBreak_CR, LineBreak_LF, LineBreak_BK,
+
NumLineBreakClasses
};
diff --git a/src/corelib/text/qunicodetools.cpp b/src/corelib/text/qunicodetools.cpp
index 08e1146c59..0db3dc74c6 100644
--- a/src/corelib/text/qunicodetools.cpp
+++ b/src/corelib/text/qunicodetools.cpp
@@ -164,29 +164,30 @@ enum Action {
};
static const uchar breakTable[QUnicodeTables::NumWordBreakClasses][QUnicodeTables::NumWordBreakClasses] = {
-// Any CR LF Newline Extend ZWJ Format RI Katakana HLetter ALetter SQuote DQuote MidNumLet MidLetter MidNum Numeric ExtNumLet E_Base E_Mod GAZ EBG
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Any
- { Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // CR
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // LF
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Newline
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Extend
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, NoBreak }, // ZWJ
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Format
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // RegionalIndicator
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break , Break , Break }, // Katakana
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Lookup , LookupW, LookupW, Break , NoBreak, NoBreak, Break , Break , Break , Break }, // HebrewLetter
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Break , LookupW, LookupW, Break , NoBreak, NoBreak, Break , Break , Break , Break }, // ALetter
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // SingleQuote
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // DoubleQuote
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNumLet
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidLetter
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNum
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, Lookup , Break , Lookup , Break , Lookup , NoBreak, NoBreak, Break , Break , Break , Break }, // Numeric
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , NoBreak, NoBreak, Break , Break , Break , Break }, // ExtendNumLet
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break }, // E_Base
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // E_Mod
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // GAZ
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break }, // EBG
+// Any CR LF Newline Extend ZWJ Format RI Katakana HLetter ALetter SQuote DQuote MidNumLet MidLetter MidNum Numeric ExtNumLet E_Base E_Mod GAZ EBG WSeg
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Any
+ { Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // CR
+ { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // LF
+ { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Newline
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Extend
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, NoBreak, Break }, // ZWJ
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Format
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // RegionalIndicator
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break , Break , Break , Break }, // Katakana
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Lookup , LookupW, LookupW, Break , NoBreak, NoBreak, Break , Break , Break , Break , Break }, // HebrewLetter
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Break , LookupW, LookupW, Break , NoBreak, NoBreak, Break , Break , Break , Break , Break }, // ALetter
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // SingleQuote
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // DoubleQuote
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNumLet
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidLetter
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNum
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, Lookup , Break , Lookup , Break , Lookup , NoBreak, NoBreak, Break , Break , Break , Break , Break }, // Numeric
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , NoBreak, NoBreak, Break , Break , Break , Break , Break }, // ExtendNumLet
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break , Break }, // E_Base
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // E_Mod
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // GAZ
+ { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break , Break }, // EBG
+ { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // WSeg
};
} // namespace WB
diff --git a/src/corelib/thread/qbasicatomic.h b/src/corelib/thread/qbasicatomic.h
index 9804e60119..c9c95cf6ce 100644
--- a/src/corelib/thread/qbasicatomic.h
+++ b/src/corelib/thread/qbasicatomic.h
@@ -47,9 +47,9 @@
# include <QtCore/qatomic_bootstrap.h>
// If C++11 atomics are supported, use them!
-// Note that constexpr support is sometimes disabled in QNX builds but its
-// library has <atomic>.
-#elif defined(Q_COMPILER_ATOMICS) && (defined(Q_COMPILER_CONSTEXPR) || defined(Q_OS_QNX))
+// Note that constexpr support is sometimes disabled in QNX or INTEGRITY builds,
+// but their libraries have <atomic>.
+#elif defined(Q_COMPILER_ATOMICS) && (defined(Q_COMPILER_CONSTEXPR) || defined(Q_OS_QNX) || defined(Q_OS_INTEGRITY))
# include <QtCore/qatomic_cxx11.h>
// We only support one fallback: MSVC, because even on version 2015, it lacks full constexpr support
diff --git a/src/corelib/thread/qexception.cpp b/src/corelib/thread/qexception.cpp
index a3e30d5a7a..f9c63085b7 100644
--- a/src/corelib/thread/qexception.cpp
+++ b/src/corelib/thread/qexception.cpp
@@ -199,7 +199,7 @@ void ExceptionStore::setException(const QException &e)
bool ExceptionStore::hasException() const
{
- return (exceptionHolder.exception() != 0);
+ return (exceptionHolder.exception() != nullptr);
}
ExceptionHolder ExceptionStore::exception()
diff --git a/src/corelib/thread/qfutureinterface.cpp b/src/corelib/thread/qfutureinterface.cpp
index 6430f38a3b..f1fd40e7b6 100644
--- a/src/corelib/thread/qfutureinterface.cpp
+++ b/src/corelib/thread/qfutureinterface.cpp
@@ -471,7 +471,7 @@ bool QFutureInterfaceBase::derefT() const
QFutureInterfaceBasePrivate::QFutureInterfaceBasePrivate(QFutureInterfaceBase::State initialState)
: refCount(1), m_progressValue(0), m_progressMinimum(0), m_progressMaximum(0),
state(initialState),
- manualProgress(false), m_expectedResultCount(0), runnable(0), m_pool(0)
+ manualProgress(false), m_expectedResultCount(0), runnable(nullptr), m_pool(nullptr)
{
progressTime.invalidate();
}
diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp
index 9e52f286ee..0508932d68 100644
--- a/src/corelib/thread/qmutex.cpp
+++ b/src/corelib/thread/qmutex.cpp
@@ -70,7 +70,7 @@ class QRecursiveMutexPrivate : public QMutexData
{
public:
QRecursiveMutexPrivate()
- : QMutexData(QMutex::Recursive), owner(0), count(0) {}
+ : QMutexData(QMutex::Recursive), owner(nullptr), count(0) {}
// written to by the thread that first owns 'mutex';
// read during attempts to acquire ownership of 'mutex' from any other thread:
@@ -186,7 +186,7 @@ public:
*/
QMutex::QMutex(RecursionMode mode)
{
- d_ptr.storeRelaxed(mode == Recursive ? new QRecursiveMutexPrivate : 0);
+ d_ptr.storeRelaxed(mode == Recursive ? new QRecursiveMutexPrivate : nullptr);
}
/*!
@@ -487,7 +487,7 @@ QRecursiveMutex::~QRecursiveMutex()
\fn QMutexLocker::QMutexLocker(QMutex *mutex)
Constructs a QMutexLocker and locks \a mutex. The mutex will be
- unlocked when the QMutexLocker is destroyed. If \a mutex is zero,
+ unlocked when the QMutexLocker is destroyed. If \a mutex is \nullptr,
QMutexLocker does nothing.
\sa QMutex::lock()
@@ -799,7 +799,7 @@ inline void QRecursiveMutexPrivate::unlock() noexcept
if (count > 0) {
count--;
} else {
- owner.storeRelaxed(0);
+ owner.storeRelaxed(nullptr);
mutex.QBasicMutex::unlock();
}
}
diff --git a/src/corelib/thread/qmutex_linux.cpp b/src/corelib/thread/qmutex_linux.cpp
index 3270875471..72002838cf 100644
--- a/src/corelib/thread/qmutex_linux.cpp
+++ b/src/corelib/thread/qmutex_linux.cpp
@@ -106,7 +106,7 @@ static inline QMutexData *dummyFutexValue()
}
template <bool IsTimed> static inline
-bool lockInternal_helper(QBasicAtomicPointer<QMutexData> &d_ptr, int timeout = -1, QElapsedTimer *elapsedTimer = 0) noexcept
+bool lockInternal_helper(QBasicAtomicPointer<QMutexData> &d_ptr, int timeout = -1, QElapsedTimer *elapsedTimer = nullptr) noexcept
{
if (!IsTimed)
timeout = -1;
@@ -175,7 +175,7 @@ void QBasicMutex::unlockInternal() noexcept
Q_UNUSED(d);
Q_ASSERT(!isRecursive());
- d_ptr.storeRelease(0);
+ d_ptr.storeRelease(nullptr);
futexWakeOne(d_ptr);
}
diff --git a/src/corelib/thread/qorderedmutexlocker_p.h b/src/corelib/thread/qorderedmutexlocker_p.h
index 570c526225..83edfd5879 100644
--- a/src/corelib/thread/qorderedmutexlocker_p.h
+++ b/src/corelib/thread/qorderedmutexlocker_p.h
@@ -69,7 +69,7 @@ class QOrderedMutexLocker
public:
QOrderedMutexLocker(QBasicMutex *m1, QBasicMutex *m2)
: mtx1((m1 == m2) ? m1 : (std::less<QBasicMutex *>()(m1, m2) ? m1 : m2)),
- mtx2((m1 == m2) ? 0 : (std::less<QBasicMutex *>()(m1, m2) ? m2 : m1)),
+ mtx2((m1 == m2) ? nullptr : (std::less<QBasicMutex *>()(m1, m2) ? m2 : m1)),
locked(false)
{
relock();
diff --git a/src/corelib/thread/qreadwritelock.cpp b/src/corelib/thread/qreadwritelock.cpp
index 14654986a0..8c28507d5a 100644
--- a/src/corelib/thread/qreadwritelock.cpp
+++ b/src/corelib/thread/qreadwritelock.cpp
@@ -227,7 +227,7 @@ bool QReadWriteLock::tryLockForRead(int timeout)
return true;
while (true) {
- if (d == 0) {
+ if (d == nullptr) {
if (!d_ptr.testAndSetAcquire(nullptr, dummyLockedForRead, d))
continue;
return true;
@@ -341,7 +341,7 @@ bool QReadWriteLock::tryLockForWrite(int timeout)
return true;
while (true) {
- if (d == 0) {
+ if (d == nullptr) {
if (!d_ptr.testAndSetAcquire(d, dummyLockedForWrite, d))
continue;
return true;
@@ -477,7 +477,7 @@ bool QReadWriteLockPrivate::lockForRead(int timeout)
if (elapsed > timeout)
return false;
waitingReaders++;
- readerCond.wait(&mutex, timeout - elapsed);
+ readerCond.wait(&mutex, QDeadlineTimer(timeout - elapsed));
} else {
waitingReaders++;
readerCond.wait(&mutex);
@@ -511,7 +511,7 @@ bool QReadWriteLockPrivate::lockForWrite(int timeout)
return false;
}
waitingWriters++;
- writerCond.wait(&mutex, timeout - elapsed);
+ writerCond.wait(&mutex, QDeadlineTimer(timeout - elapsed));
} else {
waitingWriters++;
writerCond.wait(&mutex);
@@ -581,7 +581,7 @@ void QReadWriteLockPrivate::recursiveUnlock()
if (self == currentWriter) {
if (--writerCount > 0)
return;
- currentWriter = 0;
+ currentWriter = nullptr;
} else {
auto it = currentReaders.find(self);
if (it == currentReaders.end()) {
diff --git a/src/corelib/thread/qresultstore.cpp b/src/corelib/thread/qresultstore.cpp
index 1b3bc20eca..0b82b938e1 100644
--- a/src/corelib/thread/qresultstore.cpp
+++ b/src/corelib/thread/qresultstore.cpp
@@ -192,7 +192,7 @@ int ResultStoreBase::addResults(int index, const void *results, int vectorSize,
ResultItem filteredIn(results, vectorSize);
insertResultItem(index, filteredIn);
}
- ResultItem filteredAway(0, totalCount - vectorSize);
+ ResultItem filteredAway(nullptr, totalCount - vectorSize);
return insertResultItem(index + vectorSize, filteredAway);
}
}
diff --git a/src/corelib/thread/qrunnable.cpp b/src/corelib/thread/qrunnable.cpp
index bd0a32b53d..58a764d407 100644
--- a/src/corelib/thread/qrunnable.cpp
+++ b/src/corelib/thread/qrunnable.cpp
@@ -114,4 +114,31 @@ QRunnable::~QRunnable()
\sa autoDelete(), QThreadPool
*/
+class FunctionRunnable : public QRunnable
+{
+ std::function<void()> m_functor;
+public:
+ FunctionRunnable(std::function<void()> functor) : m_functor(std::move(functor))
+ {
+ }
+ void run() override
+ {
+ m_functor();
+ }
+};
+
+/*!
+ \since 5.15
+
+ Creates a QRunnable that calls \a fun in run().
+
+ Auto-deletion is enabled by default.
+
+ \sa run(), autoDelete()
+*/
+QRunnable *QRunnable::create(std::function<void()> fun)
+{
+ return new FunctionRunnable(std::move(fun));
+}
+
QT_END_NAMESPACE
diff --git a/src/corelib/thread/qrunnable.h b/src/corelib/thread/qrunnable.h
index b8e842118c..c13aa3fa8c 100644
--- a/src/corelib/thread/qrunnable.h
+++ b/src/corelib/thread/qrunnable.h
@@ -41,6 +41,7 @@
#define QRUNNABLE_H
#include <QtCore/qglobal.h>
+#include <functional>
QT_BEGIN_NAMESPACE
@@ -59,6 +60,7 @@ public:
QRunnable() : ref(0) { }
virtual ~QRunnable();
+ static QRunnable *create(std::function<void()> fun);
bool autoDelete() const { return ref != -1; }
void setAutoDelete(bool _autoDelete) { ref = _autoDelete ? 0 : -1; }
diff --git a/src/corelib/thread/qsemaphore.h b/src/corelib/thread/qsemaphore.h
index 58c12997ad..b3b9b52052 100644
--- a/src/corelib/thread/qsemaphore.h
+++ b/src/corelib/thread/qsemaphore.h
@@ -80,8 +80,7 @@ public:
explicit QSemaphoreReleaser(QSemaphore *sem, int n = 1) noexcept
: m_sem(sem), m_n(n) {}
QSemaphoreReleaser(QSemaphoreReleaser &&other) noexcept
- : m_sem(other.m_sem), m_n(other.m_n)
- { other.m_sem = nullptr; }
+ : m_sem(other.cancel()), m_n(other.m_n) {}
QSemaphoreReleaser &operator=(QSemaphoreReleaser &&other) noexcept
{ QSemaphoreReleaser moved(std::move(other)); swap(moved); return *this; }
@@ -102,9 +101,7 @@ public:
QSemaphore *cancel() noexcept
{
- QSemaphore *old = m_sem;
- m_sem = nullptr;
- return old;
+ return qExchange(m_sem, nullptr);
}
private:
diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp
index 880ae9e046..d18056063f 100644
--- a/src/corelib/thread/qthread.cpp
+++ b/src/corelib/thread/qthread.cpp
@@ -49,6 +49,8 @@
#include "qthread_p.h"
#include "private/qcoreapplication_p.h"
+#include <limits>
+
QT_BEGIN_NAMESPACE
/*
@@ -57,7 +59,7 @@ QT_BEGIN_NAMESPACE
QThreadData::QThreadData(int initialRefCount)
: _ref(initialRefCount), loopLevel(0), scopeLevel(0),
- eventDispatcher(0),
+ eventDispatcher(nullptr),
quitNow(false), canWait(true), isAdopted(false), requiresCoreApplication(true)
{
// fprintf(stderr, "QThreadData %p created\n", this);
@@ -397,7 +399,7 @@ QThreadPrivate::~QThreadPrivate()
QThread *QThread::currentThread()
{
QThreadData *data = QThreadData::current();
- Q_ASSERT(data != 0);
+ Q_ASSERT(data != nullptr);
return data->thread.loadAcquire();
}
@@ -449,7 +451,7 @@ QThread::~QThread()
if (d->running && !d->finished && !d->data->isAdopted)
qFatal("QThread: Destroyed while thread is still running");
- d->data->thread = 0;
+ d->data->thread = nullptr;
}
}
@@ -612,7 +614,7 @@ void QThread::run()
priority.
The \a priority argument can be any value in the \c
- QThread::Priority enum except for \c InheritPriorty.
+ QThread::Priority enum except for \c InheritPriority.
The effect of the \a priority parameter is dependent on the
operating system's scheduling policy. In particular, the \a priority
@@ -624,6 +626,10 @@ void QThread::run()
*/
void QThread::setPriority(Priority priority)
{
+ if (priority == QThread::InheritPriority) {
+ qWarning("QThread::setPriority: Argument cannot be InheritPriority");
+ return;
+ }
Q_D(QThread);
QMutexLocker locker(&d->mutex);
if (!d->running) {
@@ -726,7 +732,8 @@ QThread::Priority QThread::priority() const
*/
/*!
- \fn bool QThread::wait(unsigned long time)
+ \fn bool QThread::wait(QDeadlineTimer deadline)
+ \since 5.15
Blocks the thread until either of these conditions is met:
@@ -735,12 +742,14 @@ QThread::Priority QThread::priority() const
execution (i.e. when it returns from \l{run()}). This function
will return true if the thread has finished. It also returns
true if the thread has not been started yet.
- \li \a time milliseconds has elapsed. If \a time is ULONG_MAX (the
- default), then the wait will never timeout (the thread must
- return from \l{run()}). This function will return false if the
- wait timed out.
+ \li The \a deadline is reached. This function will return false if the
+ deadline is reached.
\endlist
+ A deadline timer set to \c QDeadlineTimer::Forever (the default) will never
+ time out: in this case, the function only returns when the thread returns
+ from \l{run()} or if the thread has not yet started.
+
This provides similar functionality to the POSIX \c
pthread_join() function.
@@ -833,9 +842,9 @@ void QThread::exit(int returnCode)
}
}
-bool QThread::wait(unsigned long time)
+bool QThread::wait(QDeadlineTimer deadline)
{
- Q_UNUSED(time);
+ Q_UNUSED(deadline);
return false;
}
@@ -966,6 +975,17 @@ void QThread::setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)
}
}
+/*!
+ \fn bool QThread::wait(unsigned long time)
+ \overload
+*/
+bool QThread::wait(unsigned long time)
+{
+ if (time == std::numeric_limits<unsigned long>::max())
+ return wait(QDeadlineTimer(QDeadlineTimer::Forever));
+ return wait(QDeadlineTimer(time));
+}
+
#if QT_CONFIG(thread)
/*!
diff --git a/src/corelib/thread/qthread.h b/src/corelib/thread/qthread.h
index c7a6dc8f1a..2072e22340 100644
--- a/src/corelib/thread/qthread.h
+++ b/src/corelib/thread/qthread.h
@@ -42,6 +42,7 @@
#define QTHREAD_H
#include <QtCore/qobject.h>
+#include <QtCore/qdeadlinetimer.h>
// For QThread::create. The configure-time test just checks for the availability
// of std::future and std::async; for the C++17 codepath we perform some extra
@@ -57,8 +58,6 @@
# endif
#endif
-#include <limits.h>
-
QT_BEGIN_NAMESPACE
@@ -135,8 +134,9 @@ public Q_SLOTS:
void quit();
public:
- // default argument causes thread to block indefinetely
- bool wait(unsigned long time = ULONG_MAX);
+ bool wait(QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever));
+ // ### Qt6 inline this function
+ bool wait(unsigned long time);
static void sleep(unsigned long);
static void msleep(unsigned long);
diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp
index cb3c0d6bb1..1da68b3130 100644
--- a/src/corelib/thread/qthread_unix.cpp
+++ b/src/corelib/thread/qthread_unix.cpp
@@ -109,7 +109,7 @@ Q_STATIC_ASSERT(sizeof(pthread_t) <= sizeof(Qt::HANDLE));
enum { ThreadPriorityResetFlag = 0x80000000 };
-static thread_local QThreadData *currentThreadData = 0;
+static thread_local QThreadData *currentThreadData = nullptr;
static pthread_once_t current_thread_data_once = PTHREAD_ONCE_INIT;
static pthread_key_t current_thread_data_key;
@@ -144,7 +144,7 @@ static void destroy_current_thread_data(void *p)
#if defined(Q_OS_VXWORKS)
(void *)1);
#else
- 0);
+ nullptr);
#endif
}
@@ -182,8 +182,8 @@ static void set_thread_data(QThreadData *data)
static void clear_thread_data()
{
- currentThreadData = 0;
- pthread_setspecific(current_thread_data_key, 0);
+ currentThreadData = nullptr;
+ pthread_setspecific(current_thread_data_key, nullptr);
}
template <typename T>
@@ -226,7 +226,7 @@ QThreadData *QThreadData::current(bool createIfNecessary)
} QT_CATCH(...) {
clear_thread_data();
data->deref();
- data = 0;
+ data = nullptr;
QT_RETHROW;
}
data->deref();
@@ -294,7 +294,7 @@ static void setCurrentThreadName(const char *name)
void *QThreadPrivate::start(void *arg)
{
#if !defined(Q_OS_ANDROID)
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, nullptr);
#endif
pthread_cleanup_push(QThreadPrivate::finish, arg);
@@ -336,7 +336,7 @@ void *QThreadPrivate::start(void *arg)
emit thr->started(QThread::QPrivateSignal());
#if !defined(Q_OS_ANDROID)
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, nullptr);
pthread_testcancel();
#endif
thr->run();
@@ -360,7 +360,7 @@ void *QThreadPrivate::start(void *arg)
// thrown.
pthread_cleanup_pop(1);
- return 0;
+ return nullptr;
}
void QThreadPrivate::finish(void *arg)
@@ -379,13 +379,13 @@ void QThreadPrivate::finish(void *arg)
void *data = &d->data->tls;
locker.unlock();
emit thr->finished(QThread::QPrivateSignal());
- QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+ QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
QThreadStorageData::finish((void **)data);
locker.relock();
QAbstractEventDispatcher *eventDispatcher = d->data->eventDispatcher.loadRelaxed();
if (eventDispatcher) {
- d->data->eventDispatcher = 0;
+ d->data->eventDispatcher = nullptr;
locker.unlock();
eventDispatcher->closingDown();
delete eventDispatcher;
@@ -751,7 +751,7 @@ void QThread::terminate()
#endif
}
-bool QThread::wait(unsigned long time)
+bool QThread::wait(QDeadlineTimer deadline)
{
Q_D(QThread);
QMutexLocker locker(&d->mutex);
@@ -765,7 +765,7 @@ bool QThread::wait(unsigned long time)
return true;
while (d->running) {
- if (!d->thread_done.wait(locker.mutex(), time))
+ if (!d->thread_done.wait(locker.mutex(), deadline))
return false;
}
return true;
@@ -774,14 +774,14 @@ bool QThread::wait(unsigned long time)
void QThread::setTerminationEnabled(bool enabled)
{
QThread *thr = currentThread();
- Q_ASSERT_X(thr != 0, "QThread::setTerminationEnabled()",
+ Q_ASSERT_X(thr != nullptr, "QThread::setTerminationEnabled()",
"Current thread was not started with QThread.");
Q_UNUSED(thr)
#if defined(Q_OS_ANDROID)
Q_UNUSED(enabled);
#else
- pthread_setcancelstate(enabled ? PTHREAD_CANCEL_ENABLE : PTHREAD_CANCEL_DISABLE, NULL);
+ pthread_setcancelstate(enabled ? PTHREAD_CANCEL_ENABLE : PTHREAD_CANCEL_DISABLE, nullptr);
if (enabled)
pthread_testcancel();
#endif
diff --git a/src/corelib/thread/qthread_win.cpp b/src/corelib/thread/qthread_win.cpp
index a72df2fc40..bc70e3178a 100644
--- a/src/corelib/thread/qthread_win.cpp
+++ b/src/corelib/thread/qthread_win.cpp
@@ -610,7 +610,7 @@ void QThread::terminate()
QThreadPrivate::finish(this, false);
}
-bool QThread::wait(unsigned long time)
+bool QThread::wait(QDeadlineTimer deadline)
{
Q_D(QThread);
QMutexLocker locker(&d->mutex);
@@ -627,9 +627,9 @@ bool QThread::wait(unsigned long time)
bool ret = false;
#ifndef Q_OS_WINRT
- switch (WaitForSingleObject(d->handle, time)) {
+ switch (WaitForSingleObject(d->handle, deadline.remainingTime())) {
#else
- switch (WaitForSingleObjectEx(d->handle, time, false)) {
+ switch (WaitForSingleObjectEx(d->handle, deadline.remainingTime(), false)) {
#endif
case WAIT_OBJECT_0:
ret = true;
@@ -715,9 +715,7 @@ void QThreadPrivate::setPriority(QThread::Priority threadPriority)
prio = THREAD_PRIORITY_TIME_CRITICAL;
break;
- case QThread::InheritPriority:
default:
- qWarning("QThread::setPriority: Argument cannot be InheritPriority");
return;
}
diff --git a/src/corelib/thread/qthreadpool.cpp b/src/corelib/thread/qthreadpool.cpp
index 4d2389f699..d1875a69a9 100644
--- a/src/corelib/thread/qthreadpool.cpp
+++ b/src/corelib/thread/qthreadpool.cpp
@@ -136,7 +136,7 @@ void QThreadPoolThread::run()
manager->waitingThreads.enqueue(this);
registerThreadInactive();
// wait for work, exiting after the expiry timeout is reached
- runnableReady.wait(locker.mutex(), manager->expiryTimeout);
+ runnableReady.wait(locker.mutex(), QDeadlineTimer(manager->expiryTimeout));
++manager->activeThreads;
if (manager->waitingThreads.removeOne(this))
expired = true;
@@ -512,6 +512,22 @@ void QThreadPool::start(QRunnable *runnable, int priority)
}
/*!
+ \overload
+ \since 5.15
+
+ Reserves a thread and uses it to run \a fun, unless this thread will
+ make the current thread count exceed maxThreadCount(). In that case,
+ \a fun is added to a run queue instead. The \a priority argument can
+ be used to control the run queue's order of execution.
+*/
+void QThreadPool::start(std::function<void()> fun, int priority)
+{
+ if (!fun)
+ return;
+ start(QRunnable::create(std::move(fun)), priority);
+}
+
+/*!
Attempts to reserve a thread to run \a runnable.
If no threads are available at the time of calling, then this function
@@ -542,6 +558,22 @@ bool QThreadPool::tryStart(QRunnable *runnable)
return d->tryStart(runnable);
}
+/*!
+ \overload
+ \since 5.15
+ Attempts to reserve a thread to run \a fun.
+
+ If no threads are available at the time of calling, then this function
+ does nothing and returns \c false. Otherwise, \a fun is run immediately
+ using one available thread and this function returns \c true.
+*/
+bool QThreadPool::tryStart(std::function<void()> fun)
+{
+ if (!fun)
+ return false;
+ return tryStart(QRunnable::create(std::move(fun)));
+}
+
/*! \property QThreadPool::expiryTimeout
Threads that are unused for \a expiryTimeout milliseconds are considered
diff --git a/src/corelib/thread/qthreadpool.h b/src/corelib/thread/qthreadpool.h
index cd27b7c08a..2eede44eca 100644
--- a/src/corelib/thread/qthreadpool.h
+++ b/src/corelib/thread/qthreadpool.h
@@ -45,6 +45,8 @@
#include <QtCore/qthread.h>
#include <QtCore/qrunnable.h>
+#include <functional>
+
QT_REQUIRE_CONFIG(thread);
QT_BEGIN_NAMESPACE
@@ -70,6 +72,9 @@ public:
void start(QRunnable *runnable, int priority = 0);
bool tryStart(QRunnable *runnable);
+ void start(std::function<void()> fun, int priority = 0);
+ bool tryStart(std::function<void()> fun);
+
int expiryTimeout() const;
void setExpiryTimeout(int expiryTimeout);
diff --git a/src/corelib/thread/qthreadstorage.cpp b/src/corelib/thread/qthreadstorage.cpp
index fdc484d2d2..464559ffa5 100644
--- a/src/corelib/thread/qthreadstorage.cpp
+++ b/src/corelib/thread/qthreadstorage.cpp
@@ -116,7 +116,7 @@ void **QThreadStorageData::get() const
QThreadData *data = QThreadData::current();
if (!data) {
qWarning("QThreadStorage::get: QThreadStorage can only be used with threads started with QThread");
- return 0;
+ return nullptr;
}
QVector<void *> &tls = data->tls;
if (tls.size() <= id)
@@ -128,7 +128,7 @@ void **QThreadStorageData::get() const
*v,
data->thread.loadRelaxed());
- return *v ? v : 0;
+ return *v ? v : nullptr;
}
void **QThreadStorageData::set(void *p)
@@ -136,7 +136,7 @@ void **QThreadStorageData::set(void *p)
QThreadData *data = QThreadData::current();
if (!data) {
qWarning("QThreadStorage::set: QThreadStorage can only be used with threads started with QThread");
- return 0;
+ return nullptr;
}
QVector<void *> &tls = data->tls;
if (tls.size() <= id)
@@ -144,7 +144,7 @@ void **QThreadStorageData::set(void *p)
void *&value = tls[id];
// delete any previous data
- if (value != 0) {
+ if (value != nullptr) {
DEBUG_MSG("QThreadStorageData: Deleting previous storage %d, data %p, for thread %p",
id,
value,
@@ -156,7 +156,7 @@ void **QThreadStorageData::set(void *p)
locker.unlock();
void *q = value;
- value = 0;
+ value = nullptr;
if (destructor)
destructor(q);
@@ -178,7 +178,7 @@ void QThreadStorageData::finish(void **p)
while (!tls->isEmpty()) {
void *&value = tls->last();
void *q = value;
- value = 0;
+ value = nullptr;
int i = tls->size() - 1;
tls->resize(i);
diff --git a/src/corelib/thread/qwaitcondition.h b/src/corelib/thread/qwaitcondition.h
index 11520e4cfe..0a47ac3717 100644
--- a/src/corelib/thread/qwaitcondition.h
+++ b/src/corelib/thread/qwaitcondition.h
@@ -40,15 +40,12 @@
#ifndef QWAITCONDITION_H
#define QWAITCONDITION_H
-#include <QtCore/qglobal.h>
-
-#include <limits.h>
+#include <QtCore/QDeadlineTimer>
QT_BEGIN_NAMESPACE
#if QT_CONFIG(thread)
-class QDeadlineTimer;
class QWaitConditionPrivate;
class QMutex;
class QReadWriteLock;
@@ -59,11 +56,13 @@ public:
QWaitCondition();
~QWaitCondition();
- // ### Qt 6: remove unsigned long overloads
- bool wait(QMutex *lockedMutex, unsigned long time = ULONG_MAX);
- bool wait(QMutex *lockedMutex, QDeadlineTimer deadline);
- bool wait(QReadWriteLock *lockedReadWriteLock, unsigned long time = ULONG_MAX);
- bool wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline);
+ bool wait(QMutex *lockedMutex,
+ QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever));
+ bool wait(QMutex *lockedMutex, unsigned long time);
+
+ bool wait(QReadWriteLock *lockedReadWriteLock,
+ QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever));
+ bool wait(QReadWriteLock *lockedReadWriteLock, unsigned long time);
void wakeOne();
void wakeAll();
@@ -80,21 +79,26 @@ private:
#else
class QMutex;
+class QReadWriteLock;
+
class Q_CORE_EXPORT QWaitCondition
{
public:
QWaitCondition() {}
~QWaitCondition() {}
- bool wait(QMutex *mutex, unsigned long time = ULONG_MAX)
- {
- Q_UNUSED(mutex);
- Q_UNUSED(time);
- return true;
- }
+ bool wait(QMutex *, QDeadlineTimer = QDeadlineTimer(QDeadlineTimer::Forever))
+ { return true; }
+ bool wait(QReadWriteLock *, QDeadlineTimer = QDeadlineTimer(QDeadlineTimer::Forever))
+ { return true; }
+ bool wait(QMutex *, unsigned long) { return true; }
+ bool wait(QReadWriteLock *, unsigned long) { return true; }
void wakeOne() {}
void wakeAll() {}
+
+ void notify_one() { wakeOne(); }
+ void notify_all() { wakeAll(); }
};
#endif // QT_CONFIG(thread)
diff --git a/src/corelib/thread/qwaitcondition.qdoc b/src/corelib/thread/qwaitcondition.qdoc
index eebc28f059..014d549477 100644
--- a/src/corelib/thread/qwaitcondition.qdoc
+++ b/src/corelib/thread/qwaitcondition.qdoc
@@ -121,8 +121,18 @@
/*!
\fn bool QWaitCondition::wait(QMutex *lockedMutex, unsigned long time)
+ \overload
+*/
+/*!
+ \fn bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, unsigned long time)
+ \overload
+*/
- Releases the \a lockedMutex and waits on the wait condition. The
+/*!
+ \fn bool QWaitCondition::wait(QMutex *lockedMutex, QDeadlineTimer deadline)
+ \since 5.12
+
+ Releases the \a lockedMutex and waits on the wait condition. The
\a lockedMutex must be initially locked by the calling thread. If \a
lockedMutex is not in a locked state, the behavior is undefined. If
\a lockedMutex is a recursive mutex, this function
@@ -132,10 +142,10 @@
\list
\li Another thread signals it using wakeOne() or wakeAll(). This
function will return true in this case.
- \li \a time milliseconds has elapsed. If \a time is \c ULONG_MAX
- (the default), then the wait will never timeout (the event
- must be signalled). This function will return false if the
- wait timed out.
+ \li the deadline given by \a deadline is reached. If \a deadline is
+ \c QDeadlineTimer::Forever (the default), then the wait will never
+ timeout (the event must be signalled). This function will return
+ false if the wait timed out.
\endlist
The \a lockedMutex will be returned to the same locked state. This
@@ -146,8 +156,8 @@
*/
/*!
- \fn bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, unsigned long time)
- \since 4.4
+ \fn bool QWaitCondition::wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline)
+ \since 5.12
Releases the \a lockedReadWriteLock and waits on the wait
condition. The \a lockedReadWriteLock must be initially locked by the
@@ -160,10 +170,10 @@
\list
\li Another thread signals it using wakeOne() or wakeAll(). This
function will return true in this case.
- \li \a time milliseconds has elapsed. If \a time is \c ULONG_MAX
- (the default), then the wait will never timeout (the event
- must be signalled). This function will return false if the
- wait timed out.
+ \li the deadline given by \a deadline is reached. If \a deadline is
+ \c QDeadlineTimer::Forever (the default), then the wait will never
+ timeout (the event must be signalled). This function will return
+ false if the wait timed out.
\endlist
The \a lockedReadWriteLock will be returned to the same locked
diff --git a/src/corelib/thread/qwaitcondition_p.h b/src/corelib/thread/qwaitcondition_p.h
new file mode 100644
index 0000000000..5133e52e92
--- /dev/null
+++ b/src/corelib/thread/qwaitcondition_p.h
@@ -0,0 +1,153 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QWAITCONDITION_P_H
+#define QWAITCONDITION_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of qmutex.cpp, qmutex_unix.cpp, and qmutex_win.cpp. This header
+// file may change from version to version without notice, or even be
+// removed.
+//
+// We mean it.
+//
+
+#include <QtCore/QWaitCondition>
+#include <QtCore/QMutex>
+#include <QtCore/QDeadlineTimer>
+
+#include <condition_variable>
+#include <mutex>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtPrivate
+{
+
+#if defined(Q_OS_INTEGRITY)
+
+class condition_variable;
+
+class mutex : private QMutex
+{
+ friend class QtPrivate::condition_variable;
+public:
+ // all special member functions are ok!
+ // do not expose the (QMutex::Recursive) ctor
+ // don't use 'using QMutex::lock;' etc as those have the wrong noexcept
+
+ void lock() { return QMutex::lock(); }
+ void unlock() { return QMutex::unlock(); }
+ bool try_lock() { return QMutex::tryLock(); }
+};
+
+class condition_variable : private QWaitCondition
+{
+public:
+ // all special member functions are ok!
+
+ void notify_one() { QWaitCondition::wakeOne(); }
+ void notify_all() { QWaitCondition::wakeAll(); }
+
+ void wait(std::unique_lock<QtPrivate::mutex> &lock) { QWaitCondition::wait(lock.mutex()); }
+ template <class Predicate>
+ void wait(std::unique_lock<QtPrivate::mutex> &lock, Predicate p)
+ {
+ while (!p())
+ wait(lock);
+ }
+
+ template <typename Rep, typename Period>
+ std::cv_status wait_for(std::unique_lock<QtPrivate::mutex> &lock,
+ const std::chrono::duration<Rep, Period> &d)
+ {
+ return QWaitCondition::wait(lock.mutex(), QDeadlineTimer{d})
+ ? std::cv_status::no_timeout
+ : std::cv_status::timeout;
+ }
+ template <typename Rep, typename Period, typename Predicate>
+ bool wait_for(std::unique_lock<QtPrivate::mutex> &lock,
+ const std::chrono::duration<Rep, Period> &d, Predicate p)
+ {
+ const auto timer = QDeadlineTimer{d};
+ while (!p()) {
+ if (!QWaitCondition::wait(lock.mutex(), timer))
+ return p();
+ }
+ return true;
+ }
+
+ template <typename Clock, typename Duration>
+ std::cv_status wait_until(std::unique_lock<QtPrivate::mutex> &lock,
+ const std::chrono::time_point<Clock, Duration> &t)
+ {
+ return QWaitCondition::wait(lock.mutex(), QDeadlineTimer{t})
+ ? std::cv_status::no_timeout
+ : std::cv_status::timeout;
+ }
+
+ template <typename Clock, typename Duration, typename Predicate>
+ bool wait_until(std::unique_lock<QtPrivate::mutex> &lock,
+ const std::chrono::time_point<Clock, Duration> &t, Predicate p)
+ {
+ const auto timer = QDeadlineTimer{t};
+ while (!p()) {
+ if (!QWaitCondition::wait(lock.mutex(), timer))
+ return p();
+ }
+ return true;
+ }
+
+};
+
+#else // Integrity
+
+using mutex = std::mutex;
+using condition_variable = std::condition_variable;
+
+#endif // Integrity
+
+} // namespace QtPrivate
+
+QT_END_NAMESPACE
+
+#endif /* QWAITCONDITION_P_H */
diff --git a/src/corelib/thread/qwaitcondition_unix.cpp b/src/corelib/thread/qwaitcondition_unix.cpp
index dd7475cec5..88b058f410 100644
--- a/src/corelib/thread/qwaitcondition_unix.cpp
+++ b/src/corelib/thread/qwaitcondition_unix.cpp
@@ -173,7 +173,7 @@ public:
QWaitCondition::QWaitCondition()
{
d = new QWaitConditionPrivate;
- report_error(pthread_mutex_init(&d->mutex, NULL), "QWaitCondition", "mutex init");
+ report_error(pthread_mutex_init(&d->mutex, nullptr), "QWaitCondition", "mutex init");
qt_initialize_pthread_cond(&d->cond, "QWaitCondition");
d->waiters = d->wakeups = 0;
}
diff --git a/src/corelib/thread/thread.pri b/src/corelib/thread/thread.pri
index 9fc9af0e65..25cf68a324 100644
--- a/src/corelib/thread/thread.pri
+++ b/src/corelib/thread/thread.pri
@@ -6,6 +6,7 @@ HEADERS += \
thread/qrunnable.h \
thread/qthread.h \
thread/qthreadstorage.h \
+ thread/qwaitcondition_p.h \
thread/qwaitcondition.h
SOURCES += \
diff --git a/src/corelib/time/qcalendar.cpp b/src/corelib/time/qcalendar.cpp
index 9d485f181e..32f0a511a3 100644
--- a/src/corelib/time/qcalendar.cpp
+++ b/src/corelib/time/qcalendar.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -750,6 +750,8 @@ int QCalendar::daysInMonth(int month, int year) const
/*!
Returns the number of days in the given \a year.
+
+ Handling of \c Unspecified as \a year is undefined.
*/
int QCalendar::daysInYear(int year) const
{
@@ -758,10 +760,15 @@ int QCalendar::daysInYear(int year) const
/*!
Returns the number of months in the given \a year.
+
+ If \a year is \c Unspecified, returns the maximum number of months in a
+ year.
+
+ \sa maximumMonthsInYear()
*/
int QCalendar::monthsInYear(int year) const
{
- return d ? d->monthsInYear(year) : 0;
+ return d ? year == Unspecified ? d->maximumMonthsInYear() : d->monthsInYear(year) : 0;
}
/*!
diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp
index a5761055ed..773280ad68 100644
--- a/src/corelib/time/qdatetime.cpp
+++ b/src/corelib/time/qdatetime.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Copyright (C) 2016 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
@@ -1114,11 +1114,6 @@ static QString toStringTextDate(QDate date, QCalendar cal)
return QString();
}
-static QString toStringTextDate(QDate date)
-{
- return toStringTextDate(date, QCalendar());
-}
-
static QString toStringIsoDate(QDate date)
{
const auto parts = QCalendar().partsFromDate(date);
@@ -1129,11 +1124,13 @@ static QString toStringIsoDate(QDate date)
/*!
\fn QString QDate::toString(Qt::DateFormat format) const
+ \fn QString QDate::toString(Qt::DateFormat format, QCalendar cal) const
\overload
- Returns the date as a string. The \a format parameter determines
- the format of the string.
+ Returns the date as a string. The \a format parameter determines the format
+ of the string. If \a cal is supplied, it determines the calendar used to
+ represent the date; it defaults to Gregorian.
If the \a format is Qt::TextDate, the string is formatted in the default
way. The day and month names will be localized names using the system
@@ -1146,18 +1143,16 @@ static QString toStringIsoDate(QDate date)
year, MM is the month of the year (between 01 and 12), and dd is
the day of the month between 01 and 31.
- If the \a format is Qt::SystemLocaleShortDate or
- Qt::SystemLocaleLongDate, the string format depends on the locale
- settings of the system. Identical to calling
- QLocale::system().toString(date, QLocale::ShortFormat) or
- QLocale::system().toString(date, QLocale::LongFormat).
-
- If the \a format is Qt::DefaultLocaleShortDate or
- Qt::DefaultLocaleLongDate, the string format depends on the
- default application locale. This is the locale set with
- QLocale::setDefault(), or the system locale if no default locale
- has been set. Identical to calling
- \l {QLocale::toString()}{QLocale().toString(date, QLocale::ShortFormat) } or
+ The \a format options Qt::SystemLocaleDate, Qt::SystemLocaleShortDate and
+ Qt::SystemLocaleLongDate shall be removed in Qt 6. Their use should be
+ replaced with
+ \l {QLocale::toString()}{QLocale::system().toString(date, QLocale::ShortFormat)} or
+ \l {QLocale::toString()}{QLocale::system().toString(date, QLocale::LongFormat)}.
+
+ The \a format options Qt::LocaleDate, Qt::DefaultLocaleShortDate and
+ Qt::DefaultLocaleLongDate shall be removed in Qt 6. Their use should be
+ replaced with
+ \l {QLocale::toString()}{QLocale().toString(date, QLocale::ShortFormat)} or
\l {QLocale::toString()}{QLocale().toString(date, QLocale::LongFormat)}.
If the \a format is Qt::RFC2822Date, the string is formatted in
@@ -1167,44 +1162,54 @@ static QString toStringIsoDate(QDate date)
If the date is invalid, an empty string will be returned.
\warning The Qt::ISODate format is only valid for years in the
- range 0 to 9999. This restriction may apply to locale-aware
- formats as well, depending on the locale settings.
+ range 0 to 9999.
\sa fromString(), QLocale::toString()
*/
QString QDate::toString(Qt::DateFormat format) const
{
+ return toString(format, QCalendar());
+}
+
+QString QDate::toString(Qt::DateFormat format, QCalendar cal) const
+{
if (!isValid())
return QString();
switch (format) {
+#if QT_DEPRECATED_SINCE(5, 15)
case Qt::SystemLocaleDate:
case Qt::SystemLocaleShortDate:
- return QLocale::system().toString(*this, QLocale::ShortFormat);
+ return QLocale::system().toString(*this, QLocale::ShortFormat, cal);
case Qt::SystemLocaleLongDate:
- return QLocale::system().toString(*this, QLocale::LongFormat);
+ return QLocale::system().toString(*this, QLocale::LongFormat, cal);
case Qt::LocaleDate:
case Qt::DefaultLocaleShortDate:
- return QLocale().toString(*this, QLocale::ShortFormat);
+ return QLocale().toString(*this, QLocale::ShortFormat, cal);
case Qt::DefaultLocaleLongDate:
- return QLocale().toString(*this, QLocale::LongFormat);
+ return QLocale().toString(*this, QLocale::LongFormat, cal);
+#endif // 5.15
case Qt::RFC2822Date:
- return QLocale::c().toString(*this, u"dd MMM yyyy");
+ return QLocale::c().toString(*this, QStringView(u"dd MMM yyyy"), cal);
default:
case Qt::TextDate:
- return toStringTextDate(*this);
+ return toStringTextDate(*this, cal);
case Qt::ISODate:
case Qt::ISODateWithMs:
+ // No calendar dependence
return toStringIsoDate(*this);
}
}
/*!
\fn QString QDate::toString(const QString &format) const
+ \fn QString QDate::toString(const QString &format, QCalendar cal) const
\fn QString QDate::toString(QStringView format) const
+ \fn QString QDate::toString(QStringView format, QCalendar cal) const
- Returns the date as a string. The \a format parameter determines
- the format of the result string.
+ Returns the date as a string. The \a format parameter determines the format
+ of the result string. If \cal is supplied, it determines the calendar used
+ to represent the date; it defaults to Gregorian.
These expressions may be used:
@@ -1259,41 +1264,7 @@ QString QDate::toString(Qt::DateFormat format) const
*/
QString QDate::toString(QStringView format) const
{
- return QLocale::system().toString(*this, format); // QLocale::c() ### Qt6
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-QString QDate::toString(const QString &format) const
-{
- return toString(qToStringViewIgnoringNull(format));
-}
-#endif
-
-QString QDate::toString(Qt::DateFormat format, QCalendar cal) const
-{
- if (!isValid())
- return QString();
-
- switch (format) {
- case Qt::SystemLocaleDate:
- case Qt::SystemLocaleShortDate:
- return QLocale::system().toString(*this, QLocale::ShortFormat, cal);
- case Qt::SystemLocaleLongDate:
- return QLocale::system().toString(*this, QLocale::LongFormat, cal);
- case Qt::LocaleDate:
- case Qt::DefaultLocaleShortDate:
- return QLocale().toString(*this, QLocale::ShortFormat, cal);
- case Qt::DefaultLocaleLongDate:
- return QLocale().toString(*this, QLocale::LongFormat, cal);
- case Qt::RFC2822Date:
- return QLocale::c().toString(*this, QStringView(u"dd MMM yyyy"), cal);
- default:
- case Qt::TextDate:
- return toStringTextDate(*this, cal);
- case Qt::ISODate:
- case Qt::ISODateWithMs:
- return toStringIsoDate(*this);
- }
+ return toString(format, QCalendar());
}
QString QDate::toString(QStringView format, QCalendar cal) const
@@ -1302,6 +1273,11 @@ QString QDate::toString(QStringView format, QCalendar cal) const
}
#if QT_STRINGVIEW_LEVEL < 2
+QString QDate::toString(const QString &format) const
+{
+ return toString(qToStringViewIgnoringNull(format), QCalendar());
+}
+
QString QDate::toString(const QString &format, QCalendar cal) const
{
return toString(qToStringViewIgnoringNull(format), cal);
@@ -1648,9 +1624,14 @@ ParsedInt readInt(QStringView text)
\a format given, or an invalid date if the string cannot be
parsed.
- Note for Qt::TextDate: It is recommended that you use the
- English short month names (e.g. "Jan"). Although localized month
- names can also be used, they depend on the user's locale settings.
+ Note for Qt::TextDate: It is recommended that you use the English short
+ month names (e.g. "Jan"). Although localized month names can also be used in
+ Qt 5, they depend on the user's locale settings.
+
+ \note Support for localized dates, including the format options
+ Qt::SystemLocaleDate, Qt::SystemLocaleShortDate, Qt::SystemLocaleLongDate,
+ Qt::LocaleDate, Qt::DefaultLocaleShortDate, and Qt::DefaultLocaleLongDate,
+ shall be removed in Qt 6. Use QLocale::toDate() instead.
\sa toString(), QLocale::toDate()
*/
@@ -1661,6 +1642,7 @@ QDate QDate::fromString(const QString &string, Qt::DateFormat format)
return QDate();
switch (format) {
+#if QT_DEPRECATED_SINCE(5, 15)
case Qt::SystemLocaleDate:
case Qt::SystemLocaleShortDate:
return QLocale::system().toDate(string, QLocale::ShortFormat);
@@ -1671,6 +1653,7 @@ QDate QDate::fromString(const QString &string, Qt::DateFormat format)
return QLocale().toDate(string, QLocale::ShortFormat);
case Qt::DefaultLocaleLongDate:
return QLocale().toDate(string, QLocale::LongFormat);
+#endif // 5.15
case Qt::RFC2822Date:
return rfcDateImpl(string).date;
default:
@@ -1783,10 +1766,10 @@ QDate QDate::fromString(const QString &string, const QString &format, QCalendar
{
QDate date;
#if QT_CONFIG(datetimeparser)
- QDateTimeParser dt(QVariant::Date, QDateTimeParser::FromString, cal);
+ QDateTimeParser dt(QMetaType::QDate, QDateTimeParser::FromString, cal);
// dt.setDefaultLocale(QLocale::c()); ### Qt 6
if (dt.parseFormat(format))
- dt.fromString(string, &date, 0);
+ dt.fromString(string, &date, nullptr);
#else
Q_UNUSED(string);
Q_UNUSED(format);
@@ -2022,18 +2005,15 @@ int QTime::msec() const
date, use the \a format Qt::ISODateWithMs, which corresponds to
HH:mm:ss.zzz.
- If the \a format is Qt::SystemLocaleShortDate or
- Qt::SystemLocaleLongDate, the string format depends on the locale
- settings of the system. Identical to calling
- QLocale::system().toString(time, QLocale::ShortFormat) or
- QLocale::system().toString(time, QLocale::LongFormat).
-
- If the \a format is Qt::DefaultLocaleShortDate or
- Qt::DefaultLocaleLongDate, the string format depends on the
- default application locale. This is the locale set with
- QLocale::setDefault(), or the system locale if no default locale
- has been set. Identical to calling
+ The \a format options Qt::SystemLocaleDate:, Qt::SystemLocaleShortDate and
+ Qt::SystemLocaleLongDate shall be removed in Qt 6. Their use should be
+ replaced with:
+ \l {QLocale::toString()}{QLocale::system().toString(time, QLocale::ShortFormat)} or
+ \l {QLocale::toString()}{QLocale::system().toString(time, QLocale::LongFormat)}.
+ The \a format options Qt::LocaleDate, Qt::DefaultLocaleShortDate and
+ Qt::DefaultLocaleLongDate shall be removed in Qt 6. Their use should be
+ replaced with:
\l {QLocale::toString()}{QLocale().toString(time, QLocale::ShortFormat)} or
\l {QLocale::toString()}{QLocale().toString(time, QLocale::LongFormat)}.
@@ -2052,6 +2032,7 @@ QString QTime::toString(Qt::DateFormat format) const
return QString();
switch (format) {
+#if QT_DEPRECATED_SINCE(5, 15)
case Qt::SystemLocaleDate:
case Qt::SystemLocaleShortDate:
return QLocale::system().toString(*this, QLocale::ShortFormat);
@@ -2062,6 +2043,7 @@ QString QTime::toString(Qt::DateFormat format) const
return QLocale().toString(*this, QLocale::ShortFormat);
case Qt::DefaultLocaleLongDate:
return QLocale().toString(*this, QLocale::LongFormat);
+#endif // 5.15
case Qt::ISODateWithMs:
return QString::asprintf("%02d:%02d:%02d.%03d", hour(), minute(), second(), msec());
case Qt::RFC2822Date:
@@ -2437,6 +2419,12 @@ static QTime fromIsoTimeString(QStringView string, Qt::DateFormat format, bool *
fails for the default locale). This should be considered an
implementation detail.
+
+ \note Support for localized dates, including the format options
+ Qt::SystemLocaleDate, Qt::SystemLocaleShortDate, Qt::SystemLocaleLongDate,
+ Qt::LocaleDate, Qt::DefaultLocaleShortDate, and Qt::DefaultLocaleLongDate,
+ shall be removed in Qt 6. Use QLocale::toTime() instead.
+
\sa toString(), QLocale::toTime()
*/
QTime QTime::fromString(const QString &string, Qt::DateFormat format)
@@ -2445,6 +2433,7 @@ QTime QTime::fromString(const QString &string, Qt::DateFormat format)
return QTime();
switch (format) {
+#if QT_DEPRECATED_SINCE(5, 15)
case Qt::SystemLocaleDate:
case Qt::SystemLocaleShortDate:
return QLocale::system().toTime(string, QLocale::ShortFormat);
@@ -2455,6 +2444,7 @@ QTime QTime::fromString(const QString &string, Qt::DateFormat format)
return QLocale().toTime(string, QLocale::ShortFormat);
case Qt::DefaultLocaleLongDate:
return QLocale().toTime(string, QLocale::LongFormat);
+#endif // 5.15
case Qt::RFC2822Date:
return rfcDateImpl(string).time;
case Qt::ISODate:
@@ -2529,10 +2519,10 @@ QTime QTime::fromString(const QString &string, const QString &format)
{
QTime time;
#if QT_CONFIG(datetimeparser)
- QDateTimeParser dt(QVariant::Time, QDateTimeParser::FromString, QCalendar());
+ QDateTimeParser dt(QMetaType::QTime, QDateTimeParser::FromString, QCalendar());
// dt.setDefaultLocale(QLocale::c()); ### Qt 6
if (dt.parseFormat(format))
- dt.fromString(string, 0, &time);
+ dt.fromString(string, nullptr, &time);
#else
Q_UNUSED(string);
Q_UNUSED(format);
@@ -3299,7 +3289,7 @@ inline QDateTime::Data::Data(Qt::TimeSpec spec)
// the structure is too small, we need to detach
d = new QDateTimePrivate;
d->ref.ref();
- d->m_status = mergeSpec(nullptr, spec);
+ d->m_status = mergeSpec({}, spec);
}
}
@@ -3623,15 +3613,18 @@ QDateTime::QDateTime() noexcept(Data::CanBeSmall)
}
+#if QT_DEPRECATED_SINCE(5, 17) // ### Qt 6: remove
/*!
- Constructs a datetime with the given \a date, a valid
- time(00:00:00.000), and sets the timeSpec() to Qt::LocalTime.
-*/
+ Constructs a datetime with the given \a date, using Qt::LocalTime as the
+ timeSpec() and the time at the start of that date.
+ \sa QDate::startOfDay()
+*/
QDateTime::QDateTime(const QDate &date)
- : d(QDateTimePrivate::create(date, QTime(0, 0), Qt::LocalTime, 0))
+ : QDateTime(date.startOfDay(Qt::LocalTime, 0))
{
}
+#endif
/*!
Constructs a datetime with the given \a date and \a time, using
@@ -4287,10 +4280,13 @@ void QDateTime::setTime_t(uint secsSince1Jan1970UTC)
#if QT_CONFIG(datestring) // depends on, so implies, textdate
/*!
\fn QString QDateTime::toString(Qt::DateFormat format) const
+ \fn QString QDateTime::toString(Qt::DateFormat format, QCalendar cal) const
\overload
- Returns the datetime as a string in the \a format given.
+ Returns the datetime as a string in the \a format given. If \cal is
+ supplied, it determines the calendar used to represent the date; it defaults
+ to Gregorian.
If the \a format is Qt::TextDate, the string is formatted in the default
way. The day and month names will be localized names using the system
@@ -4307,19 +4303,17 @@ void QDateTime::setTime_t(uint secsSince1Jan1970UTC)
date, use the \a format Qt::ISODateWithMs, which corresponds to
yyyy-MM-ddTHH:mm:ss.zzz[Z|[+|-]HH:mm].
- If the \a format is Qt::SystemLocaleShortDate or
- Qt::SystemLocaleLongDate, the string format depends on the locale
- settings of the system. Identical to calling
- QLocale::system().toString(datetime, QLocale::ShortFormat) or
- QLocale::system().toString(datetime, QLocale::LongFormat).
+ The \a format options Qt::SystemLocaleDate, Qt::SystemLocaleShortDate and
+ Qt::SystemLocaleLongDate shall be removed in Qt 6. Their use should be
+ replaced with
+ \l {QLocale::toString()}{QLocale::system().toString(datetime, QLocale::ShortFormat)} or
+ \l {QLocale::toString()}{QLocale::system().toString(datetime, QLocale::LongFormat)}.
- If the \a format is Qt::DefaultLocaleShortDate or
- Qt::DefaultLocaleLongDate, the string format depends on the
- default application locale. This is the locale set with
- QLocale::setDefault(), or the system locale if no default locale
- has been set. Identical to calling QLocale().toString(datetime,
- QLocale::ShortFormat) or QLocale().toString(datetime,
- QLocale::LongFormat).
+ The \a format options Qt::LocaleDate, Qt::DefaultLocaleShortDate and
+ Qt::DefaultLocaleLongDate shall be removed in Qt 6. Their use should be
+ replaced with
+ \l {QLocale::toString()}{QLocale().toString(datetime, QLocale::ShortFormat)} or
+ \l {QLocale::toString()}{QLocale().toString(datetime, QLocale::LongFormat)}.
If the \a format is Qt::RFC2822Date, the string is formatted
following \l{RFC 2822}.
@@ -4327,8 +4321,7 @@ void QDateTime::setTime_t(uint secsSince1Jan1970UTC)
If the datetime is invalid, an empty string will be returned.
\warning The Qt::ISODate format is only valid for years in the
- range 0 to 9999. This restriction may apply to locale-aware
- formats as well, depending on the locale settings.
+ range 0 to 9999.
\sa fromString(), QDate::toString(), QTime::toString(),
QLocale::toString()
@@ -4336,30 +4329,37 @@ void QDateTime::setTime_t(uint secsSince1Jan1970UTC)
QString QDateTime::toString(Qt::DateFormat format) const
{
+ return toString(format, QCalendar());
+}
+
+QString QDateTime::toString(Qt::DateFormat format, QCalendar cal) const
+{
QString buf;
if (!isValid())
return buf;
switch (format) {
+#if QT_DEPRECATED_SINCE(5, 15)
case Qt::SystemLocaleDate:
case Qt::SystemLocaleShortDate:
- return QLocale::system().toString(*this, QLocale::ShortFormat);
+ return QLocale::system().toString(*this, QLocale::ShortFormat, cal);
case Qt::SystemLocaleLongDate:
- return QLocale::system().toString(*this, QLocale::LongFormat);
+ return QLocale::system().toString(*this, QLocale::LongFormat, cal);
case Qt::LocaleDate:
case Qt::DefaultLocaleShortDate:
- return QLocale().toString(*this, QLocale::ShortFormat);
+ return QLocale().toString(*this, QLocale::ShortFormat, cal);
case Qt::DefaultLocaleLongDate:
- return QLocale().toString(*this, QLocale::LongFormat);
+ return QLocale().toString(*this, QLocale::LongFormat, cal);
+#endif // 5.15
case Qt::RFC2822Date: {
- buf = QLocale::c().toString(*this, u"dd MMM yyyy hh:mm:ss ");
+ buf = QLocale::c().toString(*this, u"dd MMM yyyy hh:mm:ss ", cal);
buf += toOffsetString(Qt::TextDate, offsetFromUtc());
return buf;
}
default:
case Qt::TextDate: {
const QPair<QDate, QTime> p = getDateTime(d);
- buf = p.first.toString(Qt::TextDate);
+ buf = toStringTextDate(p.first, cal);
// Insert time between date's day and year:
buf.insert(buf.lastIndexOf(QLatin1Char(' ')),
QLatin1Char(' ') + p.second.toString(Qt::TextDate));
@@ -4381,14 +4381,12 @@ QString QDateTime::toString(Qt::DateFormat format) const
}
case Qt::ISODate:
case Qt::ISODateWithMs: {
+ // No calendar dependence
const QPair<QDate, QTime> p = getDateTime(d);
- const QDate &dt = p.first;
- const QTime &tm = p.second;
- buf = dt.toString(Qt::ISODate);
+ buf = toStringIsoDate(p.first);
if (buf.isEmpty())
return QString(); // failed to convert
- buf += QLatin1Char('T');
- buf += tm.toString(format);
+ buf += QLatin1Char('T') + p.second.toString(format);
switch (getSpec(d)) {
case Qt::UTC:
buf += QLatin1Char('Z');
@@ -4409,11 +4407,15 @@ QString QDateTime::toString(Qt::DateFormat format) const
/*!
\fn QString QDateTime::toString(const QString &format) const
+ \fn QString QDateTime::toString(const QString &format, QCalendar cal) const
\fn QString QDateTime::toString(QStringView format) const
+ \fn QString QDateTime::toString(QStringView format, QCalendar cal) const
Returns the datetime as a string. The \a format parameter determines the
- format of the result string. See QTime::toString() and QDate::toString() for
- the supported specifiers for time and date, respectively.
+ format of the result string. If \cal is supplied, it determines the calendar
+ used to represent the date; it defaults to Gregorian. See QTime::toString()
+ and QDate::toString() for the supported specifiers for time and date,
+ respectively.
Any sequence of characters enclosed in single quotes will be included
verbatim in the output string (stripped of the quotes), even if it contains
@@ -4444,13 +4446,23 @@ QString QDateTime::toString(Qt::DateFormat format) const
*/
QString QDateTime::toString(QStringView format) const
{
- return QLocale::system().toString(*this, format); // QLocale::c() ### Qt6
+ return toString(format, QCalendar());
+}
+
+QString QDateTime::toString(QStringView format, QCalendar cal) const
+{
+ return QLocale::system().toString(*this, format, cal); // QLocale::c() ### Qt6
}
#if QT_STRINGVIEW_LEVEL < 2
QString QDateTime::toString(const QString &format) const
{
- return toString(qToStringViewIgnoringNull(format));
+ return toString(qToStringViewIgnoringNull(format), QCalendar());
+}
+
+QString QDateTime::toString(const QString &format, QCalendar cal) const
+{
+ return toString(qToStringViewIgnoringNull(format), cal);
}
#endif
@@ -5198,9 +5210,14 @@ int QDateTime::utcOffset() const
Returns the QDateTime represented by the \a string, using the
\a format given, or an invalid datetime if this is not possible.
- Note for Qt::TextDate: It is recommended that you use the
- English short month names (e.g. "Jan"). Although localized month
- names can also be used, they depend on the user's locale settings.
+ Note for Qt::TextDate: It is recommended that you use the English short
+ month names (e.g. "Jan"). Although localized month names can also be used in
+ Qt 5, they depend on the user's locale settings.
+
+ \note Support for localized dates, including the format options
+ Qt::SystemLocaleDate, Qt::SystemLocaleShortDate, Qt::SystemLocaleLongDate,
+ Qt::LocaleDate, Qt::DefaultLocaleShortDate, and Qt::DefaultLocaleLongDate,
+ shall be removed in Qt 6. Use QLocale::toDateTime() instead.
\sa toString(), QLocale::toDateTime()
*/
@@ -5210,6 +5227,7 @@ QDateTime QDateTime::fromString(const QString &string, Qt::DateFormat format)
return QDateTime();
switch (format) {
+#if QT_DEPRECATED_SINCE(5, 15)
case Qt::SystemLocaleDate:
case Qt::SystemLocaleShortDate:
return QLocale::system().toDateTime(string, QLocale::ShortFormat);
@@ -5220,6 +5238,7 @@ QDateTime QDateTime::fromString(const QString &string, Qt::DateFormat format)
return QLocale().toDateTime(string, QLocale::ShortFormat);
case Qt::DefaultLocaleLongDate:
return QLocale().toDateTime(string, QLocale::LongFormat);
+#endif // 5.15
case Qt::RFC2822Date: {
const ParsedRfcDateTime rfc = rfcDateImpl(string);
@@ -5470,7 +5489,7 @@ QDateTime QDateTime::fromString(const QString &string, const QString &format, QC
QTime time;
QDate date;
- QDateTimeParser dt(QVariant::DateTime, QDateTimeParser::FromString, cal);
+ QDateTimeParser dt(QMetaType::QDateTime, QDateTimeParser::FromString, cal);
// dt.setDefaultLocale(QLocale::c()); ### Qt 6
if (dt.parseFormat(format) && dt.fromString(string, &date, &time))
return QDateTime(date, time);
diff --git a/src/corelib/time/qdatetime.h b/src/corelib/time/qdatetime.h
index 3eae8ebf64..c1653b5585 100644
--- a/src/corelib/time/qdatetime.h
+++ b/src/corelib/time/qdatetime.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2019 The Qt Company Ltd.
+** Copyright (C) 2020 The Qt Company Ltd.
** Copyright (C) 2016 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
@@ -110,14 +110,15 @@ public:
static QString longDayName(int weekday, MonthNameType type = DateFormat);
#endif // textdate && deprecated
#if QT_CONFIG(datestring)
- QString toString(Qt::DateFormat f = Qt::TextDate) const;
+ QString toString(Qt::DateFormat format = Qt::TextDate) const;
+ QString toString(Qt::DateFormat format, QCalendar cal) const;
+
#if QT_STRINGVIEW_LEVEL < 2
QString toString(const QString &format) const;
QString toString(const QString &format, QCalendar cal) const;
#endif
QString toString(QStringView format) const;
- QString toString(Qt::DateFormat f, QCalendar cal) const;
QString toString(QStringView format, QCalendar cal) const;
#endif
#if QT_DEPRECATED_SINCE(5,0)
@@ -287,7 +288,9 @@ class Q_CORE_EXPORT QDateTime
public:
QDateTime() noexcept(Data::CanBeSmall);
- explicit QDateTime(const QDate &); // ### Qt 6: plain QDate, QTime
+#if QT_DEPRECATED_SINCE(5, 15) // ### Qt 6: remove
+ QT_DEPRECATED_X("Use QDate::startOfDay()") explicit QDateTime(const QDate &);
+#endif
QDateTime(const QDate &, const QTime &, Qt::TimeSpec spec = Qt::LocalTime);
// ### Qt 6: Merge with above with default offsetSeconds = 0
QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec, int offsetSeconds);
@@ -330,11 +333,14 @@ public:
void setSecsSinceEpoch(qint64 secs);
#if QT_CONFIG(datestring)
- QString toString(Qt::DateFormat f = Qt::TextDate) const;
+ QString toString(Qt::DateFormat format = Qt::TextDate) const;
+ QString toString(Qt::DateFormat format, QCalendar cal) const;
#if QT_STRINGVIEW_LEVEL < 2
QString toString(const QString &format) const;
+ QString toString(const QString &format, QCalendar cal) const;
#endif
QString toString(QStringView format) const;
+ QString toString(QStringView format, QCalendar cal) const;
#endif
Q_REQUIRED_RESULT QDateTime addDays(qint64 days) const;
Q_REQUIRED_RESULT QDateTime addMonths(int months) const;
diff --git a/src/corelib/time/qdatetimeparser.cpp b/src/corelib/time/qdatetimeparser.cpp
index 2f7cbb4017..c9ebc3fab3 100644
--- a/src/corelib/time/qdatetimeparser.cpp
+++ b/src/corelib/time/qdatetimeparser.cpp
@@ -404,7 +404,7 @@ bool QDateTimeParser::parseFormat(const QString &newFormat)
QDTPDEBUGN("parseFormat: %s", newFormat.toLatin1().constData());
QVector<SectionNode> newSectionNodes;
- Sections newDisplay = 0;
+ Sections newDisplay;
QStringList newSeparators;
int i, index = 0;
int add = 0;
@@ -425,7 +425,7 @@ bool QDateTimeParser::parseFormat(const QString &newFormat)
switch (sect) {
case 'H':
case 'h':
- if (parserType != QVariant::Date) {
+ if (parserType != QMetaType::QDate) {
const Section hour = (sect == 'h') ? Hour12Section : Hour24Section;
const SectionNode sn = { hour, i - add, countRepeat(newFormat, i, 2), 0 };
newSectionNodes.append(sn);
@@ -436,7 +436,7 @@ bool QDateTimeParser::parseFormat(const QString &newFormat)
}
break;
case 'm':
- if (parserType != QVariant::Date) {
+ if (parserType != QMetaType::QDate) {
const SectionNode sn = { MinuteSection, i - add, countRepeat(newFormat, i, 2), 0 };
newSectionNodes.append(sn);
appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
@@ -446,7 +446,7 @@ bool QDateTimeParser::parseFormat(const QString &newFormat)
}
break;
case 's':
- if (parserType != QVariant::Date) {
+ if (parserType != QMetaType::QDate) {
const SectionNode sn = { SecondSection, i - add, countRepeat(newFormat, i, 2), 0 };
newSectionNodes.append(sn);
appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
@@ -457,7 +457,7 @@ bool QDateTimeParser::parseFormat(const QString &newFormat)
break;
case 'z':
- if (parserType != QVariant::Date) {
+ if (parserType != QMetaType::QDate) {
const SectionNode sn = { MSecSection, i - add, countRepeat(newFormat, i, 3) < 3 ? 1 : 3, 0 };
newSectionNodes.append(sn);
appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
@@ -468,7 +468,7 @@ bool QDateTimeParser::parseFormat(const QString &newFormat)
break;
case 'A':
case 'a':
- if (parserType != QVariant::Date) {
+ if (parserType != QMetaType::QDate) {
const bool cap = (sect == 'A');
const SectionNode sn = { AmPmSection, i - add, (cap ? 1 : 0), 0 };
newSectionNodes.append(sn);
@@ -482,7 +482,7 @@ bool QDateTimeParser::parseFormat(const QString &newFormat)
}
break;
case 'y':
- if (parserType != QVariant::Time) {
+ if (parserType != QMetaType::QTime) {
const int repeat = countRepeat(newFormat, i, 4);
if (repeat >= 2) {
const SectionNode sn = { repeat == 4 ? YearSection : YearSection2Digits,
@@ -496,7 +496,7 @@ bool QDateTimeParser::parseFormat(const QString &newFormat)
}
break;
case 'M':
- if (parserType != QVariant::Time) {
+ if (parserType != QMetaType::QTime) {
const SectionNode sn = { MonthSection, i - add, countRepeat(newFormat, i, 4), 0 };
newSectionNodes.append(sn);
newSeparators.append(unquote(newFormat.midRef(index, i - index)));
@@ -506,7 +506,7 @@ bool QDateTimeParser::parseFormat(const QString &newFormat)
}
break;
case 'd':
- if (parserType != QVariant::Time) {
+ if (parserType != QMetaType::QTime) {
const int repeat = countRepeat(newFormat, i, 4);
const Section sectionType = (repeat == 4 ? DayOfWeekSectionLong
: (repeat == 3 ? DayOfWeekSectionShort : DaySection));
@@ -519,7 +519,7 @@ bool QDateTimeParser::parseFormat(const QString &newFormat)
}
break;
case 't':
- if (parserType != QVariant::Time) {
+ if (parserType != QMetaType::QTime) {
const SectionNode sn = { TimeZoneSection, i - add, countRepeat(newFormat, i, 4), 0 };
newSectionNodes.append(sn);
appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
@@ -1151,7 +1151,7 @@ QDateTimeParser::scanString(const QDateTime &defaultValue,
}
pos += separator.size();
sectionNodes[index].pos = pos;
- int *current = 0;
+ int *current = nullptr;
const SectionNode sn = sectionNodes.at(index);
ParsedSection sect;
@@ -1252,7 +1252,7 @@ QDateTimeParser::scanString(const QDateTime &defaultValue,
return StateNode();
}
- if (parserType != QVariant::Time) {
+ if (parserType != QMetaType::QTime) {
if (year % 100 != year2digits && (isSet & YearSection2Digits)) {
if (!(isSet & YearSection)) {
year = (year / 100) * 100;
@@ -1322,7 +1322,7 @@ QDateTimeParser::scanString(const QDateTime &defaultValue,
}
}
- if (parserType != QVariant::Date) {
+ if (parserType != QMetaType::QDate) {
if (isSet & Hour12Section) {
const bool hasHour = isSet & Hour24Section;
if (ampm == -1) {
@@ -1360,7 +1360,7 @@ QDateTimeParser::scanString(const QDateTime &defaultValue,
// If hour wasn't specified, check the default we're using exists on the
// given date (which might be a spring-forward, skipping an hour).
- if (parserType == QVariant::DateTime && !(isSet & HourSectionMask) && !when.isValid()) {
+ if (parserType == QMetaType::QDateTime && !(isSet & HourSectionMask) && !when.isValid()) {
qint64 msecs = when.toMSecsSinceEpoch();
// Fortunately, that gets a useful answer, even though when is invalid ...
const QDateTime replace =
@@ -1796,7 +1796,7 @@ int QDateTimeParser::SectionNode::maxChange() const
QDateTimeParser::FieldInfo QDateTimeParser::fieldInfo(int index) const
{
- FieldInfo ret = 0;
+ FieldInfo ret;
const SectionNode &sn = sectionNode(index);
switch (sn.type) {
case MSecSection:
diff --git a/src/corelib/time/qdatetimeparser_p.h b/src/corelib/time/qdatetimeparser_p.h
index e9f1455380..5c612ef6a4 100644
--- a/src/corelib/time/qdatetimeparser_p.h
+++ b/src/corelib/time/qdatetimeparser_p.h
@@ -83,8 +83,8 @@ public:
FromString,
DateTimeEdit
};
- QDateTimeParser(QVariant::Type t, Context ctx, const QCalendar &cal = QCalendar())
- : currentSectionIndex(-1), display(nullptr), cachedDay(-1), parserType(t),
+ QDateTimeParser(QMetaType::Type t, Context ctx, const QCalendar &cal = QCalendar())
+ : currentSectionIndex(-1), cachedDay(-1), parserType(t),
fixday(false), spec(Qt::LocalTime), context(ctx), calendar(cal)
{
defaultLocale = QLocale::system();
@@ -295,7 +295,7 @@ protected: // for the benefit of QDateTimeEditPrivate
QStringList separators;
QString displayFormat;
QLocale defaultLocale;
- QVariant::Type parserType;
+ QMetaType::Type parserType;
bool fixday;
Qt::TimeSpec spec; // spec if used by QDateTimeEdit
Context context;
diff --git a/src/corelib/time/qtimezone.cpp b/src/corelib/time/qtimezone.cpp
index 0bba2afc61..87d8ea75f1 100644
--- a/src/corelib/time/qtimezone.cpp
+++ b/src/corelib/time/qtimezone.cpp
@@ -318,27 +318,40 @@ Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
*/
QTimeZone::QTimeZone() noexcept
- : d(0)
+ : d(nullptr)
{
}
/*!
Creates an instance of the requested time zone \a ianaId.
- The ID must be one of the available system IDs otherwise an invalid
- time zone will be returned.
+ The ID must be one of the available system IDs or a valid UTC-with-offset
+ ID, otherwise an invalid time zone will be returned.
\sa availableTimeZoneIds()
*/
QTimeZone::QTimeZone(const QByteArray &ianaId)
{
- // Try and see if it's a valid UTC offset ID, just as quick to try create as look-up
+ // Try and see if it's a CLDR UTC offset ID - just as quick by creating as
+ // by looking up.
d = new QUtcTimeZonePrivate(ianaId);
- // If not a valid UTC offset ID then try create it with the system backend
- // Relies on backend not creating valid tz with invalid name
+ // If not a CLDR UTC offset ID then try creating it with the system backend.
+ // Relies on backend not creating valid TZ with invalid name.
if (!d->isValid())
d = newBackendTimeZone(ianaId);
+ // Can also handle UTC with arbitrary (valid) offset, but only do so as
+ // fall-back, since either of the above may handle it more informatively.
+ if (!d->isValid()) {
+ qint64 offset = QUtcTimeZonePrivate::offsetFromUtcString(ianaId);
+ if (offset != QTimeZonePrivate::invalidSeconds()) {
+ // Should have abs(offset) < 24 * 60 * 60 = 86400.
+ qint32 seconds = qint32(offset);
+ Q_ASSERT(qint64(seconds) == offset);
+ // NB: this canonicalises the name, so it might not match ianaId
+ d = new QUtcTimeZonePrivate(seconds);
+ }
+ }
}
/*!
diff --git a/src/corelib/time/qtimezoneprivate.cpp b/src/corelib/time/qtimezoneprivate.cpp
index cb019fa1a5..facdf6661d 100644
--- a/src/corelib/time/qtimezoneprivate.cpp
+++ b/src/corelib/time/qtimezoneprivate.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2019 The Qt Company Ltd.
** Copyright (C) 2013 John Layt <jlayt@kde.org>
** Contact: https://www.qt.io/licensing/
**
@@ -764,6 +765,39 @@ QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &id)
}
}
+qint64 QUtcTimeZonePrivate::offsetFromUtcString(const QByteArray &id)
+{
+ // Convert reasonable UTC[+-]\d+(:\d+){,2} to offset in seconds.
+ // Assumption: id has already been tried as a CLDR UTC offset ID (notably
+ // including plain "UTC" itself) and a system offset ID; it's neither.
+ if (!id.startsWith("UTC") || id.size() < 5)
+ return invalidSeconds(); // Doesn't match
+ const char signChar = id.at(3);
+ if (signChar != '-' && signChar != '+')
+ return invalidSeconds(); // No sign
+ const int sign = signChar == '-' ? -1 : 1;
+
+ const auto offsets = id.mid(4).split(':');
+ if (offsets.isEmpty() || offsets.size() > 3)
+ return invalidSeconds(); // No numbers, or too many.
+
+ qint32 seconds = 0;
+ int prior = 0; // Number of fields parsed thus far
+ for (const auto &offset : offsets) {
+ bool ok = false;
+ unsigned short field = offset.toUShort(&ok);
+ // Bound hour above at 24, minutes and seconds at 60:
+ if (!ok || field >= (prior ? 60 : 24))
+ return invalidSeconds();
+ seconds = seconds * 60 + field;
+ ++prior;
+ }
+ while (prior++ < 3)
+ seconds *= 60;
+
+ return seconds * sign;
+}
+
// Create offset from UTC
QUtcTimeZonePrivate::QUtcTimeZonePrivate(qint32 offsetSeconds)
{
@@ -877,22 +911,25 @@ QByteArray QUtcTimeZonePrivate::systemTimeZoneId() const
bool QUtcTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
{
+ // Only the zone IDs supplied by CLDR and recognized by constructor.
for (int i = 0; i < utcDataTableSize; ++i) {
const QUtcData *data = utcData(i);
- if (utcId(data) == ianaId) {
+ if (utcId(data) == ianaId)
return true;
- }
}
+ // But see offsetFromUtcString(), which lets us accept some "unavailable" IDs.
return false;
}
QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds() const
{
+ // Only the zone IDs supplied by CLDR and recognized by constructor.
QList<QByteArray> result;
result.reserve(utcDataTableSize);
for (int i = 0; i < utcDataTableSize; ++i)
result << utcId(utcData(i));
- std::sort(result.begin(), result.end()); // ### or already sorted??
+ // Not guaranteed to be sorted, so sort:
+ std::sort(result.begin(), result.end());
// ### assuming no duplicates
return result;
}
@@ -907,13 +944,16 @@ QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds(QLocale::Country cou
QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds(qint32 offsetSeconds) const
{
+ // Only if it's present in CLDR. (May get more than one ID: UTC, UTC+00:00
+ // and UTC-00:00 all have the same offset.)
QList<QByteArray> result;
for (int i = 0; i < utcDataTableSize; ++i) {
const QUtcData *data = utcData(i);
if (data->offsetFromUtc == offsetSeconds)
result << utcId(data);
}
- std::sort(result.begin(), result.end()); // ### or already sorted??
+ // Not guaranteed to be sorted, so sort:
+ std::sort(result.begin(), result.end());
// ### assuming no duplicates
return result;
}
diff --git a/src/corelib/time/qtimezoneprivate_icu.cpp b/src/corelib/time/qtimezoneprivate_icu.cpp
index 5570ce7571..8a92bbb387 100644
--- a/src/corelib/time/qtimezoneprivate_icu.cpp
+++ b/src/corelib/time/qtimezoneprivate_icu.cpp
@@ -273,7 +273,7 @@ static int ucalDaylightOffset(const QByteArray &id)
// Create the system default time zone
QIcuTimeZonePrivate::QIcuTimeZonePrivate()
- : m_ucal(0)
+ : m_ucal(nullptr)
{
// TODO No ICU C API to obtain sysem tz, assume default hasn't been changed
init(ucalDefaultTimeZoneId());
@@ -281,7 +281,7 @@ QIcuTimeZonePrivate::QIcuTimeZonePrivate()
// Create a named time zone
QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QByteArray &ianaId)
- : m_ucal(0)
+ : m_ucal(nullptr)
{
// Need to check validity here as ICu will create a GMT tz if name is invalid
if (availableTimeZoneIds().contains(ianaId))
@@ -289,14 +289,14 @@ QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QByteArray &ianaId)
}
QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other)
- : QTimeZonePrivate(other), m_ucal(0)
+ : QTimeZonePrivate(other), m_ucal(nullptr)
{
// Clone the ucal so we don't close the shared object
UErrorCode status = U_ZERO_ERROR;
m_ucal = ucal_clone(other.m_ucal, &status);
if (!U_SUCCESS(status)) {
m_id.clear();
- m_ucal = 0;
+ m_ucal = nullptr;
}
}
@@ -322,7 +322,7 @@ void QIcuTimeZonePrivate::init(const QByteArray &ianaId)
if (!U_SUCCESS(status)) {
m_id.clear();
- m_ucal = 0;
+ m_ucal = nullptr;
}
}
@@ -493,7 +493,7 @@ QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) c
// TODO Available directly in C++ api but not C api, from 4.8 onwards new filter method works
#if U_ICU_VERSION_MAJOR_NUM >= 49 || (U_ICU_VERSION_MAJOR_NUM == 4 && U_ICU_VERSION_MINOR_NUM == 8)
UErrorCode status = U_ZERO_ERROR;
- UEnumeration *uenum = ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_ANY, 0,
+ UEnumeration *uenum = ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_ANY, nullptr,
&offsetFromUtc, &status);
QList<QByteArray> result;
if (U_SUCCESS(status))
diff --git a/src/corelib/time/qtimezoneprivate_p.h b/src/corelib/time/qtimezoneprivate_p.h
index 5f6491ef81..a57f61f381 100644
--- a/src/corelib/time/qtimezoneprivate_p.h
+++ b/src/corelib/time/qtimezoneprivate_p.h
@@ -188,6 +188,9 @@ public:
QUtcTimeZonePrivate(const QUtcTimeZonePrivate &other);
virtual ~QUtcTimeZonePrivate();
+ // Fall-back for UTC[+-]\d+(:\d+){,2} IDs.
+ static qint64 offsetFromUtcString(const QByteArray &id);
+
QUtcTimeZonePrivate *clone() const override;
Data data(qint64 forMSecsSinceEpoch) const override;
diff --git a/src/corelib/time/qtimezoneprivate_tz.cpp b/src/corelib/time/qtimezoneprivate_tz.cpp
index 3c2695a789..5e55c6897d 100644
--- a/src/corelib/time/qtimezoneprivate_tz.cpp
+++ b/src/corelib/time/qtimezoneprivate_tz.cpp
@@ -512,7 +512,7 @@ PosixZone PosixZone::parse(const char *&pos, const char *end)
if (zoneEnd < end && (zoneEnd[0] == '+' || zoneEnd[0] == '-'))
++zoneEnd;
while (zoneEnd < end) {
- if (strchr(offsetChars, char(*zoneEnd)) == NULL)
+ if (strchr(offsetChars, char(*zoneEnd)) == nullptr)
break;
++zoneEnd;
}
diff --git a/src/corelib/tools/qarraydata.cpp b/src/corelib/tools/qarraydata.cpp
index 234a44f6b6..3879b48cbb 100644
--- a/src/corelib/tools/qarraydata.cpp
+++ b/src/corelib/tools/qarraydata.cpp
@@ -143,7 +143,7 @@ qCalculateGrowingBlockSize(size_t elementCount, size_t elementSize, size_t heade
}
result.elementCount = (bytes - unsigned(headerSize)) / unsigned(elementSize);
- result.size = bytes;
+ result.size = result.elementCount * elementSize + headerSize;
return result;
}
@@ -265,7 +265,7 @@ void QArrayData::deallocate(QArrayData *data, size_t objectSize,
return;
#endif
- Q_ASSERT_X(data == 0 || !data->ref.isStatic(), "QArrayData::deallocate",
+ Q_ASSERT_X(data == nullptr || !data->ref.isStatic(), "QArrayData::deallocate",
"Static data cannot be deleted");
::free(data);
}
diff --git a/src/corelib/tools/qduplicatetracker_p.h b/src/corelib/tools/qduplicatetracker_p.h
new file mode 100644
index 0000000000..99068c01a3
--- /dev/null
+++ b/src/corelib/tools/qduplicatetracker_p.h
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QDUPLICATETRACKER_P_H
+#define QDUPLICATETRACKER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <qglobal.h>
+
+#if QT_HAS_INCLUDE(<memory_resource>) && __cplusplus > 201402L
+# include <unordered_set>
+# include <memory_resource>
+#else
+# include <qset.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+template <typename T, size_t Prealloc = 32>
+class QDuplicateTracker {
+#ifdef __cpp_lib_memory_resource
+ char buffer[Prealloc * sizeof(T)];
+ std::pmr::monotonic_buffer_resource res{buffer, sizeof buffer};
+ std::pmr::unordered_set<T> set{&res};
+#else
+ QSet<T> set;
+ int setSize = 0;
+#endif
+ Q_DISABLE_COPY_MOVE(QDuplicateTracker);
+public:
+ QDuplicateTracker() = default;
+ void reserve(int n) { set.reserve(n); }
+ Q_REQUIRED_RESULT bool hasSeen(const T &s)
+ {
+ bool inserted;
+#ifdef __cpp_lib_memory_resource
+ inserted = set.insert(s).second;
+#else
+ set.insert(s);
+ const int n = set.size();
+ inserted = qExchange(setSize, n) != n;
+#endif
+ return !inserted;
+ }
+};
+
+QT_END_NAMESPACE
+
+#endif /* QDUPLICATETRACKER_P_H */
diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp
index bf2fd2e401..84430ae49a 100644
--- a/src/corelib/tools/qeasingcurve.cpp
+++ b/src/corelib/tools/qeasingcurve.cpp
@@ -443,12 +443,12 @@ class QEasingCurvePrivate
public:
QEasingCurvePrivate()
: type(QEasingCurve::Linear),
- config(0),
+ config(nullptr),
func(&easeNone)
{ }
QEasingCurvePrivate(const QEasingCurvePrivate &other)
: type(other.type),
- config(other.config ? other.config->copy() : 0),
+ config(other.config ? other.config->copy() : nullptr),
func(other.func)
{ }
~QEasingCurvePrivate() { delete config; }
@@ -590,7 +590,7 @@ struct BezierEase : public QEasingCurveFunction
if (!(x < 1))
return 1;
- SingleCubicBezier *singleCubicBezier = 0;
+ SingleCubicBezier *singleCubicBezier = nullptr;
getBezierSegment(singleCubicBezier, x);
return evaluateSegmentForY(*singleCubicBezier, findTForX(*singleCubicBezier, x));
@@ -1097,7 +1097,7 @@ static QEasingCurve::EasingFunction curveToFunc(QEasingCurve::Type curve)
case QEasingCurve::CosineCurve:
return &easeCosineCurve;
default:
- return 0;
+ return nullptr;
};
}
@@ -1127,7 +1127,7 @@ static QEasingCurveFunction *curveToFunctionObject(QEasingCurve::Type type)
return new QEasingCurveFunction(type, qreal(0.3), qreal(1.0), qreal(1.70158));
}
- return 0;
+ return nullptr;
}
/*!
@@ -1422,7 +1422,7 @@ void QEasingCurvePrivate::setType_helper(QEasingCurve::Type newType)
tcbPoints = std::move(config->_tcbPoints);
delete config;
- config = 0;
+ config = nullptr;
}
if (isConfigFunction(newType) || (amp != -1.0) || (period != -1.0) || (overshoot != -1.0) ||
@@ -1436,11 +1436,11 @@ void QEasingCurvePrivate::setType_helper(QEasingCurve::Type newType)
config->_o = overshoot;
config->_bezierCurves = std::move(bezierCurves);
config->_tcbPoints = std::move(tcbPoints);
- func = 0;
+ func = nullptr;
} else if (newType != QEasingCurve::Custom) {
func = curveToFunc(newType);
}
- Q_ASSERT((func == 0) == (config != 0));
+ Q_ASSERT((func == nullptr) == (config != nullptr));
type = newType;
}
@@ -1487,7 +1487,7 @@ void QEasingCurve::setCustomType(EasingFunction func)
*/
QEasingCurve::EasingFunction QEasingCurve::customType() const
{
- return d_ptr->type == Custom ? d_ptr->func : 0;
+ return d_ptr->type == Custom ? d_ptr->func : nullptr;
}
/*!
diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp
index 6ec8019ba3..15f731a603 100644
--- a/src/corelib/tools/qhash.cpp
+++ b/src/corelib/tools/qhash.cpp
@@ -1120,21 +1120,6 @@ uint qHash(long double key, uint seed) noexcept
\snippet code/src_corelib_tools_qhash.cpp 9
- However, you can store multiple values per key by using
- insertMulti() instead of insert() (or using the convenience
- subclass QMultiHash). If you want to retrieve all
- the values for a single key, you can use values(const Key &key),
- which returns a QList<T>:
-
- \snippet code/src_corelib_tools_qhash.cpp 10
-
- The items that share the same key are available from most
- recently to least recently inserted. A more efficient approach is
- to call find() to get the iterator for the first item with a key
- and iterate from there:
-
- \snippet code/src_corelib_tools_qhash.cpp 11
-
If you only need to extract the values from a hash (not the keys),
you can also use \l{foreach}:
@@ -1435,9 +1420,8 @@ uint qHash(long double key, uint seed) noexcept
/*! \fn template <class Key, class T> int QHash<Key, T>::remove(const Key &key)
Removes all the items that have the \a key from the hash.
- Returns the number of items removed which is usually 1 but will
- be 0 if the key isn't in the hash, or greater than 1 if
- insertMulti() has been used with the \a key.
+ Returns the number of items removed which is 1 if the key exists in the hash,
+ and 0 otherwise.
\sa clear(), take(), QMultiHash::remove()
*/
@@ -1507,27 +1491,25 @@ uint qHash(long double key, uint seed) noexcept
/*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::uniqueKeys() const
\since 4.2
+ \obsolete
Returns a list containing all the keys in the map. Keys that occur multiple
times in the map (because items were inserted with insertMulti(), or
unite() was used) occur only once in the returned list.
- \sa keys(), values()
+ \sa QMultiHash::uniqueKeys()
*/
/*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::keys() const
Returns a list containing all the keys in the hash, in an
arbitrary order. Keys that occur multiple times in the hash
- (because items were inserted with insertMulti(), or unite() was
- used) also occur multiple times in the list.
-
- To obtain a list of unique keys, where each key from the map only
- occurs once, use uniqueKeys().
+ (because the method is operating on a QMultiHash) also occur
+ multiple times in the list.
The order is guaranteed to be the same as that used by values().
- \sa uniqueKeys(), values(), key()
+ \sa QMultiMap::uniqueKeys(), values(), key()
*/
/*! \fn template <class Key, class T> QList<Key> QHash<Key, T>::keys(const T &value) const
@@ -1555,7 +1537,7 @@ uint qHash(long double key, uint seed) noexcept
*/
/*! \fn template <class Key, class T> QList<T> QHash<Key, T>::values(const Key &key) const
-
+ \obsolete
\overload
Returns a list of all the values associated with the \a key,
@@ -1592,6 +1574,7 @@ uint qHash(long double key, uint seed) noexcept
*/
/*! \fn template <class Key, class T> int QHash<Key, T>::count(const Key &key) const
+ \obsolete
Returns the number of items associated with the \a key.
@@ -1803,11 +1786,22 @@ uint qHash(long double key, uint seed) noexcept
If there are multiple items with the \a key, the most
recently inserted item's value is replaced with \a value.
+*/
+
+/*! \fn template <class Key, class T> void QHash<Key, T>::insert(const QHash &other)
+ \since 5.15
+
+ Inserts all the items in the \a other hash into this hash.
+
+ If a key is common to both hashes, its value will be replaced with the
+ value stored in \a other.
- \sa insertMulti()
+ \note If \a other contains multiple entries with the same key then the
+ final value of the key is undefined.
*/
/*! \fn template <class Key, class T> QHash<Key, T>::iterator QHash<Key, T>::insertMulti(const Key &key, const T &value)
+ \obsolete
Inserts a new item with the \a key and a value of \a value.
@@ -1816,16 +1810,17 @@ uint qHash(long double key, uint seed) noexcept
different from insert(), which overwrites the value of an
existing item.)
+ This function is obsolete. Use QMultiHash or QMultiMap instead.
+
\sa insert(), values()
*/
/*! \fn template <class Key, class T> QHash &QHash<Key, T>::unite(const QHash &other)
+ \obsolete
Inserts all the items in the \a other hash into this hash. If a
key is common to both hashes, the resulting hash will contain the
key multiple times.
-
- \sa insertMulti()
*/
/*! \fn template <class Key, class T> bool QHash<Key, T>::empty() const
@@ -1966,10 +1961,7 @@ uint qHash(long double key, uint seed) noexcept
\snippet code/src_corelib_tools_qhash.cpp 17
Unlike QMap, which orders its items by key, QHash stores its
- items in an arbitrary order. The only guarantee is that items that
- share the same key (because they were inserted using
- QHash::insertMulti()) will appear consecutively, from the most
- recently to the least recently inserted value.
+ items in an arbitrary order.
Let's see a few examples of things we can do with a
QHash::iterator that we cannot do with a QHash::const_iterator.
@@ -2036,7 +2028,7 @@ uint qHash(long double key, uint seed) noexcept
There is no direct way of changing an item's key through an
iterator, although it can be done by calling QHash::erase()
- followed by QHash::insert() or QHash::insertMulti().
+ followed by QHash::insert().
\sa value()
*/
@@ -2198,7 +2190,7 @@ uint qHash(long double key, uint seed) noexcept
Unlike QMap, which orders its items by key, QHash stores its
items in an arbitrary order. The only guarantee is that items that
share the same key (because they were inserted using
- QHash::insertMulti()) will appear consecutively, from the most
+ a QMultiHash) will appear consecutively, from the most
recently to the least recently inserted value.
Multiple iterators can be used on the same hash. However, be aware
@@ -2531,18 +2523,22 @@ uint qHash(long double key, uint seed) noexcept
It inherits QHash and extends it with a few convenience functions
that make it more suitable than QHash for storing multi-valued
hashes. A multi-valued hash is a hash that allows multiple values
- with the same key; QHash normally doesn't allow that, unless you
- call QHash::insertMulti().
+ with the same key.
Because QMultiHash inherits QHash, all of QHash's functionality also
applies to QMultiHash. For example, you can use isEmpty() to test
whether the hash is empty, and you can traverse a QMultiHash using
- QHash's iterator classes (for example, QHashIterator). But in
- addition, it provides an insert() function that corresponds to
- QHash::insertMulti(), and a replace() function that corresponds to
+ QHash's iterator classes (for example, QHashIterator). But opposed to
+ QHash, it provides an insert() function will allow the insertion of
+ multiple items with the same key. The replace() function corresponds to
QHash::insert(). It also provides convenient operator+() and
operator+=().
+ Unlike QMultiMap, QMultiHash does not provide and ordering of the
+ inserted items. The only guarantee is that items that
+ share the same key will appear consecutively, from the most
+ recently to the least recently inserted value.
+
Example:
\snippet code/src_corelib_tools_qhash.cpp 24
@@ -2633,7 +2629,8 @@ uint qHash(long double key, uint seed) noexcept
\sa replace()
*/
-/*! \fn template <class Key, class T> QMultiHash &QMultiHash<Key, T>::operator+=(const QMultiHash &other)
+/*! \fn template <class Key, class T> QMultiHash &QMultiHash<Key, T>::unite(const QMultiHash &other)
+ \since 5.13
Inserts all the items in the \a other hash into this hash
and returns a reference to this hash.
@@ -2641,6 +2638,32 @@ uint qHash(long double key, uint seed) noexcept
\sa insert()
*/
+/*! \fn template <class Key, class T> QList<Key> QMultiHash<Key, T>::uniqueKeys() const
+ \since 5.13
+
+ Returns a list containing all the keys in the map. Keys that occur multiple
+ times in the map occur only once in the returned list.
+
+ \sa keys(), values()
+*/
+
+/*! \fn template <class Key, class T> QList<T> QMultiHash<Key, T>::values(const Key &key) const
+ \overload
+
+ Returns a list of all the values associated with the \a key,
+ from the most recently inserted to the least recently inserted.
+
+ \sa count(), insert()
+*/
+
+/*! \fn template <class Key, class T> QMultiHash &QMultiHash<Key, T>::operator+=(const QMultiHash &other)
+
+ Inserts all the items in the \a other hash into this hash
+ and returns a reference to this hash.
+
+ \sa unite(), insert()
+*/
+
/*! \fn template <class Key, class T> QMultiHash QMultiHash<Key, T>::operator+(const QMultiHash &other) const
Returns a hash that contains all the items in this hash in
@@ -2670,6 +2693,13 @@ uint qHash(long double key, uint seed) noexcept
\sa QHash::remove()
*/
+/*! \fn template <class Key, class T> int QMultiHash<Key, T>::count(const Key &key) const
+
+ Returns the number of items associated with the \a key.
+
+ \sa contains(), insert()
+*/
+
/*!
\fn template <class Key, class T> int QMultiHash<Key, T>::count(const Key &key, const T &value) const
\since 4.3
diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h
index 236e433101..921b781f4a 100644
--- a/src/corelib/tools/qhash.h
+++ b/src/corelib/tools/qhash.h
@@ -308,12 +308,14 @@ public:
T &operator[](const Key &key);
const T operator[](const Key &key) const;
- QList<Key> uniqueKeys() const;
QList<Key> keys() const;
QList<Key> keys(const T &value) const;
QList<T> values() const;
- QList<T> values(const Key &key) const;
- int count(const Key &key) const;
+#if QT_DEPRECATED_SINCE(5, 15)
+ QT_DEPRECATED_X("Use QMultiHash for hashes storing multiple values with the same key.") QList<Key> uniqueKeys() const;
+ QT_DEPRECATED_X("Use QMultiHash for hashes storing multiple values with the same key.") QList<T> values(const Key &key) const;
+ QT_DEPRECATED_X("Use QMultiHash for hashes storing multiple values with the same key.") int count(const Key &key) const;
+#endif
class const_iterator;
@@ -325,7 +327,11 @@ public:
QHashData::Node *i;
public:
+#if QT_DEPRECATED_SINCE(5, 15)
typedef std::bidirectional_iterator_tag iterator_category;
+#else
+ typedef std::forward_iterator_tag iterator_category;
+#endif
typedef qptrdiff difference_type;
typedef T value_type;
typedef T *pointer;
@@ -350,21 +356,25 @@ public:
i = QHashData::nextNode(i);
return r;
}
- inline iterator &operator--() {
+#if QT_DEPRECATED_SINCE(5, 15)
+ inline QT_DEPRECATED iterator &operator--()
+ {
i = QHashData::previousNode(i);
return *this;
}
- inline iterator operator--(int) {
+ inline QT_DEPRECATED iterator operator--(int)
+ {
iterator r = *this;
i = QHashData::previousNode(i);
return r;
}
- inline iterator operator+(int j) const
+ inline QT_DEPRECATED iterator operator+(int j) const
{ iterator r = *this; if (j > 0) while (j--) ++r; else while (j++) --r; return r; }
- inline iterator operator-(int j) const { return operator+(-j); }
- inline iterator &operator+=(int j) { return *this = *this + j; }
- inline iterator &operator-=(int j) { return *this = *this - j; }
- friend inline iterator operator+(int j, iterator k) { return k + j; }
+ inline QT_DEPRECATED iterator operator-(int j) const { return operator+(-j); }
+ inline QT_DEPRECATED iterator &operator+=(int j) { return *this = *this + j; }
+ inline QT_DEPRECATED iterator &operator-=(int j) { return *this = *this - j; }
+ friend inline QT_DEPRECATED iterator operator+(int j, iterator k) { return k + j; }
+#endif
#ifndef QT_STRICT_ITERATORS
public:
@@ -380,11 +390,16 @@ public:
{
friend class iterator;
friend class QHash<Key, T>;
+ friend class QMultiHash<Key, T>;
friend class QSet<Key>;
QHashData::Node *i;
public:
+#if QT_DEPRECATED_SINCE(5, 15)
typedef std::bidirectional_iterator_tag iterator_category;
+#else
+ typedef std::forward_iterator_tag iterator_category;
+#endif
typedef qptrdiff difference_type;
typedef T value_type;
typedef const T *pointer;
@@ -416,21 +431,28 @@ public:
i = QHashData::nextNode(i);
return r;
}
- inline const_iterator &operator--() {
+#if QT_DEPRECATED_SINCE(5, 15)
+ inline QT_DEPRECATED const_iterator &operator--()
+ {
i = QHashData::previousNode(i);
return *this;
}
- inline const_iterator operator--(int) {
+ inline QT_DEPRECATED const_iterator operator--(int)
+ {
const_iterator r = *this;
i = QHashData::previousNode(i);
return r;
}
- inline const_iterator operator+(int j) const
+ inline QT_DEPRECATED const_iterator operator+(int j) const
{ const_iterator r = *this; if (j > 0) while (j--) ++r; else while (j++) --r; return r; }
- inline const_iterator operator-(int j) const { return operator+(-j); }
- inline const_iterator &operator+=(int j) { return *this = *this + j; }
- inline const_iterator &operator-=(int j) { return *this = *this - j; }
- friend inline const_iterator operator+(int j, const_iterator k) { return k + j; }
+ inline QT_DEPRECATED const_iterator operator-(int j) const { return operator+(-j); }
+ inline QT_DEPRECATED const_iterator &operator+=(int j) { return *this = *this + j; }
+ inline QT_DEPRECATED const_iterator &operator-=(int j) { return *this = *this - j; }
+ friend inline QT_DEPRECATED const_iterator operator+(int j, const_iterator k)
+ {
+ return k + j;
+ }
+#endif
// ### Qt 5: not sure this is necessary anymore
#ifdef QT_STRICT_ITERATORS
@@ -462,8 +484,14 @@ public:
inline key_iterator &operator++() { ++i; return *this; }
inline key_iterator operator++(int) { return key_iterator(i++);}
- inline key_iterator &operator--() { --i; return *this; }
- inline key_iterator operator--(int) { return key_iterator(i--); }
+#if QT_DEPRECATED_SINCE(5, 15)
+ inline QT_DEPRECATED key_iterator &operator--()
+ {
+ --i;
+ return *this;
+ }
+ inline QT_DEPRECATED key_iterator operator--(int) { return key_iterator(i--); }
+#endif
const_iterator base() const { return i; }
};
@@ -501,8 +529,11 @@ public:
const_iterator find(const Key &key) const;
const_iterator constFind(const Key &key) const;
iterator insert(const Key &key, const T &value);
- iterator insertMulti(const Key &key, const T &value);
- QHash &unite(const QHash &other);
+ void insert(const QHash &hash);
+#if QT_DEPRECATED_SINCE(5, 15)
+ QT_DEPRECATED_X("Use QMultiHash for hashes storing multiple values with the same key.") iterator insertMulti(const Key &key, const T &value);
+ QT_DEPRECATED_X("Use QMultiHash for hashes storing multiple values with the same key.") QHash &unite(const QHash &other);
+#endif
// STL compatibility
typedef T mapped_type;
@@ -544,6 +575,7 @@ private:
#endif
}
friend class QSet<Key>;
+ friend class QMultiHash<Key, T>;
};
@@ -582,22 +614,6 @@ QHash<Key, T>::createNode(uint ah, const Key &akey, const T &avalue, Node **anex
}
template <class Key, class T>
-Q_INLINE_TEMPLATE QHash<Key, T> &QHash<Key, T>::unite(const QHash &other)
-{
- if (d == &QHashData::shared_null) {
- *this = other;
- } else {
- QHash copy(other);
- const_iterator it = copy.constEnd();
- while (it != copy.constBegin()) {
- --it;
- insertMulti(it.key(), it.value());
- }
- }
- return *this;
-}
-
-template <class Key, class T>
Q_OUTOFLINE_TEMPLATE void QHash<Key, T>::freeData(QHashData *x)
{
x->free_helper(deleteNode2);
@@ -656,26 +672,6 @@ Q_INLINE_TEMPLATE const T QHash<Key, T>::value(const Key &akey, const T &adefaul
}
template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::uniqueKeys() const
-{
- QList<Key> res;
- res.reserve(size()); // May be too much, but assume short lifetime
- const_iterator i = begin();
- if (i != end()) {
- for (;;) {
- const Key &aKey = i.key();
- res.append(aKey);
- do {
- if (++i == end())
- goto break_out_of_outer_loop;
- } while (aKey == i.key());
- }
- }
-break_out_of_outer_loop:
- return res;
-}
-
-template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::keys() const
{
QList<Key> res;
@@ -734,32 +730,6 @@ Q_OUTOFLINE_TEMPLATE QList<T> QHash<Key, T>::values() const
}
template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE QList<T> QHash<Key, T>::values(const Key &akey) const
-{
- QList<T> res;
- Node *node = *findNode(akey);
- if (node != e) {
- do {
- res.append(node->value);
- } while ((node = node->next) != e && node->key == akey);
- }
- return res;
-}
-
-template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE int QHash<Key, T>::count(const Key &akey) const
-{
- int cnt = 0;
- Node *node = *findNode(akey);
- if (node != e) {
- do {
- ++cnt;
- } while ((node = node->next) != e && node->key == akey);
- }
- return cnt;
-}
-
-template <class Key, class T>
Q_INLINE_TEMPLATE const T QHash<Key, T>::operator[](const Key &akey) const
{
return value(akey);
@@ -800,15 +770,28 @@ Q_INLINE_TEMPLATE typename QHash<Key, T>::iterator QHash<Key, T>::insert(const K
}
template <class Key, class T>
-Q_INLINE_TEMPLATE typename QHash<Key, T>::iterator QHash<Key, T>::insertMulti(const Key &akey,
- const T &avalue)
+Q_INLINE_TEMPLATE void QHash<Key, T>::insert(const QHash &hash)
{
+ if (d == hash.d)
+ return;
+
detach();
- d->willGrow();
- uint h;
- Node **nextNode = findNode(akey, &h);
- return iterator(createNode(h, akey, avalue, nextNode));
+ QHashData::Node *i = hash.d->firstNode();
+ QHashData::Node *end = reinterpret_cast<QHashData::Node *>(hash.e);
+ while (i != end) {
+ Node *n = concrete(i);
+ Node **node = findNode(n->key, n->h);
+ if (*node == e) {
+ if (d->willGrow())
+ node = findNode(n->key, n->h);
+ createNode(n->h, n->key, n->value, node);
+ } else {
+ if (!std::is_same<T, QHashDummyValue>::value)
+ (*node)->value = n->value;
+ }
+ i = QHashData::nextNode(i);
+ }
}
template <class Key, class T>
@@ -1061,11 +1044,12 @@ public:
inline typename QHash<Key, T>::iterator replace(const Key &key, const T &value)
{ return QHash<Key, T>::insert(key, value); }
- inline typename QHash<Key, T>::iterator insert(const Key &key, const T &value)
- { return QHash<Key, T>::insertMulti(key, value); }
+ typename QHash<Key, T>::iterator insert(const Key &key, const T &value);
+
+ inline QMultiHash &unite(const QMultiHash &other);
inline QMultiHash &operator+=(const QMultiHash &other)
- { this->unite(other); return *this; }
+ { return unite(other); }
inline QMultiHash operator+(const QMultiHash &other) const
{ QMultiHash result = *this; result += other; return result; }
@@ -1074,13 +1058,27 @@ public:
using QHash<Key, T>::count;
using QHash<Key, T>::find;
using QHash<Key, T>::constFind;
+ using QHash<Key, T>::values;
+ using QHash<Key, T>::findNode;
+ using QHash<Key, T>::createNode;
+ using QHash<Key, T>::concrete;
+ using QHash<Key, T>::detach;
+
+ using typename QHash<Key, T>::Node;
+ using typename QHash<Key, T>::iterator;
+ using typename QHash<Key, T>::const_iterator;
bool contains(const Key &key, const T &value) const;
int remove(const Key &key, const T &value);
+ int count(const Key &key) const;
int count(const Key &key, const T &value) const;
+ QList<Key> uniqueKeys() const;
+
+ QList<T> values(const Key &akey) const;
+
typename QHash<Key, T>::iterator find(const Key &key, const T &value) {
typename QHash<Key, T>::iterator i(find(key));
typename QHash<Key, T>::iterator end(this->end());
@@ -1109,6 +1107,50 @@ private:
};
template <class Key, class T>
+Q_INLINE_TEMPLATE typename QHash<Key, T>::iterator QMultiHash<Key, T>::insert(const Key &akey, const T &avalue)
+{
+ detach();
+ this->d->willGrow();
+
+ uint h;
+ Node **nextNode = findNode(akey, &h);
+ return iterator(createNode(h, akey, avalue, nextNode));
+}
+
+template <class Key, class T>
+Q_INLINE_TEMPLATE QMultiHash<Key, T> &QMultiHash<Key, T>::unite(const QMultiHash &other)
+{
+ if (this->d == &QHashData::shared_null) {
+ *this = other;
+ } else {
+#if QT_DEPRECATED_SINCE(5, 15)
+ QMultiHash copy(other);
+ const_iterator it = copy.constEnd();
+ while (it != copy.constBegin()) {
+ it.i = QHashData::previousNode(it.i);
+ insert(it.key(), it.value());
+ }
+#else
+ const QMultiHash copy(other);
+ const_iterator it = copy.cbegin();
+ const const_iterator end = copy.cend();
+ while (it != end) {
+ const auto rangeStart = it++;
+ while (it != end && rangeStart.key() == it.key())
+ ++it;
+ const qint64 last = std::distance(rangeStart, it) - 1;
+ for (qint64 i = last; i >= 0; --i) {
+ auto next = std::next(rangeStart, i);
+ insert(next.key(), next.value());
+ }
+ }
+#endif
+ }
+ return *this;
+}
+
+
+template <class Key, class T>
Q_INLINE_TEMPLATE bool QMultiHash<Key, T>::contains(const Key &key, const T &value) const
{
return constFind(key, value) != QHash<Key, T>::constEnd();
@@ -1145,8 +1187,259 @@ Q_INLINE_TEMPLATE int QMultiHash<Key, T>::count(const Key &key, const T &value)
return n;
}
-Q_DECLARE_ASSOCIATIVE_ITERATOR(Hash)
-Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR(Hash)
+template <class Key, class T>
+Q_OUTOFLINE_TEMPLATE QList<Key> QMultiHash<Key, T>::uniqueKeys() const
+{
+ QList<Key> res;
+ res.reserve(QHash<Key, T>::size()); // May be too much, but assume short lifetime
+ typename QHash<Key, T>::const_iterator i = QHash<Key, T>::begin();
+ if (i != QHash<Key, T>::end()) {
+ for (;;) {
+ const Key &aKey = i.key();
+ res.append(aKey);
+ do {
+ if (++i == QHash<Key, T>::end())
+ goto break_out_of_outer_loop;
+ } while (aKey == i.key());
+ }
+ }
+break_out_of_outer_loop:
+ return res;
+}
+
+#if QT_DEPRECATED_SINCE(5, 15)
+
+template <class Key, class T>
+Q_OUTOFLINE_TEMPLATE typename QHash<Key, T>::iterator QHash<Key, T>::insertMulti(const Key &key, const T &value) {
+ return static_cast<QMultiHash<Key, T> *>(this)->insert(key, value);
+}
+
+template <class Key, class T>
+Q_OUTOFLINE_TEMPLATE QHash<Key, T> &QHash<Key, T>::unite(const QHash &other) {
+ return static_cast<QMultiHash<Key, T> *>(this)->unite(other);
+}
+
+template <class Key, class T>
+Q_OUTOFLINE_TEMPLATE QList<T> QHash<Key, T>::values(const Key &akey) const
+{
+ return static_cast<const QMultiHash<Key, T> *>(this)->values(akey);
+}
+
+template <class Key, class T>
+Q_OUTOFLINE_TEMPLATE int QHash<Key, T>::count(const Key &akey) const
+{
+ return static_cast<const QMultiHash<Key, T> *>(this)->count(akey);
+}
+
+template <class Key, class T>
+Q_OUTOFLINE_TEMPLATE QList<Key> QHash<Key, T>::uniqueKeys() const
+{
+ return static_cast<const QMultiHash<Key, T> *>(this)->uniqueKeys();
+}
+#endif
+
+template <class Key, class T>
+Q_OUTOFLINE_TEMPLATE QList<T> QMultiHash<Key, T>::values(const Key &akey) const
+{
+ QList<T> res;
+ Node *node = *findNode(akey);
+ if (node != this->e) {
+ do {
+ res.append(node->value);
+ } while ((node = node->next) != this->e && node->key == akey);
+ }
+ return res;
+}
+
+template <class Key, class T>
+Q_OUTOFLINE_TEMPLATE int QMultiHash<Key, T>::count(const Key &akey) const
+{
+ int cnt = 0;
+ Node *node = *findNode(akey);
+ if (node != this->e) {
+ do {
+ ++cnt;
+ } while ((node = node->next) != this->e && node->key == akey);
+ }
+ return cnt;
+}
+
+#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
+template <class Key, class T>
+class QHashIterator
+{
+ typedef typename QHash<Key, T>::const_iterator const_iterator;
+ typedef const_iterator Item;
+ QHash<Key, T> c;
+ const_iterator i, n;
+ inline bool item_exists() const { return n != c.constEnd(); }
+
+public:
+ inline QHashIterator(const QHash<Key, T> &container)
+ : c(container), i(c.constBegin()), n(c.constEnd())
+ {
+ }
+ inline QHashIterator &operator=(const QHash<Key, T> &container)
+ {
+ c = container;
+ i = c.constBegin();
+ n = c.constEnd();
+ return *this;
+ }
+ inline void toFront()
+ {
+ i = c.constBegin();
+ n = c.constEnd();
+ }
+ inline void toBack()
+ {
+ i = c.constEnd();
+ n = c.constEnd();
+ }
+ inline bool hasNext() const { return i != c.constEnd(); }
+ inline Item next()
+ {
+ n = i++;
+ return n;
+ }
+ inline Item peekNext() const { return i; }
+ inline const T &value() const
+ {
+ Q_ASSERT(item_exists());
+ return *n;
+ }
+ inline const Key &key() const
+ {
+ Q_ASSERT(item_exists());
+ return n.key();
+ }
+ inline bool findNext(const T &t)
+ {
+ while ((n = i) != c.constEnd())
+ if (*i++ == t)
+ return true;
+ return false;
+ }
+#if QT_DEPRECATED_SINCE(5, 15)
+ inline QT_DEPRECATED bool hasPrevious() const { return i != c.constBegin(); }
+ inline QT_DEPRECATED Item previous()
+ {
+ n = --i;
+ return n;
+ }
+ inline QT_DEPRECATED Item peekPrevious() const
+ {
+ const_iterator p = i;
+ return --p;
+ }
+ inline bool QT_DEPRECATED findPrevious(const T &t)
+ {
+ while (i != c.constBegin())
+ if (*(n = --i) == t)
+ return true;
+ n = c.constEnd();
+ return false;
+ }
+#endif
+};
+
+template<class Key, class T>
+class QMutableHashIterator
+{
+ typedef typename QHash<Key, T>::iterator iterator;
+ typedef typename QHash<Key, T>::const_iterator const_iterator;
+ typedef iterator Item;
+ QHash<Key, T> *c;
+ iterator i, n;
+ inline bool item_exists() const { return const_iterator(n) != c->constEnd(); }
+
+public:
+ inline QMutableHashIterator(QHash<Key, T> &container) : c(&container)
+ {
+ i = c->begin();
+ n = c->end();
+ }
+ inline QMutableHashIterator &operator=(QHash<Key, T> &container)
+ {
+ c = &container;
+ i = c->begin();
+ n = c->end();
+ return *this;
+ }
+ inline void toFront()
+ {
+ i = c->begin();
+ n = c->end();
+ }
+ inline void toBack()
+ {
+ i = c->end();
+ n = c->end();
+ }
+ inline bool hasNext() const { return const_iterator(i) != c->constEnd(); }
+ inline Item next()
+ {
+ n = i++;
+ return n;
+ }
+ inline Item peekNext() const { return i; }
+ inline void remove()
+ {
+ if (const_iterator(n) != c->constEnd()) {
+ i = c->erase(n);
+ n = c->end();
+ }
+ }
+ inline void setValue(const T &t)
+ {
+ if (const_iterator(n) != c->constEnd())
+ *n = t;
+ }
+ inline T &value()
+ {
+ Q_ASSERT(item_exists());
+ return *n;
+ }
+ inline const T &value() const
+ {
+ Q_ASSERT(item_exists());
+ return *n;
+ }
+ inline const Key &key() const
+ {
+ Q_ASSERT(item_exists());
+ return n.key();
+ }
+ inline bool findNext(const T &t)
+ {
+ while (const_iterator(n = i) != c->constEnd())
+ if (*i++ == t)
+ return true;
+ return false;
+ }
+#if QT_DEPRECATED_SINCE(5, 15)
+ inline QT_DEPRECATED bool hasPrevious() const { return const_iterator(i) != c->constBegin(); }
+ inline QT_DEPRECATED Item previous()
+ {
+ n = --i;
+ return n;
+ }
+ inline QT_DEPRECATED Item peekPrevious() const
+ {
+ iterator p = i;
+ return --p;
+ }
+ inline QT_DEPRECATED bool findPrevious(const T &t)
+ {
+ while (const_iterator(i) != c->constBegin())
+ if (*(n = --i) == t)
+ return true;
+ n = c->end();
+ return false;
+ }
+#endif
+};
+#endif // !QT_NO_JAVA_STYLE_ITERATORS
template <class Key, class T>
uint qHash(const QHash<Key, T> &key, uint seed = 0)
diff --git a/src/corelib/tools/qlist.cpp b/src/corelib/tools/qlist.cpp
index 66770f6866..5d5da20752 100644
--- a/src/corelib/tools/qlist.cpp
+++ b/src/corelib/tools/qlist.cpp
@@ -847,9 +847,10 @@ void **QListData::erase(void **xi)
/*! \fn template <class T> void QList<T>::insert(int i, const T &value)
- Inserts \a value at index position \a i in the list. If \a i <= 0,
- the value is prepended to the list. If \a i >= size(), the
- value is appended to the list.
+ Inserts \a value at index position \a i in the list.
+
+ If \a i == 0, the value is prepended to the list. If \a i == size(),
+ the value is appended to the list.
Example:
\snippet code/src_corelib_tools_qlistdata.cpp 8
diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h
index 425ffa42a5..ffd470efcd 100644
--- a/src/corelib/tools/qlist.h
+++ b/src/corelib/tools/qlist.h
@@ -580,8 +580,16 @@ inline T &QList<T>::operator[](int i)
detach(); return reinterpret_cast<Node *>(p.at(i))->t(); }
template <typename T>
inline void QList<T>::removeAt(int i)
-{ if(i >= 0 && i < p.size()) { detach();
- node_destruct(reinterpret_cast<Node *>(p.at(i))); p.remove(i); } }
+{
+#if !QT_DEPRECATED_SINCE(5, 15)
+ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::removeAt", "index out of range");
+#elif !defined(QT_NO_DEBUG)
+ if (i < 0 || i >= p.size())
+ qWarning("QList::removeAt(): Index out of range.");
+#endif
+ detach();
+ node_destruct(reinterpret_cast<Node *>(p.at(i))); p.remove(i);
+}
template <typename T>
inline T QList<T>::takeAt(int i)
{ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::take", "index out of range");
@@ -676,6 +684,12 @@ inline void QList<T>::prepend(const T &t)
template <typename T>
inline void QList<T>::insert(int i, const T &t)
{
+#if !QT_DEPRECATED_SINCE(5, 15)
+ Q_ASSERT_X(i >= 0 && i <= p.size(), "QList<T>::insert", "index out of range");
+#elif !defined(QT_NO_DEBUG)
+ if (i < 0 || i > p.size())
+ qWarning("QList::insert(): Index out of range.");
+#endif
if (d->ref.isShared()) {
Node *n = detach_helper_grow(i, 1);
QT_TRY {
diff --git a/src/corelib/tools/qmap.cpp b/src/corelib/tools/qmap.cpp
index a0ec372f9a..e2b7705b55 100644
--- a/src/corelib/tools/qmap.cpp
+++ b/src/corelib/tools/qmap.cpp
@@ -468,10 +468,9 @@ void QMapDataBase::freeData(QMapDataBase *d)
\snippet code/src_corelib_tools_qmap.cpp 9
However, you can store multiple values per key by using
- insertMulti() instead of insert() (or using the convenience
- subclass QMultiMap). If you want to retrieve all the values for a
- single key, you can use values(const Key &key), which returns a
- QList<T>:
+ using the subclass QMultiMap. If you want
+ to retrieve all the values for a single key, you can use
+ values(const Key &key), which returns a QList<T>:
\snippet code/src_corelib_tools_qmap.cpp 10
@@ -676,9 +675,8 @@ void QMapDataBase::freeData(QMapDataBase *d)
/*! \fn template <class Key, class T> int QMap<Key, T>::remove(const Key &key)
Removes all the items that have the key \a key from the map.
- Returns the number of items removed which is usually 1 but will be
- 0 if the key isn't in the map, or \> 1 if insertMulti() has been
- used with the \a key.
+ Returns the number of items removed which will be 1 if the key
+ exists in the map, and 0 otherwise.
\sa clear(), take(), QMultiMap::remove()
*/
@@ -742,28 +740,26 @@ void QMapDataBase::freeData(QMapDataBase *d)
/*! \fn template <class Key, class T> QList<Key> QMap<Key, T>::uniqueKeys() const
\since 4.2
+ \obsolete
Returns a list containing all the keys in the map in ascending
order. Keys that occur multiple times in the map (because items
were inserted with insertMulti(), or unite() was used) occur only
once in the returned list.
- \sa keys(), values()
+ \sa QMultiMap::uniqueKeys()
*/
/*! \fn template <class Key, class T> QList<Key> QMap<Key, T>::keys() const
Returns a list containing all the keys in the map in ascending
- order. Keys that occur multiple times in the map (because items
- were inserted with insertMulti(), or unite() was used) also
- occur multiple times in the list.
-
- To obtain a list of unique keys, where each key from the map only
- occurs once, use uniqueKeys().
+ order. Keys that occur multiple times in the map (because the
+ method is operating on a QMultiMap) also occur multiple times
+ in the list.
The order is guaranteed to be the same as that used by values().
- \sa uniqueKeys(), values(), key()
+ \sa QMultiMap::uniqueKeys(), values(), key()
*/
/*! \fn template <class Key, class T> QList<Key> QMap<Key, T>::keys(const T &value) const
@@ -806,6 +802,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
*/
/*! \fn template <class Key, class T> QList<T> QMap<Key, T>::values(const Key &key) const
+ \obsolete
\overload
@@ -813,14 +810,15 @@ void QMapDataBase::freeData(QMapDataBase *d)
\a key, from the most recently inserted to the least recently
inserted one.
- \sa count(), insertMulti()
+ \sa QMultiMap::values()
*/
/*! \fn template <class Key, class T> int QMap<Key, T>::count(const Key &key) const
+ \obsolete
Returns the number of items associated with key \a key.
- \sa contains(), insertMulti(), QMultiMap::count()
+ \sa QMultiMap::count()
*/
/*! \fn template <class Key, class T> int QMap<Key, T>::count() const
@@ -1118,7 +1116,7 @@ void QMapDataBase::freeData(QMapDataBase *d)
If there are multiple items with the key \a key, the most
recently inserted item's value is replaced with \a value.
- \sa insertMulti()
+ \sa QMultiMap::insert()
*/
/*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::insert(const_iterator pos, const Key &key, const T &value)
@@ -1147,10 +1145,25 @@ void QMapDataBase::freeData(QMapDataBase *d)
\b {Note:} Be careful with the hint. Providing an iterator from an older shared instance might
crash but there is also a risk that it will silently corrupt both the map and the \a pos map.
- \sa insertMulti()
+ \sa QMultiMap::insert()
+*/
+
+/*! \fn template <class Key, class T> void QMap<Key, T>::insert(const QMap<Key, T> &map)
+ \since 5.15
+
+ Inserts all the items in \a map into this map.
+
+ If a key is common to both maps, its value will be replaced with
+ the value stored in \a map.
+
+ \note If \a map contains multiple entries with the same key then the
+ final value of the key is undefined.
+
+ \sa QMultiMap::insert()
*/
/*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::insertMulti(const Key &key, const T &value)
+ \obsolete
Inserts a new item with the key \a key and a value of \a value.
@@ -1159,12 +1172,13 @@ void QMapDataBase::freeData(QMapDataBase *d)
different from insert(), which overwrites the value of an
existing item.)
- \sa insert(), values()
+ \sa QMultiMap::insert()
*/
/*! \fn template <class Key, class T> QMap<Key, T>::iterator QMap<Key, T>::insertMulti(const_iterator pos, const Key &key, const T &value)
\overload
\since 5.1
+ \obsolete
Inserts a new item with the key \a key and value \a value and with hint \a pos
suggesting where to do the insert.
@@ -1178,17 +1192,18 @@ void QMapDataBase::freeData(QMapDataBase *d)
\b {Note:} Be careful with the hint. Providing an iterator from an older shared instance might
crash but there is also a risk that it will silently corrupt both the map and the \a pos map.
- \sa insert()
+ \sa QMultiMap::insert()
*/
/*! \fn template <class Key, class T> QMap<Key, T> &QMap<Key, T>::unite(const QMap<Key, T> &other)
+ \obsolete
Inserts all the items in the \a other map into this map. If a
key is common to both maps, the resulting map will contain the
key multiple times.
- \sa insertMulti()
+ \sa QMultiMap::unite()
*/
/*! \typedef QMap::Iterator
@@ -1271,9 +1286,8 @@ void QMapDataBase::freeData(QMapDataBase *d)
Unlike QHash, which stores its items in an arbitrary order, QMap
stores its items ordered by key. Items that share the same key
- (because they were inserted using QMap::insertMulti(), or due to a
- unite()) will appear consecutively, from the most recently to the
- least recently inserted value.
+ (because the map is a QMultiMap) will appear consecutively,
+ from the most recently to the least recently inserted value.
Let's see a few examples of things we can do with a
QMap::iterator that we cannot do with a QMap::const_iterator.
@@ -1519,9 +1533,8 @@ void QMapDataBase::freeData(QMapDataBase *d)
Unlike QHash, which stores its items in an arbitrary order, QMap
stores its items ordered by key. Items that share the same key
- (because they were inserted using QMap::insertMulti()) will
- appear consecutively, from the most recently to the least
- recently inserted value.
+ (because the map is a QMultiMap) will appear consecutively,
+ from the most recently to the least recently inserted value.
Multiple iterators can be used on the same map. If you add items
to the map, existing iterators will remain valid. If you remove
@@ -1893,20 +1906,20 @@ void QMapDataBase::freeData(QMapDataBase *d)
\reentrant
QMultiMap\<Key, T\> is one of Qt's generic \l{container classes}.
- It inherits QMap and extends it with a few convenience functions
- that make it more suitable than QMap for storing multi-valued
- maps. A multi-valued map is a map that allows multiple values
- with the same key; QMap normally doesn't allow that, unless you
- call QMap::insertMulti().
+ It inherits QMap and extends it with a few functions
+ that make it able to store multi-valued maps. A multi-valued map
+ is a map that allows multiple values with the same key; QMap
+ doesn't allow that.
Because QMultiMap inherits QMap, all of QMap's functionality also
applies to QMultiMap. For example, you can use isEmpty() to test
whether the map is empty, and you can traverse a QMultiMap using
QMap's iterator classes (for example, QMapIterator). But in
- addition, it provides an insert() function that corresponds to
- QMap::insertMulti(), and a replace() function that corresponds to
- QMap::insert(). It also provides convenient operator+() and
- operator+=().
+ addition, it provides an insert() function that inserts but does
+ not overwrite any previous value if the key already exists,
+ and a replace() function that corresponds which does overwite
+ an existing value if they key is already in the map.
+ It also provides convenient operator+() and operator+=().
Example:
\snippet code/src_corelib_tools_qmap.cpp 25
@@ -2095,4 +2108,31 @@ void QMapDataBase::freeData(QMapDataBase *d)
\sa QMap::constFind()
*/
+/*! \fn template <class Key, class T> QList<T> QMultiMap<Key, T>::values(const Key &key) const
+
+ Returns a list containing all the values associated with key
+ \a key, from the most recently inserted to the least recently
+ inserted one.
+*/
+
+/*! \fn template <class Key, class T> int QMultiMap<Key, T>::count(const Key &key) const
+
+ Returns the number of items associated with key \a key.
+*/
+
+/*! \fn template <class Key, class T> QList<Key> QMultiMap<Key, T>::uniqueKeys() const
+ \since 4.2
+
+ Returns a list containing all the keys in the map in ascending
+ order. Keys that occur multiple times in the map occur only
+ once in the returned list.
+*/
+
+/*! \fn template <class Key, class T> QMultiMap<Key, T> &QMultiMap<Key, T>::unite(const QMultiMap<Key, T> &other)
+
+ Inserts all the items in the \a other map into this map. If a
+ key is common to both maps, the resulting map will contain the
+ key multiple times.
+*/
+
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h
index 18c681581f..281812b5e6 100644
--- a/src/corelib/tools/qmap.h
+++ b/src/corelib/tools/qmap.h
@@ -380,12 +380,15 @@ public:
T &operator[](const Key &key);
const T operator[](const Key &key) const;
- QList<Key> uniqueKeys() const;
QList<Key> keys() const;
QList<Key> keys(const T &value) const;
QList<T> values() const;
- QList<T> values(const Key &key) const;
- int count(const Key &key) const;
+#if QT_DEPRECATED_SINCE(5, 15)
+ QT_DEPRECATED_X("Use QMultiMap for maps storing multiple values with the same key.") QList<Key> uniqueKeys() const;
+ QT_DEPRECATED_X("Use QMultiMap for maps storing multiple values with the same key.") QList<T> values(const Key &key) const;
+ QT_DEPRECATED_X("Use QMultiMap for maps storing multiple values with the same key.") int count(const Key &key) const;
+#endif
+
inline const Key &firstKey() const { Q_ASSERT(!isEmpty()); return constBegin().key(); }
inline const Key &lastKey() const { Q_ASSERT(!isEmpty()); return (constEnd() - 1).key(); }
@@ -452,6 +455,7 @@ public:
{ return i != o.i; }
#endif
friend class QMap<Key, T>;
+ friend class QMultiMap<Key, T>;
};
friend class iterator;
@@ -514,6 +518,7 @@ public:
inline bool operator!=(const iterator &o) const { return operator!=(const_iterator(o)); }
#endif
friend class QMap<Key, T>;
+ friend class QMultiMap<Key, T>;
};
friend class const_iterator;
@@ -578,9 +583,12 @@ public:
const_iterator upperBound(const Key &key) const;
iterator insert(const Key &key, const T &value);
iterator insert(const_iterator pos, const Key &key, const T &value);
- iterator insertMulti(const Key &key, const T &value);
- iterator insertMulti(const_iterator pos, const Key &akey, const T &avalue);
- QMap<Key, T> &unite(const QMap<Key, T> &other);
+ void insert(const QMap<Key, T> &map);
+#if QT_DEPRECATED_SINCE(5, 15)
+ QT_DEPRECATED_X("Use QMultiMap for maps storing multiple values with the same key.") iterator insertMulti(const Key &key, const T &value);
+ QT_DEPRECATED_X("Use QMultiMap for maps storing multiple values with the same key.") iterator insertMulti(const_iterator pos, const Key &akey, const T &avalue);
+ QT_DEPRECATED_X("Use QMultiMap for maps storing multiple values with the same key.") QMap<Key, T> &unite(const QMap<Key, T> &other);
+#endif
// STL compatibility
typedef Key key_type;
@@ -609,6 +617,8 @@ private:
return true;
#endif
}
+
+ friend class QMultiMap<Key, T>;
};
template <class Key, class T>
@@ -671,23 +681,6 @@ Q_INLINE_TEMPLATE T &QMap<Key, T>::operator[](const Key &akey)
}
template <class Key, class T>
-Q_INLINE_TEMPLATE int QMap<Key, T>::count(const Key &akey) const
-{
- Node *firstNode;
- Node *lastNode;
- d->nodeRange(akey, &firstNode, &lastNode);
-
- const_iterator ci_first(firstNode);
- const const_iterator ci_last(lastNode);
- int cnt = 0;
- while (ci_first != ci_last) {
- ++cnt;
- ++ci_first;
- }
- return cnt;
-}
-
-template <class Key, class T>
Q_INLINE_TEMPLATE bool QMap<Key, T>::contains(const Key &akey) const
{
return d->findNode(akey) != nullptr;
@@ -789,70 +782,44 @@ typename QMap<Key, T>::iterator QMap<Key, T>::insert(const_iterator pos, const K
}
template <class Key, class T>
-Q_INLINE_TEMPLATE typename QMap<Key, T>::iterator QMap<Key, T>::insertMulti(const Key &akey,
- const T &avalue)
+Q_INLINE_TEMPLATE void QMap<Key, T>::insert(const QMap<Key, T> &map)
{
- detach();
- Node* y = d->end();
- Node* x = static_cast<Node *>(d->root());
- bool left = true;
- while (x != nullptr) {
- left = !qMapLessThanKey(x->key, akey);
- y = x;
- x = left ? x->leftNode() : x->rightNode();
- }
- Node *z = d->createNode(akey, avalue, y, left);
- return iterator(z);
-}
+ if (d == map.d)
+ return;
-template <class Key, class T>
-typename QMap<Key, T>::iterator QMap<Key, T>::insertMulti(const_iterator pos, const Key &akey, const T &avalue)
-{
- if (d->ref.isShared())
- return this->insertMulti(akey, avalue);
-
- Q_ASSERT_X(isValidIterator(pos), "QMap::insertMulti", "The specified const_iterator argument 'pos' is invalid");
-
- if (pos == constEnd()) {
- // Hint is that the Node is larger than (or equal to) the largest value.
- Node *n = static_cast<Node *>(pos.i->left);
- if (n) {
- while (n->right)
- n = static_cast<Node *>(n->right);
+ detach();
- if (!qMapLessThanKey(n->key, akey))
- return this->insertMulti(akey, avalue); // ignore hint
- Node *z = d->createNode(akey, avalue, n, false); // insert right most
- return iterator(z);
+ Node *n = d->root();
+ auto it = map.cbegin();
+ const auto e = map.cend();
+ while (it != e) {
+ // Insertion here is based on insert(Key, T)
+ auto parent = d->end();
+ bool left = true;
+ Node *lastNode = nullptr;
+ while (n) {
+ parent = n;
+ if (!qMapLessThanKey(n->key, it.key())) {
+ lastNode = n;
+ n = n->leftNode();
+ left = true;
+ } else {
+ n = n->rightNode();
+ left = false;
+ }
}
- return this->insertMulti(akey, avalue);
- } else {
- // Hint indicates that the node should be less (or equal to) the hint given
- // but larger than the previous value.
- Node *next = const_cast<Node*>(pos.i);
- if (qMapLessThanKey(next->key, akey))
- return this->insertMulti(akey, avalue); // ignore hint
-
- if (pos == constBegin()) {
- // There is no previous value (insert left most)
- Node *z = d->createNode(akey, avalue, begin().i, true);
- return iterator(z);
+ if (lastNode && !qMapLessThanKey(it.key(), lastNode->key)) {
+ lastNode->value = it.value();
+ n = lastNode;
} else {
- Node *prev = const_cast<Node*>(pos.i->previousNode());
- if (!qMapLessThanKey(prev->key, akey))
- return this->insertMulti(akey, avalue); // ignore hint
-
- // Hint is ok - do insert
- if (prev->right == nullptr) {
- Node *z = d->createNode(akey, avalue, prev, false);
- return iterator(z);
- }
- if (next->left == nullptr) {
- Node *z = d->createNode(akey, avalue, next, true);
- return iterator(z);
- }
- Q_ASSERT(false); // We should have prev->right == nullptr or next->left == nullptr.
- return this->insertMulti(akey, avalue);
+ n = d->createNode(it.key(), it.value(), parent, left);
+ }
+ ++it;
+ if (it != e) {
+ // Move back up the tree until we find the next branch or node which is
+ // relevant for the next key.
+ while (n != d->root() && qMapLessThanKey(n->key, it.key()))
+ n = static_cast<Node *>(n->parent());
}
}
}
@@ -880,19 +847,6 @@ Q_INLINE_TEMPLATE typename QMap<Key, T>::iterator QMap<Key, T>::find(const Key &
}
template <class Key, class T>
-Q_INLINE_TEMPLATE QMap<Key, T> &QMap<Key, T>::unite(const QMap<Key, T> &other)
-{
- QMap<Key, T> copy(other);
- const_iterator it = copy.constEnd();
- const const_iterator b = copy.constBegin();
- while (it != b) {
- --it;
- insertMulti(it.key(), it.value());
- }
- return *this;
-}
-
-template <class Key, class T>
QPair<typename QMap<Key, T>::iterator, typename QMap<Key, T>::iterator> QMap<Key, T>::equal_range(const Key &akey)
{
detach();
@@ -1008,26 +962,6 @@ Q_OUTOFLINE_TEMPLATE void QMap<Key, T>::detach_helper()
}
template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE QList<Key> QMap<Key, T>::uniqueKeys() const
-{
- QList<Key> res;
- res.reserve(size()); // May be too much, but assume short lifetime
- const_iterator i = begin();
- if (i != end()) {
- for (;;) {
- const Key &aKey = i.key();
- res.append(aKey);
- do {
- if (++i == end())
- goto break_out_of_outer_loop;
- } while (!qMapLessThanKey(aKey, i.key())); // loop while (key == i.key())
- }
- }
-break_out_of_outer_loop:
- return res;
-}
-
-template <class Key, class T>
Q_OUTOFLINE_TEMPLATE QList<Key> QMap<Key, T>::keys() const
{
QList<Key> res;
@@ -1080,21 +1014,6 @@ Q_OUTOFLINE_TEMPLATE QList<T> QMap<Key, T>::values() const
}
template <class Key, class T>
-Q_OUTOFLINE_TEMPLATE QList<T> QMap<Key, T>::values(const Key &akey) const
-{
- QList<T> res;
- Node *n = d->findNode(akey);
- if (n) {
- const_iterator it(n);
- do {
- res.append(*it);
- ++it;
- } while (it != constEnd() && !qMapLessThanKey<Key>(akey, it.key()));
- }
- return res;
-}
-
-template <class Key, class T>
Q_INLINE_TEMPLATE typename QMap<Key, T>::const_iterator QMap<Key, T>::lowerBound(const Key &akey) const
{
Node *lb = d->root() ? d->root()->lowerBound(akey) : nullptr;
@@ -1190,15 +1109,20 @@ public:
QMultiMap(QMap<Key, T> &&other) noexcept : QMap<Key, T>(std::move(other)) {}
void swap(QMultiMap<Key, T> &other) noexcept { QMap<Key, T>::swap(other); }
+ QList<Key> uniqueKeys() const;
+ QList<T> values(const Key &key) const;
+
+ using typename QMap<Key, T>::iterator;
+ using typename QMap<Key, T>::const_iterator;
+
inline typename QMap<Key, T>::iterator replace(const Key &key, const T &value)
{ return QMap<Key, T>::insert(key, value); }
- inline typename QMap<Key, T>::iterator insert(const Key &key, const T &value)
- { return QMap<Key, T>::insertMulti(key, value); }
- inline typename QMap<Key, T>::iterator insert(typename QMap<Key, T>::const_iterator pos, const Key &key, const T &value)
- { return QMap<Key, T>::insertMulti(pos, key, value); }
+ iterator insert(const Key &key, const T &value);
+ iterator insert(const_iterator pos, const Key &key, const T &value);
+ QMultiMap &unite(const QMultiMap &other);
inline QMultiMap &operator+=(const QMultiMap &other)
- { this->unite(other); return *this; }
+ { return unite(other); }
inline QMultiMap operator+(const QMultiMap &other) const
{ QMultiMap result = *this; result += other; return result; }
@@ -1207,11 +1131,18 @@ public:
using QMap<Key, T>::count;
using QMap<Key, T>::find;
using QMap<Key, T>::constFind;
+ using QMap<Key, T>::values;
+ using QMap<Key, T>::size;
+ using QMap<Key, T>::detach;
+ using QMap<Key, T>::erase;
+ using QMap<Key, T>::isValidIterator;
+ using typename QMap<Key, T>::Node;
bool contains(const Key &key, const T &value) const;
int remove(const Key &key, const T &value);
+ int count(const Key &key) const;
int count(const Key &key, const T &value) const;
typename QMap<Key, T>::iterator find(const Key &key, const T &value) {
@@ -1242,6 +1173,123 @@ private:
};
template <class Key, class T>
+Q_OUTOFLINE_TEMPLATE QList<Key> QMultiMap<Key, T>::uniqueKeys() const
+{
+ QList<Key> res;
+ res.reserve(size()); // May be too much, but assume short lifetime
+ const_iterator i = this->begin();
+ if (i != this->end()) {
+ for (;;) {
+ const Key &aKey = i.key();
+ res.append(aKey);
+ do {
+ if (++i == this->end())
+ goto break_out_of_outer_loop;
+ } while (!qMapLessThanKey(aKey, i.key())); // loop while (key == i.key())
+ }
+ }
+break_out_of_outer_loop:
+ return res;
+}
+
+template <class Key, class T>
+Q_OUTOFLINE_TEMPLATE QList<T> QMultiMap<Key, T>::values(const Key &akey) const
+{
+ QList<T> res;
+ Node *n = this->d->findNode(akey);
+ if (n) {
+ const_iterator it(n);
+ do {
+ res.append(*it);
+ ++it;
+ } while (it != this->constEnd() && !qMapLessThanKey<Key>(akey, it.key()));
+ }
+ return res;
+}
+
+template <class Key, class T>
+Q_INLINE_TEMPLATE typename QMultiMap<Key, T>::iterator QMultiMap<Key, T>::insert(const Key &akey,
+ const T &avalue)
+{
+ detach();
+ Node* y = this->d->end();
+ Node* x = static_cast<Node *>(this->d->root());
+ bool left = true;
+ while (x != nullptr) {
+ left = !qMapLessThanKey(x->key, akey);
+ y = x;
+ x = left ? x->leftNode() : x->rightNode();
+ }
+ Node *z = this->d->createNode(akey, avalue, y, left);
+ return iterator(z);
+}
+
+template <class Key, class T>
+typename QMultiMap<Key, T>::iterator QMultiMap<Key, T>::insert(const_iterator pos, const Key &akey, const T &avalue)
+{
+ if (this->d->ref.isShared())
+ return insert(akey, avalue);
+
+ Q_ASSERT_X(isValidIterator(pos), "QMap::insert", "The specified const_iterator argument 'pos' is invalid");
+
+ if (pos == this->constEnd()) {
+ // Hint is that the Node is larger than (or equal to) the largest value.
+ Node *n = static_cast<Node *>(pos.i->left);
+ if (n) {
+ while (n->right)
+ n = static_cast<Node *>(n->right);
+
+ if (!qMapLessThanKey(n->key, akey))
+ return insert(akey, avalue); // ignore hint
+ Node *z = this->d->createNode(akey, avalue, n, false); // insert right most
+ return iterator(z);
+ }
+ return insert(akey, avalue);
+ } else {
+ // Hint indicates that the node should be less (or equal to) the hint given
+ // but larger than the previous value.
+ Node *next = const_cast<Node*>(pos.i);
+ if (qMapLessThanKey(next->key, akey))
+ return insert(akey, avalue); // ignore hint
+
+ if (pos == this->constBegin()) {
+ // There is no previous value (insert left most)
+ Node *z = this->d->createNode(akey, avalue, this->begin().i, true);
+ return iterator(z);
+ } else {
+ Node *prev = const_cast<Node*>(pos.i->previousNode());
+ if (!qMapLessThanKey(prev->key, akey))
+ return insert(akey, avalue); // ignore hint
+
+ // Hint is ok - do insert
+ if (prev->right == nullptr) {
+ Node *z = this->d->createNode(akey, avalue, prev, false);
+ return iterator(z);
+ }
+ if (next->left == nullptr) {
+ Node *z = this->d->createNode(akey, avalue, next, true);
+ return iterator(z);
+ }
+ Q_ASSERT(false); // We should have prev->right == nullptr or next->left == nullptr.
+ return insert(akey, avalue);
+ }
+ }
+}
+
+template <class Key, class T>
+Q_INLINE_TEMPLATE QMultiMap<Key, T> &QMultiMap<Key, T>::unite(const QMultiMap<Key, T> &other)
+{
+ QMultiMap<Key, T> copy(other);
+ const_iterator it = copy.constEnd();
+ const const_iterator b = copy.constBegin();
+ while (it != b) {
+ --it;
+ insert(it.key(), it.value());
+ }
+ return *this;
+}
+
+template <class Key, class T>
Q_INLINE_TEMPLATE bool QMultiMap<Key, T>::contains(const Key &key, const T &value) const
{
return constFind(key, value) != QMap<Key, T>::constEnd();
@@ -1255,7 +1303,7 @@ Q_INLINE_TEMPLATE int QMultiMap<Key, T>::remove(const Key &key, const T &value)
typename QMap<Key, T>::iterator end(QMap<Key, T>::end());
while (i != end && !qMapLessThanKey<Key>(key, i.key())) {
if (i.value() == value) {
- i = this->erase(i);
+ i = erase(i);
++n;
} else {
++i;
@@ -1265,6 +1313,23 @@ Q_INLINE_TEMPLATE int QMultiMap<Key, T>::remove(const Key &key, const T &value)
}
template <class Key, class T>
+Q_INLINE_TEMPLATE int QMultiMap<Key, T>::count(const Key &akey) const
+{
+ QMultiMap::Node *firstNode;
+ QMultiMap::Node *lastNode;
+ this->d->nodeRange(akey, &firstNode, &lastNode);
+
+ const_iterator ci_first(firstNode);
+ const const_iterator ci_last(lastNode);
+ int cnt = 0;
+ while (ci_first != ci_last) {
+ ++cnt;
+ ++ci_first;
+ }
+ return cnt;
+}
+
+template <class Key, class T>
Q_INLINE_TEMPLATE int QMultiMap<Key, T>::count(const Key &key, const T &value) const
{
int n = 0;
@@ -1278,6 +1343,44 @@ Q_INLINE_TEMPLATE int QMultiMap<Key, T>::count(const Key &key, const T &value) c
return n;
}
+#if QT_DEPRECATED_SINCE(5, 15)
+template<class Key, class T>
+QList<Key> QMap<Key, T>::uniqueKeys() const
+{
+ return static_cast<const QMultiMap<Key, T> *>(this)->uniqueKeys();
+}
+
+template<class Key, class T>
+QList<T> QMap<Key, T>::values(const Key &key) const
+{
+ return static_cast<const QMultiMap<Key, T> *>(this)->values(key);
+}
+
+template<class Key, class T>
+int QMap<Key, T>::count(const Key &key) const
+{
+ return static_cast<const QMultiMap<Key, T> *>(this)->count(key);
+}
+
+template<class Key, class T>
+typename QMap<Key, T>::iterator QMap<Key, T>::insertMulti(const Key &key, const T &value)
+{
+ return static_cast<QMultiMap<Key, T> *>(this)->insert(key, value);
+}
+
+template<class Key, class T>
+typename QMap<Key, T>::iterator QMap<Key, T>::insertMulti(const_iterator pos, const Key &akey, const T &avalue)
+{
+ return static_cast<QMultiMap<Key, T> *>(this)->insert(pos, akey, avalue);
+}
+
+template<class Key, class T>
+QMap<Key, T> &QMap<Key, T>::unite(const QMap<Key, T> &other)
+{
+ return static_cast<QMultiMap<Key, T> *>(this)->unite(other);
+}
+#endif
+
Q_DECLARE_ASSOCIATIVE_ITERATOR(Map)
Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR(Map)
diff --git a/src/corelib/tools/qscopedvaluerollback.h b/src/corelib/tools/qscopedvaluerollback.h
index f904b8dfcb..b8ceff6665 100644
--- a/src/corelib/tools/qscopedvaluerollback.h
+++ b/src/corelib/tools/qscopedvaluerollback.h
@@ -45,7 +45,11 @@
QT_BEGIN_NAMESPACE
template <typename T>
-class QScopedValueRollback
+class
+#if QT_HAS_CPP_ATTRIBUTE(nodiscard) && __cplusplus >= 201703L
+[[nodiscard]]
+#endif
+QScopedValueRollback
{
public:
explicit QScopedValueRollback(T &var)
diff --git a/src/corelib/tools/qscopeguard.h b/src/corelib/tools/qscopeguard.h
index 40d2747b1d..6a5bc6cc61 100644
--- a/src/corelib/tools/qscopeguard.h
+++ b/src/corelib/tools/qscopeguard.h
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sérgio Martins <sergio.martins@kdab.com>
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -42,13 +43,11 @@
#include <QtCore/qglobal.h>
+#include <type_traits>
+#include <utility>
QT_BEGIN_NAMESPACE
-
-template <typename F> class QScopeGuard;
-template <typename F> QScopeGuard<F> qScopeGuard(F f);
-
template <typename F>
class
#if __has_cpp_attribute(nodiscard)
@@ -59,13 +58,23 @@ Q_REQUIRED_RESULT
QScopeGuard
{
public:
+ explicit QScopeGuard(F &&f) noexcept
+ : m_func(std::move(f))
+ {
+ }
+
+ explicit QScopeGuard(const F &f) noexcept
+ : m_func(f)
+ {
+ }
+
QScopeGuard(QScopeGuard &&other) noexcept
: m_func(std::move(other.m_func))
, m_invoke(qExchange(other.m_invoke, false))
{
}
- ~QScopeGuard()
+ ~QScopeGuard() noexcept
{
if (m_invoke)
m_func();
@@ -77,26 +86,23 @@ public:
}
private:
- explicit QScopeGuard(F &&f) noexcept
- : m_func(std::move(f))
- {
- }
-
Q_DISABLE_COPY(QScopeGuard)
F m_func;
bool m_invoke = true;
- friend QScopeGuard qScopeGuard<F>(F);
};
+#ifdef __cpp_deduction_guides
+template <typename F> QScopeGuard(F(&)()) -> QScopeGuard<F(*)()>;
+#endif
template <typename F>
#if __has_cpp_attribute(nodiscard)
Q_REQUIRED_RESULT
#endif
-QScopeGuard<F> qScopeGuard(F f)
+QScopeGuard<typename std::decay<F>::type> qScopeGuard(F &&f)
{
- return QScopeGuard<F>(std::move(f));
+ return QScopeGuard<typename std::decay<F>::type>(std::forward<F>(f));
}
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qscopeguard.qdoc b/src/corelib/tools/qscopeguard.qdoc
index 6b3c942e84..572934d890 100644
--- a/src/corelib/tools/qscopeguard.qdoc
+++ b/src/corelib/tools/qscopeguard.qdoc
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sérgio Martins <sergio.martins@kdab.com>
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
@@ -35,6 +36,30 @@ QT_BEGIN_NAMESPACE
\inmodule QtCore
\brief Provides a scope guard for calling a function at the end of
a scope.
+
+ QScopeGuard<F> is a class of which the sole purpose is to run the function
+ \a f in its destructor. This is useful for guaranteeing
+ your cleanup code is executed, whether the function is exited normally,
+ exited early by a return statement, or exited by an exception.
+
+ \note Exceptions are not supported. The callable shouldn't throw when
+ executed, copied or moved.
+
+ \sa QScopedValueRollback
+*/
+
+/*!
+ \fn template <typename F> QScopeGuard<F>::QScopeGuard(F &&f)
+ \fn template <typename F> QScopeGuard<F>::QScopeGuard(const F &f)
+
+ Create a scope guard that will execute \a f at the end of the scope.
+
+ If \e F is a lambda, its type cannot be written. In that case you need to
+ either rely on class template argument deduction (C++17 feature) and leave
+ the template parameter out completely or use the helper function
+ qScopeGuard() instead of this constructor.
+
+ \since 5.15
*/
/*! \fn template <typename F> void QScopeGuard<F>::dismiss()
@@ -51,23 +76,17 @@ QT_BEGIN_NAMESPACE
of the scope.
\ingroup misc
- QScopeGuard<F> is a class of which the sole purpose is to run the function
- \a f in its destructor. This is useful for guaranteeing
- your cleanup code is executed, whether the function is exited normally,
- exited early by a return statement, or exited by an exception.
+ Create a scope guard that will execute \a f at the end of the scope.
- If \e F is a lambda then you cannot instantiate the template directly,
- therefore the qScopeGuard() helper is provided and QScopeGuard<F> is made a
- private implementation detail.
+ This helper function is provided so that you can easily construct a
+ QScopeGuard without having to name the template parameter for the type of
+ the callable. If \e F is a lambda then you cannot write its type and relying
+ on this helper or class template argument deduction is necessary.
Example usage is as follows:
\snippet code/src_corelib_tools_qscopeguard.cpp 0
- \note Exceptions are not supported. The callable shouldn't throw when
- executed, copied or moved.
-
- \sa QScopedValueRollback
*/
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qset.h b/src/corelib/tools/qset.h
index 2e72832185..879e2176f2 100644
--- a/src/corelib/tools/qset.h
+++ b/src/corelib/tools/qset.h
@@ -108,7 +108,11 @@ public:
friend class QSet<T>;
public:
+#if QT_DEPRECATED_SINCE(5, 15)
typedef std::bidirectional_iterator_tag iterator_category;
+#else
+ typedef std::forward_iterator_tag iterator_category;
+#endif
typedef qptrdiff difference_type;
typedef T value_type;
typedef const T *pointer;
@@ -128,13 +132,15 @@ public:
{ return i != o.i; }
inline iterator &operator++() { ++i; return *this; }
inline iterator operator++(int) { iterator r = *this; ++i; return r; }
- inline iterator &operator--() { --i; return *this; }
- inline iterator operator--(int) { iterator r = *this; --i; return r; }
- inline iterator operator+(int j) const { return i + j; }
- inline iterator operator-(int j) const { return i - j; }
- friend inline iterator operator+(int j, iterator k) { return k + j; }
- inline iterator &operator+=(int j) { i += j; return *this; }
- inline iterator &operator-=(int j) { i -= j; return *this; }
+#if QT_DEPRECATED_SINCE(5, 15)
+ inline QT_DEPRECATED iterator &operator--() { --i; return *this; }
+ inline QT_DEPRECATED iterator operator--(int) { iterator r = *this; --i; return r; }
+ inline QT_DEPRECATED iterator operator+(int j) const { return i + j; }
+ inline QT_DEPRECATED iterator operator-(int j) const { return i - j; }
+ friend inline QT_DEPRECATED iterator operator+(int j, iterator k) { return k + j; }
+ inline QT_DEPRECATED iterator &operator+=(int j) { i += j; return *this; }
+ inline QT_DEPRECATED iterator &operator-=(int j) { i -= j; return *this; }
+#endif
};
class const_iterator
@@ -145,7 +151,11 @@ public:
friend class QSet<T>;
public:
+#if QT_DEPRECATED_SINCE(5, 15)
typedef std::bidirectional_iterator_tag iterator_category;
+#else
+ typedef std::forward_iterator_tag iterator_category;
+#endif
typedef qptrdiff difference_type;
typedef T value_type;
typedef const T *pointer;
@@ -163,19 +173,18 @@ public:
inline bool operator!=(const const_iterator &o) const { return i != o.i; }
inline const_iterator &operator++() { ++i; return *this; }
inline const_iterator operator++(int) { const_iterator r = *this; ++i; return r; }
- inline const_iterator &operator--() { --i; return *this; }
- inline const_iterator operator--(int) { const_iterator r = *this; --i; return r; }
- inline const_iterator operator+(int j) const { return i + j; }
- inline const_iterator operator-(int j) const { return i - j; }
- friend inline const_iterator operator+(int j, const_iterator k) { return k + j; }
- inline const_iterator &operator+=(int j) { i += j; return *this; }
- inline const_iterator &operator-=(int j) { i -= j; return *this; }
+#if QT_DEPRECATED_SINCE(5, 15)
+ inline QT_DEPRECATED const_iterator &operator--() { --i; return *this; }
+ inline QT_DEPRECATED const_iterator operator--(int) { const_iterator r = *this; --i; return r; }
+ inline QT_DEPRECATED const_iterator operator+(int j) const { return i + j; }
+ inline QT_DEPRECATED const_iterator operator-(int j) const { return i - j; }
+ friend inline QT_DEPRECATED const_iterator operator+(int j, const_iterator k) { return k + j; }
+ inline QT_DEPRECATED const_iterator &operator+=(int j) { i += j; return *this; }
+ inline QT_DEPRECATED const_iterator &operator-=(int j) { i -= j; return *this; }
+#endif
};
// STL style
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-
inline iterator begin() { return q_hash.begin(); }
inline const_iterator begin() const noexcept { return q_hash.begin(); }
inline const_iterator cbegin() const noexcept { return q_hash.begin(); }
@@ -185,12 +194,17 @@ public:
inline const_iterator cend() const noexcept { return q_hash.end(); }
inline const_iterator constEnd() const noexcept { return q_hash.constEnd(); }
- reverse_iterator rbegin() { return reverse_iterator(end()); }
- reverse_iterator rend() { return reverse_iterator(begin()); }
- const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
- const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
- const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
+#if QT_DEPRECATED_SINCE(5, 15)
+ typedef std::reverse_iterator<iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+
+ reverse_iterator QT_DEPRECATED rbegin() { return reverse_iterator(end()); }
+ reverse_iterator QT_DEPRECATED rend() { return reverse_iterator(begin()); }
+ const_reverse_iterator QT_DEPRECATED rbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator QT_DEPRECATED rend() const noexcept { return const_reverse_iterator(begin()); }
+ const_reverse_iterator QT_DEPRECATED crbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator QT_DEPRECATED crend() const noexcept { return const_reverse_iterator(begin()); }
+#endif
iterator erase(iterator i)
{ return erase(m2c(i)); }
@@ -429,17 +443,19 @@ public:
inline bool hasNext() const { return c->constEnd() != i; }
inline const T &next() { n = i++; return *n; }
inline const T &peekNext() const { return *i; }
- inline bool hasPrevious() const { return c->constBegin() != i; }
- inline const T &previous() { n = --i; return *n; }
- inline const T &peekPrevious() const { iterator p = i; return *--p; }
inline void remove()
{ if (c->constEnd() != n) { i = c->erase(n); n = c->end(); } }
inline const T &value() const { Q_ASSERT(item_exists()); return *n; }
inline bool findNext(const T &t)
{ while (c->constEnd() != (n = i)) if (*i++ == t) return true; return false; }
- inline bool findPrevious(const T &t)
+#if QT_DEPRECATED_SINCE(5, 15)
+ inline QT_DEPRECATED bool hasPrevious() const { return c->constBegin() != i; }
+ inline QT_DEPRECATED const T &previous() { n = --i; return *n; }
+ inline QT_DEPRECATED const T &peekPrevious() const { iterator p = i; return *--p; }
+ inline QT_DEPRECATED bool findPrevious(const T &t)
{ while (c->constBegin() != i) if (*(n = --i) == t) return true;
n = c->end(); return false; }
+#endif
};
#endif // QT_NO_JAVA_STYLE_ITERATORS
diff --git a/src/corelib/tools/qset.qdoc b/src/corelib/tools/qset.qdoc
index 78854be0de..33a0697e12 100644
--- a/src/corelib/tools/qset.qdoc
+++ b/src/corelib/tools/qset.qdoc
@@ -906,8 +906,6 @@
Calling this function on QSet<T>::constEnd() leads to
undefined results.
-
- \sa operator--()
*/
/*!
@@ -924,6 +922,7 @@
/*!
\fn template <class T> QSet<T>::iterator &QSet<T>::iterator::operator--()
\fn template <class T> QSet<T>::const_iterator &QSet<T>::const_iterator::operator--()
+ \obsolete
The prefix -- operator (\c{--it}) makes the preceding item
current and returns an iterator to the new current item.
@@ -937,6 +936,7 @@
/*!
\fn template <class T> QSet<T>::iterator QSet<T>::iterator::operator--(int)
\fn template <class T> QSet<T>::const_iterator QSet<T>::const_iterator::operator--(int)
+ \obsolete
\overload
@@ -947,6 +947,7 @@
/*!
\fn template <class T> QSet<T>::iterator QSet<T>::iterator::operator+(int j) const
\fn template <class T> QSet<T>::const_iterator QSet<T>::const_iterator::operator+(int j) const
+ \obsolete
Returns an iterator to the item at \a j positions forward from
this iterator. (If \a j is negative, the iterator goes backward.)
@@ -959,6 +960,7 @@
/*!
\fn template <class T> QSet<T>::iterator QSet<T>::iterator::operator-(int j) const
\fn template <class T> QSet<T>::const_iterator QSet<T>::const_iterator::operator-(int j) const
+ \obsolete
Returns an iterator to the item at \a j positions backward from
this iterator. (If \a j is negative, the iterator goes forward.)
@@ -971,6 +973,7 @@
/*!
\fn template <class T> QSet<T>::iterator &QSet<T>::iterator::operator+=(int j)
\fn template <class T> QSet<T>::const_iterator &QSet<T>::const_iterator::operator+=(int j)
+ \obsolete
Advances the iterator by \a j items. (If \a j is negative, the
iterator goes backward.)
@@ -983,6 +986,7 @@
/*!
\fn template <class T> QSet<T>::iterator &QSet<T>::iterator::operator-=(int j)
\fn template <class T> QSet<T>::const_iterator &QSet<T>::const_iterator::operator-=(int j)
+ \obsolete
Makes the iterator go back by \a j items. (If \a j is negative,
the iterator goes forward.)
diff --git a/src/corelib/tools/qsimd.cpp b/src/corelib/tools/qsimd.cpp
index fb9b5996f6..75c380ee8a 100644
--- a/src/corelib/tools/qsimd.cpp
+++ b/src/corelib/tools/qsimd.cpp
@@ -1,7 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
+** Copyright (C) 2019 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -188,6 +188,8 @@ static inline quint64 detectProcessorFeatures()
# define PICreg "%%rbx"
#endif
+static bool checkRdrndWorks() noexcept;
+
static int maxBasicCpuidSupported()
{
#if defined(Q_CC_EMSCRIPTEN)
@@ -376,37 +378,8 @@ static quint64 detectProcessorFeatures()
features &= ~AllAVX512;
}
-#if defined(Q_PROCESSOR_X86) && QT_COMPILER_SUPPORTS_HERE(RDRND)
- /**
- * Some AMD CPUs (e.g. AMD A4-6250J and AMD Ryzen 3000-series) have a
- * failing random generation instruction, which always returns
- * 0xffffffff, even when generation was "successful".
- *
- * This code checks if hardware random generator generates four consecutive
- * equal numbers. If it does, then we probably have a failing one and
- * should disable it completely.
- *
- * https://bugreports.qt.io/browse/QTBUG-69423
- */
- if (features & CpuFeatureRDRND) {
- const qsizetype testBufferSize = 4;
- unsigned testBuffer[4] = {};
-
- const qsizetype generated = qRandomCpu(testBuffer, testBufferSize);
-
- if (Q_UNLIKELY(generated == testBufferSize &&
- testBuffer[0] == testBuffer[1] &&
- testBuffer[1] == testBuffer[2] &&
- testBuffer[2] == testBuffer[3])) {
-
- fprintf(stderr, "WARNING: CPU random generator seem to be failing, disable hardware random number generation\n");
- fprintf(stderr, "WARNING: RDRND generated: 0x%x 0x%x 0x%x 0x%x\n",
- testBuffer[0], testBuffer[1], testBuffer[2], testBuffer[3]);
-
- features &= ~CpuFeatureRDRND;
- }
- }
-#endif
+ if (features & CpuFeatureRDRND && !checkRdrndWorks())
+ features &= ~(CpuFeatureRDRND | CpuFeatureRDSEED);
return features;
}
@@ -626,16 +599,45 @@ void qDumpCPUFeatures()
# ifdef Q_PROCESSOR_X86_64
# define _rdrandXX_step _rdrand64_step
+# define _rdseedXX_step _rdseed64_step
# else
# define _rdrandXX_step _rdrand32_step
+# define _rdseedXX_step _rdseed32_step
# endif
-QT_FUNCTION_TARGET(RDRND) qsizetype qRandomCpu(void *buffer, qsizetype count) noexcept
+# if QT_COMPILER_SUPPORTS_HERE(RDSEED)
+static QT_FUNCTION_TARGET(RDSEED) unsigned *qt_random_rdseed(unsigned *ptr, unsigned *end) noexcept
{
- unsigned *ptr = reinterpret_cast<unsigned *>(buffer);
- unsigned *end = ptr + count;
- int retries = 10;
+ // Unlike for the RDRAND code below, the Intel whitepaper describing the
+ // use of the RDSEED instruction indicates we should not retry in a loop.
+ // If the independent bit generator used by RDSEED is out of entropy, it
+ // may take time to replenish.
+ // https://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide
+ while (ptr + sizeof(qregisteruint)/sizeof(*ptr) <= end) {
+ if (_rdseedXX_step(reinterpret_cast<qregisteruint *>(ptr)) == 0)
+ goto out;
+ ptr += sizeof(qregisteruint)/sizeof(*ptr);
+ }
+
+ if (sizeof(*ptr) != sizeof(qregisteruint) && ptr != end) {
+ if (_rdseed32_step(ptr) == 0)
+ goto out;
+ ++ptr;
+ }
+
+out:
+ return ptr;
+}
+# else
+static unsigned *qt_random_rdseed(unsigned *ptr, unsigned *)
+{
+ return ptr;
+}
+# endif
+static QT_FUNCTION_TARGET(RDRND) unsigned *qt_random_rdrnd(unsigned *ptr, unsigned *end) noexcept
+{
+ int retries = 10;
while (ptr + sizeof(qregisteruint)/sizeof(*ptr) <= end) {
if (_rdrandXX_step(reinterpret_cast<qregisteruint *>(ptr)))
ptr += sizeof(qregisteruint)/sizeof(*ptr);
@@ -653,9 +655,64 @@ QT_FUNCTION_TARGET(RDRND) qsizetype qRandomCpu(void *buffer, qsizetype count) no
}
out:
- return ptr - reinterpret_cast<unsigned *>(buffer);
+ return ptr;
+}
+
+static QT_FUNCTION_TARGET(RDRND) Q_DECL_COLD_FUNCTION bool checkRdrndWorks() noexcept
+{
+ /*
+ * Some AMD CPUs (e.g. AMD A4-6250J and AMD Ryzen 3000-series) have a
+ * failing random generation instruction, which always returns
+ * 0xffffffff, even when generation was "successful".
+ *
+ * This code checks if hardware random generator generates four consecutive
+ * equal numbers. If it does, then we probably have a failing one and
+ * should disable it completely.
+ *
+ * https://bugreports.qt.io/browse/QTBUG-69423
+ */
+ constexpr qsizetype TestBufferSize = 4;
+ unsigned testBuffer[TestBufferSize] = {};
+
+ unsigned *end = qt_random_rdrnd(testBuffer, testBuffer + TestBufferSize);
+ if (end < testBuffer + 3) {
+ // Random generation didn't produce enough data for us to make a
+ // determination whether it's working or not. Assume it isn't, but
+ // don't print a warning.
+ return false;
+ }
+
+ // Check the results for equality
+ if (testBuffer[0] == testBuffer[1]
+ && testBuffer[0] == testBuffer[2]
+ && (end < testBuffer + TestBufferSize || testBuffer[0] == testBuffer[3])) {
+ fprintf(stderr, "WARNING: CPU random generator seem to be failing, "
+ "disabling hardware random number generation\n"
+ "WARNING: RDRND generated:");
+ for (unsigned *ptr = testBuffer; ptr < end; ++ptr)
+ fprintf(stderr, " 0x%x", *ptr);
+ fprintf(stderr, "\n");
+ return false;
+ }
+
+ // We're good
+ return true;
}
-#endif
+QT_FUNCTION_TARGET(RDRND) qsizetype qRandomCpu(void *buffer, qsizetype count) noexcept
+{
+ unsigned *ptr = reinterpret_cast<unsigned *>(buffer);
+ unsigned *end = ptr + count;
+
+ if (qCpuHasFeature(RDSEED))
+ ptr = qt_random_rdseed(ptr, end);
+
+ // fill the buffer with RDRND if RDSEED didn't
+ ptr = qt_random_rdrnd(ptr, end);
+ return ptr - reinterpret_cast<unsigned *>(buffer);
+}
+#elif defined(Q_PROCESSOR_X86) && !defined(Q_OS_NACL) && !defined(Q_PROCESSOR_ARM)
+static bool checkRdrndWorks() noexcept { return false; }
+#endif // Q_PROCESSOR_X86 && RDRND
QT_END_NAMESPACE
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index 40c84157cd..e078ab4409 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -12,6 +12,7 @@ HEADERS += \
tools/qcontainerfwd.h \
tools/qcontainertools_impl.h \
tools/qcryptographichash.h \
+ tools/qduplicatetracker_p.h \
tools/qfreelist_p.h \
tools/qhash.h \
tools/qhashfunctions.h \