summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--REUSE.toml30
-rw-r--r--cmake/3rdparty/extra-cmake-modules/0003-ECMEnableSanitizers.cmake-fix-no-undefined-flag-replacement.patch15
-rw-r--r--cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake4
-rw-r--r--cmake/FindBundletool.cmake48
-rw-r--r--cmake/QtAndroidHelpers.cmake30
-rw-r--r--cmake/QtBaseHelpers.cmake3
-rw-r--r--cmake/QtFeature.cmake3
-rw-r--r--cmake/QtFlagHandlingHelpers.cmake4
-rw-r--r--cmake/QtInternalTargets.cmake19
-rw-r--r--cmake/QtModuleHelpers.cmake5
-rw-r--r--cmake/QtPlatformAndroid.cmake30
-rw-r--r--cmake/QtPostProcessHelpers.cmake2
-rw-r--r--cmake/QtPublicWasmToolchainHelpers.cmake2
-rw-r--r--cmake/QtTestHelpers.cmake7
-rw-r--r--coin/instructions/cmake_run_ctest.yaml2
-rw-r--r--coin/instructions/prepare_building_env.yaml38
-rw-r--r--configure.cmake28
-rw-r--r--dist/REUSE.toml2
-rw-r--r--doc/global/includes/cli-build-cmake.qdocinc2
-rw-r--r--examples/widgets/doc/images/treemodel-structure.pngbin8362 -> 0 bytes
-rw-r--r--examples/widgets/doc/images/treemodel-structure.svg93
-rw-r--r--examples/widgets/doc/src/shortcuteditor.qdoc2
-rw-r--r--examples/widgets/doc/src/simpletreemodel.qdoc2
-rw-r--r--licenseRule.json2
-rw-r--r--mkspecs/REUSE.toml4
-rw-r--r--mkspecs/common/clang.conf2
-rw-r--r--mkspecs/common/g++-base.conf2
-rw-r--r--mkspecs/common/msvc-version.conf1
-rw-r--r--mkspecs/features/default_post.prf9
-rw-r--r--mkspecs/features/wasm/emcc_ver.prf2
-rw-r--r--qmake/generators/unix/unixmake2.cpp4
-rw-r--r--qt_cmdline.cmake7
-rw-r--r--src/3rdparty/freetype/REUSE.toml2
-rw-r--r--src/3rdparty/freetype/docs/REUSE.toml2
-rw-r--r--src/3rdparty/freetype/src/pcf/REUSE.toml2
-rw-r--r--src/3rdparty/freetype/src/sdf/REUSE.toml2
-rw-r--r--src/3rdparty/gradle/gradle.properties3
-rw-r--r--src/3rdparty/libpng/ANNOUNCE27
-rw-r--r--src/3rdparty/libpng/CHANGES11
-rw-r--r--src/3rdparty/libpng/README2
-rw-r--r--src/3rdparty/libpng/libpng-manual.txt16
-rw-r--r--src/3rdparty/libpng/png.c4
-rw-r--r--src/3rdparty/libpng/png.h14
-rw-r--r--src/3rdparty/libpng/pngconf.h2
-rw-r--r--src/3rdparty/libpng/pnglibconf.h2
-rw-r--r--src/3rdparty/libpng/pngpread.c8
-rw-r--r--src/3rdparty/libpng/pngpriv.h6
-rw-r--r--src/3rdparty/libpng/pngread.c7
-rw-r--r--src/3rdparty/libpng/pngrutil.c12
-rw-r--r--src/3rdparty/libpng/qt_attribution.json4
-rw-r--r--src/3rdparty/wayland/extensions/REUSE.toml2
-rw-r--r--src/android/CMakeLists.txt1
-rw-r--r--src/android/REUSE.toml12
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java9
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/QtView.java2
-rw-r--r--src/android/templates/build.gradle2
-rw-r--r--src/android/templates_cmake/CMakeLists.txt46
-rw-r--r--src/android/templates_cmake/app/AndroidManifest.xml.in54
-rw-r--r--src/android/templates_cmake/app/build.gradle.in53
-rw-r--r--src/android/templates_cmake/app/gradle.properties.in1
-rw-r--r--src/android/templates_cmake/dynamic_feature/AndroidManifest.xml.in15
-rw-r--r--src/android/templates_cmake/dynamic_feature/build.gradle.in53
-rw-r--r--src/android/templates_cmake/gradle.properties.in12
-rw-r--r--src/android/templates_cmake/settings.gradle.in18
-rw-r--r--src/assets/CMakeLists.txt1
-rw-r--r--src/assets/icons/128x128/document-new.pngbin1258 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/document-open.pngbin1855 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/document-print.pngbin1576 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/document-save.pngbin1298 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/edit-copy.pngbin1480 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/edit-cut.pngbin2012 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/edit-delete.pngbin2665 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/edit-paste.pngbin1892 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/edit-redo.pngbin1239 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/edit-undo.pngbin1233 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-justify-center.pngbin663 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-justify-fill.pngbin506 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-justify-left.pngbin603 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-justify-right.pngbin634 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-text-bold.pngbin1459 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-text-italic.pngbin1158 -> 0 bytes
-rw-r--r--src/assets/icons/128x128/format-text-underline.pngbin1263 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin2541 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin3865 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin3721 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin2682 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin3467 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin5004 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin5870 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin4005 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin2528 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin2530 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin1599 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin1475 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin1539 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin1557 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin3092 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin2374 -> 0 bytes
-rw-r--r--src/assets/icons/128x128@2/[email protected]bin2477 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/document-new.pngbin241 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/document-open.pngbin286 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/document-print.pngbin261 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/document-save.pngbin224 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/edit-copy.pngbin216 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/edit-cut.pngbin267 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/edit-delete.pngbin250 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/edit-paste.pngbin272 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/edit-redo.pngbin253 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/edit-undo.pngbin253 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-justify-center.pngbin134 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-justify-fill.pngbin122 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-justify-left.pngbin128 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-justify-right.pngbin134 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-text-bold.pngbin264 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-text-italic.pngbin255 -> 0 bytes
-rw-r--r--src/assets/icons/16x16/format-text-underline.pngbin186 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin318 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin455 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin393 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin311 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin333 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin416 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin495 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin464 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin346 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin347 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin179 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin156 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin171 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin173 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin430 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin391 -> 0 bytes
-rw-r--r--src/assets/icons/16x16@2/[email protected]bin290 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/document-new.pngbin2541 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/document-open.pngbin3865 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/document-print.pngbin3721 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/document-save.pngbin2682 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/edit-copy.pngbin3467 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/edit-cut.pngbin5004 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/edit-delete.pngbin5870 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/edit-paste.pngbin4005 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/edit-redo.pngbin2528 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/edit-undo.pngbin2530 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-justify-center.pngbin1599 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-justify-fill.pngbin1475 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-justify-left.pngbin1539 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-justify-right.pngbin1557 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-text-bold.pngbin3092 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-text-italic.pngbin2374 -> 0 bytes
-rw-r--r--src/assets/icons/256x256/format-text-underline.pngbin2477 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin5683 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin8174 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin8055 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin5666 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin7329 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin11388 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin12743 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin8485 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin5378 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin5433 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin3855 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin3681 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin3775 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin3756 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin7046 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin6224 -> 0 bytes
-rw-r--r--src/assets/icons/256x256@2/[email protected]bin5168 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/document-new.pngbin318 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/document-open.pngbin455 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/document-print.pngbin393 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/document-save.pngbin311 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/edit-copy.pngbin333 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/edit-cut.pngbin416 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/edit-delete.pngbin495 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/edit-paste.pngbin464 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/edit-redo.pngbin346 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/edit-undo.pngbin347 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-justify-center.pngbin179 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-justify-fill.pngbin156 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-justify-left.pngbin171 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-justify-right.pngbin173 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-text-bold.pngbin430 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-text-italic.pngbin391 -> 0 bytes
-rw-r--r--src/assets/icons/32x32/format-text-underline.pngbin290 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin588 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin923 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin762 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin565 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin710 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin843 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin954 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin909 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin628 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin608 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin317 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin266 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin298 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin305 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin777 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin657 -> 0 bytes
-rw-r--r--src/assets/icons/32x32@2/[email protected]bin577 -> 0 bytes
-rw-r--r--src/assets/icons/CMakeLists.txt174
-rw-r--r--src/assets/icons/README29
-rw-r--r--src/assets/icons/index.theme46
-rw-r--r--src/assets/icons/scalable/document-new.svg1
-rw-r--r--src/assets/icons/scalable/document-open.svg1
-rw-r--r--src/assets/icons/scalable/document-print.svg1
-rw-r--r--src/assets/icons/scalable/document-save.svg1
-rw-r--r--src/assets/icons/scalable/edit-copy.svg1
-rw-r--r--src/assets/icons/scalable/edit-cut.svg1
-rw-r--r--src/assets/icons/scalable/edit-delete.svg1
-rw-r--r--src/assets/icons/scalable/edit-paste.svg1
-rw-r--r--src/assets/icons/scalable/edit-redo.svg1
-rw-r--r--src/assets/icons/scalable/edit-undo.svg1
-rw-r--r--src/assets/icons/scalable/format-justify-center.svg1
-rw-r--r--src/assets/icons/scalable/format-justify-fill.svg1
-rw-r--r--src/assets/icons/scalable/format-justify-left.svg1
-rw-r--r--src/assets/icons/scalable/format-justify-right.svg1
-rw-r--r--src/assets/icons/scalable/format-text-bold.svg1
-rw-r--r--src/assets/icons/scalable/format-text-italic.svg1
-rw-r--r--src/assets/icons/scalable/format-text-underline.svg1
-rw-r--r--src/corelib/CMakeLists.txt6
-rw-r--r--src/corelib/Qt6AndroidDynamicFeatureHelpers.cmake152
-rw-r--r--src/corelib/Qt6AndroidGradleHelpers.cmake631
-rw-r--r--src/corelib/Qt6AndroidMacros.cmake216
-rw-r--r--src/corelib/Qt6AndroidPermissionHelpers.cmake126
-rw-r--r--src/corelib/Qt6CoreConfigExtras.cmake.in4
-rw-r--r--src/corelib/Qt6CoreMacros.cmake9
-rw-r--r--src/corelib/animation/qabstractanimation.cpp1
-rw-r--r--src/corelib/animation/qabstractanimation.h1
-rw-r--r--src/corelib/animation/qabstractanimation_p.h1
-rw-r--r--src/corelib/animation/qanimationgroup.cpp1
-rw-r--r--src/corelib/animation/qanimationgroup.h1
-rw-r--r--src/corelib/animation/qanimationgroup_p.h1
-rw-r--r--src/corelib/animation/qparallelanimationgroup.cpp1
-rw-r--r--src/corelib/animation/qparallelanimationgroup.h1
-rw-r--r--src/corelib/animation/qparallelanimationgroup_p.h1
-rw-r--r--src/corelib/animation/qpauseanimation.cpp1
-rw-r--r--src/corelib/animation/qpauseanimation.h1
-rw-r--r--src/corelib/animation/qpropertyanimation.cpp1
-rw-r--r--src/corelib/animation/qpropertyanimation.h1
-rw-r--r--src/corelib/animation/qpropertyanimation_p.h1
-rw-r--r--src/corelib/animation/qsequentialanimationgroup.cpp1
-rw-r--r--src/corelib/animation/qsequentialanimationgroup.h1
-rw-r--r--src/corelib/animation/qsequentialanimationgroup_p.h1
-rw-r--r--src/corelib/animation/qvariantanimation.cpp1
-rw-r--r--src/corelib/animation/qvariantanimation.h1
-rw-r--r--src/corelib/animation/qvariantanimation_p.h1
-rw-r--r--src/corelib/configure.cmake1
-rw-r--r--src/corelib/doc/REUSE.toml8
-rw-r--r--src/corelib/doc/snippets/CMakeLists.txt1
-rw-r--r--src/corelib/doc/snippets/eventfilters/CMakeLists.txt8
-rw-r--r--src/corelib/doc/snippets/qmetaobject-invokable/CMakeLists.txt6
-rw-r--r--src/corelib/doc/snippets/qmetaobject-revision/CMakeLists.txt6
-rw-r--r--src/corelib/doc/snippets/qprocess/CMakeLists.txt6
-rw-r--r--src/corelib/doc/snippets/qsignalmapper/CMakeLists.txt18
-rw-r--r--src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp65
-rw-r--r--src/corelib/doc/snippets/qsignalmapper/buttonwidget.h4
-rw-r--r--src/corelib/doc/src/cmake/qt_add_resources.qdoc4
-rw-r--r--src/corelib/global/qlibraryinfo.cpp1
-rw-r--r--src/corelib/global/qnumeric.cpp1
-rw-r--r--src/corelib/global/qnumeric.h1
-rw-r--r--src/corelib/global/qrandom.cpp1
-rw-r--r--src/corelib/global/qrandom.h1
-rw-r--r--src/corelib/io/qfile.cpp1
-rw-r--r--src/corelib/io/qfile.h1
-rw-r--r--src/corelib/io/qfile_p.h1
-rw-r--r--src/corelib/io/qfilesystemengine_unix.cpp11
-rw-r--r--src/corelib/io/qfilesystemwatcher.cpp1
-rw-r--r--src/corelib/io/qfilesystemwatcher.h1
-rw-r--r--src/corelib/io/qfilesystemwatcher_fsevents.mm1
-rw-r--r--src/corelib/io/qfilesystemwatcher_fsevents_p.h1
-rw-r--r--src/corelib/io/qfilesystemwatcher_inotify.cpp1
-rw-r--r--src/corelib/io/qfilesystemwatcher_inotify_p.h1
-rw-r--r--src/corelib/io/qfilesystemwatcher_kqueue.cpp1
-rw-r--r--src/corelib/io/qfilesystemwatcher_kqueue_p.h1
-rw-r--r--src/corelib/io/qfilesystemwatcher_p.h1
-rw-r--r--src/corelib/io/qfilesystemwatcher_polling.cpp1
-rw-r--r--src/corelib/io/qfilesystemwatcher_polling_p.h1
-rw-r--r--src/corelib/io/qfilesystemwatcher_win.cpp1
-rw-r--r--src/corelib/io/qfilesystemwatcher_win_p.h1
-rw-r--r--src/corelib/io/qiodevice.cpp8
-rw-r--r--src/corelib/io/qiodevice.h1
-rw-r--r--src/corelib/io/qiodevice_p.h1
-rw-r--r--src/corelib/io/qsavefile.cpp1
-rw-r--r--src/corelib/io/qsavefile.h1
-rw-r--r--src/corelib/io/qsavefile_p.h1
-rw-r--r--src/corelib/io/qstorageinfo.cpp34
-rw-r--r--src/corelib/io/qstorageinfo.h3
-rw-r--r--src/corelib/io/qstorageinfo_linux.cpp1
-rw-r--r--src/corelib/io/qstorageinfo_linux_p.h1
-rw-r--r--src/corelib/io/qstorageinfo_mac.cpp1
-rw-r--r--src/corelib/io/qstorageinfo_p.h1
-rw-r--r--src/corelib/io/qstorageinfo_stub.cpp1
-rw-r--r--src/corelib/io/qstorageinfo_unix.cpp1
-rw-r--r--src/corelib/io/qstorageinfo_win.cpp1
-rw-r--r--src/corelib/io/qtemporaryfile.cpp6
-rw-r--r--src/corelib/io/qurl.cpp32
-rw-r--r--src/corelib/ipc/qsharedmemory.cpp1
-rw-r--r--src/corelib/ipc/qsharedmemory.h1
-rw-r--r--src/corelib/ipc/qsharedmemory_p.h1
-rw-r--r--src/corelib/ipc/qsharedmemory_posix.cpp1
-rw-r--r--src/corelib/ipc/qsharedmemory_systemv.cpp1
-rw-r--r--src/corelib/ipc/qsharedmemory_win.cpp1
-rw-r--r--src/corelib/ipc/qsystemsemaphore.cpp1
-rw-r--r--src/corelib/ipc/qsystemsemaphore.h1
-rw-r--r--src/corelib/ipc/qsystemsemaphore_p.h1
-rw-r--r--src/corelib/ipc/qsystemsemaphore_posix.cpp1
-rw-r--r--src/corelib/ipc/qsystemsemaphore_systemv.cpp1
-rw-r--r--src/corelib/ipc/qsystemsemaphore_win.cpp1
-rw-r--r--src/corelib/ipc/qtipccommon.cpp1
-rw-r--r--src/corelib/ipc/qtipccommon.h1
-rw-r--r--src/corelib/ipc/qtipccommon_p.h1
-rw-r--r--src/corelib/itemmodels/qrangemodel_impl.h37
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp29
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h12
-rw-r--r--src/corelib/kernel/qmetaobject.cpp16
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp20
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder_p.h2
-rw-r--r--src/corelib/kernel/qmetatype.cpp112
-rw-r--r--src/corelib/kernel/qmetatype_p.h26
-rw-r--r--src/corelib/kernel/qproperty.cpp4
-rw-r--r--src/corelib/kernel/qsignalmapper.cpp10
-rw-r--r--src/corelib/kernel/qtranslator.cpp41
-rw-r--r--src/corelib/kernel/qvariant.h11
-rw-r--r--src/corelib/platform/windows/qt_winrtbase_p.h1
-rw-r--r--src/corelib/serialization/qcborarray.cpp20
-rw-r--r--src/corelib/serialization/qcborarray.h2
-rw-r--r--src/corelib/serialization/qcborcommon.h4
-rw-r--r--src/corelib/serialization/qcbormap.cpp20
-rw-r--r--src/corelib/serialization/qcbormap.h2
-rw-r--r--src/corelib/serialization/qcborvalue.cpp2
-rw-r--r--src/corelib/thread/qatomicwait.cpp14
-rw-r--r--src/corelib/thread/qmutex.cpp19
-rw-r--r--src/corelib/time/qdatetime.cpp17
-rw-r--r--src/corelib/time/qtimezonelocale_data_p.h2870
-rw-r--r--src/corelib/tools/qarraydata.cpp17
-rw-r--r--src/corelib/tools/qarraydata.h10
-rw-r--r--src/corelib/tools/qarraydataops.h4
-rw-r--r--src/corelib/tools/qatomicscopedvaluerollback.h28
-rw-r--r--src/corelib/tools/qfreelist_p.h24
-rw-r--r--src/corelib/tools/qhashfunctions.h32
-rw-r--r--src/corelib/tools/qsharedpointer_impl.h10
-rw-r--r--src/gui/accessible/linux/atspiadaptor.cpp9
-rw-r--r--src/gui/compat/removed_api.cpp13
-rw-r--r--src/gui/kernel/qaction.cpp2
-rw-r--r--src/gui/kernel/qguivariant.cpp15
-rw-r--r--src/gui/kernel/qscreen.cpp6
-rw-r--r--src/gui/kernel/qshortcut.cpp2
-rw-r--r--src/gui/kernel/qtestsupport_gui.cpp63
-rw-r--r--src/gui/kernel/qtestsupport_gui.h16
-rw-r--r--src/gui/math3d/qquaternion.cpp97
-rw-r--r--src/gui/math3d/qquaternion.h22
-rw-r--r--src/gui/painting/qbackingstoredefaultcompositor.cpp17
-rw-r--r--src/gui/painting/qbackingstoredefaultcompositor_p.h3
-rw-r--r--src/gui/painting/qdrawhelper_avx2.cpp15
-rw-r--r--src/gui/painting/qpainter.cpp28
-rw-r--r--src/gui/painting/qpainter.h22
-rw-r--r--src/gui/painting/qplatformbackingstore.cpp5
-rw-r--r--src/gui/painting/qplatformbackingstore.h3
-rw-r--r--src/gui/painting/qrhibackingstore.cpp17
-rw-r--r--src/gui/painting/qtransform.cpp2
-rw-r--r--src/gui/painting/shaders/REUSE.toml2
-rw-r--r--src/gui/rhi/qrhi.cpp2
-rw-r--r--src/gui/rhi/qshader.cpp2
-rw-r--r--src/gui/text/qfontdatabase.cpp43
-rw-r--r--src/gui/text/qfontdatabase_p.h2
-rw-r--r--src/gui/util/qgridlayoutengine.cpp1
-rw-r--r--src/network/android/REUSE.toml2
-rw-r--r--src/network/socket/qnativesocketengine.cpp13
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp6
-rw-r--r--src/opengl/qopenglcompositorbackingstore.cpp4
-rw-r--r--src/opengl/qopenglcompositorbackingstore_p.h3
-rw-r--r--src/plugins/REUSE.toml6
-rw-r--r--src/plugins/imageformats/ico/qicohandler.cpp2
-rw-r--r--src/plugins/platforminputcontexts/ibus/REUSE.toml2
-rw-r--r--src/plugins/platforms/CMakeLists.txt4
-rw-r--r--src/plugins/platforms/android/CMakeLists.txt5
-rw-r--r--src/plugins/platforms/android/androidjniaccessibility.cpp130
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.h3
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.mm6
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.h3
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.mm8
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.mm18
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice.cpp1
-rw-r--r--src/plugins/platforms/ios/qiosapplicationdelegate.mm75
-rw-r--r--src/plugins/platforms/ios/qiosglobal.mm2
-rw-r--r--src/plugins/platforms/ios/qiosinputcontext.mm9
-rw-r--r--src/plugins/platforms/ios/qiosviewcontroller.h6
-rw-r--r--src/plugins/platforms/ios/qiosviewcontroller.mm57
-rw-r--r--src/plugins/platforms/ios/qioswindow.mm2
-rw-r--r--src/plugins/platforms/ios/quiview.mm3
-rw-r--r--src/plugins/platforms/wayland/qwaylandcursor.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp13
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp5
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp209
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.h5
-rw-r--r--src/plugins/platforms/xcb/qxcbbackingstore.cpp5
-rw-r--r--src/plugins/platforms/xcb/qxcbbackingstore.h3
-rw-r--r--src/plugins/styles/modernwindows/qwindows11style.cpp438
-rw-r--r--src/plugins/styles/modernwindows/qwindows11style_p.h2
-rw-r--r--src/plugins/styles/modernwindows/qwindowsvistastyle.cpp8
-rw-r--r--src/printsupport/REUSE.toml8
-rw-r--r--src/testlib/3rdparty/valgrind/qt_attribution.json2
-rw-r--r--src/testlib/3rdparty/valgrind/valgrind_p.h537
-rw-r--r--src/testlib/qtestcase.cpp2
-rw-r--r--src/testlib/qtestlog.cpp14
-rw-r--r--src/tools/androiddeployqt/main.cpp26
-rw-r--r--src/tools/androidtestrunner/main.cpp155
-rw-r--r--src/tools/uic/ui4.cpp7
-rw-r--r--src/tools/uic/ui4.h8
-rw-r--r--src/widgets/REUSE.toml8
-rw-r--r--src/widgets/accessible/simplewidgets.cpp28
-rw-r--r--src/widgets/accessible/simplewidgets_p.h4
-rw-r--r--src/widgets/itemviews/qheaderview.cpp4
-rw-r--r--src/widgets/kernel/qtestsupport_widgets.cpp63
-rw-r--r--src/widgets/kernel/qtestsupport_widgets.h13
-rw-r--r--src/widgets/kernel/qwidgetsvariant.cpp14
-rw-r--r--src/widgets/kernel/qwidgetwindow.cpp14
-rw-r--r--src/widgets/styles/qcommonstyle.cpp3
-rw-r--r--src/widgets/styles/qfusionstyle.cpp2
-rw-r--r--src/widgets/styles/qfusionstyle_p_p.h5
-rw-r--r--src/widgets/styles/qstyle.cpp12
-rw-r--r--src/widgets/styles/qstyle.h2
-rw-r--r--src/widgets/styles/qwindowsstyle.cpp2
-rw-r--r--src/widgets/widgets/qcombobox.cpp16
-rw-r--r--src/widgets/widgets/qdockarealayout.cpp3
-rw-r--r--src/widgets/widgets/qmainwindowlayout.cpp6
-rw-r--r--src/widgets/widgets/qscrollbar.cpp6
-rw-r--r--src/widgets/widgets/qtoolbararealayout.cpp8
-rw-r--r--tests/auto/cmake/CMakeLists.txt104
-rw-r--r--tests/auto/cmake/test_android_signing/CMakeLists.txt53
-rw-r--r--tests/auto/cmake/test_android_signing/main.cpp4
-rw-r--r--tests/auto/cmake/test_android_signing/verify_signature.cmake25
-rw-r--r--tests/auto/corelib/io/qdir/tst_qdir.cpp5
-rw-r--r--tests/auto/corelib/io/qfile/tst_qfile.cpp32
-rw-r--r--tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp29
-rw-r--r--tests/auto/corelib/io/qurl/tst_qurl.cpp4
-rw-r--r--tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp40
-rw-r--r--tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp28
-rw-r--r--tests/auto/corelib/kernel/qpointer/tst_qpointer.cpp38
-rw-r--r--tests/auto/corelib/platform/CMakeLists.txt4
-rw-r--r--tests/auto/corelib/platform/android_legacy_packaging/testdata/build.gradle2
-rw-r--r--tests/auto/corelib/text/qlocale/tst_qlocale.cpp16
-rw-r--r--tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp12
-rw-r--r--tests/auto/corelib/tools/qatomicscopedvaluerollback/tst_qatomicscopedvaluerollback.cpp89
-rw-r--r--tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp36
-rw-r--r--tests/auto/gui/kernel/qopenglwindow/tst_qopenglwindow.cpp3
-rw-r--r--tests/auto/gui/kernel/qwindow/BLACKLIST1
-rw-r--r--tests/auto/gui/kernel/qwindow/tst_qwindow.cpp8
-rw-r--r--tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp23
-rw-r--r--tests/auto/gui/qopengl/tst_qopengl.cpp3
-rw-r--r--tests/auto/gui/qopenglconfig/tst_qopenglconfig.cpp3
-rw-r--r--tests/auto/gui/text/qfont/BLACKLIST3
-rw-r--r--tests/auto/network/kernel/qnetworkinterface/BLACKLIST5
-rw-r--r--tests/auto/other/android/CMakeLists.txt8
-rw-r--r--tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp9
-rw-r--r--tests/auto/other/android/dynamic_feature/CMakeLists.txt33
-rw-r--r--tests/auto/other/android/dynamic_feature/feature/CMakeLists.txt8
-rw-r--r--tests/auto/other/android/dynamic_feature/feature/qtlogo.pngbin0 -> 1214 bytes
-rw-r--r--tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoader.java175
-rw-r--r--tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListener.java92
-rw-r--r--tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListenerCallback.java26
-rw-r--r--tests/auto/other/android/dynamic_feature/storeloader/storeloader.cpp227
-rw-r--r--tests/auto/other/android/dynamic_feature/storeloader/storeloader.h65
-rw-r--r--tests/auto/other/android/dynamic_feature/tst_android_dynamic_feature.cpp37
-rw-r--r--tests/auto/other/android/package_source_dir/CMakeLists.txt54
-rw-r--r--tests/auto/other/android/package_source_dir/custom_android_manifest/AndroidManifest.xml51
-rw-r--r--tests/auto/other/android/package_source_dir/custom_android_manifest_bundle/app/AndroidManifest.xml51
-rw-r--r--tests/auto/other/android/package_source_dir/partial_template/app/AndroidManifest.xml51
-rw-r--r--tests/auto/other/android/package_source_dir/partial_template/app/build.gradle.in54
-rw-r--r--tests/auto/other/android/package_source_dir/tst_android_package_source_dir.cpp47
-rw-r--r--tests/auto/other/android/permissions/CMakeLists.txt23
-rw-r--r--tests/auto/other/android/permissions/tst_android_permissions.cpp80
-rw-r--r--tests/auto/testlib/selftests/CMakeLists.txt9
-rw-r--r--tests/auto/testlib/selftests/expected_threewaycompare.junitxml36
-rw-r--r--tests/auto/testlib/selftests/expected_threewaycompare.lightxml36
-rw-r--r--tests/auto/testlib/selftests/expected_threewaycompare.tap36
-rw-r--r--tests/auto/testlib/selftests/expected_threewaycompare.teamcity18
-rw-r--r--tests/auto/testlib/selftests/expected_threewaycompare.txt36
-rw-r--r--tests/auto/testlib/selftests/expected_threewaycompare.xml36
-rw-r--r--tests/auto/testlib/selftests/mouse/tst_mouse.cpp4
-rw-r--r--tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp2
-rw-r--r--tests/auto/tools/moc/tst_moc.cpp2
-rw-r--r--tests/auto/tools/qmake/testdata/invalid-info-plist/Info.plist1
-rw-r--r--tests/auto/tools/qmake/testdata/invalid-info-plist/invalid-info-plist.pro2
-rw-r--r--tests/auto/tools/qmake/testdata/invalid-info-plist/main.cpp4
-rw-r--r--tests/auto/tools/qmake/testdata/windows_resources/REUSE.toml2
-rw-r--r--tests/auto/tools/qmake/tst_qmake.cpp18
-rw-r--r--tests/auto/tools/uic/baseline/REUSE.toml2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsanchorlayout/BLACKLIST1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp3
-rw-r--r--tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp16
-rw-r--r--tests/auto/widgets/kernel/qapplication/BLACKLIST3
-rw-r--r--tests/auto/widgets/kernel/qwidgetrepaintmanager/tst_qwidgetrepaintmanager.cpp224
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp34
-rw-r--r--tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp35
-rw-r--r--tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp6
-rw-r--r--tests/auto/widgets/widgets/qrhiwidget/tst_qrhiwidget.cpp2
-rw-r--r--util/lexgen/REUSE.toml4
-rwxr-xr-xutil/locale_database/cldr2qlocalexml.py2
-rw-r--r--util/locale_database/localetools.py4
-rw-r--r--util/x86simdgen/REUSE.toml4
503 files changed, 7462 insertions, 3148 deletions
diff --git a/REUSE.toml b/REUSE.toml
index c8812eacc03..4961e1f14bc 100644
--- a/REUSE.toml
+++ b/REUSE.toml
@@ -11,13 +11,13 @@ SPDX-License-Identifier = "BSD-3-Clause"
path = ["**tools/**", "util/**", "doc/global/template/scripts/extras.js",
"doc/global/template/scripts/main.js"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0"
[[annotations]]
path = ["tests/**"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GPL-3.0-only"
[[annotations]]
@@ -29,43 +29,43 @@ path = ["bin/*", "coin/**","libexec/*","**_clang-format", "**.cmake", "**.conf",
"**.cfg", "**/Makefile", "**/CMakeLists.txt", "**.qrc", ".tag"]
precedence = "closest"
comment = "build system"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "BSD-3-Clause"
[[annotations]]
path = ["**PrivacyInfo.xcprivacy"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "CC0-1.0"
[[annotations]]
path = ["**/.gitattributes", "**.gitignore", "**.gitreview"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause"
[[annotations]]
path = ["**/snippets/**", "examples/**", "src/tools/qlalr/examples/**"]
comment = "this must be after the build system table because example and snippets take precedence over build system"
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause"
[[annotations]]
path = ["tests/manual/examples/**", "**/snippets/**"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause"
[[annotations]]
-path = ["**/README*", "src/plugins/**/README*", "examples/**/README*", "tests/**/README*",
+path = ["**/README*", "src/plugins/**/README*", "examples/**/README*",# "tests/**/README*",
"src/widgets/doc/snippets/common-table-model/README", "cmake/README.md",
"lib/README", "coin/instructions/README.md", "src/3rdparty/README",
"**.qdocconf", "**.qdocinc", "config_help.txt",
"doc/global/template/style/*", "**/doc/**/images/**"]
comment = "documentation"
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"
[[annotations]]
@@ -78,37 +78,37 @@ SPDX-License-Identifier = "CC0-1.0"
path = ["src/gui/doc/snippets/textdocument-images/images.qrc"]
precedence = "closest"
comment = "falls under **/doc/**/images/**, which is wrong"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause"
[[annotations]]
-path = ["src/assets/icons/**.png", "src/assets/icons/**.svg", "src/android/**.xml",
+path = ["src/assets/icons/**.png", "src/assets/icons/**.svg",
"src/gui/**.xml",
"src/assets/icons/index.theme", "src/gui/rhi/test.hlsl",
"src/corelib/doc/include/QtCoreDoc",
"src/gui/doc/includes/QtGuiDoc",
"src/opengl/doc/QtOpenGLDoc"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
[[annotations]]
path = ["tests/auto/tools/rcc/data/legal/legal.qrc"]
precedence = "override"
comment = "license in file not referring to the file itself"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "BSD-3-Clause"
[[annotations]]
path = ["**/qt_attribution.json"]
precedence = "override"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"
[[annotations]]
path = ["**.toml", "licenseRule.json"]
precedence = "override"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause"
[[annotations]]
diff --git a/cmake/3rdparty/extra-cmake-modules/0003-ECMEnableSanitizers.cmake-fix-no-undefined-flag-replacement.patch b/cmake/3rdparty/extra-cmake-modules/0003-ECMEnableSanitizers.cmake-fix-no-undefined-flag-replacement.patch
new file mode 100644
index 00000000000..dbbef0c9f9e
--- /dev/null
+++ b/cmake/3rdparty/extra-cmake-modules/0003-ECMEnableSanitizers.cmake-fix-no-undefined-flag-replacement.patch
@@ -0,0 +1,15 @@
+diff --git a/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake b/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake
+index 8d95c69e3ad..5145d2ffd71 100644
+--- a/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake
++++ b/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake
+@@ -179,8 +179,8 @@ if (ECM_ENABLE_SANITIZERS)
+ link_libraries("${linker_flags}")
+ endif()
+ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+- string(REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
+- string(REPLACE "-Wl,--no-undefined" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
++ string(REGEX REPLACE "( |^)-Wl,--no-undefined( |$)" " " CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
++ string(REGEX REPLACE "( |^)-Wl,--no-undefined( |$)" " " CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
+ endif ()
+ endforeach()
+ else()
diff --git a/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake b/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake
index 8d95c69e3ad..5145d2ffd71 100644
--- a/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake
+++ b/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake
@@ -179,8 +179,8 @@ if (ECM_ENABLE_SANITIZERS)
link_libraries("${linker_flags}")
endif()
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- string(REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
- string(REPLACE "-Wl,--no-undefined" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
+ string(REGEX REPLACE "( |^)-Wl,--no-undefined( |$)" " " CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
+ string(REGEX REPLACE "( |^)-Wl,--no-undefined( |$)" " " CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
endif ()
endforeach()
else()
diff --git a/cmake/FindBundletool.cmake b/cmake/FindBundletool.cmake
new file mode 100644
index 00000000000..f691b27da89
--- /dev/null
+++ b/cmake/FindBundletool.cmake
@@ -0,0 +1,48 @@
+# Copyright (C) 2025 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#.rst:
+# FindBundletool
+# ---------
+#
+# Try to locate the android bundletool.
+# If found, this will define the following variables:
+#
+# ``Bundletool_FOUND``
+# True if the Bundletool is found
+#
+# ``Bundletool_EXECUTABLE ``
+# Path to the Bundletool executable
+#
+# If ``Bundletool_FOUND`` is TRUE, it will also define the following
+# imported target:
+#
+# ``Bundletool::Bundletool``
+# The Bundletool executable
+
+if(DEFINED ENV{Bundletool_EXECUTABLE})
+ if((NOT Bundletool_EXECUTABLE OR NOT EXISTS "${Bundletool_EXECUTABLE}")
+ AND EXISTS "$ENV{Bundletool_EXECUTABLE}")
+ set(_Bundletool_use_force FORCE)
+ else()
+ set(_Bundletool_use_force "")
+ endif()
+ set(Bundletool_EXECUTABLE "$ENV{Bundletool_EXECUTABLE}" CACHE FILEPATH
+ "Path to the 'bundletool' executable." ${_Bundletool_use_force})
+ unset(_Bundletool_use_force)
+endif()
+
+find_file(Bundletool_EXECUTABLE bundletool bundletool.jar)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Bundletool DEFAULT_MSG Bundletool_EXECUTABLE)
+
+if(Bundletool_FOUND)
+ if(NOT TARGET Bundletool::Bundletool)
+ add_executable(Bundletool::Bundletool IMPORTED)
+ set_target_properties(Bundletool::Bundletool PROPERTIES
+ IMPORTED_LOCATION "${Bundletool_EXECUTABLE}")
+ endif()
+endif()
+
+mark_as_advanced(Bundletool_EXECUTABLE)
diff --git a/cmake/QtAndroidHelpers.cmake b/cmake/QtAndroidHelpers.cmake
index 64696fff6d4..cb7d4716f12 100644
--- a/cmake/QtAndroidHelpers.cmake
+++ b/cmake/QtAndroidHelpers.cmake
@@ -473,3 +473,33 @@ function(qt_internal_create_source_jar)
add_dependencies(install_android_source_jar_${module} ${jar_target})
add_dependencies(install_android_source_jars install_android_source_jar_${module})
endfunction()
+
+# The function stores Android permissions that are required by the module target.
+# The stored INTERFACE_QT_ANDROID_PERMISSIONS is the transitive property.
+function(qt_internal_android_add_interface_permissions target)
+ get_target_property(permissions ${target} QT_ANDROID_PERMISSIONS)
+ if(NOT permissions)
+ return()
+ endif()
+
+ set(postprocessed_permissions "")
+ foreach(permission IN LISTS permissions)
+ # TODO: skip processing extras for now, add them back once internal API
+ # will cover adding extras using internal function.
+ list(APPEND postprocessed_permissions "name\;${permission}")
+ endforeach()
+ qt_internal_set_module_transitive_properties(${target} TYPE LINK PROPERTIES
+ INTERFACE_QT_ANDROID_PERMISSIONS "${postprocessed_permissions}")
+endfunction()
+
+# The function stores Android features that are required by the module target.
+# The stored INTERFACE_QT_ANDROID_FEATURES is the transitive property.
+function(qt_internal_android_add_interface_features target)
+ get_target_property(features ${target} QT_ANDROID_FEATURES)
+ if(NOT features)
+ return()
+ endif()
+
+ qt_internal_set_module_transitive_properties(${target} TYPE LINK PROPERTIES
+ INTERFACE_QT_ANDROID_FEATURES "${features}")
+endfunction()
diff --git a/cmake/QtBaseHelpers.cmake b/cmake/QtBaseHelpers.cmake
index b3a4e8c7619..911b6001564 100644
--- a/cmake/QtBaseHelpers.cmake
+++ b/cmake/QtBaseHelpers.cmake
@@ -237,6 +237,9 @@ macro(qt_internal_qtbase_build_repo)
# Needed when building qtbase for android.
if(ANDROID)
include(src/corelib/Qt6AndroidMacros.cmake)
+ include(src/corelib/Qt6AndroidDynamicFeatureHelpers.cmake)
+ include(src/corelib/Qt6AndroidGradleHelpers.cmake)
+ include(src/corelib/Qt6AndroidPermissionHelpers.cmake)
endif()
# Needed when building for WebAssembly.
diff --git a/cmake/QtFeature.cmake b/cmake/QtFeature.cmake
index 9cffa58229e..86b1201792d 100644
--- a/cmake/QtFeature.cmake
+++ b/cmake/QtFeature.cmake
@@ -1570,7 +1570,8 @@ function(qt_run_config_compile_test name)
endif()
if(arg_CXX_STANDARD)
- if(${arg_CXX_STANDARD} LESS 23 OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20")
+ if((${arg_CXX_STANDARD} LESS 23 OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20") AND
+ (${arg_CXX_STANDARD} LESS 26 OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25"))
set(CMAKE_CXX_STANDARD "${arg_CXX_STANDARD}")
set(CMAKE_CXX_STANDARD_REQUIRED OFF)
endif()
diff --git a/cmake/QtFlagHandlingHelpers.cmake b/cmake/QtFlagHandlingHelpers.cmake
index 1747e7c7197..67d6f37e36d 100644
--- a/cmake/QtFlagHandlingHelpers.cmake
+++ b/cmake/QtFlagHandlingHelpers.cmake
@@ -359,7 +359,9 @@ endfunction()
function(qt_set_language_standards)
## Use the latest standard the compiler supports (same as qt_common.prf)
- if (QT_FEATURE_cxx2b)
+ if (QT_FEATURE_cxx2c)
+ set(CMAKE_CXX_STANDARD 26 PARENT_SCOPE)
+ elseif (QT_FEATURE_cxx2b)
set(CMAKE_CXX_STANDARD 23 PARENT_SCOPE)
elseif (QT_FEATURE_cxx20)
set(CMAKE_CXX_STANDARD 20 PARENT_SCOPE)
diff --git a/cmake/QtInternalTargets.cmake b/cmake/QtInternalTargets.cmake
index a1f4cb7281c..c041f9d3ac5 100644
--- a/cmake/QtInternalTargets.cmake
+++ b/cmake/QtInternalTargets.cmake
@@ -94,6 +94,18 @@ function(qt_internal_set_warnings_are_errors_flags target target_scope)
${language_args}
)
endif()
+ if(APPLE)
+ qt_internal_add_compiler_dependent_flags("${target}" ${target_scope}
+ COMPILERS CLANG AppleClang
+ CONDITIONS $<BOOL:$<TARGET_PROPERTY:UNITY_BUILD>>
+ OPTIONS
+ -Wno-error=nullability-completeness
+ COMMON_CONDITIONS
+ ${common_conditions}
+ LANGUAGES
+ OBJCXX
+ )
+ endif()
# Other options are gated at compile time that are not likely to change between different build
# environments of other modules.
if(ANDROID)
@@ -356,6 +368,13 @@ if (MSVC AND NOT CLANG)
)
endif()
+if (WIN32 AND (CLANG OR MINGW) AND (TEST_architecture_arch STREQUAL x86_64))
+ # windows 10 requires cmpxchg16b
+ target_compile_options(PlatformCommonInternal INTERFACE
+ -mcx16
+ )
+endif()
+
set(_qt_internal_clang_msvc_frontend False)
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND
CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
diff --git a/cmake/QtModuleHelpers.cmake b/cmake/QtModuleHelpers.cmake
index ecfdb740d71..f7ab67455ce 100644
--- a/cmake/QtModuleHelpers.cmake
+++ b/cmake/QtModuleHelpers.cmake
@@ -1554,8 +1554,9 @@ function(qt_describe_module target)
endif()
if(ANDROID)
string(APPEND targets_information
- "${indent5}\"api_version\": \"${QT_ANDROID_API_USED_FOR_JAVA}\",
-${indent5}\"ndk_version\": \"${ANDROID_NDK_REVISION}\",\n")
+ "${indent5}\"api_version\": \"${QT_ANDROID_API_USED_FOR_JAVA}\",\n"
+ "${indent5}\"ndk_version\": \"${ANDROID_NDK_REVISION}\",\n"
+ "${indent5}\"android_platform\": \"${ANDROID_PLATFORM}\",\n")
endif()
string(APPEND targets_information "${indent5}\"architecture\": \"${architecture}\",\n")
string(APPEND targets_information "${indent5}\"abi\": \"${TEST_arch_${architecture}_abi}\"\n")
diff --git a/cmake/QtPlatformAndroid.cmake b/cmake/QtPlatformAndroid.cmake
index b480b1c14a6..d56a889d114 100644
--- a/cmake/QtPlatformAndroid.cmake
+++ b/cmake/QtPlatformAndroid.cmake
@@ -30,6 +30,7 @@ include(UseJava)
# Find JDK 8.0
find_package(Java 1.8 COMPONENTS Development REQUIRED)
+find_package(Bundletool)
# Ensure we are using the shared version of libc++
if(NOT ANDROID_STL STREQUAL c++_shared)
@@ -117,13 +118,32 @@ function(qt_internal_android_test_runner_arguments target out_test_runner out_te
set(deployment_tool "${host_bin_dir}/androiddeployqt")
_qt_internal_android_get_target_android_build_dir(android_build_dir ${target})
- set(${out_test_arguments}
+ _qt_internal_android_get_platform_tools_path(platform_tools)
+ set(test_arguments
"--path" "${android_build_dir}"
- "--adb" "${ANDROID_SDK_ROOT}/platform-tools/adb"
+ "--adb" "${platform_tools}/adb"
"--skip-install-root"
- "--make" "\"${CMAKE_COMMAND}\" --build ${CMAKE_BINARY_DIR} --target ${target}_make_apk"
- "--apk" "${android_build_dir}/${target}.apk"
"--ndk-stack" "${ANDROID_NDK_ROOT}/ndk-stack"
- PARENT_SCOPE
)
+
+ if(QT_USE_ANDROID_MODERN_BUNDLE)
+ _qt_internal_android_get_target_deployment_dir(target_deployment_dir ${target})
+ list(APPEND test_arguments
+ "--manifest" "${target_deployment_dir}/AndroidManifest.xml")
+ endif()
+
+ if(EXISTS "${Bundletool_EXECUTABLE}" AND QT_USE_ANDROID_MODERN_BUNDLE)
+ list(APPEND test_arguments
+ "--make" "\"${CMAKE_COMMAND}\" --build ${CMAKE_BINARY_DIR} --target ${target}_make_aab"
+ "--aab" "${android_build_dir}/${target}.aab"
+ "--bundletool" "${Bundletool_EXECUTABLE}"
+ )
+ else()
+ list(APPEND test_arguments
+ "--make" "\"${CMAKE_COMMAND}\" --build ${CMAKE_BINARY_DIR} --target ${target}_make_apk"
+ "--apk" "${android_build_dir}/${target}.apk"
+ )
+ endif()
+
+ set(${out_test_arguments} "${test_arguments}" PARENT_SCOPE)
endfunction()
diff --git a/cmake/QtPostProcessHelpers.cmake b/cmake/QtPostProcessHelpers.cmake
index 9f220f9d78b..07fcdee268b 100644
--- a/cmake/QtPostProcessHelpers.cmake
+++ b/cmake/QtPostProcessHelpers.cmake
@@ -790,6 +790,8 @@ function(qt_modules_process_android_dependencies)
qt_internal_get_qt_repo_known_modules(repo_known_modules)
foreach (target ${repo_known_modules})
qt_internal_android_dependencies(${target})
+ qt_internal_android_add_interface_permissions(${target})
+ qt_internal_android_add_interface_features(${target})
endforeach()
endfunction()
diff --git a/cmake/QtPublicWasmToolchainHelpers.cmake b/cmake/QtPublicWasmToolchainHelpers.cmake
index ecdca052113..32309ed05ba 100644
--- a/cmake/QtPublicWasmToolchainHelpers.cmake
+++ b/cmake/QtPublicWasmToolchainHelpers.cmake
@@ -53,7 +53,7 @@ endfunction()
function(__qt_internal_get_emcc_recommended_version out_var)
# This version of Qt needs this version of emscripten.
- set(QT_EMCC_RECOMMENDED_VERSION "3.1.70")
+ set(QT_EMCC_RECOMMENDED_VERSION "4.0.7")
set(${out_var} "${QT_EMCC_RECOMMENDED_VERSION}" PARENT_SCOPE)
endfunction()
diff --git a/cmake/QtTestHelpers.cmake b/cmake/QtTestHelpers.cmake
index ad8a9d65c14..8a0666b0ceb 100644
--- a/cmake/QtTestHelpers.cmake
+++ b/cmake/QtTestHelpers.cmake
@@ -1176,6 +1176,13 @@ function(qt_internal_collect_command_environment out_path out_plugin_path)
set(test_env_path "${test_env_path}${QT_PATH_SEPARATOR}${install_prefix}")
endforeach()
set(test_env_path "${test_env_path}${QT_PATH_SEPARATOR}$ENV{PATH}")
+ if(ANDROID)
+ # Add android platform tools to path. Required for the correct androidtestrunner work.
+ _qt_internal_android_get_platform_tools_path(platform_tools)
+ string(PREPEND test_env_path
+ "${platform_tools}" "${QT_PATH_SEPARATOR}")
+ endif()
+
string(REPLACE ";" "\;" test_env_path "${test_env_path}")
set(${out_path} "${test_env_path}" PARENT_SCOPE)
diff --git a/coin/instructions/cmake_run_ctest.yaml b/coin/instructions/cmake_run_ctest.yaml
index 0c58a83b209..43963fc172b 100644
--- a/coin/instructions/cmake_run_ctest.yaml
+++ b/coin/instructions/cmake_run_ctest.yaml
@@ -151,6 +151,8 @@ instructions:
userMessageOnFailure: >
Failed to copy LastTest.log to testresults directory.
executeOn: always
+ maxTimeInSeconds: 20
+ maxTimeBetweenOutput: 20
- type: Group
enable_if:
condition: runtime
diff --git a/coin/instructions/prepare_building_env.yaml b/coin/instructions/prepare_building_env.yaml
index 20e7ef7f01c..0330369662d 100644
--- a/coin/instructions/prepare_building_env.yaml
+++ b/coin/instructions/prepare_building_env.yaml
@@ -7,6 +7,24 @@ instructions:
- type: EnvironmentVariable
variableName: CMAKE_GENERATOR
variableValue: Ninja
+ - type: Group
+ instructions:
+ - type: AppendToEnvironmentVariable
+ variableName: COMMON_CMAKE_ARGS
+ variableValue: " -DCMAKE_MAKE_PROGRAM={{.Env.NINJA_EXECUTABLE}}"
+ - type: AppendToEnvironmentVariable
+ variableName: COMMON_NON_QTBASE_CMAKE_ARGS
+ variableValue: " -DCMAKE_MAKE_PROGRAM={{.Env.NINJA_EXECUTABLE}}"
+ - type: AppendToEnvironmentVariable
+ variableName: COMMON_TARGET_CMAKE_ARGS
+ variableValue: " -DCMAKE_MAKE_PROGRAM={{.Env.NINJA_EXECUTABLE}}"
+ - type: AppendToEnvironmentVariable
+ variableName: COMMON_NON_QTBASE_TARGET_CMAKE_ARGS
+ variableValue: " -DCMAKE_MAKE_PROGRAM={{.Env.NINJA_EXECUTABLE}}"
+ enable_if:
+ condition: runtime
+ env_var: NINJA_EXECUTABLE
+ not_equals_value: null
# Set path separator based on host platform.
# \ on Windows (double \\ for escaping the backslash)
@@ -646,6 +664,26 @@ instructions:
property: features
contains_value: Sccache
+ # VCPKG
+ - type: Group
+ instructions:
+ - type: AppendToEnvironmentVariable
+ variableName: COMMON_NON_QTBASE_CMAKE_ARGS
+ variableValue: " -DQT_USE_VCPKG=ON -DVCPKG_INSTALLED_DIR={{.Env.VCPKG_INSTALLED_DIR}} -DVCPKG_HOST_TRIPLET={{.Env.VCPKG_HOST_TRIPLET}} -DVCPKG_TARGET_TRIPLET={{.Env.VCPKG_TARGET_TRIPLET}}"
+ - type: AppendToEnvironmentVariable
+ variableName: COMMON_TEST_CMAKE_ARGS
+ variableValue: " -DQT_USE_VCPKG=ON -DVCPKG_INSTALLED_DIR={{.Env.VCPKG_INSTALLED_DIR}} -DVCPKG_HOST_TRIPLET={{.Env.VCPKG_HOST_TRIPLET}} -DVCPKG_TARGET_TRIPLET={{.Env.VCPKG_TARGET_TRIPLET}}"
+ - type: AppendToEnvironmentVariable
+ variableName: COMMON_EXAMPLES_CMAKE_ARGS
+ variableValue: " -DQT_USE_VCPKG=ON -DVCPKG_INSTALLED_DIR={{.Env.VCPKG_INSTALLED_DIR}} -DVCPKG_HOST_TRIPLET={{.Env.VCPKG_HOST_TRIPLET}} -DVCPKG_TARGET_TRIPLET={{.Env.VCPKG_TARGET_TRIPLET}}"
+ - type: AppendToEnvironmentVariable
+ variableName: COMMON_NON_QTBASE_TARGET_CMAKE_ARGS
+ variableValue: " -DQT_USE_VCPKG=ON -DVCPKG_INSTALLED_DIR={{.Env.VCPKG_INSTALLED_DIR}} -DVCPKG_HOST_TRIPLET={{.Env.VCPKG_HOST_TRIPLET}} -DVCPKG_TARGET_TRIPLET={{.Env.VCPKG_TARGET_TRIPLET}}"
+ enable_if:
+ condition: runtime
+ env_var: USE_VCPKG
+ equals_value: "ON"
+
# Specify a custom examples installation directory, so that the built example binaries are not
# packaged into the artifact archive together with the Qt libraries.
# Also specify that during examples deployment, only a subset of examples should be deployed, to
diff --git a/configure.cmake b/configure.cmake
index 4ca5f7f07d2..8d96ba7e1f0 100644
--- a/configure.cmake
+++ b/configure.cmake
@@ -292,6 +292,25 @@ int main(void)
CXX_STANDARD 23
)
+qt_config_compile_test(cxx2c
+ LABEL "C++2c support"
+ CODE
+"#if __cplusplus > 202302L
+// Compiler claims to support C++2c, trust it
+#else
+# error __cplusplus must be > 202302L (the value for C++23)
+#endif
+
+int main(void)
+{
+ /* BEGIN TEST: */
+ /* END TEST: */
+ return 0;
+}
+"
+ CXX_STANDARD 26
+)
+
qt_config_compiler_supports_flag_test(optimize_debug
LABEL "-Og support"
FLAG "-Og"
@@ -730,6 +749,12 @@ qt_feature("c++2b" PUBLIC
CONDITION QT_FEATURE_cxx20 AND (CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") AND TEST_cxx2b
)
qt_feature_config("c++2b" QMAKE_PUBLIC_QT_CONFIG)
+qt_feature("c++2c" PUBLIC
+ LABEL "C++2c"
+ AUTODETECT OFF
+ CONDITION QT_FEATURE_cxx2b AND (CMAKE_VERSION VERSION_GREATER_EQUAL "3.25") AND TEST_cxx2c
+)
+qt_feature_config("c++2c" QMAKE_PUBLIC_QT_CONFIG)
set(__qt_ltcg_detected FALSE)
if(CMAKE_INTERPROCEDURAL_OPTIMIZATION)
set(__qt_ltcg_detected TRUE)
@@ -1091,13 +1116,12 @@ qt_feature("network" PRIVATE
)
qt_feature("printsupport" PRIVATE
LABEL "Qt PrintSupport"
- CONDITION QT_FEATURE_widgets AND NOT WASM
+ CONDITION QT_FEATURE_widgets
SECTION "Module"
PURPOSE "Provides the Qt PrintSupport module."
)
qt_feature("sql" PRIVATE
LABEL "Qt Sql"
- CONDITION NOT WASM
SECTION "Module"
PURPOSE "Provides the Sql module."
)
diff --git a/dist/REUSE.toml b/dist/REUSE.toml
index f14104bf6f4..6e06fc5353f 100644
--- a/dist/REUSE.toml
+++ b/dist/REUSE.toml
@@ -4,5 +4,5 @@ version = 1
path = ["*"]
precedence = "override"
comment = "Licensed as documentation."
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"
diff --git a/doc/global/includes/cli-build-cmake.qdocinc b/doc/global/includes/cli-build-cmake.qdocinc
index b4c6ffccb4b..5f30e8632b7 100644
--- a/doc/global/includes/cli-build-cmake.qdocinc
+++ b/doc/global/includes/cli-build-cmake.qdocinc
@@ -28,7 +28,7 @@
\badcode \QtVersion
md notepad-build
cd notepad-build
- C:\Qt\\1\msvc2019_64\bin\qt-cmake -GNinja C:\Examples\notepad
+ C:\Qt\\1\msvc2022_64\bin\qt-cmake -GNinja C:\Examples\notepad
ninja
\endcode
diff --git a/examples/widgets/doc/images/treemodel-structure.png b/examples/widgets/doc/images/treemodel-structure.png
deleted file mode 100644
index 778841b6fd8..00000000000
--- a/examples/widgets/doc/images/treemodel-structure.png
+++ /dev/null
Binary files differ
diff --git a/examples/widgets/doc/images/treemodel-structure.svg b/examples/widgets/doc/images/treemodel-structure.svg
new file mode 100644
index 00000000000..f8bc24803bf
--- /dev/null
+++ b/examples/widgets/doc/images/treemodel-structure.svg
@@ -0,0 +1,93 @@
+<svg
+ preserveAspectRatio="none"
+ width="192"
+ height="350"
+ viewBox="-25 -30 153.6 280"
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg">
+
+<!-- Root node -->
+<g transform="translate(0, 0)">
+<path fill="none" stroke="#333" stroke-dasharray="4" d="M -10 -10 l 20 0 l 0 20 l -20 0 z" />
+<text x="15" y="0" font-size="12" font-family="Arial" fill="#333" text-anchor="left" dominant-baseline="central" font-weight="bold">
+ Root item (empty)
+</text>
+</g>
+
+<!-- Root spine vertical line solid part -->
+<path fill="none" stroke="#333" d="M 0 10 l 0 190" />
+
+<!-- Root spine vertical line dotted continuation -->
+<path fill="none" stroke="#333" stroke-dasharray="4" d="M 0 200 l 0 30" />
+
+<!-- Horizontal lines from Root spine to children A, E, F -->
+<path fill="none" stroke="#333" d="M 0 40 l 20 0" />
+<path fill="none" stroke="#333" d="M 0 160 l 20 0" />
+<path fill="none" stroke="#333" d="M 0 185 l 20 0" />
+
+<!-- Node A with label [0] -->
+<g transform="translate(30, 40)">
+<path fill="none" stroke="#333" d="M -10 -10 l 20 0 l 0 20 l -20 0 z"/>
+<text x="0" y="0" font-size="12" font-family="Arial" fill="#333" text-anchor="middle" dominant-baseline="central">
+ A
+</text>
+<text x="15" y="0" font-size="12" font-family="Arial" fill="#333" text-anchor="start" dominant-baseline="central">
+ row = 0
+</text>
+</g>
+
+<!-- Vertical line from A to its children -->
+<path fill="none" stroke="#333" d="M 30 50 l 0 80" />
+
+<!-- Horizontal lines from A's spine to B, C, D -->
+<path fill="none" stroke="#333" d="M 30 70 l 20 0" />
+<path fill="none" stroke="#333" d="M 30 100 l 20 0" />
+<path fill="none" stroke="#333" d="M 30 130 l 20 0" />
+
+<!-- Node B -->
+<g transform="translate(60, 70)">
+<path fill="none" stroke="#333" d="M -10 -10 l 20 0 l 0 20 l -20 0 z"/>
+<text x="15" y="0" font-size="12" font-family="Arial" fill="#333" text-anchor="start" dominant-baseline="central">
+ row = 0
+</text>
+</g>
+
+<!-- Node C -->
+<g transform="translate(60, 100)">
+<path fill="none" stroke="#333" d="M -10 -10 l 20 0 l 0 20 l -20 0 z"/>
+<text x="0" y="0" font-size="12" font-family="Arial" fill="#333" text-anchor="middle" dominant-baseline="central">
+ B
+</text>
+<text x="15" y="0" font-size="12" font-family="Arial" fill="#333" text-anchor="start" dominant-baseline="central">
+ row = 1
+</text>
+</g>
+
+<!-- Node D -->
+<g transform="translate(60, 130)">
+<path fill="none" stroke="#333" d="M -10 -10 l 20 0 l 0 20 l -20 0 z"/>
+<text x="15" y="0" font-size="12" font-family="Arial" fill="#333" text-anchor="start" dominant-baseline="central">
+ row = 2
+</text>
+</g>
+
+<!-- Node E -->
+<g transform="translate(30, 160)">
+<path fill="none" stroke="#333" d="M -10 -10 l 20 0 l 0 20 l -20 0 z"/>
+<text x="0" y="0" font-size="12" font-family="Arial" fill="#333" text-anchor="middle" dominant-baseline="central">
+ C
+</text>
+<text x="15" y="0" font-size="12" font-family="Arial" fill="#333" text-anchor="start" dominant-baseline="central">
+ row = 1
+</text>
+</g>
+
+<!-- Node F -->
+<g transform="translate(30, 185)">
+<path fill="none" stroke="#333" d="M -10 -10 l 20 0 l 0 20 l -20 0 z"/>
+<text x="15" y="0" font-size="12" font-family="Arial" fill="#333" text-anchor="start" dominant-baseline="central">
+ row = 2
+</text>
+</g>
+
+</svg>
diff --git a/examples/widgets/doc/src/shortcuteditor.qdoc b/examples/widgets/doc/src/shortcuteditor.qdoc
index 9999a184215..b17835ba168 100644
--- a/examples/widgets/doc/src/shortcuteditor.qdoc
+++ b/examples/widgets/doc/src/shortcuteditor.qdoc
@@ -30,7 +30,7 @@
two columns of data.
\table
- \row \li \inlineimage treemodel-structure.png
+ \row \li \inlineimage treemodel-structure.svg
\li \b{Shortcut Editor Structure}
The data is stored internally in the model using ShortcutEditorModelItem
diff --git a/examples/widgets/doc/src/simpletreemodel.qdoc b/examples/widgets/doc/src/simpletreemodel.qdoc
index d8e5a6faa8b..be4889adbe9 100644
--- a/examples/widgets/doc/src/simpletreemodel.qdoc
+++ b/examples/widgets/doc/src/simpletreemodel.qdoc
@@ -40,7 +40,7 @@
\target SimpleTreeModelStructure
\table
- \row \li \inlineimage treemodel-structure.png
+ \row \li \inlineimage treemodel-structure.svg
\li \b{Simple Tree Model Structure}
The data is stored internally in the model using \c TreeItem objects that
diff --git a/licenseRule.json b/licenseRule.json
index e35e8ba7fd1..b40e225e347 100644
--- a/licenseRule.json
+++ b/licenseRule.json
@@ -119,7 +119,7 @@
"file type": "test",
"spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only"]
},
- "ests/auto/testlib/selftests/": {
+ "tests/auto/testlib/selftests/(?!README)": {
"comment": "Exception. Those are test files",
"file type": "test",
"spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only"]
diff --git a/mkspecs/REUSE.toml b/mkspecs/REUSE.toml
index 7f5d9f5040a..7f452f8794d 100644
--- a/mkspecs/REUSE.toml
+++ b/mkspecs/REUSE.toml
@@ -8,13 +8,13 @@ path = ["**.plist*", "features/data/configure.json", "features/data/testserver/D
"macx-xcode/default.xcscheme"]
precedence = "closest"
comment = "build system"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "BSD-3-Clause"
[[annotations]]
path = ["modules/README"]
comment = "documentation"
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"
diff --git a/mkspecs/common/clang.conf b/mkspecs/common/clang.conf
index 6eb08a9d2fa..82c6173a037 100644
--- a/mkspecs/common/clang.conf
+++ b/mkspecs/common/clang.conf
@@ -36,11 +36,13 @@ QMAKE_CXXFLAGS_CXX14 = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
QMAKE_CXXFLAGS_CXX2A = -std=c++2a
QMAKE_CXXFLAGS_CXX2B = -std=c++2b
+QMAKE_CXXFLAGS_CXX2C = -std=c++2c
QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_CXXFLAGS_GNUCXX2A = -std=gnu++2a
QMAKE_CXXFLAGS_GNUCXX2B = -std=gnu++2b
+QMAKE_CXXFLAGS_GNUCXX2C = -std=gnu++2c
QMAKE_LFLAGS_CXX11 =
QMAKE_LFLAGS_CXX14 =
diff --git a/mkspecs/common/g++-base.conf b/mkspecs/common/g++-base.conf
index d392879f66d..e12e41506ae 100644
--- a/mkspecs/common/g++-base.conf
+++ b/mkspecs/common/g++-base.conf
@@ -34,11 +34,13 @@ QMAKE_CXXFLAGS_CXX14 = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
QMAKE_CXXFLAGS_CXX2A = -std=c++2a
QMAKE_CXXFLAGS_CXX2B = -std=c++2b
+QMAKE_CXXFLAGS_CXX2C = -std=c++2c
QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_CXXFLAGS_GNUCXX2A = -std=gnu++2a
QMAKE_CXXFLAGS_GNUCXX2B = -std=gnu++2b
+QMAKE_CXXFLAGS_GNUCXX2C = -std=gnu++2c
QMAKE_LFLAGS_CXX11 =
QMAKE_LFLAGS_CXX14 =
QMAKE_LFLAGS_CXX1Z =
diff --git a/mkspecs/common/msvc-version.conf b/mkspecs/common/msvc-version.conf
index 303b341e9d7..0130542ddb9 100644
--- a/mkspecs/common/msvc-version.conf
+++ b/mkspecs/common/msvc-version.conf
@@ -121,6 +121,7 @@ greaterThan(QMAKE_MSC_VER, 1919) {
MSVC_TOOLSET_VER = 142
QMAKE_CXXFLAGS_CXX2A = -std:c++latest
QMAKE_CXXFLAGS_CXX2B = -std:c++latest
+ QMAKE_CXXFLAGS_CXX2C = -std:c++latest
QMAKE_CXXFLAGS += -Zc:externConstexpr
}
diff --git a/mkspecs/features/default_post.prf b/mkspecs/features/default_post.prf
index a44d03c91bb..cf48bfda07f 100644
--- a/mkspecs/features/default_post.prf
+++ b/mkspecs/features/default_post.prf
@@ -124,17 +124,18 @@ breakpad {
c++17: CONFIG += c++1z
c++20: CONFIG += c++2a
c++23: CONFIG += c++2b
-c++latest: CONFIG *= c++2b c++2a c++1z c++14 c++11
+c++latest: CONFIG *= c++2c c++2b c++2a c++1z c++14 c++11
-!c++1z:!c++2a:!c++2b {
+!c++1z:!c++2a:!c++2b:!c++2c {
# Qt requires C++17
QT_COMPILER_STDCXX_no_L = $$replace(QT_COMPILER_STDCXX, "L$", "")
!greaterThan(QT_COMPILER_STDCXX_no_L, 201402): CONFIG += c++1z
}
-c++1z|c++2a|c++2b {
+c++1z|c++2a|c++2b|c++2c {
# Disable special compiler flags for host builds
!host_build|!cross_compile {
- c++2b: cxxstd = CXX2B
+ c++2c: cxxstd = CXX2C
+ else:c++2b: cxxstd = CXX2B
else:c++2a: cxxstd = CXX2A
else: cxxstd = CXX1Z
} else {
diff --git a/mkspecs/features/wasm/emcc_ver.prf b/mkspecs/features/wasm/emcc_ver.prf
index 2f801228797..bb59844c4d5 100644
--- a/mkspecs/features/wasm/emcc_ver.prf
+++ b/mkspecs/features/wasm/emcc_ver.prf
@@ -1,5 +1,5 @@
defineReplace(qtEmccRecommendedVersion) {
- return (3.1.70)
+ return (4.0.7)
}
defineReplace(qtSystemEmccVersion) {
diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp
index 96036eba701..9c29b26fb82 100644
--- a/qmake/generators/unix/unixmake2.cpp
+++ b/qmake/generators/unix/unixmake2.cpp
@@ -804,7 +804,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
QString icon = fileFixify(var("ICON"));
t << "@$(DEL_FILE) " << info_plist_out << "\n\t"
- << "@plutil -convert xml1 -o - " << info_plist << " | "
+ << "@set -o pipefail && plutil -convert xml1 -o - " << info_plist << " | "
<< "sed ";
for (const ProString &arg : std::as_const(commonSedArgs))
t << arg;
@@ -837,7 +837,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
if (!isShallowBundle)
symlinks[bundle_dir + "Resources"] = "Versions/Current/Resources";
t << "@$(DEL_FILE) " << info_plist_out << "\n\t"
- << "@plutil -convert xml1 -o - " << info_plist << " | "
+ << "@set -o pipefail && plutil -convert xml1 -o - " << info_plist << " | "
<< "sed ";
for (const ProString &arg : std::as_const(commonSedArgs))
t << arg;
diff --git a/qt_cmdline.cmake b/qt_cmdline.cmake
index 3abd265e9c7..8f68a40f3ff 100644
--- a/qt_cmdline.cmake
+++ b/qt_cmdline.cmake
@@ -174,12 +174,19 @@ function(qt_commandline_cxxstd arg val nextok)
if(val MATCHES "(c\\+\\+)?(17|1z)")
qtConfCommandlineDisableFeature(c++20)
qtConfCommandlineDisableFeature(c++2b)
+ qtConfCommandlineDisableFeature(c++2c)
elseif(val MATCHES "(c\\+\\+)?(20|2a)")
qtConfCommandlineEnableFeature(c++20)
qtConfCommandlineDisableFeature(c++2b)
+ qtConfCommandlineDisableFeature(c++2c)
elseif(val MATCHES "(c\\+\\+)?(23|2b)")
qtConfCommandlineEnableFeature(c++20)
qtConfCommandlineEnableFeature(c++2b)
+ qtConfCommandlineDisableFeature(c++2c)
+ elseif(val MATCHES "(c\\+\\+)?(2c)")
+ qtConfCommandlineEnableFeature(c++20)
+ qtConfCommandlineEnableFeature(c++2b)
+ qtConfCommandlineEnableFeature(c++2c)
else()
qtConfAddError("Invalid argument '${val}' to command line parameter '${arg}'")
endif()
diff --git a/src/3rdparty/freetype/REUSE.toml b/src/3rdparty/freetype/REUSE.toml
index f2fc6b3e2bc..6cc074c1947 100644
--- a/src/3rdparty/freetype/REUSE.toml
+++ b/src/3rdparty/freetype/REUSE.toml
@@ -10,5 +10,5 @@ SPDX-License-Identifier = "FTL OR GPL-2.0-only"
path = ["CMakeLists.txt"]
precedence = "override"
SPDX-FileCopyrightText = ["Copyright (C) 2013-2024 by David Turner, Robert Wilhelm, and Werner Lemberg.",
-"Copyright (C) 2024 The Qt Company Ltd."]
+"Copyright (C) The Qt Company Ltd."]
SPDX-License-Identifier = "FTL OR GPL-2.0-only"
diff --git a/src/3rdparty/freetype/docs/REUSE.toml b/src/3rdparty/freetype/docs/REUSE.toml
index 873ff919050..84576882473 100644
--- a/src/3rdparty/freetype/docs/REUSE.toml
+++ b/src/3rdparty/freetype/docs/REUSE.toml
@@ -46,5 +46,5 @@ SPDX-License-Identifier = "GPL-2.0-only"
path = "REUSE.toml"
comment = "The copyrights inside those files are not related to the file"
precedence = "override"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "BSD-3-Clause"
diff --git a/src/3rdparty/freetype/src/pcf/REUSE.toml b/src/3rdparty/freetype/src/pcf/REUSE.toml
index 4eecd7a22bc..52d5b551e34 100644
--- a/src/3rdparty/freetype/src/pcf/REUSE.toml
+++ b/src/3rdparty/freetype/src/pcf/REUSE.toml
@@ -24,5 +24,5 @@ SPDX-License-Identifier = "FTL OR GPL-2.0-only"
path = ["REUSE.toml"]
comment = "The copyrights inside those files are not related to the file"
precedence = "override"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "BSD-3-Clause"
diff --git a/src/3rdparty/freetype/src/sdf/REUSE.toml b/src/3rdparty/freetype/src/sdf/REUSE.toml
index f25732fce90..ff7ddb872db 100644
--- a/src/3rdparty/freetype/src/sdf/REUSE.toml
+++ b/src/3rdparty/freetype/src/sdf/REUSE.toml
@@ -11,5 +11,5 @@ SPDX-License-Identifier = "FTL OR GPL-2.0-only"
path = "REUSE.toml"
comment = "The copyrights inside those files are not related to the file"
precedence = "override"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "BSD-3-Clause"
diff --git a/src/3rdparty/gradle/gradle.properties b/src/3rdparty/gradle/gradle.properties
index 4fe1674abd3..3472b396d96 100644
--- a/src/3rdparty/gradle/gradle.properties
+++ b/src/3rdparty/gradle/gradle.properties
@@ -16,3 +16,6 @@ org.gradle.parallel=true
# Allow AndroidX usage
android.useAndroidX=true
+
+# User-defined properties
+@EXTRA_PROPERTIES@
diff --git a/src/3rdparty/libpng/ANNOUNCE b/src/3rdparty/libpng/ANNOUNCE
index 90c766594e7..516e078082d 100644
--- a/src/3rdparty/libpng/ANNOUNCE
+++ b/src/3rdparty/libpng/ANNOUNCE
@@ -1,5 +1,5 @@
-libpng 1.6.49 - June 12, 2025
-=============================
+libpng 1.6.50 - July 1, 2025
+============================
This is a public release of libpng, intended for use in production code.
@@ -9,13 +9,13 @@ Files available for download
Source files with LF line endings (for Unix/Linux):
- * libpng-1.6.49.tar.xz (LZMA-compressed, recommended)
- * libpng-1.6.49.tar.gz (deflate-compressed)
+ * libpng-1.6.50.tar.xz (LZMA-compressed, recommended)
+ * libpng-1.6.50.tar.gz (deflate-compressed)
Source files with CRLF line endings (for Windows):
- * lpng1649.7z (LZMA-compressed, recommended)
- * lpng1649.zip (deflate-compressed)
+ * lpng1650.7z (LZMA-compressed, recommended)
+ * lpng1650.zip (deflate-compressed)
Other information:
@@ -25,13 +25,18 @@ Other information:
* TRADEMARK.md
-Changes from version 1.6.48 to version 1.6.49
+Changes from version 1.6.49 to version 1.6.50
---------------------------------------------
- * Added SIMD-optimized code for the RISC-V Vector Extension (RVV).
- (Contributed by Manfred Schlaegl, Dragos Tiselice and Filip Wasil)
- * Added various fixes and improvements to the build scripts and to
- the sample code.
+ * Improved the detection of the RVV Extension on the RISC-V platform.
+ (Contributed by Filip Wasil)
+ * Replaced inline ASM with C intrinsics in the RVV code.
+ (Contributed by Filip Wasil)
+ * Fixed a decoder defect in which unknown chunks trailing IDAT, set
+ to go through the unknown chunk handler, incorrectly triggered
+ out-of-place IEND errors.
+ (Contributed by John Bowler)
+ * Fixed the CMake file for cross-platform builds that require `libm`.
Send comments/corrections/commendations to png-mng-implement at lists.sf.net.
diff --git a/src/3rdparty/libpng/CHANGES b/src/3rdparty/libpng/CHANGES
index 0c0fa6dc70b..b6499b1f34c 100644
--- a/src/3rdparty/libpng/CHANGES
+++ b/src/3rdparty/libpng/CHANGES
@@ -6267,6 +6267,17 @@ Version 1.6.49 [June 12, 2025]
Added various fixes and improvements to the build scripts and to
the sample code.
+Version 1.6.50 [July 1, 2025]
+ Improved the detection of the RVV Extension on the RISC-V platform.
+ (Contributed by Filip Wasil)
+ Replaced inline ASM with C intrinsics in the RVV code.
+ (Contributed by Filip Wasil)
+ Fixed a decoder defect in which unknown chunks trailing IDAT, set
+ to go through the unknown chunk handler, incorrectly triggered
+ out-of-place IEND errors.
+ (Contributed by John Bowler)
+ Fixed the CMake file for cross-platform builds that require `libm`.
+
Send comments/corrections/commendations to png-mng-implement at lists.sf.net.
Subscription is required; visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
diff --git a/src/3rdparty/libpng/README b/src/3rdparty/libpng/README
index 9f2b2d0ed53..2eb633ac0fb 100644
--- a/src/3rdparty/libpng/README
+++ b/src/3rdparty/libpng/README
@@ -1,4 +1,4 @@
-README for libpng version 1.6.49
+README for libpng version 1.6.50
================================
See the note about version numbers near the top of `png.h`.
diff --git a/src/3rdparty/libpng/libpng-manual.txt b/src/3rdparty/libpng/libpng-manual.txt
index f4e151f0c23..6c07e1022b6 100644
--- a/src/3rdparty/libpng/libpng-manual.txt
+++ b/src/3rdparty/libpng/libpng-manual.txt
@@ -9,7 +9,7 @@ libpng-manual.txt - A description on how to use and modify libpng
Based on:
- libpng version 1.6.36, December 2018, through 1.6.49 - June 2025
+ libpng version 1.6.36, December 2018, through 1.6.50 - July 2025
Updated and distributed by Cosmin Truta
Copyright (c) 2018-2025 Cosmin Truta
@@ -65,18 +65,22 @@ Libpng was written as a companion to the PNG specification, as a way
of reducing the amount of time and effort it takes to support the PNG
file format in application programs.
-The PNG specification (second edition), November 2003, is available as
+The PNG specification (Third Edition), June 2025, is available as
+a W3C Recommendation at
+<https://www.w3.org/TR/2025/REC-png-3-20250624/>.
+
+The PNG specification (Second Edition), November 2003, is available as
a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2004 (E)) at
<https://www.w3.org/TR/2003/REC-PNG-20031110/>.
The W3C and ISO documents have identical technical content.
The PNG-1.2 specification is available at
-<https://png-mng.sourceforge.io/pub/png/spec/1.2/>.
-It is technically equivalent
-to the PNG specification (second edition) but has some additional material.
+<https://www.libpng.org/pub/png/spec/1.2/>.
+It is technically equivalent to the PNG specification (Second Edition)
+but has some additional material.
The PNG-1.0 specification is available as RFC 2083 at
-<https://png-mng.sourceforge.io/pub/png/spec/1.0/> and as a
+<https://www.libpng.org/pub/png/spec/1.0/> and as a
W3C Recommendation at <https://www.w3.org/TR/REC-png-961001>.
Some additional chunks are described in the special-purpose public chunks
diff --git a/src/3rdparty/libpng/png.c b/src/3rdparty/libpng/png.c
index 8a77b6db5f2..6e21915c402 100644
--- a/src/3rdparty/libpng/png.c
+++ b/src/3rdparty/libpng/png.c
@@ -13,7 +13,7 @@
#include "pngpriv.h"
/* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_6_49 Your_png_h_is_not_version_1_6_49;
+typedef png_libpng_version_1_6_50 Your_png_h_is_not_version_1_6_50;
/* Sanity check the chunks definitions - PNG_KNOWN_CHUNKS from pngpriv.h and the
* corresponding macro definitions. This causes a compile time failure if
@@ -815,7 +815,7 @@ png_get_copyright(png_const_structrp png_ptr)
return PNG_STRING_COPYRIGHT
#else
return PNG_STRING_NEWLINE \
- "libpng version 1.6.49" PNG_STRING_NEWLINE \
+ "libpng version 1.6.50" PNG_STRING_NEWLINE \
"Copyright (c) 2018-2025 Cosmin Truta" PNG_STRING_NEWLINE \
"Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \
PNG_STRING_NEWLINE \
diff --git a/src/3rdparty/libpng/png.h b/src/3rdparty/libpng/png.h
index f43e49c521a..b9985e81680 100644
--- a/src/3rdparty/libpng/png.h
+++ b/src/3rdparty/libpng/png.h
@@ -1,6 +1,6 @@
/* png.h - header file for PNG reference library
*
- * libpng version 1.6.49
+ * libpng version 1.6.50
*
* Copyright (c) 2018-2025 Cosmin Truta
* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
@@ -14,7 +14,7 @@
* libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
* libpng versions 0.97, January 1998, through 1.6.35, July 2018:
* Glenn Randers-Pehrson
- * libpng versions 1.6.36, December 2018, through 1.6.49, June 2025:
+ * libpng versions 1.6.36, December 2018, through 1.6.50, July 2025:
* Cosmin Truta
* See also "Contributing Authors", below.
*/
@@ -238,7 +238,7 @@
* ...
* 1.5.30 15 10530 15.so.15.30[.0]
* ...
- * 1.6.49 16 10649 16.so.16.49[.0]
+ * 1.6.50 16 10650 16.so.16.50[.0]
*
* Henceforth the source version will match the shared-library major and
* minor numbers; the shared-library major version number will be used for
@@ -274,7 +274,7 @@
*/
/* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.6.49"
+#define PNG_LIBPNG_VER_STRING "1.6.50"
#define PNG_HEADER_VERSION_STRING " libpng version " PNG_LIBPNG_VER_STRING "\n"
/* The versions of shared library builds should stay in sync, going forward */
@@ -285,7 +285,7 @@
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
#define PNG_LIBPNG_VER_MAJOR 1
#define PNG_LIBPNG_VER_MINOR 6
-#define PNG_LIBPNG_VER_RELEASE 49
+#define PNG_LIBPNG_VER_RELEASE 50
/* This should be zero for a public release, or non-zero for a
* development version.
@@ -316,7 +316,7 @@
* From version 1.0.1 it is:
* XXYYZZ, where XX=major, YY=minor, ZZ=release
*/
-#define PNG_LIBPNG_VER 10649 /* 1.6.49 */
+#define PNG_LIBPNG_VER 10650 /* 1.6.50 */
/* Library configuration: these options cannot be changed after
* the library has been built.
@@ -426,7 +426,7 @@ extern "C" {
/* This triggers a compiler error in png.c, if png.c and png.h
* do not agree upon the version number.
*/
-typedef char* png_libpng_version_1_6_49;
+typedef char* png_libpng_version_1_6_50;
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
*
diff --git a/src/3rdparty/libpng/pngconf.h b/src/3rdparty/libpng/pngconf.h
index e92a3b1eca4..d1081b54ddd 100644
--- a/src/3rdparty/libpng/pngconf.h
+++ b/src/3rdparty/libpng/pngconf.h
@@ -1,6 +1,6 @@
/* pngconf.h - machine-configurable file for libpng
*
- * libpng version 1.6.49
+ * libpng version 1.6.50
*
* Copyright (c) 2018-2025 Cosmin Truta
* Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson
diff --git a/src/3rdparty/libpng/pnglibconf.h b/src/3rdparty/libpng/pnglibconf.h
index ea61c441ba6..f15fc16dade 100644
--- a/src/3rdparty/libpng/pnglibconf.h
+++ b/src/3rdparty/libpng/pnglibconf.h
@@ -1,6 +1,6 @@
/* pnglibconf.h - library build configuration */
-/* libpng version 1.6.49 */
+/* libpng version 1.6.50 */
/* Copyright (c) 2018-2025 Cosmin Truta */
/* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */
diff --git a/src/3rdparty/libpng/pngpread.c b/src/3rdparty/libpng/pngpread.c
index 0a3e822cf47..37aa432aeca 100644
--- a/src/3rdparty/libpng/pngpread.c
+++ b/src/3rdparty/libpng/pngpread.c
@@ -229,6 +229,14 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
png_benign_error(png_ptr, "Too many IDATs found");
}
+ else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
+ {
+ /* These flags must be set consistently for all non-IDAT chunks,
+ * including the unknown chunks.
+ */
+ png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT | PNG_AFTER_IDAT;
+ }
+
if (chunk_name == png_IHDR)
{
if (png_ptr->push_length != 13)
diff --git a/src/3rdparty/libpng/pngpriv.h b/src/3rdparty/libpng/pngpriv.h
index cb44a6aec8a..e3054b90aae 100644
--- a/src/3rdparty/libpng/pngpriv.h
+++ b/src/3rdparty/libpng/pngpriv.h
@@ -154,11 +154,7 @@
* to configure or put -DPNG_RISCV_RVV_OPT=2 in CPPFLAGS.
*/
-# if defined(__riscv) && defined(PNG_ALIGNED_MEMORY_SUPPORTED)
-# define PNG_RISCV_RVV_OPT 1
-# else
-# define PNG_RISCV_RVV_OPT 0
-# endif
+# define PNG_RISCV_RVV_OPT 0
#endif
#if PNG_ARM_NEON_OPT > 0
diff --git a/src/3rdparty/libpng/pngread.c b/src/3rdparty/libpng/pngread.c
index a0dbf2ae208..212afb7d215 100644
--- a/src/3rdparty/libpng/pngread.c
+++ b/src/3rdparty/libpng/pngread.c
@@ -702,7 +702,12 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
png_uint_32 chunk_name = png_ptr->chunk_name;
if (chunk_name != png_IDAT)
- png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
+ {
+ /* These flags must be set consistently for all non-IDAT chunks,
+ * including the unknown chunks.
+ */
+ png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT | PNG_AFTER_IDAT;
+ }
if (chunk_name == png_IEND)
png_handle_chunk(png_ptr, info_ptr, length);
diff --git a/src/3rdparty/libpng/pngrutil.c b/src/3rdparty/libpng/pngrutil.c
index 7d9a00186dc..e7c7bbe48e9 100644
--- a/src/3rdparty/libpng/pngrutil.c
+++ b/src/3rdparty/libpng/pngrutil.c
@@ -2412,10 +2412,6 @@ png_handle_tEXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
}
#endif
- /* TODO: this doesn't work and shouldn't be necessary. */
- if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
- png_ptr->mode |= PNG_AFTER_IDAT;
-
buffer = png_read_buffer(png_ptr, length+1);
if (buffer == NULL)
@@ -2486,10 +2482,6 @@ png_handle_zTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
}
#endif
- /* TODO: should not be necessary. */
- if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
- png_ptr->mode |= PNG_AFTER_IDAT;
-
/* Note, "length" is sufficient here; we won't be adding
* a null terminator later. The limit check in png_handle_chunk should be
* sufficient.
@@ -2606,10 +2598,6 @@ png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
}
#endif
- /* TODO: should not be necessary. */
- if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
- png_ptr->mode |= PNG_AFTER_IDAT;
-
buffer = png_read_buffer(png_ptr, length+1);
if (buffer == NULL)
diff --git a/src/3rdparty/libpng/qt_attribution.json b/src/3rdparty/libpng/qt_attribution.json
index 49d0b6ca79f..9327dee564c 100644
--- a/src/3rdparty/libpng/qt_attribution.json
+++ b/src/3rdparty/libpng/qt_attribution.json
@@ -7,8 +7,8 @@
"Description": "libpng is the official PNG reference library.",
"Homepage": "http://www.libpng.org/pub/png/libpng.html",
- "Version": "1.6.49",
- "DownloadLocation": "https://download.sourceforge.net/libpng/libpng-1.6.49.tar.xz",
+ "Version": "1.6.50",
+ "DownloadLocation": "https://download.sourceforge.net/libpng/libpng-1.6.50.tar.xz",
"PURL": "pkg:github/pnggroup/libpng@v$<VERSION>",
"CPE": "cpe:2.3:a:libpng:libpng:$<VERSION>:*:*:*:*:*:*:*",
diff --git a/src/3rdparty/wayland/extensions/REUSE.toml b/src/3rdparty/wayland/extensions/REUSE.toml
index 7debc4f4e09..72b4251a911 100644
--- a/src/3rdparty/wayland/extensions/REUSE.toml
+++ b/src/3rdparty/wayland/extensions/REUSE.toml
@@ -4,5 +4,5 @@ version = 1
path = "qt-text-input-method-unstable-v1.xml"
precedence = "closest"
comment = "License is in full text in file. Should it be changed?"
-SPDX-FileCopyrightText = "Copyright © 2020 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright © The Qt Company Ltd."
SPDX-License-Identifier = "MIT"
diff --git a/src/android/CMakeLists.txt b/src/android/CMakeLists.txt
index 7c99ce7264e..12fbca624b3 100644
--- a/src/android/CMakeLists.txt
+++ b/src/android/CMakeLists.txt
@@ -9,6 +9,7 @@ if (ANDROID)
add_subdirectory(java)
add_subdirectory(templates)
add_subdirectory(templates_aar)
+ add_subdirectory(templates_cmake)
endif()
qt_internal_add_java_documentation(Global)
diff --git a/src/android/REUSE.toml b/src/android/REUSE.toml
index 7d5a22fd2f7..04b82f125e9 100644
--- a/src/android/REUSE.toml
+++ b/src/android/REUSE.toml
@@ -1,15 +1,21 @@
version = 1
[[annotations]]
-path = ["jar/build.gradle", "jar/settings.gradle", "templates/build.gradle"]
+path = ["jar/build.gradle", "jar/settings.gradle", "templates/build.gradle", "templates_cmake/**", "templates_aar/**", "templates/**", "**.xml"]
precedence = "closest"
comment = "double check"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
[[annotations]]
path = ["java/READ-THIS-BEFORE-MANUALLY-ADDING-FILES-TO-PACKAGE.txt"]
comment = "documentation"
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"
+
+[[annotations]]
+path = ["**.gitignore"]
+precedence = "closest"
+SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause"
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java b/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java
index 542d05627c9..61f8f4b8d53 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtAccessibilityDelegate.java
@@ -28,10 +28,6 @@ class QtAccessibilityDelegate extends View.AccessibilityDelegate
// all low positive ints should be fine.
static final int INVALID_ID = 333; // half evil
- // The platform might ask for the class implementing the "view".
- // Pretend to be an inner class of the QtSurface.
- private static final String DEFAULT_CLASS_NAME = "$VirtualChild";
-
private View m_view = null;
private AccessibilityManager m_manager;
private QtLayout m_layout;
@@ -247,7 +243,7 @@ class QtAccessibilityDelegate extends View.AccessibilityDelegate
AccessibilityEvent.obtain(AccessibilityEvent.TYPE_ANNOUNCEMENT);
event.setEnabled(true);
- event.setClassName(m_view.getClass().getName() + DEFAULT_CLASS_NAME);
+ event.setClassName(getNodeForVirtualViewId(viewId).getClassName());
event.setContentDescription(value);
@@ -323,7 +319,7 @@ class QtAccessibilityDelegate extends View.AccessibilityDelegate
final AccessibilityEvent event = AccessibilityEvent.obtain(eventType);
event.setEnabled(true);
- event.setClassName(m_view.getClass().getName() + DEFAULT_CLASS_NAME);
+ event.setClassName(getNodeForVirtualViewId(virtualViewId).getClassName());
event.setContentDescription(QtNativeAccessibility.descriptionForAccessibleObject(virtualViewId));
if (event.getText().isEmpty() && TextUtils.isEmpty(event.getContentDescription()))
@@ -419,7 +415,6 @@ class QtAccessibilityDelegate extends View.AccessibilityDelegate
final AccessibilityNodeInfo node = AccessibilityNodeInfo.obtain();
- node.setClassName(m_view.getClass().getName() + DEFAULT_CLASS_NAME);
node.setPackageName(m_view.getContext().getPackageName());
if (m_layout.getChildCount() == 0 || !QtNativeAccessibility.populateNode(virtualViewId, node)) {
diff --git a/src/android/jar/src/org/qtproject/qt/android/QtView.java b/src/android/jar/src/org/qtproject/qt/android/QtView.java
index 9d7850cb517..afe4d005402 100644
--- a/src/android/jar/src/org/qtproject/qt/android/QtView.java
+++ b/src/android/jar/src/org/qtproject/qt/android/QtView.java
@@ -1,6 +1,6 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
-// Qt-Security score:critical reason:executing-external-code
+// Qt-Security score:critical reason:execute-external-code
package org.qtproject.qt.android;
diff --git a/src/android/templates/build.gradle b/src/android/templates/build.gradle
index 6595cb5358f..b6c4797fde7 100644
--- a/src/android/templates/build.gradle
+++ b/src/android/templates/build.gradle
@@ -70,8 +70,8 @@ android {
abortOnError = false
}
- // Do not compress Qt binary resources file
aaptOptions {
+ // Do not compress Qt binary resources file
noCompress 'rcc'
}
diff --git a/src/android/templates_cmake/CMakeLists.txt b/src/android/templates_cmake/CMakeLists.txt
new file mode 100644
index 00000000000..546a4fc50f3
--- /dev/null
+++ b/src/android/templates_cmake/CMakeLists.txt
@@ -0,0 +1,46 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+set(templates_files
+ "${CMAKE_CURRENT_SOURCE_DIR}/settings.gradle.in"
+ "${CMAKE_CURRENT_SOURCE_DIR}/gradle.properties.in"
+)
+
+set(app_template_files
+ "${CMAKE_CURRENT_SOURCE_DIR}/app/gradle.properties.in"
+ "${CMAKE_CURRENT_SOURCE_DIR}/app/build.gradle.in"
+ "${CMAKE_CURRENT_SOURCE_DIR}/app/AndroidManifest.xml.in"
+)
+
+set(dynamic_feature_files
+ "${CMAKE_CURRENT_SOURCE_DIR}/dynamic_feature/AndroidManifest.xml.in"
+ "${CMAKE_CURRENT_SOURCE_DIR}/dynamic_feature/build.gradle.in"
+)
+
+add_custom_target(Qt6AndroidCMakeTemplates
+ SOURCES
+ ${templates_files}
+)
+
+qt_path_join(destination ${QT_INSTALL_DIR} ${INSTALL_DATADIR} "src/android/templates_cmake")
+
+qt_copy_or_install(FILES ${templates_files} DESTINATION "${destination}")
+qt_copy_or_install(FILES ${app_template_files} DESTINATION "${destination}/app")
+qt_copy_or_install(FILES ${dynamic_feature_files} DESTINATION "${destination}/dynamic_feature")
+
+if(NOT QT_WILL_INSTALL)
+ qt_internal_copy_at_build_time(TARGET Qt6AndroidCMakeTemplates
+ FILES ${templates_files}
+ DESTINATION ${destination}
+ )
+
+ qt_internal_copy_at_build_time(TARGET Qt6AndroidCMakeTemplates
+ FILES ${app_templates_files}
+ DESTINATION ${destination}/app
+ )
+
+ qt_internal_copy_at_build_time(TARGET Qt6AndroidCMakeTemplates
+ FILES ${dynamic_feature_files}
+ DESTINATION ${destination}/dynamic_feature
+ )
+endif()
diff --git a/src/android/templates_cmake/app/AndroidManifest.xml.in b/src/android/templates_cmake/app/AndroidManifest.xml.in
new file mode 100644
index 00000000000..61c33cc7657
--- /dev/null
+++ b/src/android/templates_cmake/app/AndroidManifest.xml.in
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:dist="http://schemas.android.com/apk/distribution"
+ package="@APP_PACKAGE_NAME@"
+ android:installLocation="auto"
+ android:versionCode="@APP_VERSION_CODE@"
+ android:versionName="@APP_VERSION_NAME@">
+ @APP_PERMISSIONS@
+ @APP_FEATURES@
+ <dist:module dist:instant="true"/>
+ <supports-screens
+ android:anyDensity="true"
+ android:largeScreens="true"
+ android:normalScreens="true"
+ android:smallScreens="true" />
+ <application
+ android:name="org.qtproject.qt.android.bindings.QtApplication"
+ android:hardwareAccelerated="true"
+ android:label="@APP_NAME@"
+ @APP_ICON@
+ android:requestLegacyExternalStorage="true"
+ android:allowBackup="true"
+ android:fullBackupOnly="false">
+ <activity
+ android:name="org.qtproject.qt.android.bindings.QtActivity"
+ android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density"
+ android:launchMode="singleTop"
+ android:screenOrientation="unspecified"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+
+ <meta-data
+ android:name="android.app.lib_name"
+ android:value="@APP_LIB_NAME@" />
+
+ <meta-data
+ android:name="android.app.arguments"
+ android:value="@APP_ARGUMENTS@" />
+ </activity>
+
+ <provider
+ android:name="androidx.core.content.FileProvider"
+ android:authorities="${applicationId}.qtprovider"
+ android:exported="false"
+ android:grantUriPermissions="true">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/qtprovider_paths"/>
+ </provider>
+ </application>
+</manifest>
diff --git a/src/android/templates_cmake/app/build.gradle.in b/src/android/templates_cmake/app/build.gradle.in
new file mode 100644
index 00000000000..917f371e46f
--- /dev/null
+++ b/src/android/templates_cmake/app/build.gradle.in
@@ -0,0 +1,53 @@
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:8.10.1'
+ }
+}
+
+apply plugin: '@GRADLE_PLUGIN_TYPE@'
+
+dependencies {
+ @GRADLE_DEPENDENCIES@
+}
+
+android {
+ namespace '@PACKAGE_NAME@'
+ compileSdkVersion '@ANDROID_COMPILE_SDK_VERSION@'
+ buildToolsVersion '@ANDROID_BUILD_TOOLS_VERSION@'
+ ndkVersion '@ANDROID_NDK_REVISION@'
+
+ defaultConfig {
+ @DEFAULT_CONFIG_VALUES@
+ }
+
+ sourceSets {
+ main {
+@SOURCE_SETS@
+ }
+ }
+
+ tasks.withType(JavaCompile) {
+ options.incremental = true
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+
+ aaptOptions {
+ // Do not compress Qt binary resources file
+ noCompress 'rcc'
+ }
+
+ @ANDROID_DEPLOYMENT_EXTRAS@
+}
diff --git a/src/android/templates_cmake/app/gradle.properties.in b/src/android/templates_cmake/app/gradle.properties.in
new file mode 100644
index 00000000000..1136551f3fa
--- /dev/null
+++ b/src/android/templates_cmake/app/gradle.properties.in
@@ -0,0 +1 @@
+# Extend this template with the extra gradle properties applicable for Android app.
diff --git a/src/android/templates_cmake/dynamic_feature/AndroidManifest.xml.in b/src/android/templates_cmake/dynamic_feature/AndroidManifest.xml.in
new file mode 100644
index 00000000000..9945ec76f27
--- /dev/null
+++ b/src/android/templates_cmake/dynamic_feature/AndroidManifest.xml.in
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:dist="http://schemas.android.com/apk/distribution"
+ split="@APP_TARGET@"
+ android:isFeatureSplit="true">
+ <dist:module
+ dist:instant="true"
+ dist:title="@TITLE_VAR@">
+ <dist:delivery>
+ <dist:on-demand />
+ </dist:delivery>
+ <dist:fusing dist:include="false" />
+ </dist:module>
+ <application android:hasCode="false"/>
+</manifest>
diff --git a/src/android/templates_cmake/dynamic_feature/build.gradle.in b/src/android/templates_cmake/dynamic_feature/build.gradle.in
new file mode 100644
index 00000000000..917f371e46f
--- /dev/null
+++ b/src/android/templates_cmake/dynamic_feature/build.gradle.in
@@ -0,0 +1,53 @@
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:8.10.1'
+ }
+}
+
+apply plugin: '@GRADLE_PLUGIN_TYPE@'
+
+dependencies {
+ @GRADLE_DEPENDENCIES@
+}
+
+android {
+ namespace '@PACKAGE_NAME@'
+ compileSdkVersion '@ANDROID_COMPILE_SDK_VERSION@'
+ buildToolsVersion '@ANDROID_BUILD_TOOLS_VERSION@'
+ ndkVersion '@ANDROID_NDK_REVISION@'
+
+ defaultConfig {
+ @DEFAULT_CONFIG_VALUES@
+ }
+
+ sourceSets {
+ main {
+@SOURCE_SETS@
+ }
+ }
+
+ tasks.withType(JavaCompile) {
+ options.incremental = true
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+
+ aaptOptions {
+ // Do not compress Qt binary resources file
+ noCompress 'rcc'
+ }
+
+ @ANDROID_DEPLOYMENT_EXTRAS@
+}
diff --git a/src/android/templates_cmake/gradle.properties.in b/src/android/templates_cmake/gradle.properties.in
new file mode 100644
index 00000000000..b751946190a
--- /dev/null
+++ b/src/android/templates_cmake/gradle.properties.in
@@ -0,0 +1,12 @@
+# Project-wide Gradle settings.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2500m -XX:MaxMetaspaceSize=768m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# Enable building projects in parallel
+org.gradle.parallel=true
+
+# Allow AndroidX usage
+android.useAndroidX=true
diff --git a/src/android/templates_cmake/settings.gradle.in b/src/android/templates_cmake/settings.gradle.in
new file mode 100644
index 00000000000..03954ae5f9f
--- /dev/null
+++ b/src/android/templates_cmake/settings.gradle.in
@@ -0,0 +1,18 @@
+pluginManagement {
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.name = "@ROOT_PROJECT_NAME@"
+include(":app")
+@SUBPROJECTS@
diff --git a/src/assets/CMakeLists.txt b/src/assets/CMakeLists.txt
index da9c0c14eea..ab07d27696e 100644
--- a/src/assets/CMakeLists.txt
+++ b/src/assets/CMakeLists.txt
@@ -1,6 +1,5 @@
# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
-add_subdirectory(icons)
if (NOT INTEGRITY AND TARGET Qt6::Network AND TARGET Qt6::Concurrent)
add_subdirectory(downloader)
diff --git a/src/assets/icons/128x128/document-new.png b/src/assets/icons/128x128/document-new.png
deleted file mode 100644
index 8d86a4827a7..00000000000
--- a/src/assets/icons/128x128/document-new.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/document-open.png b/src/assets/icons/128x128/document-open.png
deleted file mode 100644
index 2183dbbea64..00000000000
--- a/src/assets/icons/128x128/document-open.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/document-print.png b/src/assets/icons/128x128/document-print.png
deleted file mode 100644
index 9e7378aab2a..00000000000
--- a/src/assets/icons/128x128/document-print.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/document-save.png b/src/assets/icons/128x128/document-save.png
deleted file mode 100644
index e8b28406433..00000000000
--- a/src/assets/icons/128x128/document-save.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/edit-copy.png b/src/assets/icons/128x128/edit-copy.png
deleted file mode 100644
index 7585f4baa0c..00000000000
--- a/src/assets/icons/128x128/edit-copy.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/edit-cut.png b/src/assets/icons/128x128/edit-cut.png
deleted file mode 100644
index 51ede2fe37e..00000000000
--- a/src/assets/icons/128x128/edit-cut.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/edit-delete.png b/src/assets/icons/128x128/edit-delete.png
deleted file mode 100644
index bdf785c8285..00000000000
--- a/src/assets/icons/128x128/edit-delete.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/edit-paste.png b/src/assets/icons/128x128/edit-paste.png
deleted file mode 100644
index 690ffa172d9..00000000000
--- a/src/assets/icons/128x128/edit-paste.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/edit-redo.png b/src/assets/icons/128x128/edit-redo.png
deleted file mode 100644
index f1c97f71c25..00000000000
--- a/src/assets/icons/128x128/edit-redo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/edit-undo.png b/src/assets/icons/128x128/edit-undo.png
deleted file mode 100644
index e728cbf6e03..00000000000
--- a/src/assets/icons/128x128/edit-undo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-justify-center.png b/src/assets/icons/128x128/format-justify-center.png
deleted file mode 100644
index 44ceb2af4d5..00000000000
--- a/src/assets/icons/128x128/format-justify-center.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-justify-fill.png b/src/assets/icons/128x128/format-justify-fill.png
deleted file mode 100644
index b99a8507046..00000000000
--- a/src/assets/icons/128x128/format-justify-fill.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-justify-left.png b/src/assets/icons/128x128/format-justify-left.png
deleted file mode 100644
index 2b63887b495..00000000000
--- a/src/assets/icons/128x128/format-justify-left.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-justify-right.png b/src/assets/icons/128x128/format-justify-right.png
deleted file mode 100644
index 6c61889d595..00000000000
--- a/src/assets/icons/128x128/format-justify-right.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-text-bold.png b/src/assets/icons/128x128/format-text-bold.png
deleted file mode 100644
index 96a5ca88a22..00000000000
--- a/src/assets/icons/128x128/format-text-bold.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-text-italic.png b/src/assets/icons/128x128/format-text-italic.png
deleted file mode 100644
index 2bb71b4a4d3..00000000000
--- a/src/assets/icons/128x128/format-text-italic.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128/format-text-underline.png b/src/assets/icons/128x128/format-text-underline.png
deleted file mode 100644
index ecf6830c929..00000000000
--- a/src/assets/icons/128x128/format-text-underline.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 32776b51a96..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 06e188b93b9..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 644e3c149af..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 16fa70493a2..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index b18bead117f..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index d9454cebf1c..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 4081cdb2ca7..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 3358426818d..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index e28b28542c6..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index fe10f57a398..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index d4ad74b0d07..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index bf0dd84bbb0..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index dde68c8514a..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 8a5e7518bdc..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 665d3ce37b5..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 4b6846a6b98..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/128x128@2/[email protected] b/src/assets/icons/128x128@2/[email protected]
deleted file mode 100644
index 601f73216a3..00000000000
--- a/src/assets/icons/128x128@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/document-new.png b/src/assets/icons/16x16/document-new.png
deleted file mode 100644
index 893e7e1aec4..00000000000
--- a/src/assets/icons/16x16/document-new.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/document-open.png b/src/assets/icons/16x16/document-open.png
deleted file mode 100644
index b07906f40bd..00000000000
--- a/src/assets/icons/16x16/document-open.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/document-print.png b/src/assets/icons/16x16/document-print.png
deleted file mode 100644
index 9341060076f..00000000000
--- a/src/assets/icons/16x16/document-print.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/document-save.png b/src/assets/icons/16x16/document-save.png
deleted file mode 100644
index 6238718191b..00000000000
--- a/src/assets/icons/16x16/document-save.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/edit-copy.png b/src/assets/icons/16x16/edit-copy.png
deleted file mode 100644
index 585f5bfc8d8..00000000000
--- a/src/assets/icons/16x16/edit-copy.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/edit-cut.png b/src/assets/icons/16x16/edit-cut.png
deleted file mode 100644
index 661ef1ad030..00000000000
--- a/src/assets/icons/16x16/edit-cut.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/edit-delete.png b/src/assets/icons/16x16/edit-delete.png
deleted file mode 100644
index 7b5998df8a4..00000000000
--- a/src/assets/icons/16x16/edit-delete.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/edit-paste.png b/src/assets/icons/16x16/edit-paste.png
deleted file mode 100644
index 6318a22caf3..00000000000
--- a/src/assets/icons/16x16/edit-paste.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/edit-redo.png b/src/assets/icons/16x16/edit-redo.png
deleted file mode 100644
index 7eb10fe899c..00000000000
--- a/src/assets/icons/16x16/edit-redo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/edit-undo.png b/src/assets/icons/16x16/edit-undo.png
deleted file mode 100644
index 108712547cb..00000000000
--- a/src/assets/icons/16x16/edit-undo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-justify-center.png b/src/assets/icons/16x16/format-justify-center.png
deleted file mode 100644
index 6b0951fa5dd..00000000000
--- a/src/assets/icons/16x16/format-justify-center.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-justify-fill.png b/src/assets/icons/16x16/format-justify-fill.png
deleted file mode 100644
index 6e1c10d7c45..00000000000
--- a/src/assets/icons/16x16/format-justify-fill.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-justify-left.png b/src/assets/icons/16x16/format-justify-left.png
deleted file mode 100644
index 9dfdc89b68a..00000000000
--- a/src/assets/icons/16x16/format-justify-left.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-justify-right.png b/src/assets/icons/16x16/format-justify-right.png
deleted file mode 100644
index 36a52081f18..00000000000
--- a/src/assets/icons/16x16/format-justify-right.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-text-bold.png b/src/assets/icons/16x16/format-text-bold.png
deleted file mode 100644
index a079317a947..00000000000
--- a/src/assets/icons/16x16/format-text-bold.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-text-italic.png b/src/assets/icons/16x16/format-text-italic.png
deleted file mode 100644
index 04202b2842f..00000000000
--- a/src/assets/icons/16x16/format-text-italic.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16/format-text-underline.png b/src/assets/icons/16x16/format-text-underline.png
deleted file mode 100644
index a80368212d8..00000000000
--- a/src/assets/icons/16x16/format-text-underline.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 482ae52024e..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 9858b146f44..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 1672ec58971..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index f04de746731..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index bbb34cc4c22..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index d89ef6c0167..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 4c97ee24952..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 299fa776867..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 4f8849c7110..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index b3d366c53f6..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 80c3afd9a6e..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 33589ea25d0..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index ba028211355..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 8e15d0cb44f..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 754efdd9755..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 6db31a4f697..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/16x16@2/[email protected] b/src/assets/icons/16x16@2/[email protected]
deleted file mode 100644
index 977cde9d974..00000000000
--- a/src/assets/icons/16x16@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/document-new.png b/src/assets/icons/256x256/document-new.png
deleted file mode 100644
index 32776b51a96..00000000000
--- a/src/assets/icons/256x256/document-new.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/document-open.png b/src/assets/icons/256x256/document-open.png
deleted file mode 100644
index 06e188b93b9..00000000000
--- a/src/assets/icons/256x256/document-open.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/document-print.png b/src/assets/icons/256x256/document-print.png
deleted file mode 100644
index 644e3c149af..00000000000
--- a/src/assets/icons/256x256/document-print.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/document-save.png b/src/assets/icons/256x256/document-save.png
deleted file mode 100644
index 16fa70493a2..00000000000
--- a/src/assets/icons/256x256/document-save.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/edit-copy.png b/src/assets/icons/256x256/edit-copy.png
deleted file mode 100644
index b18bead117f..00000000000
--- a/src/assets/icons/256x256/edit-copy.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/edit-cut.png b/src/assets/icons/256x256/edit-cut.png
deleted file mode 100644
index d9454cebf1c..00000000000
--- a/src/assets/icons/256x256/edit-cut.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/edit-delete.png b/src/assets/icons/256x256/edit-delete.png
deleted file mode 100644
index 4081cdb2ca7..00000000000
--- a/src/assets/icons/256x256/edit-delete.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/edit-paste.png b/src/assets/icons/256x256/edit-paste.png
deleted file mode 100644
index 3358426818d..00000000000
--- a/src/assets/icons/256x256/edit-paste.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/edit-redo.png b/src/assets/icons/256x256/edit-redo.png
deleted file mode 100644
index e28b28542c6..00000000000
--- a/src/assets/icons/256x256/edit-redo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/edit-undo.png b/src/assets/icons/256x256/edit-undo.png
deleted file mode 100644
index fe10f57a398..00000000000
--- a/src/assets/icons/256x256/edit-undo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-justify-center.png b/src/assets/icons/256x256/format-justify-center.png
deleted file mode 100644
index d4ad74b0d07..00000000000
--- a/src/assets/icons/256x256/format-justify-center.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-justify-fill.png b/src/assets/icons/256x256/format-justify-fill.png
deleted file mode 100644
index bf0dd84bbb0..00000000000
--- a/src/assets/icons/256x256/format-justify-fill.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-justify-left.png b/src/assets/icons/256x256/format-justify-left.png
deleted file mode 100644
index dde68c8514a..00000000000
--- a/src/assets/icons/256x256/format-justify-left.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-justify-right.png b/src/assets/icons/256x256/format-justify-right.png
deleted file mode 100644
index 8a5e7518bdc..00000000000
--- a/src/assets/icons/256x256/format-justify-right.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-text-bold.png b/src/assets/icons/256x256/format-text-bold.png
deleted file mode 100644
index 665d3ce37b5..00000000000
--- a/src/assets/icons/256x256/format-text-bold.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-text-italic.png b/src/assets/icons/256x256/format-text-italic.png
deleted file mode 100644
index 4b6846a6b98..00000000000
--- a/src/assets/icons/256x256/format-text-italic.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256/format-text-underline.png b/src/assets/icons/256x256/format-text-underline.png
deleted file mode 100644
index 601f73216a3..00000000000
--- a/src/assets/icons/256x256/format-text-underline.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index bfec6d0e6d1..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 630a05f622c..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index c8611c31c49..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 6f460959818..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 2f350041a05..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index e11cf6d2347..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index efe6b90bf59..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 32f54b39598..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 1f6e366535b..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 980ed370621..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index af7044ddee1..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index da14563bd68..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index c1025bf0102..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 3a07e06e0f3..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index b0f4cb09958..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 85f0cfc1d65..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/256x256@2/[email protected] b/src/assets/icons/256x256@2/[email protected]
deleted file mode 100644
index 51ee0aa7783..00000000000
--- a/src/assets/icons/256x256@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/document-new.png b/src/assets/icons/32x32/document-new.png
deleted file mode 100644
index 482ae52024e..00000000000
--- a/src/assets/icons/32x32/document-new.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/document-open.png b/src/assets/icons/32x32/document-open.png
deleted file mode 100644
index 9858b146f44..00000000000
--- a/src/assets/icons/32x32/document-open.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/document-print.png b/src/assets/icons/32x32/document-print.png
deleted file mode 100644
index 1672ec58971..00000000000
--- a/src/assets/icons/32x32/document-print.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/document-save.png b/src/assets/icons/32x32/document-save.png
deleted file mode 100644
index f04de746731..00000000000
--- a/src/assets/icons/32x32/document-save.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/edit-copy.png b/src/assets/icons/32x32/edit-copy.png
deleted file mode 100644
index bbb34cc4c22..00000000000
--- a/src/assets/icons/32x32/edit-copy.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/edit-cut.png b/src/assets/icons/32x32/edit-cut.png
deleted file mode 100644
index d89ef6c0167..00000000000
--- a/src/assets/icons/32x32/edit-cut.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/edit-delete.png b/src/assets/icons/32x32/edit-delete.png
deleted file mode 100644
index 4c97ee24952..00000000000
--- a/src/assets/icons/32x32/edit-delete.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/edit-paste.png b/src/assets/icons/32x32/edit-paste.png
deleted file mode 100644
index 299fa776867..00000000000
--- a/src/assets/icons/32x32/edit-paste.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/edit-redo.png b/src/assets/icons/32x32/edit-redo.png
deleted file mode 100644
index 4f8849c7110..00000000000
--- a/src/assets/icons/32x32/edit-redo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/edit-undo.png b/src/assets/icons/32x32/edit-undo.png
deleted file mode 100644
index b3d366c53f6..00000000000
--- a/src/assets/icons/32x32/edit-undo.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-justify-center.png b/src/assets/icons/32x32/format-justify-center.png
deleted file mode 100644
index 80c3afd9a6e..00000000000
--- a/src/assets/icons/32x32/format-justify-center.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-justify-fill.png b/src/assets/icons/32x32/format-justify-fill.png
deleted file mode 100644
index 33589ea25d0..00000000000
--- a/src/assets/icons/32x32/format-justify-fill.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-justify-left.png b/src/assets/icons/32x32/format-justify-left.png
deleted file mode 100644
index ba028211355..00000000000
--- a/src/assets/icons/32x32/format-justify-left.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-justify-right.png b/src/assets/icons/32x32/format-justify-right.png
deleted file mode 100644
index 8e15d0cb44f..00000000000
--- a/src/assets/icons/32x32/format-justify-right.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-text-bold.png b/src/assets/icons/32x32/format-text-bold.png
deleted file mode 100644
index 754efdd9755..00000000000
--- a/src/assets/icons/32x32/format-text-bold.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-text-italic.png b/src/assets/icons/32x32/format-text-italic.png
deleted file mode 100644
index 6db31a4f697..00000000000
--- a/src/assets/icons/32x32/format-text-italic.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32/format-text-underline.png b/src/assets/icons/32x32/format-text-underline.png
deleted file mode 100644
index 977cde9d974..00000000000
--- a/src/assets/icons/32x32/format-text-underline.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index c9245760612..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 68e75b549a0..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index b7843367393..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index f4cca4b3238..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 9690d6bb041..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 408b0ae19b0..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 58abfc1fa53..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index b8c288f6c70..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 89fcd33c300..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 6f7ad2cb402..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 9b2cc1ed160..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 1212e9f7613..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 8c0eca3037e..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index fb0ed702525..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 0e67ead0b8c..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index f746f8956f8..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/32x32@2/[email protected] b/src/assets/icons/32x32@2/[email protected]
deleted file mode 100644
index 47d6fced026..00000000000
--- a/src/assets/icons/32x32@2/[email protected]
+++ /dev/null
Binary files differ
diff --git a/src/assets/icons/CMakeLists.txt b/src/assets/icons/CMakeLists.txt
deleted file mode 100644
index f5adb229d85..00000000000
--- a/src/assets/icons/CMakeLists.txt
+++ /dev/null
@@ -1,174 +0,0 @@
-# Copyright (C) 2023 The Qt Company Ltd.
-# SPDX-License-Identifier: BSD-3-Clause
-
-qt_internal_add_module(ExampleIconsPrivate
- CONFIG_MODULE_NAME example_icons
- STATIC
- INTERNAL_MODULE
- NO_GENERATE_CPP_EXPORTS
-)
-
-set(icons_resource_files
- index.theme
- 16x16/document-new.png
- 16x16/document-open.png
- 16x16/document-print.png
- 16x16/document-save.png
- 16x16/edit-copy.png
- 16x16/edit-cut.png
- 16x16/edit-delete.png
- 16x16/edit-paste.png
- 16x16/edit-redo.png
- 16x16/edit-undo.png
- 16x16/format-justify-center.png
- 16x16/format-justify-fill.png
- 16x16/format-justify-left.png
- 16x16/format-justify-right.png
- 16x16/format-text-bold.png
- 16x16/format-text-italic.png
- 16x16/format-text-underline.png
- 32x32/document-new.png
- 32x32/document-open.png
- 32x32/document-print.png
- 32x32/document-save.png
- 32x32/edit-copy.png
- 32x32/edit-cut.png
- 32x32/edit-delete.png
- 32x32/edit-paste.png
- 32x32/edit-redo.png
- 32x32/edit-undo.png
- 32x32/format-justify-center.png
- 32x32/format-justify-fill.png
- 32x32/format-justify-left.png
- 32x32/format-justify-right.png
- 32x32/format-text-bold.png
- 32x32/format-text-italic.png
- 32x32/format-text-underline.png
- 128x128/document-new.png
- 128x128/document-open.png
- 128x128/document-print.png
- 128x128/document-save.png
- 128x128/edit-copy.png
- 128x128/edit-cut.png
- 128x128/edit-delete.png
- 128x128/edit-paste.png
- 128x128/edit-redo.png
- 128x128/edit-undo.png
- 128x128/format-justify-center.png
- 128x128/format-justify-fill.png
- 128x128/format-justify-left.png
- 128x128/format-justify-right.png
- 128x128/format-text-bold.png
- 128x128/format-text-italic.png
- 128x128/format-text-underline.png
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 128x128@2/[email protected]
- 256x256/document-new.png
- 256x256/document-open.png
- 256x256/document-print.png
- 256x256/document-save.png
- 256x256/edit-copy.png
- 256x256/edit-cut.png
- 256x256/edit-delete.png
- 256x256/edit-paste.png
- 256x256/edit-redo.png
- 256x256/edit-undo.png
- 256x256/format-justify-center.png
- 256x256/format-justify-fill.png
- 256x256/format-justify-left.png
- 256x256/format-justify-right.png
- 256x256/format-text-bold.png
- 256x256/format-text-italic.png
- 256x256/format-text-underline.png
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- 256x256@2/[email protected]
- scalable/document-new.svg
- scalable/document-open.svg
- scalable/document-print.svg
- scalable/document-save.svg
- scalable/edit-copy.svg
- scalable/edit-cut.svg
- scalable/edit-delete.svg
- scalable/edit-paste.svg
- scalable/edit-redo.svg
- scalable/edit-undo.svg
- scalable/format-justify-center.svg
- scalable/format-justify-fill.svg
- scalable/format-justify-left.svg
- scalable/format-justify-right.svg
- scalable/format-text-bold.svg
- scalable/format-text-italic.svg
- scalable/format-text-underline.svg
-)
-
-qt_internal_add_resource(ExampleIconsPrivate "example_icons"
- PREFIX
- "/qt-project.org/icons/example_icons"
- FILES
- ${icons_resource_files}
-)
-
diff --git a/src/assets/icons/README b/src/assets/icons/README
deleted file mode 100644
index 26d94e9ff13..00000000000
--- a/src/assets/icons/README
+++ /dev/null
@@ -1,29 +0,0 @@
-Copyright (C) 2023 The Qt Company Ltd.
-SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
-
-Setting up a project for using Example icon library
-
-1. Add ExampleIconsPrivate component to your project CMakeList.txt file
- ...
- find_package(Qt6
- REQUIRED COMPONENTS Core Gui Widgets ExampleIconsPrivate
- )
-
- target_link_libraries(imageviewer PRIVATE
- Qt6::Core
- Qt6::Gui
- Qt6::Widgets
- Qt6::ExampleIconsPrivate
- )
- ...
-
-2. Load the theme
- ...
- QIcon::setThemeSearchPaths(QIcon::themeSearchPaths() << u":/qt-project.org/icons"_s);
- QIcon::setFallbackThemeName(u"example_icons"_s);
- ...
-
-3. Use the icons
- ...
- const QIcon openIcon = QIcon::fromTheme("document-open");
- ...
diff --git a/src/assets/icons/index.theme b/src/assets/icons/index.theme
deleted file mode 100644
index e389719e01c..00000000000
--- a/src/assets/icons/index.theme
+++ /dev/null
@@ -1,46 +0,0 @@
-[Icon Theme]
-Name=example_icons
-
-Directories=16x16,16x16@2,32x32,32x32@2,128x128,128x128@2,256x256,256x256@2,scalable
-
-[16x16]
-Size=16
-Type=Fixed
-
-[16x16@2]
-Size=16
-Scale=2
-Type=Fixed
-
-[32x32]
-Size=32
-Type=Fixed
-
-[32x32@2]
-Size=32
-Scale=2
-Type=Fixed
-
-[128x128]
-Size=128
-Type=Fixed
-
-[128x128@2]
-Size=128
-Scale=2
-Type=Fixed
-
-[256x256]
-Size=256
-Type=Fixed
-
-[256x256@2]
-Size=256
-Scale=2
-Type=Fixed
-
-[scalable]
-Size=512
-Type=Scalable
-MinSize=16
-MaxSize=512
diff --git a/src/assets/icons/scalable/document-new.svg b/src/assets/icons/scalable/document-new.svg
deleted file mode 100644
index b926a7b0e11..00000000000
--- a/src/assets/icons/scalable/document-new.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_New" d="m15,13c0,.28-.22.5-.5.5h-2v2c0,.28-.22.5-.5.5s-.5-.22-.5-.5v-2h-2c-.28,0-.5-.22-.5-.5s.22-.5.5-.5h2v-2c0-.28.22-.5.5-.5s.5.22.5.5v2h2c.28,0,.5.22.5.5Zm-12,2h5v1H3c-1.1,0-2-.9-2-2V2C1,.9,1.9,0,3,0h7c1.14,1.14,2.93,2.93,4,4v5h-1v-4h-2c-1.1,0-2-.9-2-2V1H3c-.55,0-1,.45-1,1v12c0,.55.45,1,1,1ZM10,1.41v1.59c0,.55.45,1,1,1h1.59l-.82-.82-1.76-1.76Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/document-open.svg b/src/assets/icons/scalable/document-open.svg
deleted file mode 100644
index 778c1b7c6e9..00000000000
--- a/src/assets/icons/scalable/document-open.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Open" d="m14.5,5h-1.5v-1c0-1.1-.9-2-2-2h-5L4,0h-2C.9,0,0,.9,0,2v12c0,1.1.9,2,2,2h9s0,0,0,0c.12,0,.25-.01.36-.03.98-.16,1.94-.94,2.24-1.87l2.29-7.19c.33-1.05-.29-1.91-1.39-1.91ZM1,14V2c0-.55.45-1,1-1h1.59l1.71,1.71c.19.19.44.29.71.29h5c.55,0,1,.45,1,1v1h-5.5c-1.1,0-2.27.86-2.61,1.91l-2.29,7.19c-.09.28-.11.54-.07.78-.32-.17-.54-.49-.54-.87Zm13.94-7.4l-2.29,7.19c-.2.63-.99,1.21-1.65,1.21H3c-.2,0-.36-.05-.43-.15-.07-.1-.07-.26-.01-.45l2.29-7.19c.2-.63.99-1.21,1.65-1.21h8c.2,0,.36.05.43.15.07.1.07.26.01.45Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/document-print.svg b/src/assets/icons/scalable/document-print.svg
deleted file mode 100644
index fb8436af81a..00000000000
--- a/src/assets/icons/scalable/document-print.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Print" d="m14,4h-2v-2c0-1.1-.9-2-2-2h-4c-1.1,0-2,.9-2,2v2h-2c-1.1,0-2,.9-2,2v4c0,1.1.9,2,2,2h2v2c0,1.1.9,2,2,2h4c1.1,0,2-.9,2-2v-2h2c1.1,0,2-.9,2-2v-4c0-1.1-.9-2-2-2ZM5,2c0-.55.45-1,1-1h4c.55,0,1,.45,1,1v2h-6v-2Zm5,13h-4c-.55,0-1-.45-1-1v-5h6v5c0,.55-.45,1-1,1Zm5-5c0,.55-.45,1-1,1h-2v-2h.5c.28,0,.5-.22.5-.5s-.22-.5-.5-.5h-.5s-8,0-8,0h0s-.5,0-.5,0c-.28,0-.5.22-.5.5s.22.5.5.5h.5v2h-2c-.55,0-1-.45-1-1v-4c0-.55.45-1,1-1h12c.55,0,1,.45,1,1v4Zm-5,1.5c0,.28-.22.5-.5.5h-3c-.28,0-.5-.22-.5-.5s.22-.5.5-.5h3c.28,0,.5.22.5.5Zm0,2c0,.28-.22.5-.5.5h-3c-.28,0-.5-.22-.5-.5s.22-.5.5-.5h3c.28,0,.5.22.5.5Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/document-save.svg b/src/assets/icons/scalable/document-save.svg
deleted file mode 100644
index 03675f4dab0..00000000000
--- a/src/assets/icons/scalable/document-save.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Save" d="m16,11h0V2.29c0-1.26-1.02-2.29-2.29-2.29H2.29C1.02,0,0,1.02,0,2.29v8.71h0v1h0v1.71c0,1.26,1.02,2.29,2.29,2.29h11.43c1.26,0,2.29-1.02,2.29-2.29v-1.71h0v-1ZM5.71,1h5.29v4.5c0,.28-.22.5-.5.5h-5c-.28,0-.5-.22-.5-.5V1h.71ZM1,2.29c0-.71.58-1.29,1.29-1.29h1.71v4.5c0,.83.67,1.5,1.5,1.5h5c.83,0,1.5-.67,1.5-1.5V1h1.71c.71,0,1.29.58,1.29,1.29v8.71H1V2.29Zm14,11.43c0,.71-.58,1.29-1.29,1.29H2.29c-.71,0-1.29-.58-1.29-1.29v-1.71h14v1.71Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/edit-copy.svg b/src/assets/icons/scalable/edit-copy.svg
deleted file mode 100644
index db53ff11624..00000000000
--- a/src/assets/icons/scalable/edit-copy.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Copy" d="m12,0h-5c-1.1,0-2,.9-2,2h1c0-.55.45-1,1-1h4v2c0,1.1.9,2,2,2h2v6c0,.55-.45,1-1,1h-2v1h2c1.1,0,2-.9,2-2v-7c-1.07-1.07-2.86-2.86-4-4Zm1,4c-.55,0-1-.45-1-1v-1.59l1.29,1.29,1.29,1.29h-1.59Zm-6-1H2c-1.1,0-2,.9-2,2v9c0,1.1.9,2,2,2h7c1.1,0,2-.9,2-2v-7c-1.07-1.07-2.86-2.86-4-4Zm3,6v5c0,.55-.45,1-1,1H2c-.55,0-1-.45-1-1V5c0-.55.45-1,1-1h4v2c0,1.1.9,2,2,2h2v1Zm-2-2c-.55,0-1-.45-1-1v-1.59l1.29,1.29,1.29,1.29h-1.59Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/edit-cut.svg b/src/assets/icons/scalable/edit-cut.svg
deleted file mode 100644
index 7f75d0b829d..00000000000
--- a/src/assets/icons/scalable/edit-cut.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Cut" d="m15.22,12.05l-7.39-3.55,7.39-3.55c.25-.12.35-.42.23-.67-.12-.25-.42-.35-.67-.23l-8.12,3.9-2.48-1.19c1.07-.46,1.81-1.52,1.81-2.75,0-1.66-1.34-3-3-3S0,2.34,0,4c0,1.28.81,2.36,1.93,2.8.1.05.22.1.35.15l3.23,1.55-3.23,1.55c-.1.05-.18.09-.26.13-1.18.41-2.02,1.51-2.02,2.82,0,1.66,1.34,3,3,3s3-1.34,3-3c0-1.24-.75-2.29-1.81-2.75l2.48-1.19,8.12,3.9c.07.03.14.05.22.05.19,0,.37-.1.45-.28.12-.25.01-.55-.23-.67ZM3,2c1.1,0,2,.9,2,2s-.9,2-2,2-2-.9-2-2,.9-2,2-2Zm2,11c0,1.1-.9,2-2,2s-2-.9-2-2,.9-2,2-2,2,.9,2,2Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/edit-delete.svg b/src/assets/icons/scalable/edit-delete.svg
deleted file mode 100644
index 15d1a9c7fd6..00000000000
--- a/src/assets/icons/scalable/edit-delete.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Delete" d="m8,0C3.58,0,0,3.58,0,8s3.58,8,8,8,8-3.58,8-8S12.42,0,8,0Zm0,15c-3.86,0-7-3.14-7-7S4.14,1,8,1s7,3.14,7,7-3.14,7-7,7Zm2.83-9.12l-2.12,2.12,2.12,2.12c.2.2.2.51,0,.71-.1.1-.23.15-.35.15s-.26-.05-.35-.15l-2.12-2.12-2.12,2.12c-.1.1-.23.15-.35.15s-.26-.05-.35-.15c-.2-.2-.2-.51,0-.71l2.12-2.12-2.12-2.12c-.2-.2-.2-.51,0-.71s.51-.2.71,0l2.12,2.12,2.12-2.12c.2-.2.51-.2.71,0s.2.51,0,.71Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/edit-paste.svg b/src/assets/icons/scalable/edit-paste.svg
deleted file mode 100644
index 57e94d917d2..00000000000
--- a/src/assets/icons/scalable/edit-paste.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Paste" d="m14.09,6.09c-.71-.74-1.44-1.5-2.09-2.09h-3.78c-1.23,0-2.22.9-2.22,2v8c0,1.1.99,2,2.22,2h5.56c1.23,0,2.22-.9,2.22-2v-6c-.52-.52-1.21-1.21-1.91-1.91Zm-2.09-.68l1.38,1.38c.41.43.8.83,1.18,1.21h-1.56c-.55,0-1-.45-1-1v-1.59Zm3,5.59v3c0,.55-.55,1-1.22,1h-5.56c-.67,0-1.22-.45-1.22-1V6c0-.55.55-1,1.22-1h2.78v2c0,1.1.9,2,2,2h2v2Zm-6.5,0h5c.28,0,.5.22.5.5s-.22.5-.5.5h-5c-.28,0-.5-.22-.5-.5s.22-.5.5-.5ZM5.5,3h1c.83,0,1.5-.67,1.5-1.5v-.5h2c.55,0,1,.45,1,1v1h1v-1C12,.9,11.1,0,10,0h-2s-4,0-4,0h0s-2,0-2,0C.9,0,0,.9,0,2v10c0,1.1.9,2,2,2h3v-1h-3c-.55,0-1-.45-1-1V2c0-.55.45-1,1-1h2v.5c0,.83.67,1.5,1.5,1.5Zm1.5-1.5c0,.28-.22.5-.5.5h-1c-.28,0-.5-.22-.5-.5v-.5h2v.5Zm7,12c0,.28-.22.5-.5.5h-5c-.28,0-.5-.22-.5-.5s.22-.5.5-.5h5c.28,0,.5.22.5.5Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/edit-redo.svg b/src/assets/icons/scalable/edit-redo.svg
deleted file mode 100644
index 92d60e1dd8c..00000000000
--- a/src/assets/icons/scalable/edit-redo.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Redo" d="m15.85,4.68l-3.54-3.54c-.2-.2-.51-.2-.71,0s-.2.51,0,.71l2.68,2.68H2.5c-1.38,0-2.5,1.12-2.5,2.5v4c0,1.38,1.12,2.5,2.5,2.5h7c.28,0,.5-.22.5-.5s-.22-.5-.5-.5H2.5c-.83,0-1.5-.67-1.5-1.5v-4c0-.83.67-1.5,1.5-1.5h11.79l-2.68,2.68c-.2.2-.2.51,0,.71.1.1.23.15.35.15s.26-.05.35-.15l3.54-3.54c.2-.2.2-.51,0-.71Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/edit-undo.svg b/src/assets/icons/scalable/edit-undo.svg
deleted file mode 100644
index 91731bb86fa..00000000000
--- a/src/assets/icons/scalable/edit-undo.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconDesktopApp_Undo" d="m13.5,4.54H1.71l2.68-2.68c.2-.2.2-.51,0-.71s-.51-.2-.71,0L.15,4.68c-.2.2-.2.51,0,.71l3.54,3.54c.1.1.23.15.35.15s.26-.05.35-.15c.2-.2.2-.51,0-.71l-2.68-2.68h11.79c.83,0,1.5.67,1.5,1.5v4c0,.83-.67,1.5-1.5,1.5h-7c-.28,0-.5.22-.5.5s.22.5.5.5h7c1.38,0,2.5-1.12,2.5-2.5v-4c0-1.38-1.12-2.5-2.5-2.5Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/format-justify-center.svg b/src/assets/icons/scalable/format-justify-center.svg
deleted file mode 100644
index 9822c95f2fa..00000000000
--- a/src/assets/icons/scalable/format-justify-center.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconTextEditor_alignCenter" d="m15.5,8H.5c-.28,0-.5-.22-.5-.5h0c0-.28.22-.5.5-.5h15c.28,0,.5.22.5.5h0c0,.28-.22.5-.5.5Zm-2,3.5h0c0-.28-.22-.5-.5-.5H3c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h10c.28,0,.5-.22.5-.5Zm2.5,4h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h15c.28,0,.5-.22.5-.5Zm-2.5-12h0c0-.28-.22-.5-.5-.5H3c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h10c.28,0,.5-.22.5-.5Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/format-justify-fill.svg b/src/assets/icons/scalable/format-justify-fill.svg
deleted file mode 100644
index 2fa7ddfa40d..00000000000
--- a/src/assets/icons/scalable/format-justify-fill.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconTextEditor_alignJustify" d="m15.5,8H.5c-.28,0-.5-.22-.5-.5h0c0-.28.22-.5.5-.5h15c.28,0,.5.22.5.5h0c0,.28-.22.5-.5.5Zm.5,3.5h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h15c.28,0,.5-.22.5-.5Zm0,4h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h15c.28,0,.5-.22.5-.5Zm0-12h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h15c.28,0,.5-.22.5-.5Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/format-justify-left.svg b/src/assets/icons/scalable/format-justify-left.svg
deleted file mode 100644
index 99d666428d9..00000000000
--- a/src/assets/icons/scalable/format-justify-left.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconTextEditor_alignLeft" d="m15.5,8H.5c-.28,0-.5-.22-.5-.5h0c0-.28.22-.5.5-.5h15c.28,0,.5.22.5.5h0c0,.28-.22.5-.5.5Zm-4.5,3.5h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h10c.28,0,.5-.22.5-.5Zm5,4h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h15c.28,0,.5-.22.5-.5ZM11,3.5h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h10c.28,0,.5-.22.5-.5Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/format-justify-right.svg b/src/assets/icons/scalable/format-justify-right.svg
deleted file mode 100644
index 7041f5e3f88..00000000000
--- a/src/assets/icons/scalable/format-justify-right.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconTextEditor_alignRight" d="m15.5,8H.5c-.28,0-.5-.22-.5-.5h0c0-.28.22-.5.5-.5h15c.28,0,.5.22.5.5h0c0,.28-.22.5-.5.5Zm.5,3.5h0c0-.28-.22-.5-.5-.5H5.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h10c.28,0,.5-.22.5-.5Zm0,4h0c0-.28-.22-.5-.5-.5H.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h15c.28,0,.5-.22.5-.5Zm0-12h0c0-.28-.22-.5-.5-.5H5.5c-.28,0-.5.22-.5.5h0c0,.28.22.5.5.5h10c.28,0,.5-.22.5-.5Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/format-text-bold.svg b/src/assets/icons/scalable/format-text-bold.svg
deleted file mode 100644
index c0f43e0a692..00000000000
--- a/src/assets/icons/scalable/format-text-bold.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconTextEditor_Bold" d="m12.06,7.75c.65-.36,1.13-.81,1.44-1.35.3-.55.46-1.29.46-2.24,0-1.45-.4-2.5-1.21-3.16-.81-.66-2.03-.99-3.67-.99H3v16h6.26c3.39,0,5.09-1.51,5.09-4.53,0-1.88-.76-3.12-2.29-3.71ZM5.59,2.24h3.34c1.59,0,2.38.74,2.38,2.22,0,1.57-.76,2.36-2.29,2.36h-3.43V2.24Zm5.45,10.98c-.43.36-1.07.54-1.93.54h-3.53v-4.74h3.48c.75,0,1.37.17,1.87.53.5.35.75.96.75,1.83s-.21,1.49-.64,1.85Z"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/format-text-italic.svg b/src/assets/icons/scalable/format-text-italic.svg
deleted file mode 100644
index 43df7ca54dc..00000000000
--- a/src/assets/icons/scalable/format-text-italic.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><polygon id="iconTextEditor_Italic" points="6.63 0 6.18 2.01 8.18 2.01 5.45 13.99 3.45 13.99 3 16 9.56 16 10.01 13.99 8.01 13.99 10.74 2.01 12.74 2.01 13.19 0 6.63 0"/></svg> \ No newline at end of file
diff --git a/src/assets/icons/scalable/format-text-underline.svg b/src/assets/icons/scalable/format-text-underline.svg
deleted file mode 100644
index 62778fc579e..00000000000
--- a/src/assets/icons/scalable/format-text-underline.svg
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg id="Outlined_icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path id="iconTextEditor_Underline" d="m3.38,11.88c-.92-.75-1.38-1.94-1.38-3.57V0h2.44v8.35c0,1.79,1.02,2.69,3.06,2.69s3.06-.9,3.06-2.69V0h2.44v8.31c0,1.63-.46,2.82-1.39,3.57-.92.75-2.3,1.12-4.13,1.12s-3.2-.37-4.11-1.12Zm10.12,3.12H1.5c-.28,0-.5.22-.5.5s.22.5.5.5h12c.28,0,.5-.22.5-.5s-.22-.5-.5-.5Z"/></svg> \ No newline at end of file
diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt
index 4d83bbf794e..249b9b8c1ee 100644
--- a/src/corelib/CMakeLists.txt
+++ b/src/corelib/CMakeLists.txt
@@ -16,7 +16,11 @@ qt_internal_extend_sbom(WrapZLIB::WrapZLIB
if(ANDROID)
set(corelib_extra_cmake_files
- "${CMAKE_CURRENT_SOURCE_DIR}/${QT_CMAKE_EXPORT_NAMESPACE}AndroidMacros.cmake")
+ "${CMAKE_CURRENT_SOURCE_DIR}/${QT_CMAKE_EXPORT_NAMESPACE}AndroidMacros.cmake"
+ "${CMAKE_CURRENT_SOURCE_DIR}/${QT_CMAKE_EXPORT_NAMESPACE}AndroidDynamicFeatureHelpers.cmake"
+ "${CMAKE_CURRENT_SOURCE_DIR}/${QT_CMAKE_EXPORT_NAMESPACE}AndroidGradleHelpers.cmake"
+ "${CMAKE_CURRENT_SOURCE_DIR}/${QT_CMAKE_EXPORT_NAMESPACE}AndroidPermissionHelpers.cmake"
+ )
endif()
if(WASM)
set(corelib_extra_cmake_files
diff --git a/src/corelib/Qt6AndroidDynamicFeatureHelpers.cmake b/src/corelib/Qt6AndroidDynamicFeatureHelpers.cmake
new file mode 100644
index 00000000000..e8a81bde1d7
--- /dev/null
+++ b/src/corelib/Qt6AndroidDynamicFeatureHelpers.cmake
@@ -0,0 +1,152 @@
+# Copyright (C) 2025 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+# Collects the dynamic features for the target
+
+function(_qt_internal_android_add_dynamic_feature_deployment target)
+ get_target_property(dynamic_features ${target} _qt_android_dynamic_features)
+ if(NOT dynamic_features)
+ return()
+ endif()
+
+ foreach(dynamic_feature IN LISTS dynamic_features)
+ get_target_property(is_imported ${dynamic_feature} IMPORTED)
+ if(is_imported)
+ message(FATAL_ERROR "Imported target ${dynamic_feature} can not be a"
+ " 'DYNAMIC_FEATURE'.")
+ endif()
+
+ get_target_property(type ${dynamic_feature} TYPE)
+ if(NOT type STREQUAL "SHARED_LIBRARY")
+ message(FATAL_ERROR "Cannot make ${dynamic_feature} 'DYNAMIC_FEATURE'."
+ " The target must be the 'SHARED_LIBRARY'.")
+ endif()
+
+ get_target_property(android_type ${dynamic_feature} _qt_android_target_type)
+ if(NOT android_type STREQUAL "" AND NOT android_type MATCHES "-NOTFOUND$"
+ AND NOT android_type STREQUAL "DYNAMIC_FEATURE")
+ message(FATAL_ERROR "Cannot make ${dynamic_feature} 'DYNAMIC_FEATURE',"
+ " it's already '${android_type}'. The target must be the plain 'SHARED_LIBRARY'.")
+ endif()
+
+ # Mark the target as DYNAMIC_FEATURE, since we used it in this role once.
+ set_target_properties(${dynamic_feature} PROPERTIES _qt_android_target_type DYNAMIC_FEATURE)
+ _qt_internal_set_android_dynamic_feature_gradle_defaults(${dynamic_feature})
+
+ _qt_internal_android_get_dynamic_feature_deployment_dir(dynamic_feature_deployment_dir
+ ${target} ${dynamic_feature})
+ _qt_internal_android_generate_target_build_gradle(${dynamic_feature}
+ DEPLOYMENT_DIR "${dynamic_feature_deployment_dir}")
+ _qt_internal_android_generate_dynamic_feature_manifest(${target} ${dynamic_feature})
+ _qt_internal_android_copy_dynamic_feature(${target} ${dynamic_feature})
+ endforeach()
+endfunction()
+
+# Sets the default values of the gradle properties for the Android dynamic feature target.
+function(_qt_internal_set_android_dynamic_feature_gradle_defaults target)
+ _qt_internal_android_java_dir(android_java_dir)
+
+ # TODO: make androidx.core:core versionc configurable.
+ # Currently, it is hardcoded to 1.16.0.
+ set(implementation_dependencies "project(':app')" "'androidx.core:core:1.16.0'")
+
+ set_target_properties(${target} PROPERTIES
+ _qt_android_gradle_java_source_dirs "src;java"
+ _qt_android_gradle_aidl_source_dirs "src;aidl"
+ _qt_android_gradle_res_source_dirs "res"
+ _qt_android_gradle_resources_source_dirs "resources"
+ _qt_android_gradle_renderscript_source_dirs "src"
+ _qt_android_gradle_assets_source_dirs "assets"
+ _qt_android_gradle_jniLibs_source_dirs "libs"
+ _qt_android_manifest "AndroidManifest.xml"
+ _qt_android_gradle_implementation_dependencies "${implementation_dependencies}"
+ )
+endfunction()
+
+# Copies the dynamic feature library to the respective gradle build tree.
+function(_qt_internal_android_copy_dynamic_feature target dynamic_feature)
+ if(NOT TARGET ${dynamic_feature})
+ message(FATAL_ERROR "${dynamic_feature} is not a target.")
+ endif()
+
+ _qt_internal_android_get_dynamic_feature_deployment_dir(dynamic_feature_deployment_dir
+ ${target} ${dynamic_feature})
+
+ set(dynamic_feature_libs_dir "${dynamic_feature_deployment_dir}/libs/${CMAKE_ANDROID_ARCH_ABI}")
+ get_target_property(output_name ${dynamic_feature} OUTPUT_NAME)
+ if(NOT output_name)
+ get_target_property(suffix "${dynamic_feature}" SUFFIX)
+ set(output_name "lib${dynamic_feature}${suffix}")
+ endif()
+ set(output_file_path "${dynamic_feature_libs_dir}/${output_name}")
+ _qt_internal_copy_file_if_different_command(copy_command
+ "$<TARGET_FILE:${dynamic_feature}>"
+ "${output_file_path}"
+ )
+ add_custom_command(OUTPUT ${output_file_path}
+ COMMAND ${copy_command}
+ DEPENDS ${dynamic_feature}
+ COMMENT "Copying ${dynamic_feature} dynamic feature to ${target} deployment directory"
+ )
+ add_custom_target(${target}_deploy_dynamic_features DEPENDS "${output_file_path}")
+endfunction()
+
+# Generates the feature name strings and copy them to the respective deployment directory.
+function(_qt_internal_android_generate_dynamic_feature_names target)
+ get_target_property(dynamic_features ${target} _qt_android_dynamic_features)
+ if(NOT dynamic_features)
+ return()
+ endif()
+
+ # Collect the titles
+ string(JOIN "\n" content
+ "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+ "<resources>"
+ )
+ foreach(feature IN LISTS dynamic_features)
+ string(APPEND content "\n <string name=\"${feature}_title\">${feature}</string>")
+ endforeach()
+ string(APPEND content "\n</resources>")
+
+ _qt_internal_android_get_target_deployment_dir(deployment_dir ${target})
+ # TODO: androiddeployqt wipes the android build directory. Generate feature_names.xml target
+ # build dir and copy after androiddeployqt run. We should skip feature_names.xml copying when
+ # androiddeployqt is not involved into the deployment process anymore.
+ #
+ # set(output_file "${deployment_dir}/res/values/feature_names.xml")
+ set(output_file "$<TARGET_PROPERTY:${target},BINARY_DIR>/res/values/feature_names.xml")
+ _qt_internal_configure_file(GENERATE OUTPUT "${output_file}" CONTENT "${content}")
+ set(output_file_in_deployment_dir "${deployment_dir}/res/values/feature_names.xml")
+ add_custom_command(OUTPUT "${output_file_in_deployment_dir}"
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ "${output_file}"
+ "${output_file_in_deployment_dir}"
+ DEPENDS "${output_file}" ${target}_android_deploy_aux
+ VERBATIM
+ )
+ add_custom_target(${target}_copy_feature_names
+ DEPENDS
+ "${output_file_in_deployment_dir}"
+ )
+endfunction()
+
+# Returns the dynamic feature deployment directory in the target build tree.
+function(_qt_internal_android_get_dynamic_feature_deployment_dir out_var target dynamic_feature)
+ _qt_internal_android_get_target_android_build_dir(android_build_dir ${target})
+ set(${out_var} "${android_build_dir}/${dynamic_feature}" PARENT_SCOPE)
+endfunction()
+
+# Generates the AndroidManifest.xml file for the dynamic_feature.
+function(_qt_internal_android_generate_dynamic_feature_manifest target dynamic_feature)
+ set(android_manifest_filename AndroidManifest.xml)
+ _qt_internal_android_get_dynamic_feature_deployment_dir(dynamic_feature_deployment_dir ${target}
+ ${dynamic_feature})
+
+ _qt_internal_android_get_template_path(template_file ${target}
+ "dynamic_feature/${android_manifest_filename}")
+
+ set(APP_TARGET "${target}")
+ set(TITLE_VAR "@string/${dynamic_feature}_title")
+
+ set(output_file "${dynamic_feature_deployment_dir}/AndroidManifest.xml")
+ _qt_internal_configure_file(CONFIGURE OUTPUT "${output_file}" INPUT "${template_file}")
+endfunction()
diff --git a/src/corelib/Qt6AndroidGradleHelpers.cmake b/src/corelib/Qt6AndroidGradleHelpers.cmake
new file mode 100644
index 00000000000..09184c93b69
--- /dev/null
+++ b/src/corelib/Qt6AndroidGradleHelpers.cmake
@@ -0,0 +1,631 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Returns the path to the template file from either user defined template directory, or
+# Qt default template directory.
+function(_qt_internal_android_get_template_path out_var target template_name)
+ if(template_name STREQUAL "")
+ message(FATAL_ERROR "Template name is empty."
+ " This is the Qt issue, please report a bug at https://bugreports.qt.io.")
+ endif()
+
+ _qt_internal_android_template_dir(template_directory)
+ get_filename_component(template_directory "${template_directory}" ABSOLUTE)
+
+ # The paths are ordered according to their priority, from highest to lowest.
+ set(possible_paths
+ "${template_directory}/${template_name}.in"
+ )
+
+ get_target_property(android_target_type ${target} _qt_android_target_type)
+ if(android_target_type STREQUAL "APPLICATION")
+ _qt_internal_android_get_package_source_dir(user_template_directory ${target})
+ get_filename_component(user_template_directory "${user_template_directory}" ABSOLUTE)
+
+ # Add user template with the higher priority
+ list(PREPEND possible_paths "${user_template_directory}/${template_name}.in")
+ endif()
+
+ set(template_path "")
+ foreach(possible_path IN LISTS possible_paths)
+ if(EXISTS "${possible_path}")
+ set(template_path "${possible_path}")
+ break()
+ endif()
+ endforeach()
+
+ if(template_path STREQUAL "")
+ message(FATAL_ERROR "'${template_name}' is not found."
+ " This is the Qt issue, please report a bug at https://bugreports.qt.io.")
+ endif()
+
+ set(${out_var} "${template_path}" PARENT_SCOPE)
+endfunction()
+
+# Generates the settings.gradle file for the target. Writes the result to the target android build
+# directory.
+function(_qt_internal_android_generate_bundle_settings_gradle target)
+ set(settings_gradle_filename "settings.gradle")
+ _qt_internal_android_get_target_android_build_dir(android_build_dir ${target})
+ set(settings_gradle_file "${android_build_dir}/${settings_gradle_filename}")
+
+ # Skip generating the file if it's already provided by user.
+ get_target_property(deployment_files ${target} _qt_android_deployment_files)
+ if("${settings_gradle_file}" IN_LIST deployment_files)
+ return()
+ endif()
+
+ _qt_internal_android_get_template_path(template_file ${target} "${settings_gradle_filename}")
+
+ set(android_app_name "$<TARGET_PROPERTY:${target},QT_ANDROID_APP_NAME>")
+ string(JOIN "" ROOT_PROJECT_NAME
+ "$<IF:$<BOOL:${android_app_name}>,"
+ "${android_app_name},"
+ "${target}"
+ ">"
+ )
+
+ set(target_dynamic_features "$<TARGET_PROPERTY:${target},_qt_android_dynamic_features>")
+ set(include_prefix "include(\":")
+ set(include_suffix "\")")
+ set(include_glue "${include_suffix}\n${include_prefix}")
+ string(JOIN "" SUBPROJECTS
+ "$<$<BOOL:${target_dynamic_features}>:"
+ "${include_prefix}"
+ "$<JOIN:${target_dynamic_features},${include_glue}>"
+ "${include_suffix}"
+ ">"
+ )
+
+ _qt_internal_configure_file(GENERATE OUTPUT ${settings_gradle_file}
+ INPUT "${template_file}")
+ set_property(TARGET ${target} APPEND PROPERTY _qt_android_deployment_files
+ "${settings_gradle_file}")
+endfunction()
+
+# Generates the source sets for the target.
+function(_qt_internal_android_get_gradle_source_sets out_var target)
+ set(known_types java aidl res resources renderscript assets jniLibs)
+ set(source_set "")
+ set(indent " ")
+ foreach(type IN LISTS known_types)
+ set(source_dirs
+ "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},_qt_android_gradle_${type}_source_dirs>>")
+ string(JOIN "" source_set
+ "${source_set}"
+ "$<$<BOOL:${source_dirs}>:"
+ "${indent}${type}.srcDirs = ['$<JOIN:${source_dirs},'$<COMMA> '>']\n"
+ ">"
+ )
+ endforeach()
+
+ set(manifest
+ "$<TARGET_PROPERTY:${target},_qt_android_manifest>")
+ string(JOIN "" source_set
+ "${source_set}"
+ "$<$<BOOL:${manifest}>:"
+ "${indent}manifest.srcFile '${manifest}'\n"
+ ">"
+ )
+ set(${out_var} "${source_set}" PARENT_SCOPE)
+endfunction()
+
+# Generates the gradle dependency list for the target.
+function(_qt_internal_android_get_gradle_dependencies out_var target)
+ # Use dependencies from file tree by default
+ set(known_dependencies
+ "implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])")
+ foreach(dep_type implementation api)
+ string(JOIN "\n " dep_prefix
+ "\n //noinspection GradleDependency"
+ "${dep_type} "
+ )
+ set(dep_postfix "")
+ set(dep_property "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},_qt_android_gradle_${dep_type}_dependencies>>")
+ string(JOIN "" known_dependencies
+ "${known_dependencies}"
+ "$<$<BOOL:${dep_property}>:"
+ "${dep_prefix}$<JOIN:${dep_property},${dep_postfix}${dep_prefix}>${dep_postfix}"
+ ">"
+ )
+ endforeach()
+ set(${out_var} "${known_dependencies}" PARENT_SCOPE)
+endfunction()
+
+# Sets the default values of the gradle properties for the Android executable target.
+function(_qt_internal_set_android_application_gradle_defaults target)
+ _qt_internal_android_java_dir(android_java_dir)
+
+ set(target_dynamic_features "$<TARGET_PROPERTY:${target},_qt_android_dynamic_features>")
+ string(JOIN "" implementation_dependencies
+ "$<$<BOOL:${target_dynamic_features}>:'com.google.android.play:feature-delivery:2.1.0'>"
+ )
+ # TODO: make androidx.core:core version configurable.
+ # Currently, it is hardcoded to 1.16.0.
+ list(APPEND implementation_dependencies "'androidx.core:core:1.16.0'")
+
+ set_target_properties(${target} PROPERTIES
+ _qt_android_gradle_java_source_dirs "${android_java_dir}/src;src;java"
+ _qt_android_gradle_aidl_source_dirs "${android_java_dir}/src;src;aidl"
+ _qt_android_gradle_res_source_dirs "${android_java_dir}/res;res"
+ _qt_android_gradle_resources_source_dirs "resources"
+ _qt_android_gradle_renderscript_source_dirs "src"
+ _qt_android_gradle_assets_source_dirs "assets"
+ _qt_android_gradle_jniLibs_source_dirs "libs"
+ _qt_android_manifest "AndroidManifest.xml"
+ _qt_android_gradle_implementation_dependencies "${implementation_dependencies}"
+ )
+endfunction()
+
+# Generates the build.gradle file for the target. Writes the result to the target app deployment
+# directory.
+function(_qt_internal_android_generate_target_build_gradle target)
+ cmake_parse_arguments(PARSE_ARGV 1 arg "" "DEPLOYMENT_DIR" "")
+
+ if(NOT arg_DEPLOYMENT_DIR)
+ message(FATAL_ERROR "DEPLOYMENT_DIR is not specified.")
+ endif()
+
+ set(build_gradle_filename "build.gradle")
+ set(out_file "${arg_DEPLOYMENT_DIR}/${build_gradle_filename}")
+
+ # Skip generating the file if it's already provided by user.
+ get_target_property(deployment_files ${target} _qt_android_deployment_files)
+ if("${out_file}" IN_LIST deployment_files)
+ return()
+ endif()
+
+ # TODO: The current build.gradle.in templates hardcodes couple values that needs to be
+ # configurable in the future. For example the buildscript dependencies, or the use of
+ # androidx.core:core:1.13.1 and the dependency for all user applications.
+
+ _qt_internal_android_get_gradle_property(PACKAGE_NAME ${target}
+ QT_ANDROID_PACKAGE_NAME "org.qtproject.example.$<MAKE_C_IDENTIFIER:${target}>")
+
+ _qt_internal_android_get_target_sdk_build_tools_revision(ANDROID_BUILD_TOOLS_VERSION
+ ${target})
+
+ _qt_internal_detect_latest_android_platform(ANDROID_COMPILE_SDK_VERSION)
+ if(NOT ANDROID_COMPILE_SDK_VERSION)
+ message(FATAL_ERROR "Unable to detect the android platform in ${ANDROID_SDK_ROOT}. "
+ "Please check your Android SDK installation.")
+ endif()
+
+ _qt_internal_android_get_gradle_source_sets(SOURCE_SETS ${target})
+ _qt_internal_android_get_gradle_dependencies(GRADLE_DEPENDENCIES ${target})
+
+ _qt_internal_android_get_gradle_property(min_sdk_version ${target}
+ QT_ANDROID_MIN_SDK_VERSION "28")
+
+ _qt_internal_android_get_gradle_property(target_sdk_version ${target}
+ QT_ANDROID_TARGET_SDK_VERSION "34")
+
+ set(target_abis "$<TARGET_PROPERTY:${target},_qt_android_abis>")
+ set(target_abi_list "$<JOIN:${target_abis};${CMAKE_ANDROID_ARCH_ABI},'$<COMMA> '>")
+
+ string(JOIN "\n " DEFAULT_CONFIG_VALUES
+ "resConfig 'en'"
+ "minSdkVersion ${min_sdk_version}"
+ "targetSdkVersion ${target_sdk_version}"
+ "ndk.abiFilters = ['${target_abi_list}']"
+ )
+
+ set(target_dynamic_features "$<TARGET_PROPERTY:${target},_qt_android_dynamic_features>")
+ set(include_prefix "\":")
+ set(include_suffix "\"")
+ set(include_glue "${include_suffix}$<COMMA>${include_prefix}")
+ string(APPEND ANDROID_DEPLOYMENT_EXTRAS
+ "$<$<BOOL:${target_dynamic_features}>:dynamicFeatures = ["
+ "${include_prefix}"
+ "$<JOIN:${target_dynamic_features},${include_glue}>"
+ "${include_suffix}]"
+ ">"
+ )
+
+ get_target_property(android_target_type ${target} _qt_android_target_type)
+ if(android_target_type STREQUAL "APPLICATION")
+ set(GRADLE_PLUGIN_TYPE "com.android.application")
+ set(template_subdir "app")
+ elseif(android_target_type STREQUAL "DYNAMIC_FEATURE")
+ set(GRADLE_PLUGIN_TYPE "com.android.dynamic-feature")
+ set(template_subdir "dynamic_feature")
+ else()
+ message(FATAL_ERROR "Unsupported target type for android bundle deployment ${target}")
+ endif()
+
+ _qt_internal_android_get_template_path(template_file ${target}
+ "${template_subdir}/${build_gradle_filename}")
+ _qt_internal_configure_file(GENERATE
+ OUTPUT "${out_file}"
+ INPUT "${template_file}"
+ )
+ set_property(TARGET ${target} APPEND PROPERTY _qt_android_deployment_files "${out_file}")
+endfunction()
+
+# Prepares the artifacts for the gradle build of the target.
+function(_qt_internal_android_prepare_gradle_build target)
+ _qt_internal_android_get_target_android_build_dir(android_build_dir ${target})
+ _qt_internal_android_get_target_deployment_dir(deployment_dir ${target})
+
+ _qt_internal_android_copy_gradle_files(${target} "${android_build_dir}")
+ _qt_internal_android_copy_target_package_sources(${target})
+
+ _qt_internal_android_generate_bundle_gradle_properties(${target})
+ _qt_internal_android_generate_bundle_settings_gradle(${target})
+ _qt_internal_android_generate_bundle_local_properties(${target})
+ _qt_internal_android_generate_target_build_gradle(${target} DEPLOYMENT_DIR "${deployment_dir}")
+ _qt_internal_android_generate_target_gradle_properties(${target}
+ DEPLOYMENT_DIR "${deployment_dir}")
+ _qt_internal_android_generate_target_android_manifest(${target}
+ DEPLOYMENT_DIR "${deployment_dir}")
+
+
+ _qt_internal_android_add_gradle_build(${target} apk)
+ _qt_internal_android_add_gradle_build(${target} aab)
+
+ # Make global apk, aab, and aar targets depend on the respective targets.
+ _qt_internal_android_add_global_package_dependencies(${target})
+ _qt_internal_create_global_apk_all_target_if_needed()
+endfunction()
+
+# Adds the modern gradle build targets.
+# These targets use the settings.gradle based build directory structure.
+function(_qt_internal_android_add_gradle_build target type)
+ _qt_internal_android_get_deployment_type_option(android_deployment_type_option
+ "assembleRelease" "assembleDebug")
+
+ _qt_internal_android_gradlew_name(gradlew_file_name)
+ _qt_internal_android_get_target_android_build_dir(android_build_dir ${target})
+ set(gradlew "${android_build_dir}/${gradlew_file_name}")
+
+ set(extra_args "")
+ if(type STREQUAL "aab")
+ set(extra_args "bundle")
+ endif()
+
+ set(package_file_path "${android_build_dir}/${target}.${type}")
+
+ _qt_internal_android_package_path(package_build_dir ${target} ${type})
+ _qt_internal_android_get_deployment_type_option(deployment_type_suffix
+ "release" "debug")
+ set(package_build_file_path
+ "${package_build_dir}/${deployment_type_suffix}/app-${deployment_type_suffix}.${type}")
+
+ set(extra_deps "")
+ if(TARGET ${target}_copy_feature_names)
+ list(APPEND extra_deps ${target}_copy_feature_names)
+ endif()
+
+ if(TARGET ${target}_deploy_dynamic_features)
+ list(APPEND extra_deps ${target}_deploy_dynamic_features)
+ endif()
+
+ set(gradle_scripts "$<TARGET_PROPERTY:${target},_qt_android_deployment_files>")
+ add_custom_command(OUTPUT "${package_file_path}"
+ BYPRODUCTS "${package_build_file_path}"
+ COMMAND
+ "${gradlew}" ${android_deployment_type_option} ${extra_args}
+ COMMAND
+ ${CMAKE_COMMAND} -E copy_if_different
+ "${package_build_file_path}" "${package_file_path}"
+ DEPENDS
+ ${target}
+ ${gradle_scripts}
+ ${target}_copy_gradle_files
+ ${target}_android_deploy_aux
+ ${extra_deps}
+ WORKING_DIRECTORY
+ "${android_build_dir}"
+ VERBATIM
+ )
+
+ add_custom_target(${target}_make_${type} DEPENDS "${package_file_path}")
+endfunction()
+
+# Returns the path to the android executable package either apk or aab.
+function(_qt_internal_android_package_path out_var target type)
+ set(supported_package_types apk aab)
+ if(NOT type IN_LIST supported_package_types)
+ message(FATAL_ERROR "Invalid package type, supported types: ${supported_package_types}")
+ endif()
+
+ # aab packages are located in the bundle directory
+ if(type STREQUAL "aab")
+ set(type "bundle")
+ endif()
+
+ _qt_internal_android_get_target_deployment_dir(deployment_dir ${target})
+
+ set(${out_var} "${deployment_dir}/build/outputs/${type}" PARENT_SCOPE)
+endfunction()
+
+# Returns the path to the gradle build directory.
+function(_qt_internal_android_gradle_template_dir out_var)
+ if(PROJECT_NAME STREQUAL "QtBase" OR QT_SUPERBUILD)
+ set(${out_var} "${QtBase_SOURCE_DIR}/src/3rdparty/gradle" PARENT_SCOPE)
+ else()
+ set(${out_var} "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_DATA}/src/3rdparty/gradle" PARENT_SCOPE)
+ endif()
+endfunction()
+
+# Returns the path to the android java dir.
+function(_qt_internal_android_java_dir out_var)
+ if(PROJECT_NAME STREQUAL "QtBase" OR QT_SUPERBUILD)
+ set(${out_var} "${QtBase_SOURCE_DIR}/src/android/java" PARENT_SCOPE)
+ else()
+ set(${out_var} "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_DATA}/src/android/java" PARENT_SCOPE)
+ endif()
+endfunction()
+
+# Returns the platform-spefic name of the gradlew script.
+function(_qt_internal_android_gradlew_name out_var)
+ if(CMAKE_HOST_WIN32)
+ set(gradlew_file_name "gradlew.bat")
+ else()
+ set(gradlew_file_name "gradlew")
+ endif()
+
+ set(${out_var} "${gradlew_file_name}" PARENT_SCOPE)
+endfunction()
+
+# Return the path to the gradlew script.
+function(_qt_internal_android_gradlew_path out_var target)
+ _qt_internal_android_get_target_android_build_dir(android_build_dir ${target})
+ set(${out_var} "${android_build_dir}/${gradlew_file_name}" PARENT_SCOPE)
+endfunction()
+
+# Returns the generator expression for the gradle_property value. Defaults to the default_value
+# argument.
+function(_qt_internal_android_get_gradle_property out_var target target_property default_value)
+ set(target_property_genex "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},${target_property}>>")
+ string(JOIN "" result
+ "$<IF:$<BOOL:${target_property_genex}>,"
+ "${target_property_genex},"
+ "${default_value}"
+ ">"
+ )
+ set(${out_var} "${result}" PARENT_SCOPE)
+endfunction()
+
+# Generates gradle.properties for the specific target. Usually contains the
+# target build type(executable, dynamic feature, library).
+function(_qt_internal_android_generate_target_gradle_properties target)
+ cmake_parse_arguments(PARSE_ARGV 1 arg "" "DEPLOYMENT_DIR" "")
+
+ if(NOT arg_DEPLOYMENT_DIR)
+ message(FATAL_ERROR "DEPLOYMENT_DIR is not specified.")
+ endif()
+
+ set(gradle_properties_file_name "gradle.properties")
+ set(out_file "${arg_DEPLOYMENT_DIR}/${gradle_properties_file_name}")
+ # Skip generating the file if it's already provided by user.
+ get_target_property(deployment_files ${target} _qt_android_deployment_files)
+ if("${out_file}" IN_LIST deployment_files)
+ return()
+ endif()
+
+ _qt_internal_android_get_template_path(template_file ${target}
+ "app/${gradle_properties_file_name}")
+ _qt_internal_configure_file(CONFIGURE
+ OUTPUT "${out_file}"
+ INPUT "${template_file}"
+ )
+ set_property(TARGET ${target} APPEND PROPERTY _qt_android_deployment_files "${out_file}")
+endfunction()
+
+# Constucts generator expression that returns either target property or the default value
+function(_qt_internal_android_get_manifest_property out_var target property default)
+ set(target_property "$<TARGET_PROPERTY:${target},${property}>")
+ string(JOIN "" out_genex
+ "$<IF:$<BOOL:${target_property}>,"
+ "${target_property},"
+ "${default}"
+ ">"
+ )
+
+ set(${out_var} "${out_genex}" PARENT_SCOPE)
+endfunction()
+
+# Generates the target AndroidManifest.xml
+function(_qt_internal_android_generate_target_android_manifest target)
+ cmake_parse_arguments(PARSE_ARGV 1 arg "" "DEPLOYMENT_DIR" "")
+
+ if(NOT arg_DEPLOYMENT_DIR)
+ message(FATAL_ERROR "DEPLOYMENT_DIR is not specified.")
+ endif()
+
+ set(android_manifest_filename "AndroidManifest.xml")
+ set(out_file "${arg_DEPLOYMENT_DIR}/${android_manifest_filename}")
+
+ # Skip generating the file if it's already provided by user.
+ get_target_property(deployment_files ${target} _qt_android_deployment_files)
+ if("${out_file}" IN_LIST deployment_files)
+ return()
+ endif()
+
+ _qt_internal_android_get_template_path(template_file ${target}
+ "app/${android_manifest_filename}")
+ set(temporary_file "${out_file}.tmp")
+
+ # The file cannot be generated at cmake configure time, because androiddeployqt
+ # will override it at build time. We use this trick with temporary file to override
+ # it after the aux run of androiddeployqt.
+ add_custom_command(OUTPUT "${out_file}"
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ "${temporary_file}"
+ "${out_file}"
+ DEPENDS
+ "${template_file}"
+ "${temporary_file}"
+ ${target}_android_deploy_aux
+ )
+
+ _qt_internal_android_get_manifest_property(APP_PACKAGE_NAME ${target}
+ QT_ANDROID_PACKAGE_NAME "org.qtproject.example.$<MAKE_C_IDENTIFIER:${target}>")
+ _qt_internal_android_get_manifest_property(APP_NAME ${target}
+ QT_ANDROID_APP_NAME "${target}")
+ _qt_internal_android_get_manifest_property(APP_VERSION_CODE ${target}
+ QT_ANDROID_VERSION_CODE "1")
+ _qt_internal_android_get_manifest_property(APP_VERSION_NAME ${target}
+ QT_ANDROID_VERSION_NAME "1")
+ _qt_internal_android_get_manifest_property(APP_LIB_NAME ${target} OUTPUT_NAME "${target}")
+
+ # For application icon we substitute the whole attribute definition, but not only value
+ # otherwise it leads to the Manifest processing issue.
+ set(target_property "$<TARGET_PROPERTY:${target},QT_ANDROID_APP_ICON>")
+ string(JOIN "" APP_ICON
+ "$<$<BOOL:${target_property}>:"
+ "android:icon=\"${target_property}\""
+ ">"
+ )
+
+ file(READ "${template_file}" manifest_content)
+ string(REPLACE ">" "$<ANGLE-R>" manifest_content "${manifest_content}")
+ string(REPLACE ";" "$<SEMICOLON>" manifest_content "${manifest_content}")
+ string(REPLACE "," "$<COMMA>" manifest_content "${manifest_content}")
+
+ _qt_internal_android_convert_permissions(APP_PERMISSIONS ${target} XML)
+
+ set(feature_prefix "\n <uses-feature android:name=\"")
+ set(feature_suffix " \" android:required=\"false\" /$<ANGLE-R>")
+ set(feature_property "$<TARGET_PROPERTY:${target},QT_ANDROID_FEATURES>")
+ string(JOIN "" APP_FEATURES
+ "$<$<BOOL:${feature_property}>:"
+ "${feature_prefix}"
+ "$<JOIN:${feature_property},${feature_suffix},${feature_prefix}>"
+ "${feature_suffix}"
+ ">"
+ )
+
+ set(APP_ARGUMENTS "${QT_ANDROID_APPLICATION_ARGUMENTS}")
+
+ _qt_internal_configure_file(GENERATE OUTPUT "${temporary_file}"
+ CONTENT "${manifest_content}")
+
+ set_property(TARGET ${target} APPEND PROPERTY
+ _qt_android_deployment_files "${out_file}" "${temporary_file}")
+endfunction()
+
+# Generates the top-level gradle.properties in the android-build directory
+# The file contains the information about the versions of the android build
+# tools, the list of supported ABIs.
+function(_qt_internal_android_generate_bundle_gradle_properties target)
+ set(EXTRA_PROPERTIES "")
+
+ set(gradle_properties_file_name "gradle.properties")
+ _qt_internal_android_get_target_android_build_dir(android_build_dir ${target})
+ set(out_file "${android_build_dir}/${gradle_properties_file_name}")
+
+ # Skip generating the file if it's already provided by user.
+ get_target_property(deployment_files ${target} _qt_android_deployment_files)
+ if("${out_file}" IN_LIST deployment_files)
+ return()
+ endif()
+
+ _qt_internal_android_get_template_path(template_file ${target} "${gradle_properties_file_name}")
+ _qt_internal_configure_file(CONFIGURE
+ OUTPUT "${out_file}"
+ INPUT "${template_file}"
+ )
+ set_property(TARGET ${target} APPEND PROPERTY _qt_android_deployment_files "${out_file}")
+endfunction()
+
+# Generates the local.properties for gradle builds. Contains the path to the
+# Android SDK root.
+function(_qt_internal_android_generate_bundle_local_properties target)
+ _qt_internal_android_get_target_android_build_dir(android_build_dir ${target})
+ set(out_file "${android_build_dir}/local.properties")
+
+ # Skip generating the file if it's already provided by user.
+ get_target_property(deployment_files ${target} _qt_android_deployment_files)
+ if("${out_file}" IN_LIST deployment_files)
+ return()
+ endif()
+
+ file(TO_CMAKE_PATH "${ANDROID_SDK_ROOT}" ANDROID_SDK_ROOT_NATIVE)
+ _qt_internal_configure_file(CONFIGURE OUTPUT "${out_file}"
+ CONTENT "sdk.dir=${ANDROID_SDK_ROOT_NATIVE}\n")
+endfunction()
+
+# Copies the customized Android package sources to the Android build directory
+function(_qt_internal_android_copy_target_package_sources target)
+ _qt_internal_android_get_package_source_dir(package_source_dir ${target})
+
+ if(NOT package_source_dir)
+ return()
+ endif()
+ get_filename_component(package_source_dir "${package_source_dir}" ABSOLUTE)
+
+ # Collect deployment files from use-defined package source directory
+ file(GLOB_RECURSE package_files
+ LIST_DIRECTORIES false
+ RELATIVE "${package_source_dir}"
+ "${package_source_dir}/*"
+ )
+
+ # Do not copy files that we treat as CMake templates, having '.in' extention.
+ #
+ # TODO: If it ever will be an issue we may exclude only templates that are
+ # known by our build system.
+ list(FILTER package_files EXCLUDE REGEX ".+\\.in$")
+
+ _qt_internal_android_get_target_android_build_dir(android_build_dir ${target})
+ list(TRANSFORM package_files PREPEND "${android_build_dir}/" OUTPUT_VARIABLE out_package_files)
+ list(TRANSFORM package_files PREPEND "${package_source_dir}/" OUTPUT_VARIABLE in_package_files)
+
+ if(in_package_files)
+ # TODO: Add cmake < 3.26 support
+ if(CMAKE_VERSION VERSION_LESS 3.26)
+ message(FATAL_ERROR "The use of QT_ANDROID_PACKAGE_SOURCE_DIR property with
+ the QT_USE_ANDROID_MODERN_BUNDLE option enabled requires CMake version >= 3.26.")
+ endif()
+ set(copy_commands COMMAND "${CMAKE_COMMAND}" -E copy_directory_if_different
+ "${package_source_dir}" "${android_build_dir}")
+ else()
+ # We actually have nothing to deploy.
+ return()
+ endif()
+
+ add_custom_command(OUTPUT ${out_package_files}
+ ${copy_commands}
+ DEPENDS
+ ${in_package_files}
+ VERBATIM
+ )
+
+ set_target_properties(${target} PROPERTIES _qt_android_deployment_files "${out_package_files}")
+endfunction()
+
+# Copies gradle scripts to a build directory.
+function(_qt_internal_android_copy_gradle_files target output_directory)
+ _qt_internal_android_gradlew_name(gradlew_file_name)
+ _qt_internal_android_gradle_template_dir(gradle_template_dir)
+
+ set(gradlew_file_src "${gradle_template_dir}/${gradlew_file_name}")
+ set(gradlew_file_dst "${output_directory}/${gradlew_file_name}")
+
+ add_custom_command(OUTPUT "${gradlew_file_dst}"
+ COMMAND
+ ${CMAKE_COMMAND} -E copy_if_different "${gradlew_file_src}" "${gradlew_file_dst}"
+ DEPENDS "${gradlew_file_src}"
+ COMMENT "Copying gradlew script for ${target}"
+ VERBATIM
+ )
+
+ # TODO: make a more precise directory copying
+ set(gradle_dir_src "${gradle_template_dir}/gradle")
+ set(gradle_dir_dst "${output_directory}/gradle")
+ add_custom_command(OUTPUT "${gradle_dir_dst}"
+ COMMAND
+ ${CMAKE_COMMAND} -E copy_directory "${gradle_dir_src}" "${gradle_dir_dst}"
+ DEPENDS "${gradle_dir_src}"
+ COMMENT "Copying gradle support files for ${target}"
+ VERBATIM
+ )
+
+ add_custom_target(${target}_copy_gradle_files
+ DEPENDS
+ "${gradlew_file_dst}"
+ "${gradle_dir_dst}"
+ )
+endfunction()
diff --git a/src/corelib/Qt6AndroidMacros.cmake b/src/corelib/Qt6AndroidMacros.cmake
index aa0e5bfed24..ed97a42c83f 100644
--- a/src/corelib/Qt6AndroidMacros.cmake
+++ b/src/corelib/Qt6AndroidMacros.cmake
@@ -120,6 +120,29 @@ function(_qt_internal_generate_android_permissions_json out_result target)
set(${out_result} "${result}" PARENT_SCOPE)
endfunction()
+# Add the specific dynamic library as the dynamic feature for the Android application target.
+function(qt6_add_android_dynamic_features target)
+ cmake_parse_arguments(PARSE_ARGV 1 arg "" "" "FEATURE_TARGETS")
+ if(NOT QT_USE_ANDROID_MODERN_BUNDLE)
+ message(FATAL_ERROR "qt6_add_android_dynamic_features is only supported with"
+ " 'QT_USE_ANDROID_MODERN_BUNDLE' enabled.")
+ endif()
+ if(NOT TARGET ${target})
+ message(FATAL_ERROR "${target} is not a target. Cannot add the dynamic features.")
+ endif()
+ get_target_property(android_type ${target} _qt_android_target_type)
+ if(NOT android_type STREQUAL "APPLICATION")
+ message(FATAL_ERROR "${target} is not an android executable target."
+ " Cannot add the dynamic features.")
+ endif()
+ if(arg_FEATURE_TARGETS)
+ set_property(TARGET ${target}
+ APPEND PROPERTY _qt_android_dynamic_features ${arg_FEATURE_TARGETS})
+ else()
+ message(WARNING "No dynamic features provided.")
+ endif()
+endfunction()
+
# Generate the deployment settings json file for a cmake target.
function(qt6_android_generate_deployment_settings target)
# Information extracted from mkspecs/features/android/android_deployment_settings.prf
@@ -324,8 +347,9 @@ function(qt6_android_generate_deployment_settings target)
__qt_internal_collect_plugin_library_files_v2("${target}" "${plugin_targets}" plugin_targets)
string(APPEND file_contents " \"android-deploy-plugins\":\"${plugin_targets}\",\n")
- _qt_internal_generate_android_permissions_json(permissions_json_array "${target}")
- string(APPEND file_contents " \"permissions\": ${permissions_json_array},\n")
+
+ _qt_internal_android_convert_permissions(permissions_genex ${target} JSON)
+ string(APPEND file_contents " \"permissions\": ${permissions_genex},\n")
# App binary
string(APPEND file_contents
@@ -415,44 +439,6 @@ if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
endfunction()
endif()
-function(_qt_internal_add_android_permission target)
- if(NOT TARGET ${target})
- message(FATAL_ERROR "Empty or invalid target for adding Android permission: (${target})")
- endif()
-
- cmake_parse_arguments(arg "" "NAME" "ATTRIBUTES" ${ARGN})
-
- if(NOT arg_NAME)
- message(FATAL_ERROR "NAME for adding Android permission cannot be empty (${target})")
- endif()
-
- set(permission_entry "${arg_NAME}")
-
- if(arg_ATTRIBUTES)
- # Permission with additional attributes
- list(LENGTH arg_ATTRIBUTES attributes_len)
- math(EXPR attributes_modulus "${attributes_len} % 2")
- if(NOT (attributes_len GREATER 1 AND attributes_modulus EQUAL 0))
- message(FATAL_ERROR "Android permission: ${arg_NAME} attributes: ${arg_ATTRIBUTES} must"
- " be name-value pairs (for example: minSdkVersion 30)")
- endif()
- # Combine name-value pairs
- set(index 0)
- set(attributes "")
- while(index LESS attributes_len)
- list(GET arg_ATTRIBUTES ${index} name)
- math(EXPR index "${index} + 1")
- list(GET arg_ATTRIBUTES ${index} value)
- string(APPEND attributes "android:${name}=\'${value}\' ")
- math(EXPR index "${index} + 1")
- endwhile()
- set(permission_entry "${permission_entry}\;${attributes}")
- endif()
-
- # Append the permission to the target's property
- set_property(TARGET ${target} APPEND PROPERTY QT_ANDROID_PERMISSIONS "${permission_entry}")
-endfunction()
-
function(qt6_add_android_permission target)
_qt_internal_add_android_permission(${ARGV})
endfunction()
@@ -519,18 +505,6 @@ function(qt6_android_add_apk_target target)
">"
)
- # Make global apk and aab targets depend on the current apk target.
- if(TARGET aab)
- add_dependencies(aab ${target}_make_aab)
- endif()
- if(TARGET aar)
- add_dependencies(aar ${target}_make_aar)
- endif()
- if(TARGET apk)
- add_dependencies(apk ${target}_make_apk)
- _qt_internal_create_global_apk_all_target_if_needed()
- endif()
-
_qt_internal_android_get_deployment_tool(deployment_tool)
# No need to use genex for the BINARY_DIR since it's read-only.
@@ -719,6 +693,10 @@ function(qt6_android_add_apk_target target)
)
add_dependencies(${target}_make_aab ${target}_prepare_apk_dir)
+ # Make global apk, aab, and aar targets depend on the respective targets.
+ _qt_internal_android_add_global_package_dependencies(${target})
+ _qt_internal_create_global_apk_all_target_if_needed()
+
if(QT_IS_ANDROID_MULTI_ABI_EXTERNAL_PROJECT)
# When building per-ABI external projects we only need to copy ABI-specific libraries and
# resources to the "main" ABI android build folder.
@@ -1661,13 +1639,26 @@ endfunction()
# module and is executed implicitly when configuring user projects.
function(_qt_internal_android_executable_finalizer target)
set_property(TARGET ${target} PROPERTY _qt_android_executable_finalizer_called TRUE)
+ set_property(TARGET ${target} PROPERTY _qt_android_in_finalizer "EXECUTABLE")
_qt_internal_expose_android_package_source_dir_to_ide(${target})
_qt_internal_configure_android_multiabi_target("${target}")
qt6_android_generate_deployment_settings("${target}")
- qt6_android_add_apk_target("${target}")
+ if(QT_USE_ANDROID_MODERN_BUNDLE)
+ _qt_internal_android_generate_dynamic_feature_names("${target}")
+ _qt_internal_android_add_dynamic_feature_deployment("${target}")
+
+ _qt_internal_android_prepare_gradle_build("${target}")
+ _qt_internal_android_add_aux_deployment("${target}")
+
+ _qt_internal_collect_apk_dependencies_defer()
+ _qt_internal_collect_apk_imported_dependencies_defer("${target}")
+ else()
+ qt6_android_add_apk_target("${target}")
+ endif()
_qt_internal_android_create_runner_wrapper("${target}")
+ set_property(TARGET ${target} PROPERTY _qt_android_in_finalizer "")
endfunction()
# Helper to add the android executable finalizer.
@@ -1737,8 +1728,9 @@ function(_qt_internal_android_app_runner_arguments target out_runner_path out_ar
set(${out_runner_path} "${runner_dir}/qt-android-runner.py" PARENT_SCOPE)
_qt_internal_android_get_target_android_build_dir(android_build_dir ${target})
+ _qt_internal_android_get_platform_tools_path(platform_tools)
set(${out_arguments}
- "--adb" "${ANDROID_SDK_ROOT}/platform-tools/adb"
+ "--adb" "${platform_tools}/adb"
"--build-path" "${android_build_dir}"
"--apk" "${android_build_dir}/${target}.apk"
PARENT_SCOPE
@@ -1754,8 +1746,13 @@ function(_qt_internal_android_get_target_android_build_dir out_build_dir target)
endif()
endfunction()
+function(_qt_internal_android_get_target_deployment_dir out_deploy_dir target)
+ _qt_internal_android_get_target_android_build_dir(build_dir ${target})
+ set(${out_deploy_dir} "${build_dir}/app" PARENT_SCOPE)
+endfunction()
+
function(_qt_internal_expose_android_package_source_dir_to_ide target)
- get_target_property(android_package_source_dir ${target} QT_ANDROID_PACKAGE_SOURCE_DIR)
+ _qt_internal_android_get_package_source_dir(android_package_source_dir ${target})
if(android_package_source_dir)
get_target_property(target_source_dir ${target} SOURCE_DIR)
if(NOT IS_ABSOLUTE "${android_package_source_dir}")
@@ -1778,6 +1775,71 @@ function(_qt_internal_expose_android_package_source_dir_to_ide target)
endif()
endfunction()
+function(_qt_internal_android_add_aux_deployment target)
+ cmake_parse_arguments(arg "" "OUTPUT_TARGET_NAME;DEPLOYMENT_DIRECTORY" "EXTRA_ARGS" ${ARGN})
+ _qt_internal_validate_all_args_are_parsed(arg)
+
+ string(JOIN "" deployment_file
+ "$<GENEX_EVAL:"
+ "$<TARGET_PROPERTY:${target},QT_ANDROID_DEPLOYMENT_SETTINGS_FILE>"
+ ">"
+ )
+
+ _qt_internal_android_get_deployment_tool(deployment_tool)
+ if(arg_DEPLOYMENT_DIRECTORY)
+ set(deployment_dir "${arg_DEPLOYMENT_DIRECTORY}")
+ else()
+ _qt_internal_android_get_target_deployment_dir(deployment_dir ${target})
+ endif()
+
+ cmake_policy(PUSH)
+ if(POLICY CMP0116)
+ # Without explicitly setting this policy to NEW, we get a warning
+ # even though we ensure there's actually no problem here.
+ # See https://gitlab.kitware.com/cmake/cmake/-/issues/21959
+ cmake_policy(SET CMP0116 NEW)
+ set(relative_to_dir ${CMAKE_CURRENT_BINARY_DIR})
+ else()
+ set(relative_to_dir ${CMAKE_BINARY_DIR})
+ endif()
+
+ set(target_file_copy_relative_path
+ "libs/${CMAKE_ANDROID_ARCH_ABI}/$<TARGET_FILE_NAME:${target}>")
+ _qt_internal_copy_file_if_different_command(copy_command
+ "$<TARGET_FILE:${target}>"
+ "${deployment_dir}/${target_file_copy_relative_path}"
+ )
+
+ _qt_internal_android_get_use_terminal_for_deployment(uses_terminal)
+
+ # TODO: We use androiddeployqt to collect target depdenencies and produce the lib.xml file
+ # which autoloads the collected libraries. Should be done using GRE and transitive properties
+ # in the future.
+ set(libs_xml "${deployment_dir}/res/values/libs.xml")
+ add_custom_command(OUTPUT "${libs_xml}"
+ COMMAND ${copy_command}
+ COMMAND "${deployment_tool}"
+ --input "${deployment_file}"
+ --output "${deployment_dir}"
+ --builddir "${relative_to_dir}"
+ --aux-mode
+ ${arg_EXTRA_ARGS}
+ #TODO: Support signing
+ COMMENT "Deploying Android artifacts for ${target}"
+ DEPENDS "${target}" "${deployment_file}"
+ VERBATIM
+ ${uses_terminal}
+ )
+
+ if(NOT arg_OUTPUT_TARGET_NAME)
+ set(arg_OUTPUT_TARGET_NAME ${target}_android_deploy_aux)
+ endif()
+
+ add_custom_target(${arg_OUTPUT_TARGET_NAME} DEPENDS "${libs_xml}")
+
+ cmake_policy(POP)
+endfunction()
+
# Enables the terminal usage for the add_custom_command calls when verbose deployment is enabled.
function(_qt_internal_android_get_use_terminal_for_deployment out_var)
if(QT_ENABLE_VERBOSE_DEPLOYMENT)
@@ -1822,6 +1884,45 @@ function(_qt_internal_android_get_deployment_type_option out_var release_flag de
endif()
endfunction()
+# Returns the path to the android template directory, that are used by CMake
+# deployment procedures.
+function(_qt_internal_android_template_dir out_var)
+ if(PROJECT_NAME STREQUAL "QtBase" OR QT_SUPERBUILD)
+ set(${out_var} "${QtBase_SOURCE_DIR}/src/android/templates_cmake" PARENT_SCOPE)
+ else()
+ set(${out_var}
+ "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_DATA}/src/android/templates_cmake" PARENT_SCOPE)
+ endif()
+endfunction()
+
+# Return the path to the target template directory if it's set for the target.
+# Then this path is stored in the target QT_ANDROID_PACKAGE_SOURCE_DIR property
+# and can only be effectively read in android finalizers.
+function(_qt_internal_android_get_package_source_dir out_var target)
+ get_target_property(in_finalizer ${target} _qt_android_in_finalizer)
+ if(NOT in_finalizer)
+ message(FATAL_ERROR "The '_qt_internal_android_get_package_source_dir' function is"
+ " called outside the Android finalizer."
+ " This is the Qt issue, please report a bug at https://bugreports.qt.io.")
+ endif()
+ get_target_property(package_src_dir ${target} QT_ANDROID_PACKAGE_SOURCE_DIR)
+ if(NOT package_src_dir)
+ set(package_src_dir "")
+ endif()
+ set(${out_var} "${package_src_dir}" PARENT_SCOPE)
+endfunction()
+
+# Add target_make_<apk|aab> as the depednecy for the respective global apk/aab
+# target.
+function(_qt_internal_android_add_global_package_dependencies target)
+ foreach(type apk aab aar)
+ # Make global apk and aab targets depend on the current apk target.
+ if(TARGET ${type} AND TARGET ${target}_make_${type})
+ add_dependencies(${type} ${target}_make_${type})
+ endif()
+ endforeach()
+endfunction()
+
function(_qt_internal_android_get_target_abis out_abis target)
get_target_property(target_abis ${target} QT_ANDROID_ABIS)
if(target_abis)
@@ -1840,5 +1941,10 @@ function(_qt_internal_android_get_target_abis out_abis target)
set(${out_abis} "${android_abis}" PARENT_SCOPE)
endfunction()
+# Returns the path to the Android platform-tools(adb is located there).
+function(_qt_internal_android_get_platform_tools_path out_var)
+ set(${out_var} "${ANDROID_SDK_ROOT}/platform-tools" PARENT_SCOPE)
+endfunction()
+
set(QT_INTERNAL_ANDROID_TARGET_BUILD_DIR_SUPPORT ON CACHE INTERNAL
"Indicates that Qt supports per-target Android build directories")
diff --git a/src/corelib/Qt6AndroidPermissionHelpers.cmake b/src/corelib/Qt6AndroidPermissionHelpers.cmake
new file mode 100644
index 00000000000..7f851e14667
--- /dev/null
+++ b/src/corelib/Qt6AndroidPermissionHelpers.cmake
@@ -0,0 +1,126 @@
+# Copyright (C) 2025 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Generates the generator expression that converts the 'target'
+# QT_ANDROID_PERMISSIONS property to the specific 'type'.
+#
+# It's expected that each element in QT_ANDROID_PERMISSIONS list has specific
+# format:
+# <name>\;<permission>\\\;<extra1>\;<value>\\\;<extra2>\;<value>
+#
+# Synopsis
+# _qt_internal_android_convert_permissions(out_var target <JSON|XML>)
+#
+# Arguments
+#
+# `out_var`
+# The name of the variable where the resulting generator expression is
+# stored.
+#
+# `target`
+# The name of the target.
+#
+# `JSON`
+# Generate JSON array known by androiddeployqt.
+#
+# `XML`
+# Generate XML content compatible with AndroidManifest.xml.
+function(_qt_internal_android_convert_permissions out_var target type)
+ set(permissions_property "$<TARGET_PROPERTY:${target},QT_ANDROID_PERMISSIONS>")
+ set(permissions_genex "$<$<BOOL:${permissions_property}>:")
+ if(type STREQUAL "JSON")
+ set(pref "{ \"")
+ set(post "\" }")
+ set(indent "\n ")
+ string(APPEND permissions_genex
+ "[${indent}$<JOIN:"
+ "$<JOIN:"
+ "${pref}$<JOIN:"
+ "${permissions_property},"
+ "${post}$<COMMA>${indent}${pref}"
+ ">${post},"
+ "\": \""
+ ">,"
+ "\"$<COMMA> \""
+ ">\n ]"
+ )
+ elseif(type STREQUAL "XML")
+ set(pref "<uses-permission\n android:")
+ set(post "' /$<ANGLE-R>\n")
+ string(APPEND permissions_genex
+ "$<JOIN:"
+ "$<JOIN:"
+ "${pref}$<JOIN:"
+ "${permissions_property},"
+ "${post}${pref}"
+ ">${post}\n,"
+ "='"
+ ">,"
+ "' android:"
+ ">"
+ )
+ else()
+ message(FATAL_ERROR "Invalid type ${type}. Supported types: JSON, XML")
+ endif()
+ string(APPEND permissions_genex ">")
+
+ set(${out_var} "${permissions_genex}" PARENT_SCOPE)
+endfunction()
+
+# Add the specific Android permission to the target. The permission is stored
+# in the QT_ANDROID_PERMISSIONS property(the property is not a public API)
+# and has the following format:
+# <name>\;<permission>\\\;<extra1>\;<value>\\\;<extra2>\;<value>
+#
+# Synopsis
+# _qt_internal_add_android_permission(target NAME <permission>
+# ATTRIBUTES <extra1> <value1>
+# [<extra2> <value2>]...
+# )
+#
+# Arguments
+#
+# `target`
+# The Android target.
+#
+# `NAME`
+# The permission name. E.g. 'android.permission.CAMERA'.
+#
+# `ATTRIBUTES`
+# Extra permission attribute key-value pairs.
+# See https://developer.android.com/guide/topics/manifest/uses-permission-element
+# for details.
+function(_qt_internal_add_android_permission target)
+ if(NOT TARGET ${target})
+ message(FATAL_ERROR "Empty or invalid target for adding Android permission: (${target})")
+ endif()
+
+ cmake_parse_arguments(arg "" "NAME" "ATTRIBUTES" ${ARGN})
+
+ if(NOT arg_NAME)
+ message(FATAL_ERROR "NAME for adding Android permission cannot be empty (${target})")
+ endif()
+
+ set(permission_entry "name\;${arg_NAME}")
+ if(arg_ATTRIBUTES)
+ # Permission with additional attributes
+ list(LENGTH arg_ATTRIBUTES attributes_len)
+ math(EXPR attributes_modulus "${attributes_len} % 2")
+ if(NOT (attributes_len GREATER 1 AND attributes_modulus EQUAL 0))
+ message(FATAL_ERROR "Android permission: ${arg_NAME} attributes: ${arg_ATTRIBUTES}"
+ " must be name-value pairs (for example: minSdkVersion 30)")
+ endif()
+ # Combine name-value pairs
+ set(index 0)
+ while(index LESS attributes_len)
+ list(GET arg_ATTRIBUTES ${index} name)
+ math(EXPR index "${index} + 1")
+ list(GET arg_ATTRIBUTES ${index} value)
+ string(APPEND permission_entry "\\\;${name}\;${value}")
+ math(EXPR index "${index} + 1")
+ endwhile()
+ endif()
+
+ # Append the permission to the target's property
+ set_property(TARGET ${target} APPEND PROPERTY QT_ANDROID_PERMISSIONS "${permission_entry}")
+endfunction()
diff --git a/src/corelib/Qt6CoreConfigExtras.cmake.in b/src/corelib/Qt6CoreConfigExtras.cmake.in
index 15405197a61..8a88d558fa8 100644
--- a/src/corelib/Qt6CoreConfigExtras.cmake.in
+++ b/src/corelib/Qt6CoreConfigExtras.cmake.in
@@ -30,6 +30,10 @@ _qt_internal_setup_deploy_support()
if(ANDROID_PLATFORM)
include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
+ include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
+ include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
+ include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
+
_qt_internal_create_global_android_targets()
_qt_internal_collect_default_android_abis()
if(__qt_Core_targets_file_included)
diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake
index 3f5f9180805..5bc85ae7f7a 100644
--- a/src/corelib/Qt6CoreMacros.cmake
+++ b/src/corelib/Qt6CoreMacros.cmake
@@ -683,6 +683,9 @@ function(_qt_internal_create_executable target)
)
qt6_android_apply_arch_suffix("${target}")
+ if(QT_USE_ANDROID_MODERN_BUNDLE)
+ _qt_internal_set_android_application_gradle_defaults(${target})
+ endif()
else()
cmake_policy(PUSH)
__qt_internal_set_cmp0156()
@@ -3799,7 +3802,7 @@ function(qt6_generate_deploy_app_script)
qt6_generate_deploy_script(${generate_args}
CONTENT "
qt6_deploy_runtime_dependencies(
- EXECUTABLE $<TARGET_FILE_NAME:${arg_TARGET}>.app
+ EXECUTABLE \"$<TARGET_FILE_NAME:${arg_TARGET}>.app\"
${common_deploy_args})
")
@@ -3807,7 +3810,7 @@ ${common_deploy_args})
qt6_generate_deploy_script(${generate_args}
CONTENT "
qt6_deploy_runtime_dependencies(
- EXECUTABLE $<TARGET_FILE:${arg_TARGET}>
+ EXECUTABLE \"$<TARGET_FILE:${arg_TARGET}>\"
GENERATE_QT_CONF
${common_deploy_args})
")
@@ -3817,7 +3820,7 @@ ${common_deploy_args})
qt6_generate_deploy_script(${generate_args}
CONTENT "
qt6_deploy_runtime_dependencies(
- EXECUTABLE $<TARGET_FILE:${arg_TARGET}>
+ EXECUTABLE \"$<TARGET_FILE:${arg_TARGET}>\"
GENERATE_QT_CONF
${common_deploy_args})
")
diff --git a/src/corelib/animation/qabstractanimation.cpp b/src/corelib/animation/qabstractanimation.cpp
index d74894e1e42..4388122b7b9 100644
--- a/src/corelib/animation/qabstractanimation.cpp
+++ b/src/corelib/animation/qabstractanimation.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
/*!
\class QAbstractAnimation
diff --git a/src/corelib/animation/qabstractanimation.h b/src/corelib/animation/qabstractanimation.h
index 69a30556a3a..b4b43e64a1d 100644
--- a/src/corelib/animation/qabstractanimation.h
+++ b/src/corelib/animation/qabstractanimation.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QABSTRACTANIMATION_H
#define QABSTRACTANIMATION_H
diff --git a/src/corelib/animation/qabstractanimation_p.h b/src/corelib/animation/qabstractanimation_p.h
index d6c245f36f0..51c635f1bed 100644
--- a/src/corelib/animation/qabstractanimation_p.h
+++ b/src/corelib/animation/qabstractanimation_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QABSTRACTANIMATION_P_H
#define QABSTRACTANIMATION_P_H
diff --git a/src/corelib/animation/qanimationgroup.cpp b/src/corelib/animation/qanimationgroup.cpp
index d2572a7462b..ae96069e86f 100644
--- a/src/corelib/animation/qanimationgroup.cpp
+++ b/src/corelib/animation/qanimationgroup.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
/*!
\class QAnimationGroup
diff --git a/src/corelib/animation/qanimationgroup.h b/src/corelib/animation/qanimationgroup.h
index 412e2d442ea..07d24ae1f73 100644
--- a/src/corelib/animation/qanimationgroup.h
+++ b/src/corelib/animation/qanimationgroup.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QANIMATIONGROUP_H
#define QANIMATIONGROUP_H
diff --git a/src/corelib/animation/qanimationgroup_p.h b/src/corelib/animation/qanimationgroup_p.h
index 334f780968a..a09bc6ebcc6 100644
--- a/src/corelib/animation/qanimationgroup_p.h
+++ b/src/corelib/animation/qanimationgroup_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QANIMATIONGROUP_P_H
#define QANIMATIONGROUP_P_H
diff --git a/src/corelib/animation/qparallelanimationgroup.cpp b/src/corelib/animation/qparallelanimationgroup.cpp
index 86e9417b595..0b43a73434f 100644
--- a/src/corelib/animation/qparallelanimationgroup.cpp
+++ b/src/corelib/animation/qparallelanimationgroup.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
/*!
\class QParallelAnimationGroup
diff --git a/src/corelib/animation/qparallelanimationgroup.h b/src/corelib/animation/qparallelanimationgroup.h
index 77bc6eabac7..9442f4f7355 100644
--- a/src/corelib/animation/qparallelanimationgroup.h
+++ b/src/corelib/animation/qparallelanimationgroup.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QPARALLELANIMATIONGROUP_H
#define QPARALLELANIMATIONGROUP_H
diff --git a/src/corelib/animation/qparallelanimationgroup_p.h b/src/corelib/animation/qparallelanimationgroup_p.h
index 62c53d36097..482b9555c7d 100644
--- a/src/corelib/animation/qparallelanimationgroup_p.h
+++ b/src/corelib/animation/qparallelanimationgroup_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QPARALLELANIMATIONGROUP_P_H
#define QPARALLELANIMATIONGROUP_P_H
diff --git a/src/corelib/animation/qpauseanimation.cpp b/src/corelib/animation/qpauseanimation.cpp
index 344b21946e3..74e22e2f053 100644
--- a/src/corelib/animation/qpauseanimation.cpp
+++ b/src/corelib/animation/qpauseanimation.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
/*!
\class QPauseAnimation
diff --git a/src/corelib/animation/qpauseanimation.h b/src/corelib/animation/qpauseanimation.h
index f661459f835..bf7863a171c 100644
--- a/src/corelib/animation/qpauseanimation.h
+++ b/src/corelib/animation/qpauseanimation.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QPAUSEANIMATION_H
#define QPAUSEANIMATION_H
diff --git a/src/corelib/animation/qpropertyanimation.cpp b/src/corelib/animation/qpropertyanimation.cpp
index 04f048af753..b4c6b6ff8a6 100644
--- a/src/corelib/animation/qpropertyanimation.cpp
+++ b/src/corelib/animation/qpropertyanimation.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
/*!
\class QPropertyAnimation
diff --git a/src/corelib/animation/qpropertyanimation.h b/src/corelib/animation/qpropertyanimation.h
index 038c202b8f3..590a6ddaf15 100644
--- a/src/corelib/animation/qpropertyanimation.h
+++ b/src/corelib/animation/qpropertyanimation.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QPROPERTYANIMATION_H
#define QPROPERTYANIMATION_H
diff --git a/src/corelib/animation/qpropertyanimation_p.h b/src/corelib/animation/qpropertyanimation_p.h
index ef5534cd9c3..c1918ae1bf8 100644
--- a/src/corelib/animation/qpropertyanimation_p.h
+++ b/src/corelib/animation/qpropertyanimation_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QPROPERTYANIMATION_P_H
#define QPROPERTYANIMATION_P_H
diff --git a/src/corelib/animation/qsequentialanimationgroup.cpp b/src/corelib/animation/qsequentialanimationgroup.cpp
index 260481dbef5..d11249ca7ed 100644
--- a/src/corelib/animation/qsequentialanimationgroup.cpp
+++ b/src/corelib/animation/qsequentialanimationgroup.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
/*!
\class QSequentialAnimationGroup
diff --git a/src/corelib/animation/qsequentialanimationgroup.h b/src/corelib/animation/qsequentialanimationgroup.h
index 6786078170d..b7f9c1b17a1 100644
--- a/src/corelib/animation/qsequentialanimationgroup.h
+++ b/src/corelib/animation/qsequentialanimationgroup.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QSEQUENTIALANIMATIONGROUP_H
#define QSEQUENTIALANIMATIONGROUP_H
diff --git a/src/corelib/animation/qsequentialanimationgroup_p.h b/src/corelib/animation/qsequentialanimationgroup_p.h
index cbdf204d0a6..131902b5aa5 100644
--- a/src/corelib/animation/qsequentialanimationgroup_p.h
+++ b/src/corelib/animation/qsequentialanimationgroup_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QSEQUENTIALANIMATIONGROUP_P_H
#define QSEQUENTIALANIMATIONGROUP_P_H
diff --git a/src/corelib/animation/qvariantanimation.cpp b/src/corelib/animation/qvariantanimation.cpp
index be5c09519e9..bd12d5dae95 100644
--- a/src/corelib/animation/qvariantanimation.cpp
+++ b/src/corelib/animation/qvariantanimation.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qvariantanimation.h"
#include "qvariantanimation_p.h"
diff --git a/src/corelib/animation/qvariantanimation.h b/src/corelib/animation/qvariantanimation.h
index 4bdb9713578..172ee0d6090 100644
--- a/src/corelib/animation/qvariantanimation.h
+++ b/src/corelib/animation/qvariantanimation.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QVARIANTANIMATION_H
#define QVARIANTANIMATION_H
diff --git a/src/corelib/animation/qvariantanimation_p.h b/src/corelib/animation/qvariantanimation_p.h
index 0ac238a882b..5fdd9666dba 100644
--- a/src/corelib/animation/qvariantanimation_p.h
+++ b/src/corelib/animation/qvariantanimation_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QVARIANTANIMATION_P_H
#define QVARIANTANIMATION_P_H
diff --git a/src/corelib/configure.cmake b/src/corelib/configure.cmake
index 909041cf44b..096dce9e84e 100644
--- a/src/corelib/configure.cmake
+++ b/src/corelib/configure.cmake
@@ -591,6 +591,7 @@ qt_config_compile_test(cpp_winrt
runtimeobject
CODE
"// Including winrt/base.h causes an error in some configurations (Windows 10 SDK + c++20)
+# include <guiddef.h> // required by clang-cl: https://github.com/microsoft/cppwinrt/issues/1179
# include <winrt/base.h>
int main(void)
diff --git a/src/corelib/doc/REUSE.toml b/src/corelib/doc/REUSE.toml
index 254251a0b6b..969cc0d9938 100644
--- a/src/corelib/doc/REUSE.toml
+++ b/src/corelib/doc/REUSE.toml
@@ -3,23 +3,23 @@ version = 1
[[annotations]]
path = ["snippets/**"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause"
[[annotations]]
path = ["**qdocinc", "**/images/**"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"
[[annotations]]
path = ["src/corelib/doc/qtcore.qdocconf"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "BSD-3-Clause"
[[annotations]]
path = ["src/corelib/doc/include/QtCoreDoc"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
diff --git a/src/corelib/doc/snippets/CMakeLists.txt b/src/corelib/doc/snippets/CMakeLists.txt
index 937433f2e21..47ac9e860d6 100644
--- a/src/corelib/doc/snippets/CMakeLists.txt
+++ b/src/corelib/doc/snippets/CMakeLists.txt
@@ -39,6 +39,7 @@ qt_internal_extend_target(corelib_snippets CONDITION QT_FEATURE_widgets
hellotrmain.cpp
fileinfo/main.cpp
pointer/pointer.cpp
+ qsignalmapper/buttonwidget.cpp
qsortfilterproxymodel-details/main.cpp
qstring/main.cpp
qtcast/qtcast.cpp
diff --git a/src/corelib/doc/snippets/eventfilters/CMakeLists.txt b/src/corelib/doc/snippets/eventfilters/CMakeLists.txt
index ea381e425a5..57371419e50 100644
--- a/src/corelib/doc/snippets/eventfilters/CMakeLists.txt
+++ b/src/corelib/doc/snippets/eventfilters/CMakeLists.txt
@@ -1,17 +1,17 @@
-add_library(snippets_eventfilters OBJECT)
+add_library(corelib_snippets_eventfilters OBJECT)
-target_link_libraries(snippets_eventfilters PRIVATE
+target_link_libraries(corelib_snippets_eventfilters PRIVATE
Qt::Core
)
-qt_internal_extend_target(snippets_eventfilters CONDITION QT_FEATURE_widgets
+qt_internal_extend_target(corelib_snippets_eventfilters CONDITION QT_FEATURE_widgets
LIBRARIES
Qt::Widgets
SOURCE
main.cpp
)
-qt_internal_extend_target(snippets_eventfilters CONDITION QT_FEATURE_gui
+qt_internal_extend_target(corelib_snippets_eventfilters CONDITION QT_FEATURE_gui
LIBRARIES
Qt::Gui
SOURCES
diff --git a/src/corelib/doc/snippets/qmetaobject-invokable/CMakeLists.txt b/src/corelib/doc/snippets/qmetaobject-invokable/CMakeLists.txt
index 76bb79951a3..6ddfd80c036 100644
--- a/src/corelib/doc/snippets/qmetaobject-invokable/CMakeLists.txt
+++ b/src/corelib/doc/snippets/qmetaobject-invokable/CMakeLists.txt
@@ -2,13 +2,13 @@ if(NOT QT_FEATURE_widgets)
return()
endif()
-add_library(snippets_qmetaobject-invokable OBJECT)
+add_library(corelib_snippets_qmetaobject-invokable OBJECT)
-target_link_libraries(snippets_qmetaobject-invokable PRIVATE
+target_link_libraries(corelib_snippets_qmetaobject-invokable PRIVATE
Qt::Core
)
-qt_internal_extend_target(snippets_qmetaobject-invokable CONDITION QT_FEATURE_widgets
+qt_internal_extend_target(corelib_snippets_qmetaobject-invokable CONDITION QT_FEATURE_widgets
LIBRARIES
Qt::Widgets
SOURCES
diff --git a/src/corelib/doc/snippets/qmetaobject-revision/CMakeLists.txt b/src/corelib/doc/snippets/qmetaobject-revision/CMakeLists.txt
index 0cadf9380b1..d760ed225aa 100644
--- a/src/corelib/doc/snippets/qmetaobject-revision/CMakeLists.txt
+++ b/src/corelib/doc/snippets/qmetaobject-revision/CMakeLists.txt
@@ -2,13 +2,13 @@ if(NOT QT_FEATURE_widgets)
return()
endif()
-add_library(snippets_qmetaobject-revision OBJECT)
+add_library(corelib_snippets_qmetaobject-revision OBJECT)
-target_link_libraries(snippets_qmetaobject-revision PRIVATE
+target_link_libraries(corelib_snippets_qmetaobject-revision PRIVATE
Qt::Core
)
-qt_internal_extend_target(snippets_qmetaobject-revision CONDITION QT_FEATURE_widgets
+qt_internal_extend_target(corelib_snippets_qmetaobject-revision CONDITION QT_FEATURE_widgets
LIBRARIES
Qt::Widgets
SOURCES
diff --git a/src/corelib/doc/snippets/qprocess/CMakeLists.txt b/src/corelib/doc/snippets/qprocess/CMakeLists.txt
index 07b66d0b36b..7ed0e0b2f68 100644
--- a/src/corelib/doc/snippets/qprocess/CMakeLists.txt
+++ b/src/corelib/doc/snippets/qprocess/CMakeLists.txt
@@ -1,8 +1,10 @@
-add_library(snippets_qprocess OBJECT
+set(CMAKE_UNITY_BUILD OFF)
+
+add_library(corelib_snippets_qprocess OBJECT
qprocess-createprocessargumentsmodifier.cpp
qprocess-simpleexecution.cpp
)
-target_link_libraries(snippets_qprocess PRIVATE
+target_link_libraries(corelib_snippets_qprocess PRIVATE
Qt::Core
)
diff --git a/src/corelib/doc/snippets/qsignalmapper/CMakeLists.txt b/src/corelib/doc/snippets/qsignalmapper/CMakeLists.txt
deleted file mode 100644
index 086ddbf9c5e..00000000000
--- a/src/corelib/doc/snippets/qsignalmapper/CMakeLists.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-if(NOT TARGET Qt::Widgets)
- return()
-endif()
-
-add_library(snippets_qsignalmapper OBJECT
- buttonwidget.cpp
-)
-
-add_compile_definitions(EXAMPLE_ONE)
-
-target_link_libraries(snippets_qsignalmapper PRIVATE
- Qt::Core
-)
-
-qt_internal_extend_target(snippets_qsignalmapper CONDITION QT_FEATURE_widgets
- LIBRARIES
- Qt::Widgets
-)
diff --git a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp
index 1f9e53f1385..cdbf83a977d 100644
--- a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp
+++ b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.cpp
@@ -5,39 +5,40 @@
#include <QtWidgets>
-#ifdef EXAMPLE_ONE
-//! [0]
-ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
- : QWidget(parent)
-{
- signalMapper = new QSignalMapper(this);
+ //! [OpenCtor]
+ ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
+ : QWidget(parent)
+ {
+ //! [OpenCtor]
+ {
+ //![OldNotation]
+ signalMapper = new QSignalMapper(this);
- QGridLayout *gridLayout = new QGridLayout(this);
- for (int i = 0; i < texts.size(); ++i) {
- QPushButton *button = new QPushButton(texts[i]);
- connect(button, &QPushButton::clicked, signalMapper, qOverload<>(&QSignalMapper::map));
-//! [0] //! [1]
- signalMapper->setMapping(button, texts[i]);
- gridLayout->addWidget(button, i / 3, i % 3);
+ QGridLayout *gridLayout = new QGridLayout(this);
+ for (int i = 0; i < texts.size(); ++i) {
+ QPushButton *button = new QPushButton(texts[i]);
+ connect(button, &QPushButton::clicked, signalMapper, qOverload<>(&QSignalMapper::map));
+ signalMapper->setMapping(button, texts[i]);
+ gridLayout->addWidget(button, i / 3, i % 3);
+ }
+
+ connect(signalMapper, &QSignalMapper::mappedString,
+ this, &ButtonWidget::clicked);
+ //![OldNotation]
+ }
+
+ {
+ //![ModernNotation]
+ QGridLayout *gridLayout = new QGridLayout(this);
+ for (int i = 0; i < texts.size(); ++i) {
+ QString text = texts[i];
+ QPushButton *button = new QPushButton(text);
+ connect(button, &QPushButton::clicked, [this, text] { clicked(text); });
+ gridLayout->addWidget(button, i / 3, i % 3);
+ }
+ //![ModernNotation]
}
- connect(signalMapper, &QSignalMapper::mappedString,
-//! [1] //! [2]
- this, &ButtonWidget::clicked);
-}
-//! [2]
-#else
-//! [3]
-ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
- : QWidget(parent)
-{
- QGridLayout *gridLayout = new QGridLayout(this);
- for (int i = 0; i < texts.size(); ++i) {
- QString text = texts[i];
- QPushButton *button = new QPushButton(text);
- connect(button, &QPushButton::clicked, [this, text] { clicked(text); });
- gridLayout->addWidget(button, i / 3, i % 3);
+ //! [CloseBrackets]
}
-}
-//! [3]
-#endif
+ //! [CloseBrackets]
diff --git a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h
index 537c21c9141..cd75628dc2b 100644
--- a/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h
+++ b/src/corelib/doc/snippets/qsignalmapper/buttonwidget.h
@@ -4,10 +4,8 @@
#ifndef BUTTONWIDGET_H
#define BUTTONWIDGET_H
-#include <QWidget>
+#include <QtWidgets>
-class QSignalMapper;
-class QString;
//! [0]
class ButtonWidget : public QWidget
diff --git a/src/corelib/doc/src/cmake/qt_add_resources.qdoc b/src/corelib/doc/src/cmake/qt_add_resources.qdoc
index 570272c6097..445e37e000a 100644
--- a/src/corelib/doc/src/cmake/qt_add_resources.qdoc
+++ b/src/corelib/doc/src/cmake/qt_add_resources.qdoc
@@ -111,5 +111,9 @@ resources linked into the final target.
This especially affects static builds. There, the same resource name in
different static libraries conflict in the consuming target.
+In contrast to \l{qmake}'s \c{RESOURCES}, \c qt_add_resources does not
+attempt to compile any QML or JavaScript files using \l{qmlcachegen}. Use
+\l{qt_add_qml_module} for this.
+
\sa {qt6_add_big_resources}{qt_add_big_resources()}
*/
diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp
index 1ecec63aed4..d1fc672564f 100644
--- a/src/corelib/global/qlibraryinfo.cpp
+++ b/src/corelib/global/qlibraryinfo.cpp
@@ -1,6 +1,7 @@
// Copyright (C) 2021 The Qt Company Ltd.
// Copyright (C) 2021 Intel Corporation.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:critical reason:execute-external-code
#include "qdir.h"
#include "qstringlist.h"
diff --git a/src/corelib/global/qnumeric.cpp b/src/corelib/global/qnumeric.cpp
index 16b2b7ca408..8b153bcdb84 100644
--- a/src/corelib/global/qnumeric.cpp
+++ b/src/corelib/global/qnumeric.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:critical reason:data-parser
#include "qnumeric.h"
#include "qnumeric_p.h"
diff --git a/src/corelib/global/qnumeric.h b/src/corelib/global/qnumeric.h
index 2c7110c97a6..bc2bbf9e53e 100644
--- a/src/corelib/global/qnumeric.h
+++ b/src/corelib/global/qnumeric.h
@@ -1,6 +1,7 @@
// Copyright (C) 2021 The Qt Company Ltd.
// Copyright (C) 2025 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author Giuseppe D'Angelo <[email protected]>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:critical reason:data-parser
#ifndef QNUMERIC_H
#define QNUMERIC_H
diff --git a/src/corelib/global/qrandom.cpp b/src/corelib/global/qrandom.cpp
index fd742898f81..dab903f51fb 100644
--- a/src/corelib/global/qrandom.cpp
+++ b/src/corelib/global/qrandom.cpp
@@ -1,6 +1,7 @@
// Copyright (C) 2021 Intel Corporation.
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:critical reason:cryptography
// for rand_s
#define _CRT_RAND_S
diff --git a/src/corelib/global/qrandom.h b/src/corelib/global/qrandom.h
index 5ac864e79ef..30599413d75 100644
--- a/src/corelib/global/qrandom.h
+++ b/src/corelib/global/qrandom.h
@@ -1,5 +1,6 @@
// Copyright (C) 2020 Intel Corporation.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:critical reason:cryptography
#ifndef QRANDOM_H
#define QRANDOM_H
diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp
index c645e57bdb6..8c22483fbfe 100644
--- a/src/corelib/io/qfile.cpp
+++ b/src/corelib/io/qfile.cpp
@@ -1,6 +1,7 @@
// Copyright (C) 2020 The Qt Company Ltd.
// Copyright (C) 2017 Intel Corporation.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qplatformdefs.h"
#include "qdebug.h"
diff --git a/src/corelib/io/qfile.h b/src/corelib/io/qfile.h
index c115a6aee98..11546d87d9c 100644
--- a/src/corelib/io/qfile.h
+++ b/src/corelib/io/qfile.h
@@ -1,6 +1,7 @@
// Copyright (C) 2020 The Qt Company Ltd.
// Copyright (C) 2016 Intel Corporation.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QFILE_H
#define QFILE_H
diff --git a/src/corelib/io/qfile_p.h b/src/corelib/io/qfile_p.h
index 126da28b0f9..a50fe575f8e 100644
--- a/src/corelib/io/qfile_p.h
+++ b/src/corelib/io/qfile_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QFILE_P_H
#define QFILE_P_H
diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp
index 6f995fe082e..5a0be1d895e 100644
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -893,6 +893,12 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM
{
Q_CHECK_FILE_NAME(entry, false);
+ // Detection of WasDeletedAttribute is imperfect: in general, if we can
+ // successfully stat() or access() a file, it hasn't been deleted (though
+ // there are exceptions, like /proc/XXX/fd/ entries on Linux). So we have
+ // to restore this flag in case we fail to stat() anything.
+ auto hadBeenDeleted = data.entryFlags & QFileSystemMetaData::WasDeletedAttribute;
+
#if defined(Q_OS_DARWIN)
if (what & (QFileSystemMetaData::BundleType | QFileSystemMetaData::CaseSensitive)) {
if (!data.hasFlags(QFileSystemMetaData::DirectoryType))
@@ -1103,6 +1109,11 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM
if (entryErrno != 0) {
what &= ~QFileSystemMetaData::LinkType; // don't clear link: could be broken symlink
data.clearFlags(what);
+
+ // see comment at the top
+ data.entryFlags |= hadBeenDeleted;
+ data.knownFlagsMask |= hadBeenDeleted;
+
return false;
}
return true;
diff --git a/src/corelib/io/qfilesystemwatcher.cpp b/src/corelib/io/qfilesystemwatcher.cpp
index 064be4c2112..cd72f21acdf 100644
--- a/src/corelib/io/qfilesystemwatcher.cpp
+++ b/src/corelib/io/qfilesystemwatcher.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qfilesystemwatcher.h"
#include "qfilesystemwatcher_p.h"
diff --git a/src/corelib/io/qfilesystemwatcher.h b/src/corelib/io/qfilesystemwatcher.h
index 668bc143b20..9523945435e 100644
--- a/src/corelib/io/qfilesystemwatcher.h
+++ b/src/corelib/io/qfilesystemwatcher.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QFILESYSTEMWATCHER_H
#define QFILESYSTEMWATCHER_H
diff --git a/src/corelib/io/qfilesystemwatcher_fsevents.mm b/src/corelib/io/qfilesystemwatcher_fsevents.mm
index 0d9b84890ae..0f49d43bc02 100644
--- a/src/corelib/io/qfilesystemwatcher_fsevents.mm
+++ b/src/corelib/io/qfilesystemwatcher_fsevents.mm
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include <qplatformdefs.h>
diff --git a/src/corelib/io/qfilesystemwatcher_fsevents_p.h b/src/corelib/io/qfilesystemwatcher_fsevents_p.h
index d6ce176a30f..2fc95a99931 100644
--- a/src/corelib/io/qfilesystemwatcher_fsevents_p.h
+++ b/src/corelib/io/qfilesystemwatcher_fsevents_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QFILESYSTEMWATCHER_FSEVENTS_P_H
#define QFILESYSTEMWATCHER_FSEVENTS_P_H
diff --git a/src/corelib/io/qfilesystemwatcher_inotify.cpp b/src/corelib/io/qfilesystemwatcher_inotify.cpp
index e60f6881109..4971b41c102 100644
--- a/src/corelib/io/qfilesystemwatcher_inotify.cpp
+++ b/src/corelib/io/qfilesystemwatcher_inotify.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qfilesystemwatcher.h"
#include "qfilesystemwatcher_inotify_p.h"
diff --git a/src/corelib/io/qfilesystemwatcher_inotify_p.h b/src/corelib/io/qfilesystemwatcher_inotify_p.h
index 05f87df14c1..705fe71725a 100644
--- a/src/corelib/io/qfilesystemwatcher_inotify_p.h
+++ b/src/corelib/io/qfilesystemwatcher_inotify_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QFILESYSTEMWATCHER_INOTIFY_P_H
#define QFILESYSTEMWATCHER_INOTIFY_P_H
diff --git a/src/corelib/io/qfilesystemwatcher_kqueue.cpp b/src/corelib/io/qfilesystemwatcher_kqueue.cpp
index 7a9be337bf8..bc331c9dd2a 100644
--- a/src/corelib/io/qfilesystemwatcher_kqueue.cpp
+++ b/src/corelib/io/qfilesystemwatcher_kqueue.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include <qplatformdefs.h>
diff --git a/src/corelib/io/qfilesystemwatcher_kqueue_p.h b/src/corelib/io/qfilesystemwatcher_kqueue_p.h
index 05844d5be95..a460da6882e 100644
--- a/src/corelib/io/qfilesystemwatcher_kqueue_p.h
+++ b/src/corelib/io/qfilesystemwatcher_kqueue_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QFILESYSTEMWATCHER_KQUEUE_P_H
#define QFILESYSTEMWATCHER_KQUEUE_P_H
diff --git a/src/corelib/io/qfilesystemwatcher_p.h b/src/corelib/io/qfilesystemwatcher_p.h
index c34e3e2408f..79cf7443e37 100644
--- a/src/corelib/io/qfilesystemwatcher_p.h
+++ b/src/corelib/io/qfilesystemwatcher_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QFILESYSTEMWATCHER_P_H
#define QFILESYSTEMWATCHER_P_H
diff --git a/src/corelib/io/qfilesystemwatcher_polling.cpp b/src/corelib/io/qfilesystemwatcher_polling.cpp
index 5ec13a77f6c..ea374141563 100644
--- a/src/corelib/io/qfilesystemwatcher_polling.cpp
+++ b/src/corelib/io/qfilesystemwatcher_polling.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qfilesystemwatcher_polling_p.h"
diff --git a/src/corelib/io/qfilesystemwatcher_polling_p.h b/src/corelib/io/qfilesystemwatcher_polling_p.h
index 80d7b7d1526..2ace2947be4 100644
--- a/src/corelib/io/qfilesystemwatcher_polling_p.h
+++ b/src/corelib/io/qfilesystemwatcher_polling_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QFILESYSTEMWATCHER_POLLING_P_H
#define QFILESYSTEMWATCHER_POLLING_P_H
diff --git a/src/corelib/io/qfilesystemwatcher_win.cpp b/src/corelib/io/qfilesystemwatcher_win.cpp
index 5418265ba2c..3a2cb02c3d7 100644
--- a/src/corelib/io/qfilesystemwatcher_win.cpp
+++ b/src/corelib/io/qfilesystemwatcher_win.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qfilesystemwatcher.h"
#include "qfilesystemwatcher_win_p.h"
diff --git a/src/corelib/io/qfilesystemwatcher_win_p.h b/src/corelib/io/qfilesystemwatcher_win_p.h
index f6c6fd6c923..0687080b0ed 100644
--- a/src/corelib/io/qfilesystemwatcher_win_p.h
+++ b/src/corelib/io/qfilesystemwatcher_win_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QFILESYSTEMWATCHER_WIN_P_H
#define QFILESYSTEMWATCHER_WIN_P_H
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
index 585a07158ea..9c1bb45dd2d 100644
--- a/src/corelib/io/qiodevice.cpp
+++ b/src/corelib/io/qiodevice.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:critical reason:network-protocol
//#define QIODEVICE_DEBUG
@@ -1308,8 +1309,11 @@ QByteArray QIODevice::readAll()
The newline character ('\\n') is included in the buffer. If a
newline is not encountered before maxSize - 1 bytes are read, a
- newline will not be inserted into the buffer. On windows newline
- characters are replaced with '\\n'.
+ newline will not be inserted into the buffer.
+
+ \note Newline translation(e.g., converting \r to \n) is performed
+ only when the device is opened for reading with QIODevice::Text
+ flag.
Note that on sequential devices, data may not be immediately available,
which may result in a partial line being returned. By calling the
diff --git a/src/corelib/io/qiodevice.h b/src/corelib/io/qiodevice.h
index 6bf7149e9af..263214ff012 100644
--- a/src/corelib/io/qiodevice.h
+++ b/src/corelib/io/qiodevice.h
@@ -1,5 +1,6 @@
// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:header-decls-only
#ifndef QIODEVICE_H
#define QIODEVICE_H
diff --git a/src/corelib/io/qiodevice_p.h b/src/corelib/io/qiodevice_p.h
index 151548fb04e..6a1a91e1dea 100644
--- a/src/corelib/io/qiodevice_p.h
+++ b/src/corelib/io/qiodevice_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:critical reason:network-protocol
#ifndef QIODEVICE_P_H
#define QIODEVICE_P_H
diff --git a/src/corelib/io/qsavefile.cpp b/src/corelib/io/qsavefile.cpp
index 91f168f20f6..a7d101dc124 100644
--- a/src/corelib/io/qsavefile.cpp
+++ b/src/corelib/io/qsavefile.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2012 David Faure <[email protected]>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:critical reason:guaranteed-behavior
#include "qsavefile.h"
diff --git a/src/corelib/io/qsavefile.h b/src/corelib/io/qsavefile.h
index bf0a91bae74..5e8cffe7c38 100644
--- a/src/corelib/io/qsavefile.h
+++ b/src/corelib/io/qsavefile.h
@@ -1,5 +1,6 @@
// Copyright (C) 2012 David Faure <[email protected]>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:header-decls-only
#ifndef QSAVEFILE_H
#define QSAVEFILE_H
diff --git a/src/corelib/io/qsavefile_p.h b/src/corelib/io/qsavefile_p.h
index 50ecdad2daf..e1dcc0abe23 100644
--- a/src/corelib/io/qsavefile_p.h
+++ b/src/corelib/io/qsavefile_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2013 David Faure <[email protected]>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:header-decls-only
#ifndef QSAVEFILE_P_H
#define QSAVEFILE_P_H
diff --git a/src/corelib/io/qstorageinfo.cpp b/src/corelib/io/qstorageinfo.cpp
index 950af69ab82..aa7c67e8596 100644
--- a/src/corelib/io/qstorageinfo.cpp
+++ b/src/corelib/io/qstorageinfo.cpp
@@ -1,6 +1,7 @@
// Copyright (C) 2022 The Qt Company Ltd.
// Copyright (C) 2015 Ivan Komissarov <[email protected]>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qstorageinfo.h"
#include "qstorageinfo_p.h"
@@ -12,6 +13,7 @@ QT_BEGIN_NAMESPACE
Q_LOGGING_CATEGORY(lcStorageInfo, "qt.core.qstorageinfo", QtWarningMsg)
QT_IMPL_METATYPE_EXTERN(QStorageInfo)
+QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QStorageInfoPrivate)
/*!
\class QStorageInfo
@@ -75,7 +77,7 @@ QStorageInfo::QStorageInfo()
\sa setPath()
*/
QStorageInfo::QStorageInfo(const QString &path)
- : d(new QStorageInfoPrivate)
+ : QStorageInfo()
{
setPath(path);
}
@@ -85,39 +87,45 @@ QStorageInfo::QStorageInfo(const QString &path)
containing the \a dir folder.
*/
QStorageInfo::QStorageInfo(const QDir &dir)
- : d(new QStorageInfoPrivate)
+ : QStorageInfo(dir.absolutePath())
{
- setPath(dir.absolutePath());
}
/*!
Constructs a new QStorageInfo object that is a copy of the \a other QStorageInfo object.
*/
QStorageInfo::QStorageInfo(const QStorageInfo &other)
- : d(other.d)
-{
-}
+ = default;
+
+/*!
+ \since 6.10
+ \fn QStorageInfo::QStorageInfo(QStorageInfo &&other)
+
+ Move-constructs a new QStorageInfo from \a other.
+
+ The moved-from object \a other is placed in a partially-formed state, in
+ which the only valid operations are destruction and assignment of a new
+ value.
+*/
/*!
Destroys the QStorageInfo object and frees its resources.
*/
QStorageInfo::~QStorageInfo()
-{
-}
+ = default;
/*!
Makes a copy of the QStorageInfo object \a other and assigns it to this QStorageInfo object.
*/
QStorageInfo &QStorageInfo::operator=(const QStorageInfo &other)
-{
- d = other.d;
- return *this;
-}
+ = default;
/*!
\fn QStorageInfo &QStorageInfo::operator=(QStorageInfo &&other)
- Assigns \a other to this QStorageInfo instance.
+ Move-assigns \a other to this QStorageInfo instance.
+
+ The moved-from object \a other is placed in a valid, but unspecified state.
*/
/*!
diff --git a/src/corelib/io/qstorageinfo.h b/src/corelib/io/qstorageinfo.h
index 2d7c60ec915..846cfaf4f41 100644
--- a/src/corelib/io/qstorageinfo.h
+++ b/src/corelib/io/qstorageinfo.h
@@ -1,5 +1,6 @@
// Copyright (C) 2014 Ivan Komissarov <[email protected]>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QSTORAGEINFO_H
#define QSTORAGEINFO_H
@@ -17,6 +18,7 @@ QT_BEGIN_NAMESPACE
class QDebug;
class QStorageInfoPrivate;
+QT_DECLARE_QESDP_SPECIALIZATION_DTOR(QStorageInfoPrivate)
class Q_CORE_EXPORT QStorageInfo
{
public:
@@ -24,6 +26,7 @@ public:
explicit QStorageInfo(const QString &path);
explicit QStorageInfo(const QDir &dir);
QStorageInfo(const QStorageInfo &other);
+ QStorageInfo(QStorageInfo &&) noexcept = default;
~QStorageInfo();
QStorageInfo &operator=(const QStorageInfo &other);
diff --git a/src/corelib/io/qstorageinfo_linux.cpp b/src/corelib/io/qstorageinfo_linux.cpp
index 00331a57127..f706650c637 100644
--- a/src/corelib/io/qstorageinfo_linux.cpp
+++ b/src/corelib/io/qstorageinfo_linux.cpp
@@ -3,6 +3,7 @@
// Copyright (C) 2016 Intel Corporation.
// Copyright (C) 2023 Ahmad Samir <[email protected]>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qstorageinfo_linux_p.h"
diff --git a/src/corelib/io/qstorageinfo_linux_p.h b/src/corelib/io/qstorageinfo_linux_p.h
index 8f92b9e9783..26a60dcbc13 100644
--- a/src/corelib/io/qstorageinfo_linux_p.h
+++ b/src/corelib/io/qstorageinfo_linux_p.h
@@ -3,6 +3,7 @@
// Copyright (C) 2016 Intel Corporation.
// Copyright (C) 2023 Ahmad Samir <[email protected]>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QSTORAGEINFO_LINUX_P_H
#define QSTORAGEINFO_LINUX_P_H
diff --git a/src/corelib/io/qstorageinfo_mac.cpp b/src/corelib/io/qstorageinfo_mac.cpp
index c6c0f501dab..acfa21d8146 100644
--- a/src/corelib/io/qstorageinfo_mac.cpp
+++ b/src/corelib/io/qstorageinfo_mac.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2014 Ivan Komissarov <[email protected]>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qstorageinfo_p.h"
diff --git a/src/corelib/io/qstorageinfo_p.h b/src/corelib/io/qstorageinfo_p.h
index a917763fe36..0e3f81151e7 100644
--- a/src/corelib/io/qstorageinfo_p.h
+++ b/src/corelib/io/qstorageinfo_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2014 Ivan Komissarov <[email protected]>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QSTORAGEINFO_P_H
#define QSTORAGEINFO_P_H
diff --git a/src/corelib/io/qstorageinfo_stub.cpp b/src/corelib/io/qstorageinfo_stub.cpp
index f2f7d2eb656..805b66b893c 100644
--- a/src/corelib/io/qstorageinfo_stub.cpp
+++ b/src/corelib/io/qstorageinfo_stub.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qstorageinfo_p.h"
diff --git a/src/corelib/io/qstorageinfo_unix.cpp b/src/corelib/io/qstorageinfo_unix.cpp
index 40580e3be17..34ba7b9682b 100644
--- a/src/corelib/io/qstorageinfo_unix.cpp
+++ b/src/corelib/io/qstorageinfo_unix.cpp
@@ -2,6 +2,7 @@
// Copyright (C) 2014 Ivan Komissarov <[email protected]>
// Copyright (C) 2016 Intel Corporation.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qstorageinfo_p.h"
diff --git a/src/corelib/io/qstorageinfo_win.cpp b/src/corelib/io/qstorageinfo_win.cpp
index 3582612508c..cbaf01848e2 100644
--- a/src/corelib/io/qstorageinfo_win.cpp
+++ b/src/corelib/io/qstorageinfo_win.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2014 Ivan Komissarov <[email protected]>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qstorageinfo_p.h"
diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index c1f01267949..038db4d857e 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -1,6 +1,7 @@
// Copyright (C) 2016 The Qt Company Ltd.
// Copyright (C) 2017 Intel Corporation.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:critical reason:data-parser
#include "qtemporaryfile.h"
@@ -881,6 +882,11 @@ void QTemporaryFile::setFileTemplate(const QString &name)
be used for a similar purpose too, particularly if the destination file is
not temporary.
+ \note Calling rename() does not disable autoRemove. If you want the renamed
+ file to persist, you must call setAutoRemove and set it to \c false after
+ calling rename(). Otherwise, the file will be deleted when the QTemporaryFile
+ object is destroyed.
+
\sa QSaveFile, QSaveFile::commit(), QFile::rename()
*/
bool QTemporaryFile::rename(const QString &newName)
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index 565ce04c6ce..a4fbf69da8b 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -3660,17 +3660,29 @@ QList<QUrl> QUrl::fromStringList(const QStringList &urls, ParsingMode mode)
*/
size_t qHash(const QUrl &url, size_t seed) noexcept
{
+ QtPrivate::QHashCombineWithSeed hasher(seed);
+
+ // non-commutative, we must hash the port first
if (!url.d)
- return qHash(-1, seed); // the hash of an unset port (-1)
-
- return qHash(url.d->scheme) ^
- qHash(url.d->userName) ^
- qHash(url.d->password) ^
- qHash(url.d->host) ^
- qHash(url.d->port, seed) ^
- qHash(url.d->path) ^
- qHash(url.d->query) ^
- qHash(url.d->fragment);
+ return hasher(0, -1);
+ size_t state = hasher(0, url.d->port);
+
+ if (url.d->hasScheme())
+ state = hasher(state, url.d->scheme);
+ if (url.d->hasUserInfo()) {
+ // see presentSections(), appendUserName(), etc.
+ state = hasher(state, url.d->userName);
+ state = hasher(state, url.d->password);
+ }
+ if (url.d->hasHost() || url.d->isLocalFile()) // for XDG compatibility
+ state = hasher(state, url.d->host);
+ if (url.d->hasPath())
+ state = hasher(state, url.d->path);
+ if (url.d->hasQuery())
+ state = hasher(state, url.d->query);
+ if (url.d->hasFragment())
+ state = hasher(state, url.d->fragment);
+ return state;
}
static QUrl adjustFtpPath(QUrl url)
diff --git a/src/corelib/ipc/qsharedmemory.cpp b/src/corelib/ipc/qsharedmemory.cpp
index a2f6e42579e..7345753ce5b 100644
--- a/src/corelib/ipc/qsharedmemory.cpp
+++ b/src/corelib/ipc/qsharedmemory.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qsharedmemory.h"
#include "qsharedmemory_p.h"
diff --git a/src/corelib/ipc/qsharedmemory.h b/src/corelib/ipc/qsharedmemory.h
index ab448b15c16..eec7d82160c 100644
--- a/src/corelib/ipc/qsharedmemory.h
+++ b/src/corelib/ipc/qsharedmemory.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QSHAREDMEMORY_H
#define QSHAREDMEMORY_H
diff --git a/src/corelib/ipc/qsharedmemory_p.h b/src/corelib/ipc/qsharedmemory_p.h
index 82cce8919ac..df0a6963598 100644
--- a/src/corelib/ipc/qsharedmemory_p.h
+++ b/src/corelib/ipc/qsharedmemory_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QSHAREDMEMORY_P_H
#define QSHAREDMEMORY_P_H
diff --git a/src/corelib/ipc/qsharedmemory_posix.cpp b/src/corelib/ipc/qsharedmemory_posix.cpp
index 582c6628e19..fa215c3b538 100644
--- a/src/corelib/ipc/qsharedmemory_posix.cpp
+++ b/src/corelib/ipc/qsharedmemory_posix.cpp
@@ -2,6 +2,7 @@
// Copyright (C) 2016 The Qt Company Ltd.
// Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author Tobias Koenig <[email protected]>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qsharedmemory.h"
#include "qsharedmemory_p.h"
diff --git a/src/corelib/ipc/qsharedmemory_systemv.cpp b/src/corelib/ipc/qsharedmemory_systemv.cpp
index dc9de11091d..1777236bacc 100644
--- a/src/corelib/ipc/qsharedmemory_systemv.cpp
+++ b/src/corelib/ipc/qsharedmemory_systemv.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qsharedmemory.h"
#include "qsharedmemory_p.h"
diff --git a/src/corelib/ipc/qsharedmemory_win.cpp b/src/corelib/ipc/qsharedmemory_win.cpp
index 472f34f9a18..b46d0da0c8c 100644
--- a/src/corelib/ipc/qsharedmemory_win.cpp
+++ b/src/corelib/ipc/qsharedmemory_win.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qsharedmemory.h"
#include "qsharedmemory_p.h"
diff --git a/src/corelib/ipc/qsystemsemaphore.cpp b/src/corelib/ipc/qsystemsemaphore.cpp
index 24f4789f975..67e8c4bf757 100644
--- a/src/corelib/ipc/qsystemsemaphore.cpp
+++ b/src/corelib/ipc/qsystemsemaphore.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qsystemsemaphore.h"
#include "qsystemsemaphore_p.h"
diff --git a/src/corelib/ipc/qsystemsemaphore.h b/src/corelib/ipc/qsystemsemaphore.h
index 0981a7eecee..2d80955b85c 100644
--- a/src/corelib/ipc/qsystemsemaphore.h
+++ b/src/corelib/ipc/qsystemsemaphore.h
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QSYSTEMSEMAPHORE_H
#define QSYSTEMSEMAPHORE_H
diff --git a/src/corelib/ipc/qsystemsemaphore_p.h b/src/corelib/ipc/qsystemsemaphore_p.h
index 788c4fb7844..5b4630a20a8 100644
--- a/src/corelib/ipc/qsystemsemaphore_p.h
+++ b/src/corelib/ipc/qsystemsemaphore_p.h
@@ -1,6 +1,7 @@
// Copyright (C) 2016 The Qt Company Ltd.
// Copyright (C) 2022 Intel Corporation.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QSYSTEMSEMAPHORE_P_H
#define QSYSTEMSEMAPHORE_P_H
diff --git a/src/corelib/ipc/qsystemsemaphore_posix.cpp b/src/corelib/ipc/qsystemsemaphore_posix.cpp
index 7df9593513c..89a75048b4c 100644
--- a/src/corelib/ipc/qsystemsemaphore_posix.cpp
+++ b/src/corelib/ipc/qsystemsemaphore_posix.cpp
@@ -3,6 +3,7 @@
// Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected], author Tobias Koenig <[email protected]>
// Copyright (C) 2022 Intel Corporation.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qsystemsemaphore.h"
#include "qsystemsemaphore_p.h"
diff --git a/src/corelib/ipc/qsystemsemaphore_systemv.cpp b/src/corelib/ipc/qsystemsemaphore_systemv.cpp
index e5d231d1d42..54e62c615cf 100644
--- a/src/corelib/ipc/qsystemsemaphore_systemv.cpp
+++ b/src/corelib/ipc/qsystemsemaphore_systemv.cpp
@@ -1,6 +1,7 @@
// Copyright (C) 2016 The Qt Company Ltd.
// Copyright (C) 2022 Intel Corporation.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qsystemsemaphore.h"
#include "qsystemsemaphore_p.h"
diff --git a/src/corelib/ipc/qsystemsemaphore_win.cpp b/src/corelib/ipc/qsystemsemaphore_win.cpp
index f42fecf71f6..a157dec0dd2 100644
--- a/src/corelib/ipc/qsystemsemaphore_win.cpp
+++ b/src/corelib/ipc/qsystemsemaphore_win.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qsystemsemaphore.h"
#include "qsystemsemaphore_p.h"
diff --git a/src/corelib/ipc/qtipccommon.cpp b/src/corelib/ipc/qtipccommon.cpp
index 355f6fbc602..e56046497c5 100644
--- a/src/corelib/ipc/qtipccommon.cpp
+++ b/src/corelib/ipc/qtipccommon.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2022 Intel Corporation.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#include "qtipccommon.h"
#include "qtipccommon_p.h"
diff --git a/src/corelib/ipc/qtipccommon.h b/src/corelib/ipc/qtipccommon.h
index 658a426914f..375100f9837 100644
--- a/src/corelib/ipc/qtipccommon.h
+++ b/src/corelib/ipc/qtipccommon.h
@@ -1,5 +1,6 @@
// Copyright (C) 2022 Intel Corporation.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QTIPCCOMMON_H
#define QTIPCCOMMON_H
diff --git a/src/corelib/ipc/qtipccommon_p.h b/src/corelib/ipc/qtipccommon_p.h
index 8836cd64421..dc8619299fc 100644
--- a/src/corelib/ipc/qtipccommon_p.h
+++ b/src/corelib/ipc/qtipccommon_p.h
@@ -1,5 +1,6 @@
// Copyright (C) 2022 Intel Corporation.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+// Qt-Security score:significant reason:default
#ifndef QTIPCCOMMON_P_H
#define QTIPCCOMMON_P_H
diff --git a/src/corelib/itemmodels/qrangemodel_impl.h b/src/corelib/itemmodels/qrangemodel_impl.h
index 849d6084b80..38378fdcc64 100644
--- a/src/corelib/itemmodels/qrangemodel_impl.h
+++ b/src/corelib/itemmodels/qrangemodel_impl.h
@@ -952,7 +952,7 @@ public:
if constexpr (multi_role::int_key)
return std::as_const(value).find(Qt::ItemDataRole(role));
else
- return std::as_const(value).find(roleNames().value(role));
+ return std::as_const(value).find(itemModel().roleNames().value(role));
}();
if (it != value.cend()) {
result = QRangeModelDetails::value(it);
@@ -981,13 +981,20 @@ public:
if constexpr (std::is_convertible_v<value_type, decltype(result)>) {
result = value;
} else {
+ const auto roleNames = [this]() -> QHash<int, QByteArray> {
+ Q_UNUSED(this);
+ if constexpr (!multi_role::int_key)
+ return itemModel().roleNames();
+ else
+ return {};
+ }();
for (auto it = std::cbegin(value); it != std::cend(value); ++it) {
- int role = [this, key = QRangeModelDetails::key(it)]() {
- Q_UNUSED(this);
+ const int role = [&roleNames, key = QRangeModelDetails::key(it)]() {
+ Q_UNUSED(roleNames);
if constexpr (multi_role::int_key)
return int(key);
else
- return roleNames().key(key.toUtf8(), -1);
+ return roleNames.key(key.toUtf8(), -1);
}();
if (role != -1)
@@ -999,7 +1006,7 @@ public:
tried = true;
using meta_type = QRangeModelDetails::wrapped_t<value_type>;
const QMetaObject &mo = meta_type::staticMetaObject;
- for (auto &&[role, roleName] : roleNames().asKeyValueRange()) {
+ for (auto &&[role, roleName] : itemModel().roleNames().asKeyValueRange()) {
QVariant data;
if constexpr (std::is_base_of_v<QObject, meta_type>) {
if (value)
@@ -1064,19 +1071,26 @@ public:
Qt::ItemDataRole roleToSet = Qt::ItemDataRole(role);
// If there is an entry for EditRole, overwrite that; otherwise,
// set the entry for DisplayRole.
+ const auto roleNames = [this]() -> QHash<int, QByteArray> {
+ Q_UNUSED(this);
+ if constexpr (!multi_role::int_key)
+ return itemModel().roleNames();
+ else
+ return {};
+ }();
if (role == Qt::EditRole) {
if constexpr (multi_role::int_key) {
if (target.find(roleToSet) == target.end())
roleToSet = Qt::DisplayRole;
} else {
- if (target.find(roleNames().value(roleToSet)) == target.end())
+ if (target.find(roleNames.value(roleToSet)) == target.end())
roleToSet = Qt::DisplayRole;
}
}
if constexpr (multi_role::int_key)
return write(target[roleToSet], data);
else
- return write(target[roleNames().value(roleToSet)], data);
+ return write(target[roleNames.value(roleToSet)], data);
} else if (role == Qt::DisplayRole || role == Qt::EditRole) {
return write(target, data);
}
@@ -1108,7 +1122,9 @@ public:
if constexpr (multi_role()) {
using key_type = typename value_type::key_type;
tried = true;
- const auto roleName = [map = roleNames()](int role) { return map.value(role); };
+ const auto roleName = [map = itemModel().roleNames()](int role) {
+ return map.value(role);
+ };
// transactional: only update target if all values from data
// can be stored. Storing never fails with int-keys.
@@ -1148,8 +1164,9 @@ public:
else // can't copy - targetCopy is now a pointer
return &origin;
}(target);
+ const auto roleNames = itemModel().roleNames();
for (auto &&[role, value] : data.asKeyValueRange()) {
- const QByteArray roleName = roleNames().value(role);
+ const QByteArray roleName = roleNames.value(role);
bool written = false;
if constexpr (std::is_base_of_v<QObject, meta_type>) {
if (targetCopy)
@@ -1547,7 +1564,7 @@ protected:
QMetaProperty roleProperty(int role) const
{
const QMetaObject *mo = &ItemType::staticMetaObject;
- const QByteArray roleName = roleNames().value(role);
+ const QByteArray roleName = itemModel().roleNames().value(role);
if (const int index = mo->indexOfProperty(roleName.data()); index >= 0)
return mo->property(index);
return {};
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index a19e39685f1..1b711ba16bd 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -2189,7 +2189,7 @@ bool QCoreApplication::installTranslator(QTranslator *translationFile)
QCoreApplicationPrivate *d = self->d_func();
{
- QMutexLocker locker(&d->translateMutex);
+ QWriteLocker locker(&d->translateMutex);
d->translators.prepend(translationFile);
}
@@ -2221,7 +2221,7 @@ bool QCoreApplication::removeTranslator(QTranslator *translationFile)
if (!QCoreApplicationPrivate::checkInstance("removeTranslator"))
return false;
QCoreApplicationPrivate *d = self->d_func();
- QMutexLocker locker(&d->translateMutex);
+ QWriteLocker locker(&d->translateMutex);
if (d->translators.removeAll(translationFile)) {
#ifndef QT_NO_QOBJECT
locker.unlock();
@@ -2306,7 +2306,7 @@ QString QCoreApplication::translate(const char *context, const char *sourceText,
if (self) {
QCoreApplicationPrivate *d = self->d_func();
- QMutexLocker locker(&d->translateMutex);
+ QReadLocker locker(&d->translateMutex);
if (!d->translators.isEmpty()) {
QList<QTranslator*>::ConstIterator it;
QTranslator *translationFile;
@@ -2332,23 +2332,13 @@ QString qtTrId(const char *id, int n)
return QCoreApplication::translate(nullptr, id, nullptr, n);
}
-/*!
- \internal
- Returns a locked mutex handle if \a translator is registered in QCoreApplication,
- and might be therefore queried for translations from other threads.
- Returns an unlocked/dummy QMutexLocker otherwise.
- */
-std::unique_lock<QMutex> QCoreApplicationPrivate::mutexLockerForTranslator(QTranslator *translator)
+bool QCoreApplicationPrivate::isTranslatorInstalled(QTranslator *translator)
{
if (!QCoreApplication::self)
- return std::unique_lock<QMutex>();
-
+ return false;
QCoreApplicationPrivate *d = QCoreApplication::self->d_func();
- std::unique_lock<QMutex> locker(d->translateMutex);
- if (!d->translators.contains(translator))
- locker.unlock();
-
- return locker;
+ QReadLocker locker(&d->translateMutex);
+ return d->translators.contains(translator);
}
#else
@@ -2562,8 +2552,9 @@ static QStringList winCmdArgs()
Otherwise, the arguments() are constructed from the return value of
\l{https://docs.microsoft.com/en-us/windows/win32/api/processenv/nf-processenv-getcommandlinea}{GetCommandLine()}.
- As a result of this, the string given by arguments().at(0) might not be
- the program name on Windows, depending on how the application was started.
+ As a result of this, the string given by arguments().at(0)
+ might not be the exact program used to start the application
+ on Windows.
\sa applicationFilePath(), QCommandLineParser
*/
diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h
index 4cb6254e98d..0027b1ad57f 100644
--- a/src/corelib/kernel/qcoreapplication_p.h
+++ b/src/corelib/kernel/qcoreapplication_p.h
@@ -30,12 +30,10 @@
#include "private/qcore_mac_p.h"
#endif
-#ifndef QT_NO_TRANSLATION
-#include <mutex>
-#endif
-
QT_BEGIN_NAMESPACE
+typedef QList<QTranslator*> QTranslatorList;
+
class QAbstractEventDispatcher;
#ifndef QT_NO_QOBJECT
@@ -149,9 +147,9 @@ public:
static bool is_app_closing;
#endif
#ifndef QT_NO_TRANSLATION
- QList<QTranslator*> translators;
- QMutex translateMutex;
- static std::unique_lock<QMutex> mutexLockerForTranslator(QTranslator *translator);
+ QTranslatorList translators;
+ QReadWriteLock translateMutex;
+ static bool isTranslatorInstalled(QTranslator *translator);
#endif
static bool setuidAllowed;
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index b48922daeab..de5f27f9619 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -2362,7 +2362,7 @@ QList<QByteArray> QMetaMethod::parameterNames() const
\note In Qt 7, this function will return a null pointer for constructors.
- \sa returnType(), QMetaType::type()
+ \sa returnType(), QMetaType::name()
*/
const char *QMetaMethod::typeName() const
{
@@ -3149,6 +3149,20 @@ bool QMetaMethod::invokeOnGadget(void *gadget,
representation. The scope() function returns the class scope this
enumerator was declared in.
+ To use QMetaEnum functionality, register the enumerator within the meta-object
+ system using the Q_ENUM macro.
+
+ \code
+ enum AppleType {
+ Big,
+ Small
+ };
+ Q_ENUM(AppleType)
+
+ QMetaEnum metaEnum = QMetaEnum::fromType<ModelApple::AppleType>();
+ qDebug() << metaEnum.valueToKey(ModelApple::Big);
+ \endcode
+
\sa QMetaObject, QMetaMethod, QMetaProperty
*/
diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp
index 60bcdedba13..445009ea000 100644
--- a/src/corelib/kernel/qmetaobjectbuilder.cpp
+++ b/src/corelib/kernel/qmetaobjectbuilder.cpp
@@ -2080,6 +2080,17 @@ bool QMetaPropertyBuilder::isBindable() const
else
return false;
}
+/*!
+ Returns \c true if the property is required.
+ The default is \c false.
+ */
+bool QMetaPropertyBuilder::isRequired() const
+{
+ if (auto d = d_func())
+ return d->flag(Required);
+ else
+ return false;
+}
/*!
Sets this property to readable if \a value is true.
@@ -2236,6 +2247,15 @@ void QMetaPropertyBuilder::setBindable(bool value)
}
/*!
+ Sets the\c REQUIRED flag on this property to \a value
+ */
+void QMetaPropertyBuilder::setRequired(bool value)
+{
+ if (auto d = d_func())
+ d->setFlag(Required, value);
+}
+
+/*!
Returns the revision of this property.
\sa setRevision()
diff --git a/src/corelib/kernel/qmetaobjectbuilder_p.h b/src/corelib/kernel/qmetaobjectbuilder_p.h
index cf64e51c30c..36cd08d908c 100644
--- a/src/corelib/kernel/qmetaobjectbuilder_p.h
+++ b/src/corelib/kernel/qmetaobjectbuilder_p.h
@@ -216,6 +216,7 @@ public:
bool isFinal() const;
bool isAlias() const;
bool isBindable() const;
+ bool isRequired() const;
void setReadable(bool value);
void setWritable(bool value);
@@ -230,6 +231,7 @@ public:
void setFinal(bool value);
void setAlias(bool value);
void setBindable(bool value);
+ void setRequired(bool value);
int revision() const;
void setRevision(int revision);
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index 1242a40f185..45c947004f5 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -981,12 +981,6 @@ void QMetaType::unregisterMetaType(QMetaType type)
than the QMetaType \a rhs, otherwise returns \c false.
*/
-/*! \internal */
-bool QMetaTypeModuleHelper::convert(const void *, int, void *, int) const
-{
- return false;
-}
-
static constexpr auto createStaticTypeToIdMap()
{
#define QT_ADD_STATIC_METATYPE(MetaTypeName, MetaTypeId, RealName) \
@@ -1049,8 +1043,8 @@ static bool qIntegerConversionFromFPHelper(From from, To *to)
return true;
}
-// NOLINTNEXTLINE(cppcoreguidelines-virtual-class-destructor): this is not a base class
-static constexpr struct : QMetaTypeModuleHelper
+namespace {
+struct QCoreVariantHelper : QMetaTypeModuleHelper
{
template<typename T, typename LiteralWrapper =
std::conditional_t<std::is_same_v<T, QString>, QLatin1StringView, const char *>>
@@ -1060,7 +1054,8 @@ static constexpr struct : QMetaTypeModuleHelper
return !(str.isEmpty() || str == LiteralWrapper("0") || str == LiteralWrapper("false"));
}
- const QtPrivate::QMetaTypeInterface *interfaceForType(int type) const override {
+ static const QtPrivate::QMetaTypeInterface *interfaceForType(int type)
+ {
switch (type) {
QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_METATYPE_CONVERT_ID_TO_TYPE)
QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_METATYPE_CONVERT_ID_TO_TYPE)
@@ -1072,11 +1067,14 @@ static constexpr struct : QMetaTypeModuleHelper
}
}
-#ifndef QT_BOOTSTRAPPED
- bool convert(const void *from, int fromTypeId, void *to, int toTypeId) const override
+ static bool convert(const void *from, int fromTypeId, void *to, int toTypeId)
{
Q_ASSERT(fromTypeId != toTypeId);
+#ifdef QT_BOOTSTRAPPED
+ Q_UNUSED(from);
+ Q_UNUSED(to);
+#else
// canConvert calls with two nullptr
bool onlyCheck = (from == nullptr && to == nullptr);
@@ -1747,26 +1745,28 @@ QT_WARNING_DISABLE_CLANG("-Wtautological-compare")
QT_WARNING_POP
}
+#endif // !QT_BOOTSTRAPPED
return false;
}
-#endif // !QT_BOOTSTRAPPED
-} metatypeHelper = {};
+};
+} // unnamed namespace
-Q_CONSTINIT Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeGuiHelper = nullptr;
-Q_CONSTINIT Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeWidgetsHelper = nullptr;
+Q_CONSTINIT Q_CORE_EXPORT QMetaTypeModuleHelper qMetaTypeGuiHelper = {};
+Q_CONSTINIT Q_CORE_EXPORT QMetaTypeModuleHelper qMetaTypeWidgetsHelper = {};
-static const QMetaTypeModuleHelper *qModuleHelperForType(int type)
+#ifndef QT_BOOTSTRAPPED
+static bool tryConvertBuiltinTypes(const void *from, int fromTypeId, void *to, int toTypeId)
{
+ int type = qMax(fromTypeId, toTypeId);
if (type <= QMetaType::LastCoreType)
- return &metatypeHelper;
+ return QCoreVariantHelper::convert(from, fromTypeId, to, toTypeId);
if (type >= QMetaType::FirstGuiType && type <= QMetaType::LastGuiType)
- return qMetaTypeGuiHelper;
+ return qMetaTypeGuiHelper.convert(from, fromTypeId, to, toTypeId);
else if (type >= QMetaType::FirstWidgetsType && type <= QMetaType::LastWidgetsType)
- return qMetaTypeWidgetsHelper;
- return nullptr;
+ return qMetaTypeWidgetsHelper.convert(from, fromTypeId, to, toTypeId);
+ return false;
}
-#ifndef QT_BOOTSTRAPPED
template<typename T, typename Key>
class QMetaTypeFunctionRegistry
{
@@ -2471,10 +2471,8 @@ bool QMetaType::convert(QMetaType fromType, const void *from, QMetaType toType,
int fromTypeId = fromType.id();
int toTypeId = toType.id();
- if (auto moduleHelper = qModuleHelperForType(qMax(fromTypeId, toTypeId))) {
- if (moduleHelper->convert(from, fromTypeId, to, toTypeId))
- return true;
- }
+ if (tryConvertBuiltinTypes(from, fromTypeId, to, toTypeId))
+ return true;
const auto f = customTypesConversionRegistry()->function({fromTypeId, toTypeId});
if (f)
return (*f)(from, to);
@@ -2676,10 +2674,9 @@ bool QMetaType::canConvert(QMetaType fromType, QMetaType toType)
if (fromTypeId == toTypeId)
return true;
- if (auto moduleHelper = qModuleHelperForType(qMax(fromTypeId, toTypeId))) {
- if (moduleHelper->convert(nullptr, fromTypeId, nullptr, toTypeId))
- return true;
- }
+ if (tryConvertBuiltinTypes(nullptr, fromTypeId, nullptr, toTypeId))
+ return true;
+
const ConverterFunction * const f =
customTypesConversionRegistry()->function(std::make_pair(fromTypeId, toTypeId));
if (f)
@@ -2879,8 +2876,12 @@ void QMetaType::registerNormalizedTypedef(const NS(QByteArray) & normalizedTypeN
static const QtPrivate::QMetaTypeInterface *interfaceForStaticType(int typeId)
{
Q_ASSERT(typeId < QMetaType::User);
- if (auto moduleHelper = qModuleHelperForType(typeId))
- return moduleHelper->interfaceForType(typeId);
+ if (typeId <= QMetaType::LastCoreType)
+ return QCoreVariantHelper::interfaceForType(typeId);
+ if (typeId >= QMetaType::FirstGuiType && typeId <= QMetaType::LastGuiType)
+ return qMetaTypeGuiHelper.interfaceForType(typeId);
+ if (typeId >= QMetaType::FirstWidgetsType && typeId <= QMetaType::LastWidgetsType)
+ return qMetaTypeWidgetsHelper.interfaceForType(typeId);
return nullptr;
}
@@ -2909,40 +2910,18 @@ bool QMetaType::isRegistered(int type)
return interfaceForTypeNoWarning(type) != nullptr;
}
-namespace {
-enum NormalizeTypeMode {
- DontNormalizeType,
- TryNormalizeType
-};
-}
-template <NormalizeTypeMode tryNormalizedType> static inline
-const QtPrivate::QMetaTypeInterface *qMetaTypeTypeImpl(QByteArrayView name)
+static const QtPrivate::QMetaTypeInterface *findMetaTypeByName(QByteArrayView name)
{
- if (name.isEmpty())
- return nullptr;
-
+ Q_PRE(!name.isEmpty());
int type = qMetaTypeStaticType(name);
if (type != QMetaType::UnknownType) {
return interfaceForStaticType(type);
#ifndef QT_BOOTSTRAPPED
- } else {
- QReadLocker locker(&customTypeRegistry()->lock);
+ } else if (customTypeRegistry.exists()) {
+ QReadLocker locker(&customTypeRegistry->lock);
auto it = customTypeRegistry->aliases.constFind(name);
if (it != customTypeRegistry->aliases.constEnd())
return it.value().data();
-
-#ifndef QT_NO_QOBJECT
- if (tryNormalizedType) {
- const char *typeName = name.constData();
- const NS(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName);
- type = qMetaTypeStaticType(normalizedTypeName);
- if (type == QMetaType::UnknownType) {
- return customTypeRegistry->aliases.value(normalizedTypeName).data();
- } else {
- return interfaceForStaticType(type);
- }
- }
-#endif
#endif
}
return nullptr;
@@ -2969,7 +2948,9 @@ const QtPrivate::QMetaTypeInterface *qMetaTypeTypeImpl(QByteArrayView name)
*/
int qMetaTypeTypeInternal(QByteArrayView name)
{
- const QtPrivate::QMetaTypeInterface *iface = qMetaTypeTypeImpl<DontNormalizeType>(name);
+ const QtPrivate::QMetaTypeInterface *iface = nullptr;
+ if (!name.isEmpty())
+ iface = findMetaTypeByName(name);
return iface ? iface->typeId.loadRelaxed() : QMetaType::UnknownType;
}
@@ -3138,7 +3119,20 @@ QMetaType QMetaType::underlyingType() const
*/
QMetaType QMetaType::fromName(QByteArrayView typeName)
{
- return QMetaType(qMetaTypeTypeImpl<TryNormalizeType>(typeName));
+ if (typeName.isEmpty())
+ return QMetaType();
+
+ const QtPrivate::QMetaTypeInterface *iface = findMetaTypeByName(typeName);
+ if (iface)
+ return QMetaType(iface);
+
+#if !defined(QT_NO_QOBJECT)
+ const NS(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName.constData());
+ if (normalizedTypeName != typeName)
+ iface = findMetaTypeByName(normalizedTypeName);
+#endif
+
+ return QMetaType(iface);
}
/*!
diff --git a/src/corelib/kernel/qmetatype_p.h b/src/corelib/kernel/qmetatype_p.h
index c05bce5fc8f..b39e1de0be2 100644
--- a/src/corelib/kernel/qmetatype_p.h
+++ b/src/corelib/kernel/qmetatype_p.h
@@ -40,25 +40,29 @@ QT_BEGIN_NAMESPACE
assign_and_return \
}
-class Q_CORE_EXPORT QMetaTypeModuleHelper
+struct QMetaTypeModuleHelper
{
- Q_DISABLE_COPY_MOVE(QMetaTypeModuleHelper)
-protected:
- QMetaTypeModuleHelper() = default;
- ~QMetaTypeModuleHelper() = default;
-public:
- Q_WEAK_OVERLOAD // prevent it from entering the ABI and rendering constexpr useless
static constexpr auto makePair(int from, int to) -> quint64
{
return (quint64(from) << 32) + quint64(to);
}
- virtual const QtPrivate::QMetaTypeInterface *interfaceForType(int) const = 0;
- virtual bool convert(const void *, int, void *, int) const;
+ static const QtPrivate::QMetaTypeInterface *interfaceForType_dummy(int)
+ {
+ return nullptr;
+ }
+
+ static bool convert_dummy(const void *, int, void *, int)
+ {
+ return false;
+ }
+
+ decltype(&interfaceForType_dummy) interfaceForType = &interfaceForType_dummy;
+ decltype(&convert_dummy) convert = &convert_dummy;
};
-extern Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeGuiHelper;
-extern Q_CORE_EXPORT const QMetaTypeModuleHelper *qMetaTypeWidgetsHelper;
+extern Q_CORE_EXPORT QMetaTypeModuleHelper qMetaTypeGuiHelper;
+extern Q_CORE_EXPORT QMetaTypeModuleHelper qMetaTypeWidgetsHelper;
namespace QtMetaTypePrivate {
template<typename T>
diff --git a/src/corelib/kernel/qproperty.cpp b/src/corelib/kernel/qproperty.cpp
index 384253265be..7368af2df6e 100644
--- a/src/corelib/kernel/qproperty.cpp
+++ b/src/corelib/kernel/qproperty.cpp
@@ -1385,6 +1385,7 @@ QString QPropertyBindingError::description() const
/*!
\fn template <typename T> template <typename Functor> QPropertyBinding<T> QProperty<T>::setBinding(Functor f)
\overload
+ \since 6.0
Associates the value of this property with the provided functor \a f and
returns the previously associated binding. The property's value is set to the
@@ -1442,6 +1443,7 @@ QString QPropertyBindingError::description() const
/*!
\fn template <typename T> template <typename Functor> QPropertyChangeHandler<T, Functor> QProperty<T>::subscribe(Functor f)
+ \since 6.0
Subscribes the given functor \a f as a callback that is called immediately and
whenever the value of the property changes in the future. On each value
@@ -1459,6 +1461,7 @@ QString QPropertyBindingError::description() const
/*!
\fn template <typename T> template <typename Functor> QPropertyNotifier QProperty<T>::addNotifier(Functor f)
+ \since 6.2
Subscribes the given functor \a f as a callback that is called whenever
the value of the property changes.
@@ -1948,6 +1951,7 @@ QString QPropertyBindingError::description() const
\brief The QPropertyNotifier class controls the lifecycle of change callback installed on a QProperty.
\ingroup tools
+ \since 6.2
QPropertyNotifier is created when registering a callback on a QProperty to
listen to changes to the property's value, using QProperty::addNotifier. As
diff --git a/src/corelib/kernel/qsignalmapper.cpp b/src/corelib/kernel/qsignalmapper.cpp
index 65d766db4a9..96e909d1be7 100644
--- a/src/corelib/kernel/qsignalmapper.cpp
+++ b/src/corelib/kernel/qsignalmapper.cpp
@@ -74,9 +74,9 @@ public:
The only function that we need to implement is the constructor:
- \snippet qsignalmapper/buttonwidget.cpp 0
- \snippet qsignalmapper/buttonwidget.cpp 1
- \snippet qsignalmapper/buttonwidget.cpp 2
+ \snippet qsignalmapper/buttonwidget.cpp OpenCtor
+ \snippet qsignalmapper/buttonwidget.cpp OldNotation
+ \snippet qsignalmapper/buttonwidget.cpp CloseBrackets
A list of texts is passed to the constructor. A signal mapper is
constructed and for each text in the list a QPushButton is
@@ -92,7 +92,9 @@ public:
slots. The example above can be rewritten simpler without QSignalMapper
by connecting to a lambda function.
- \snippet qsignalmapper/buttonwidget.cpp 3
+ \snippet qsignalmapper/buttonwidget.cpp OpenCtor
+ \snippet qsignalmapper/buttonwidget.cpp ModernNotation
+ \snippet qsignalmapper/buttonwidget.cpp CloseBrackets
\sa QObject, QButtonGroup, QActionGroup
*/
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index 47483dc6470..c8348aba16a 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -39,6 +39,8 @@
#include <vector>
#include <memory>
+#include <QtCore/qmutex.h>
+
QT_BEGIN_NAMESPACE
Q_STATIC_LOGGING_CATEGORY(lcTranslator, "qt.core.qtranslator")
@@ -259,6 +261,8 @@ class QTranslatorPrivate : public QObjectPrivate
public:
enum { Contexts = 0x2f, Hashes = 0x42, Messages = 0x69, NumerusRules = 0x88, Dependencies = 0x96, Language = 0xa7 };
+ mutable QMutex lock;
+
QTranslatorPrivate() :
#if defined(QT_USE_MMAP)
used_mmap(0),
@@ -463,12 +467,7 @@ bool QTranslator::load(const QString & filename, const QString & directory,
const QString & suffix)
{
Q_D(QTranslator);
-
- std::unique_lock locker = QCoreApplicationPrivate::mutexLockerForTranslator(this);
- if (locker.owns_lock())
- QCoreApplication::postEvent(QCoreApplication::instance(),
- new QEvent(QEvent::LanguageChange));
-
+ QMutexLocker locker(&d->lock);
d->clear();
QString prefix;
@@ -744,12 +743,7 @@ bool QTranslator::load(const QLocale & locale,
const QString & suffix)
{
Q_D(QTranslator);
-
- std::unique_lock locker = QCoreApplicationPrivate::mutexLockerForTranslator(this);
- if (locker.owns_lock())
- QCoreApplication::postEvent(QCoreApplication::instance(),
- new QEvent(QEvent::LanguageChange));
-
+ QMutexLocker locker(&d->lock);
d->clear();
return d->load_translation(locale, filename, prefix, directory, suffix);
}
@@ -769,12 +763,7 @@ bool QTranslator::load(const QLocale & locale,
bool QTranslator::load(const uchar *data, int len, const QString &directory)
{
Q_D(QTranslator);
-
- std::unique_lock locker = QCoreApplicationPrivate::mutexLockerForTranslator(this);
- if (locker.owns_lock())
- QCoreApplication::postEvent(QCoreApplication::instance(),
- new QEvent(QEvent::LanguageChange));
-
+ QMutexLocker locker(&d->lock);
d->clear();
if (!data || len < MagicLength || memcmp(data, magic, MagicLength))
@@ -1048,6 +1037,7 @@ searchDependencies:
void QTranslatorPrivate::clear()
{
+ Q_Q(QTranslator);
if (unmapPointer && unmapLength) {
#if defined(QT_USE_MMAP)
if (used_mmap) {
@@ -1075,9 +1065,15 @@ void QTranslatorPrivate::clear()
language.clear();
filePath.clear();
+
+ if (QCoreApplicationPrivate::isTranslatorInstalled(q))
+ QCoreApplication::postEvent(QCoreApplication::instance(),
+ new QEvent(QEvent::LanguageChange));
}
/*!
+ \threadsafe
+
Returns the translation for the key (\a context, \a sourceText,
\a disambiguation). If none is found, also tries (\a context, \a
sourceText, ""). If that still fails, returns a null string.
@@ -1099,7 +1095,14 @@ QString QTranslator::translate(const char *context, const char *sourceText, cons
int n) const
{
Q_D(const QTranslator);
- return d->do_translate(context, sourceText, disambiguation, n);
+
+ // Return early to avoid a deadlock in case translate() is called
+ // from a code path triggered by QTranslator::load()
+ if (!d->lock.tryLock())
+ return QString();
+ QString result = d->do_translate(context, sourceText, disambiguation, n);
+ d->lock.unlock();
+ return result;
}
/*!
diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h
index 31f5869c9d9..e9d3ffb9ae3 100644
--- a/src/corelib/kernel/qvariant.h
+++ b/src/corelib/kernel/qvariant.h
@@ -332,7 +332,16 @@ public:
inline void swap(QVariant &other) noexcept { std::swap(d, other.d); }
int userType() const { return typeId(); }
- int typeId() const { return metaType().id(); }
+ int typeId() const
+ {
+ // QVariant types are always registered (see fromMetaType())
+ const QtPrivate::QMetaTypeInterface *mt = metaType().iface();
+ if (!mt)
+ return 0;
+ int id = mt->typeId.loadRelaxed();
+ // Q_ASSUME(id > 0);
+ return id;
+ }
const char *typeName() const;
QMetaType metaType() const;
diff --git a/src/corelib/platform/windows/qt_winrtbase_p.h b/src/corelib/platform/windows/qt_winrtbase_p.h
index fb7366f93de..79c2bdf6b1c 100644
--- a/src/corelib/platform/windows/qt_winrtbase_p.h
+++ b/src/corelib/platform/windows/qt_winrtbase_p.h
@@ -18,6 +18,7 @@
#include <QtCore/qglobal.h>
#if QT_CONFIG(cpp_winrt)
+# include <guiddef.h> // required by clang-cl: https://github.com/microsoft/cppwinrt/issues/1179
# include <winrt/base.h>
# include <QtCore/private/qfactorycacheregistration_p.h>
// Workaround for Windows SDK bug.
diff --git a/src/corelib/serialization/qcborarray.cpp b/src/corelib/serialization/qcborarray.cpp
index e00b7a4571f..9a566b999b4 100644
--- a/src/corelib/serialization/qcborarray.cpp
+++ b/src/corelib/serialization/qcborarray.cpp
@@ -98,6 +98,17 @@ QCborArray::QCborArray(const QCborArray &other) noexcept
}
/*!
+ \fn QCborArray::QCborArray(QCborArray &&other)
+ \since 6.10
+
+ Move-constructor.
+
+ The moved-from object \a other is placed in the default-constructed state.
+
+ \sa QCborArray::QCborArray()
+*/
+
+/*!
\fn QCborArray::QCborArray(std::initializer_list<QCborValue> args)
Initializes this QCborArray from the C++ brace-enclosed list found in \a
@@ -126,6 +137,15 @@ QCborArray &QCborArray::operator=(const QCborArray &other) noexcept
}
/*!
+ \fn QCborArray &QCborArray::operator=(QCborArray &&other)
+ \since 6.10
+
+ Move-assignment operator.
+
+ The moved-from object \a other is placed in a valid, but unspecified state.
+*/
+
+/*!
\fn void QCborArray::swap(QCborArray &other)
\memberswap{array}
*/
diff --git a/src/corelib/serialization/qcborarray.h b/src/corelib/serialization/qcborarray.h
index dd24e5604c0..208d5bcc9a1 100644
--- a/src/corelib/serialization/qcborarray.h
+++ b/src/corelib/serialization/qcborarray.h
@@ -204,7 +204,9 @@ public:
QCborArray() noexcept;
QCborArray(const QCborArray &other) noexcept;
+ QCborArray(QCborArray &&other) noexcept = default;
QCborArray &operator=(const QCborArray &other) noexcept;
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QCborArray)
QCborArray(std::initializer_list<QCborValue> args)
: QCborArray()
{
diff --git a/src/corelib/serialization/qcborcommon.h b/src/corelib/serialization/qcborcommon.h
index b9f7a66ae2f..5183a90937f 100644
--- a/src/corelib/serialization/qcborcommon.h
+++ b/src/corelib/serialization/qcborcommon.h
@@ -7,6 +7,7 @@
#include <QtCore/qobjectdefs.h>
#include <QtCore/qmetatype.h>
+#include <QtCore/qshareddata.h>
#if 0
#pragma qt_class(QtCborCommon)
@@ -22,6 +23,9 @@ QT_BEGIN_NAMESPACE
class QDebug;
+class QCborContainerPrivate;
+QT_DECLARE_QESDP_SPECIALIZATION_DTOR(QCborContainerPrivate) // defined in qcborvalue.cpp
+
enum class QCborSimpleType : quint8 {
False = 20,
True = 21,
diff --git a/src/corelib/serialization/qcbormap.cpp b/src/corelib/serialization/qcbormap.cpp
index 6166775c8ce..e6075dcfc36 100644
--- a/src/corelib/serialization/qcbormap.cpp
+++ b/src/corelib/serialization/qcbormap.cpp
@@ -276,6 +276,17 @@ QCborMap::QCborMap(const QCborMap &other) noexcept
}
/*!
+ \fn QCborMap::QCborMap(QCborMap &&other)
+ \since 6.10
+
+ Move-constructor.
+
+ The moved-from object \a other is placed in the default-constructed state.
+
+ \sa QCborMap::QCborMap()
+*/
+
+/*!
\fn QCborMap::QCborMap(std::initializer_list<value_type> args)
Constructs a QCborMap with items from a brace-initialization list found in
@@ -309,6 +320,15 @@ QCborMap &QCborMap::operator=(const QCborMap &other) noexcept
}
/*!
+ \fn QCborMap &QCborMap::operator=(QCborMap &&other)
+ \since 6.10
+
+ Move-assignment operator.
+
+ The moved-from object \a other is placed in a valid, but unspecified state.
+*/
+
+/*!
\fn void QCborMap::swap(QCborMap &other)
\memberswap{map}
*/
diff --git a/src/corelib/serialization/qcbormap.h b/src/corelib/serialization/qcbormap.h
index 039c436c76b..e2945621451 100644
--- a/src/corelib/serialization/qcbormap.h
+++ b/src/corelib/serialization/qcbormap.h
@@ -239,7 +239,9 @@ public:
QCborMap() noexcept;
QCborMap(const QCborMap &other) noexcept;
+ QCborMap(QCborMap &&other) noexcept = default;
QCborMap &operator=(const QCborMap &other) noexcept;
+ QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QCborMap)
QCborMap(std::initializer_list<value_type> args)
: QCborMap()
{
diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp
index fabed2f06e1..5b7ec705079 100644
--- a/src/corelib/serialization/qcborvalue.cpp
+++ b/src/corelib/serialization/qcborvalue.cpp
@@ -28,6 +28,8 @@
QT_BEGIN_NAMESPACE
+QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QCborContainerPrivate)
+
// Worst case memory allocation for a corrupt stream: 256 MB for 32-bit, 1 GB for 64-bit
static constexpr quint64 MaxAcceptableMemoryUse = (sizeof(void*) == 4 ? 256 : 1024) * 1024 * 1024;
diff --git a/src/corelib/thread/qatomicwait.cpp b/src/corelib/thread/qatomicwait.cpp
index 3d70333ca7b..25ca771643b 100644
--- a/src/corelib/thread/qatomicwait.cpp
+++ b/src/corelib/thread/qatomicwait.cpp
@@ -4,6 +4,7 @@
#include "qatomicwait_p.h"
#include <qendian.h>
+#include "qfutex_p.h"
#include "qwaitcondition_p.h"
#include <array>
@@ -96,8 +97,21 @@ struct QAtomicWaitLocks
};
} // unnamed namespace
+static inline void checkFutexUse()
+{
+#if !defined(QATOMICWAIT_USE_FALLBACK)
+ if (QtFutex::futexAvailable()) {
+ // This will disable the code and data on systems where futexes are
+ // always available (currently: FreeBSD, Linux, Windows).
+ qFatal("Implementation should have used futex!");
+ }
+#endif
+}
+
static QAtomicWaitLocks &atomicLocks() noexcept
{
+ checkFutexUse();
+
static QAtomicWaitLocks global {};
return global;
}
diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp
index bd3b269c0b7..832d87332b0 100644
--- a/src/corelib/thread/qmutex.cpp
+++ b/src/corelib/thread/qmutex.cpp
@@ -120,8 +120,8 @@ void QBasicMutex::destroyInternal(void *ptr)
Locks the mutex. If another thread has locked the mutex then this
call will block until that thread has unlocked it.
- Calling this function multiple times on the same mutex from the
- same thread will cause a \e dead-lock.
+ If the mutex was already locked by the current thread, this call will
+ never return, causing a \e dead-lock.
\sa unlock()
*/
@@ -140,9 +140,6 @@ void QBasicMutex::destroyInternal(void *ptr)
If the lock was obtained, the mutex must be unlocked with unlock()
before another thread can successfully lock it.
- Calling this function multiple times on the same mutex from the
- same thread will cause a \e dead-lock.
-
\sa lock(), unlock()
*/
@@ -157,9 +154,6 @@ void QBasicMutex::destroyInternal(void *ptr)
If the lock was obtained, the mutex must be unlocked with unlock()
before another thread can successfully lock it.
- Calling this function multiple times on the same mutex from the
- same thread will cause a \e dead-lock.
-
\sa lock(), unlock()
*/
@@ -172,9 +166,6 @@ void QBasicMutex::destroyInternal(void *ptr)
If the lock was obtained, the mutex must be unlocked with unlock()
before another thread can successfully lock it.
- Calling this function multiple times on the same mutex from the
- same thread will cause a \e dead-lock.
-
\sa lock(), unlock()
*/
@@ -202,9 +193,6 @@ void QBasicMutex::destroyInternal(void *ptr)
If the lock was obtained, the mutex must be unlocked with unlock()
before another thread can successfully lock it.
- Calling this function multiple times on the same mutex from the
- same thread will cause a \e dead-lock.
-
\sa lock(), unlock()
*/
@@ -222,9 +210,6 @@ void QBasicMutex::destroyInternal(void *ptr)
If the lock was obtained, the mutex must be unlocked with unlock()
before another thread can successfully lock it.
- Calling this function multiple times on the same mutex from the
- same thread will cause a \e dead-lock.
-
\sa lock(), unlock()
*/
diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp
index 42011993243..43b16cd0f4f 100644
--- a/src/corelib/time/qdatetime.cpp
+++ b/src/corelib/time/qdatetime.cpp
@@ -405,13 +405,16 @@ static int fromOffsetString(QStringView offsetString, bool *valid) noexcept
\section2 Range of Valid Dates
- Dates are stored internally as a Julian Day number, an integer count of
- every day in a contiguous range, with 24 November 4714 BCE in the Gregorian
- calendar being Julian Day 0 (1 January 4713 BCE in the Julian calendar).
- As well as being an efficient and accurate way of storing an absolute date,
- it is suitable for converting a date into other calendar systems such as
- Hebrew, Islamic or Chinese. The Julian Day number can be obtained using
- QDate::toJulianDay() and can be set using QDate::fromJulianDay().
+ Dates are stored internally as a modified Julian Day number, an integer
+ count of every day in a contiguous range, with 24 November 4714 BCE in the
+ Gregorian calendar being Julian Day 0 (1 January 4713 BCE in the Julian
+ calendar). As well as being an efficient and accurate way of storing an
+ absolute date, it is suitable for converting a date into other calendar
+ systems such as Hebrew, Islamic or Chinese. For the purposes of QDate,
+ Julian Days are delimited at midnight and, for those of QDateTime, in the
+ zone used by the datetime. (This departs from the formal definition, which
+ delimits Julian Days at UTC noon.) The Julian Day number can be obtained
+ using QDate::toJulianDay() and can be set using QDate::fromJulianDay().
The range of Julian Day numbers that QDate can represent is, for technical
reasons, limited to between -784350574879 and 784354017364, which means from
diff --git a/src/corelib/time/qtimezonelocale_data_p.h b/src/corelib/time/qtimezonelocale_data_p.h
index 9afb12406c0..9e179369254 100644
--- a/src/corelib/time/qtimezonelocale_data_p.h
+++ b/src/corelib/time/qtimezonelocale_data_p.h
@@ -58,7 +58,7 @@ namespace QtTimeZoneLocale {
// GENERATED PART STARTS HERE
/*
- This part of the file was generated on 2025-06-17 from the
+ This part of the file was generated on 2025-07-01 from the
Common Locale Data Repository v47
http://www.unicode.org/cldr/
@@ -49804,7 +49804,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 687, 5130, 88357, 11, }, // Africa/Dar_es_Salaam
{ 687, 5043, 88368, 6, }, // Africa/Djibouti
{ 687, 5243, 88374, 5, }, // Africa/Douala
- { 687, 5166, 221031, 9, }, // Africa/El_Aaiun
+ { 687, 5166, 88379, 8, }, // Africa/El_Aaiun
{ 687, 6853, 88387, 9, }, // Africa/Freetown
{ 687, 4906, 88396, 7, }, // Africa/Gaborone
{ 687, 5015, 88403, 5, }, // Africa/Harare
@@ -49925,7 +49925,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 687, 5897, 89278, 7, }, // America/Marigot
{ 687, 5805, 89285, 9, }, // America/Martinique
{ 687, 8184, 89294, 9, }, // America/Matamoros
- { 687, 2917, 221040, 8, }, // America/Mazatlan
+ { 687, 2917, 221031, 8, }, // America/Mazatlan
{ 687, 8202, 89312, 8, }, // America/Menominee
{ 687, 8220, 31158, 6, }, // America/Merida
{ 687, 8235, 89320, 12, }, // America/Metlakatla
@@ -50012,7 +50012,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 687, 4540, 89984, 7, }, // Asia/Damascus
{ 687, 1093, 89991, 4, }, // Asia/Dhaka
{ 687, 6192, 89995, 4, }, // Asia/Dili
- { 687, 3596, 221048, 3, }, // Asia/Dubai
+ { 687, 3596, 221039, 3, }, // Asia/Dubai
{ 687, 6159, 90003, 7, }, // Asia/Dushanbe
{ 687, 8636, 90010, 11, }, // Asia/Famagusta
{ 687, 8651, 90021, 5, }, // Asia/Gaza
@@ -50024,7 +50024,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 687, 7006, 90073, 7, }, // Asia/Jakarta
{ 687, 6992, 31943, 7, }, // Asia/Jayapura
{ 687, 1290, 90080, 6, }, // Asia/Jerusalem
- { 687, 3560, 221051, 4, }, // Asia/Kabul
+ { 687, 3560, 221042, 4, }, // Asia/Kabul
{ 687, 4316, 90091, 7, }, // Asia/Kamchatka
{ 687, 4239, 31972, 5, }, // Asia/Karachi
{ 687, 1185, 90098, 8, }, // Asia/Kathmandu
@@ -50080,7 +50080,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 687, 1395, 90429, 5, }, // Atlantic/Faroe
{ 687, 8736, 90434, 5, }, // Atlantic/Madeira
{ 687, 2748, 90439, 9, }, // Atlantic/Reykjavik
- { 687, 7272, 221055, 13, }, // Atlantic/South_Georgia
+ { 687, 7272, 221046, 13, }, // Atlantic/South_Georgia
{ 687, 6821, 90463, 11, }, // Atlantic/St_Helena
{ 687, 6644, 90474, 7, }, // Atlantic/Stanley
{ 687, 1670, 90481, 6, }, // Australia/Adelaide
@@ -50094,7 +50094,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 687, 1727, 90537, 8, }, // Australia/Melbourne
{ 687, 1762, 90545, 4, }, // Australia/Perth
{ 687, 1463, 32494, 5, }, // Australia/Sydney
- { 687, 6441, 221068, 9, }, // Europe/Amsterdam
+ { 687, 6441, 221059, 9, }, // Europe/Amsterdam
{ 687, 6216, 90559, 6, }, // Europe/Andorra
{ 687, 3620, 90565, 10, }, // Europe/Astrakhan
{ 687, 2300, 90575, 5, }, // Europe/Athens
@@ -50128,7 +50128,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 687, 6410, 90773, 6, }, // Europe/Monaco
{ 687, 3537, 90779, 6, }, // Europe/Moscow
{ 687, 6458, 90785, 5, }, // Europe/Oslo
- { 687, 4284, 221077, 4, }, // Europe/Paris
+ { 687, 4284, 221068, 4, }, // Europe/Paris
{ 687, 6424, 90790, 10, }, // Europe/Podgorica
{ 687, 6275, 90800, 5, }, // Europe/Prague
{ 687, 8837, 90805, 4, }, // Europe/Riga
@@ -50154,7 +50154,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 687, 6540, 90946, 9, }, // Europe/Zurich
{ 687, 5078, 90955, 11, }, // Indian/Antananarivo
{ 687, 6947, 90966, 5, }, // Indian/Chagos
- { 687, 6046, 221081, 8, }, // Indian/Christmas
+ { 687, 6046, 221072, 8, }, // Indian/Christmas
{ 687, 6063, 90978, 5, }, // Indian/Cocos
{ 687, 5029, 90983, 6, }, // Indian/Comoro
{ 687, 6661, 90989, 7, }, // Indian/Kerguelen
@@ -50177,7 +50177,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 687, 6696, 91094, 7, }, // Pacific/Gambier
{ 687, 3822, 91101, 10, }, // Pacific/Guadalcanal
{ 687, 6018, 31112, 4, }, // Pacific/Guam
- { 687, 3049, 221089, 5, }, // Pacific/Kanton
+ { 687, 3049, 221080, 5, }, // Pacific/Kanton
{ 687, 3998, 33132, 10, }, // Pacific/Kiritimati
{ 687, 7019, 91126, 6, }, // Pacific/Kosrae
{ 687, 2842, 91132, 10, }, // Pacific/Kwajalein
@@ -50188,7 +50188,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 687, 7132, 91165, 4, }, // Pacific/Niue
{ 687, 4168, 91169, 7, }, // Pacific/Norfolk
{ 687, 7098, 91176, 6, }, // Pacific/Noumea
- { 687, 3126, 221094, 9, }, // Pacific/Pago_Pago
+ { 687, 3126, 221085, 9, }, // Pacific/Pago_Pago
{ 687, 7155, 91191, 4, }, // Pacific/Palau
{ 687, 7194, 33210, 8, }, // Pacific/Pitcairn
{ 687, 3096, 91195, 6, }, // Pacific/Pohnpei
@@ -50203,650 +50203,650 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 688, 6788, 195501, 6, }, // Africa/Abidjan Venetian/Latin/Italy
{ 688, 6760, 74129, 4, }, // Africa/Accra
{ 688, 5059, 35821, 10, }, // Africa/Addis_Ababa
- { 688, 7420, 221103, 6, }, // Africa/Algiers
- { 688, 14, 221109, 6, }, // Africa/Asmara
- { 688, 5257, 221115, 6, }, // Africa/Bangui
- { 688, 7435, 221121, 5, }, // Africa/Bissau
- { 688, 4922, 221126, 9, }, // Africa/Bujumbura
+ { 688, 7420, 221094, 6, }, // Africa/Algiers
+ { 688, 14, 221100, 6, }, // Africa/Asmara
+ { 688, 5257, 221106, 6, }, // Africa/Bangui
+ { 688, 7435, 221112, 5, }, // Africa/Bissau
+ { 688, 4922, 221117, 9, }, // Africa/Bujumbura
{ 688, 2320, 161877, 8, }, // Africa/Cairo
- { 688, 4117, 221135, 10, }, // Africa/Casablanca
+ { 688, 4117, 221126, 10, }, // Africa/Casablanca
{ 688, 7449, 166781, 5, }, // Africa/Ceuta
{ 688, 6773, 157976, 7, }, // Africa/Conakry
{ 688, 5130, 21354, 12, }, // Africa/Dar_es_Salaam
{ 688, 5043, 158501, 6, }, // Africa/Djibouti
{ 688, 5243, 21372, 5, }, // Africa/Douala
{ 688, 5166, 6393, 7, }, // Africa/El_Aaiun
- { 688, 5151, 221145, 7, }, // Africa/Kampala
+ { 688, 5151, 221136, 7, }, // Africa/Kampala
{ 688, 4524, 157994, 6, }, // Africa/Khartoum
{ 688, 6869, 20418, 4, }, // Africa/Lome
- { 688, 4939, 221152, 10, }, // Africa/Lubumbashi
- { 688, 5197, 221162, 6, }, // Africa/Maseru
- { 688, 5182, 221168, 7, }, // Africa/Mbabane
- { 688, 5113, 221175, 8, }, // Africa/Mogadishu
+ { 688, 4939, 221143, 10, }, // Africa/Lubumbashi
+ { 688, 5197, 221153, 6, }, // Africa/Maseru
+ { 688, 5182, 221159, 7, }, // Africa/Mbabane
+ { 688, 5113, 221166, 8, }, // Africa/Mogadishu
{ 688, 5271, 195575, 6, }, // Africa/Ndjamena
{ 688, 6803, 147724, 8, }, // Africa/Nouakchott
- { 688, 6727, 221183, 8, }, // Africa/Ouagadougou
+ { 688, 6727, 221174, 8, }, // Africa/Ouagadougou
{ 688, 5225, 26542, 10, }, // Africa/Porto-Novo
- { 688, 4435, 221191, 15, }, // Africa/Sao_Tome
+ { 688, 4435, 221182, 15, }, // Africa/Sao_Tome
{ 688, 2866, 164486, 7, }, // Africa/Tripoli
- { 688, 6554, 221206, 6, }, // Africa/Tunis
+ { 688, 6554, 221197, 6, }, // Africa/Tunis
{ 688, 5607, 4775, 7, }, // America/Anguilla
- { 688, 270, 221212, 7, }, // America/Argentina/Cordoba
- { 688, 7489, 221219, 11, }, // America/Argentina/Rio_Gallegos
+ { 688, 270, 221203, 7, }, // America/Argentina/Cordoba
+ { 688, 7489, 221210, 11, }, // America/Argentina/Rio_Gallegos
{ 688, 4252, 6592, 8, }, // America/Asuncion
{ 688, 237, 22, 8, }, // America/Atikokan
- { 688, 7623, 221230, 16, }, // America/Bahia_Banderas
+ { 688, 7623, 221221, 16, }, // America/Bahia_Banderas
{ 688, 4361, 44161, 6, }, // America/Bogota
- { 688, 7735, 221246, 12, }, // America/Campo_Grande
+ { 688, 7735, 221237, 12, }, // America/Campo_Grande
{ 688, 3868, 33314, 6, }, // America/Cancun
{ 688, 4345, 147758, 6, }, // America/Cayenne
{ 688, 5496, 44173, 6, }, // America/Cayman
{ 688, 7774, 60, 6, }, // America/Ciudad_Juarez
- { 688, 3791, 221258, 6, }, // America/Cuiaba
+ { 688, 3791, 221249, 6, }, // America/Cuiaba
{ 688, 5723, 66, 7, }, // America/Curacao
- { 688, 805, 221264, 6, }, // America/Denver
- { 688, 5739, 221270, 8, }, // America/Dominica
+ { 688, 805, 221255, 6, }, // America/Denver
+ { 688, 5739, 221261, 8, }, // America/Dominica
{ 688, 7869, 26580, 8, }, // America/Eirunepe
{ 688, 5770, 20519, 7, }, // America/Grenada
{ 688, 5786, 95109, 9, }, // America/Guadeloupe
{ 688, 2281, 95118, 7, }, // America/Havana
- { 688, 348, 221278, 12, }, // America/Indiana/Indianapolis
- { 688, 481, 221290, 14, }, // America/Indiana/Knox
- { 688, 7961, 221304, 17, }, // America/Indiana/Marengo
- { 688, 7985, 221321, 20, }, // America/Indiana/Petersburg
- { 688, 8012, 221341, 19, }, // America/Indiana/Tell_City
- { 688, 8038, 221360, 15, }, // America/Indiana/Vevay
- { 688, 8060, 221375, 19, }, // America/Indiana/Vincennes
- { 688, 8086, 221394, 17, }, // America/Indiana/Winamac
- { 688, 2799, 221411, 7, }, // America/Jamaica
- { 688, 8125, 221418, 21, }, // America/Kentucky/Monticello
- { 688, 3239, 221439, 11, }, // America/Los_Angeles
+ { 688, 348, 221269, 12, }, // America/Indiana/Indianapolis
+ { 688, 481, 221281, 14, }, // America/Indiana/Knox
+ { 688, 7961, 221295, 17, }, // America/Indiana/Marengo
+ { 688, 7985, 221312, 20, }, // America/Indiana/Petersburg
+ { 688, 8012, 221332, 19, }, // America/Indiana/Tell_City
+ { 688, 8038, 221351, 15, }, // America/Indiana/Vevay
+ { 688, 8060, 221366, 19, }, // America/Indiana/Vincennes
+ { 688, 8086, 221385, 17, }, // America/Indiana/Winamac
+ { 688, 2799, 221402, 7, }, // America/Jamaica
+ { 688, 8125, 221409, 21, }, // America/Kentucky/Monticello
+ { 688, 3239, 221430, 11, }, // America/Los_Angeles
{ 688, 5932, 207, 22, }, // America/Lower_Princes
{ 688, 8153, 26588, 6, }, // America/Maceio
- { 688, 5805, 221450, 9, }, // America/Martinique
+ { 688, 5805, 221441, 9, }, // America/Martinique
{ 688, 8220, 229, 6, }, // America/Merida
- { 688, 2949, 221459, 16, }, // America/Mexico_City
- { 688, 4391, 221475, 8, }, // America/Miquelon
+ { 688, 2949, 221450, 16, }, // America/Mexico_City
+ { 688, 4391, 221466, 8, }, // America/Miquelon
{ 688, 8270, 21944, 8, }, // America/Monterrey
{ 688, 5824, 7172, 9, }, // America/Montserrat
{ 688, 1850, 235, 19, }, // America/Noronha
- { 688, 8301, 221483, 20, }, // America/North_Dakota/Beulah
- { 688, 8329, 221503, 20, }, // America/North_Dakota/Center
- { 688, 8357, 221523, 23, }, // America/North_Dakota/New_Salem
+ { 688, 8301, 221474, 20, }, // America/North_Dakota/Beulah
+ { 688, 8329, 221494, 20, }, // America/North_Dakota/Center
+ { 688, 8357, 221514, 23, }, // America/North_Dakota/New_Salem
{ 688, 393, 317, 4, }, // America/Nuuk
{ 688, 2356, 164613, 6, }, // America/Panama
- { 688, 3945, 221546, 14, }, // America/Port-au-Prince
- { 688, 5954, 221560, 15, }, // America/Port_of_Spain
+ { 688, 3945, 221537, 14, }, // America/Port-au-Prince
+ { 688, 5954, 221551, 15, }, // America/Port_of_Spain
{ 688, 5843, 95222, 9, }, // America/Puerto_Rico
- { 688, 1878, 221575, 8, }, // America/Sao_Paulo
+ { 688, 1878, 221566, 8, }, // America/Sao_Paulo
{ 688, 6899, 321, 16, }, // America/Scoresbysund
- { 688, 8508, 221583, 13, }, // America/St_Barthelemy
- { 688, 2061, 221596, 8, }, // America/St_Johns
- { 688, 5863, 221604, 12, }, // America/St_Kitts
- { 688, 5880, 221616, 8, }, // America/St_Lucia
- { 688, 855, 221197, 9, }, // America/St_Thomas
- { 688, 5913, 221624, 11, }, // America/St_Vincent
+ { 688, 8508, 221574, 13, }, // America/St_Barthelemy
+ { 688, 2061, 221587, 8, }, // America/St_Johns
+ { 688, 5863, 221595, 12, }, // America/St_Kitts
+ { 688, 5880, 221607, 8, }, // America/St_Lucia
+ { 688, 855, 221188, 9, }, // America/St_Thomas
+ { 688, 5913, 221615, 11, }, // America/St_Vincent
{ 688, 5688, 148000, 7, }, // America/Tortola
{ 688, 6133, 400, 16, }, // Antarctica/DumontDUrville
- { 688, 8568, 221635, 15, }, // Antarctica/Macquarie
+ { 688, 8568, 221626, 15, }, // Antarctica/Macquarie
{ 688, 5395, 7594, 6, }, // Asia/Almaty
{ 688, 3968, 5605, 4, }, // Asia/Amman
- { 688, 5511, 221650, 6, }, // Asia/Anadyr
- { 688, 5523, 221656, 5, }, // Asia/Aqtau
+ { 688, 5511, 221641, 6, }, // Asia/Anadyr
+ { 688, 5523, 221647, 5, }, // Asia/Aqtau
{ 688, 5368, 7606, 6, }, // Asia/Aqtobe
- { 688, 964, 221661, 7, }, // Asia/Ashgabat
- { 688, 8624, 221668, 6, }, // Asia/Atyrau
+ { 688, 964, 221652, 7, }, // Asia/Ashgabat
+ { 688, 8624, 221659, 6, }, // Asia/Atyrau
{ 688, 3607, 4162, 6, }, // Asia/Baghdad
{ 688, 5534, 63955, 6, }, // Asia/Bahrain
{ 688, 3778, 91536, 6, }, // Asia/Bishkek
{ 688, 5989, 20751, 6, }, // Asia/Brunei
{ 688, 4601, 93254, 4, }, // Asia/Chita
- { 688, 4511, 221674, 7, }, // Asia/Colombo
+ { 688, 4511, 221665, 7, }, // Asia/Colombo
{ 688, 4540, 74438, 7, }, // Asia/Damascus
{ 688, 1093, 158496, 4, }, // Asia/Dhaka
- { 688, 3596, 221681, 5, }, // Asia/Dubai
- { 688, 6159, 221686, 7, }, // Asia/Dushanbe
+ { 688, 3596, 221672, 5, }, // Asia/Dubai
+ { 688, 6159, 221677, 7, }, // Asia/Dushanbe
{ 688, 8636, 95258, 9, }, // Asia/Famagusta
{ 688, 1259, 432, 11, }, // Asia/Ho_Chi_Minh
{ 688, 1290, 123559, 10, }, // Asia/Jerusalem
{ 688, 4316, 162180, 9, }, // Asia/Kamchatka
- { 688, 1185, 221693, 8, }, // Asia/Kathmandu
- { 688, 8661, 221701, 7, }, // Asia/Khandyga
+ { 688, 1185, 221684, 8, }, // Asia/Kathmandu
+ { 688, 8661, 221692, 7, }, // Asia/Khandyga
{ 688, 992, 20838, 7, }, // Asia/Kolkata
- { 688, 4197, 221708, 11, }, // Asia/Krasnoyarsk
- { 688, 4859, 221719, 12, }, // Asia/Kuala_Lumpur
- { 688, 1211, 221731, 5, }, // Asia/Macau
+ { 688, 4197, 221699, 11, }, // Asia/Krasnoyarsk
+ { 688, 4859, 221710, 12, }, // Asia/Kuala_Lumpur
+ { 688, 1211, 221722, 5, }, // Asia/Macau
{ 688, 1349, 7736, 7, }, // Asia/Makassar
{ 688, 6920, 20857, 7, }, // Asia/Muscat
- { 688, 8675, 221736, 13, }, // Asia/Novokuznetsk
+ { 688, 8675, 221727, 13, }, // Asia/Novokuznetsk
{ 688, 7145, 65240, 5, }, // Asia/Oral
{ 688, 6961, 22518, 8, }, // Asia/Phnom_Penh
{ 688, 5559, 73150, 5, }, // Asia/Qatar
- { 688, 8708, 221749, 8, }, // Asia/Qostanay
+ { 688, 8708, 221740, 8, }, // Asia/Qostanay
{ 688, 4269, 7778, 9, }, // Asia/Qyzylorda
{ 688, 3584, 7787, 4, }, // Asia/Riyadh
{ 688, 4408, 158282, 7, }, // Asia/Sakhalin
{ 688, 7245, 20886, 10, }, // Asia/Samarkand
{ 688, 3279, 7798, 4, }, // Asia/Seoul
- { 688, 1053, 221757, 8, }, // Asia/Shanghai
- { 688, 4297, 221765, 13, }, // Asia/Srednekolymsk
+ { 688, 1053, 221748, 8, }, // Asia/Shanghai
+ { 688, 4297, 221756, 13, }, // Asia/Srednekolymsk
{ 688, 3263, 177683, 6, }, // Asia/Taipei
{ 688, 4781, 91755, 7, }, // Asia/Tashkent
{ 688, 3915, 220114, 7, }, // Asia/Tbilisi
{ 688, 2772, 7842, 7, }, // Asia/Tehran
- { 688, 1317, 221778, 5, }, // Asia/Thimphu
- { 688, 1021, 221783, 10, }, // Asia/Ulaanbaatar
+ { 688, 1317, 221769, 5, }, // Asia/Thimphu
+ { 688, 1021, 221774, 10, }, // Asia/Ulaanbaatar
{ 688, 1159, 202026, 7, }, // Asia/Urumqi
- { 688, 8722, 221793, 9, }, // Asia/Ust-Nera
+ { 688, 8722, 221784, 9, }, // Asia/Ust-Nera
{ 688, 6977, 26939, 8, }, // Asia/Vientiane
{ 688, 1235, 477, 6, }, // Asia/Yangon
- { 688, 3883, 221802, 14, }, // Asia/Yekaterinburg
- { 688, 3747, 221816, 7, }, // Asia/Yerevan
- { 688, 3663, 221823, 11, }, // Atlantic/Azores
- { 688, 6628, 221834, 13, }, // Atlantic/Canary
- { 688, 3727, 221847, 9, }, // Atlantic/Cape_Verde
- { 688, 1395, 221856, 11, }, // Atlantic/Faroe
- { 688, 8736, 221867, 13, }, // Atlantic/Madeira
- { 688, 2748, 221880, 8, }, // Atlantic/Reykjavik
- { 688, 7272, 221888, 16, }, // Atlantic/South_Georgia
- { 688, 6821, 221904, 14, }, // Atlantic/St_Helena
- { 688, 1670, 221918, 8, }, // Australia/Adelaide
- { 688, 1635, 221926, 8, }, // Australia/Brisbane
- { 688, 1547, 221934, 15, }, // Australia/Lord_Howe
- { 688, 6441, 221949, 9, }, // Europe/Amsterdam
+ { 688, 3883, 221793, 14, }, // Asia/Yekaterinburg
+ { 688, 3747, 221807, 7, }, // Asia/Yerevan
+ { 688, 3663, 221814, 11, }, // Atlantic/Azores
+ { 688, 6628, 221825, 13, }, // Atlantic/Canary
+ { 688, 3727, 221838, 9, }, // Atlantic/Cape_Verde
+ { 688, 1395, 221847, 11, }, // Atlantic/Faroe
+ { 688, 8736, 221858, 13, }, // Atlantic/Madeira
+ { 688, 2748, 221871, 8, }, // Atlantic/Reykjavik
+ { 688, 7272, 221879, 16, }, // Atlantic/South_Georgia
+ { 688, 6821, 221895, 14, }, // Atlantic/St_Helena
+ { 688, 1670, 221909, 8, }, // Australia/Adelaide
+ { 688, 1635, 221917, 8, }, // Australia/Brisbane
+ { 688, 1547, 221925, 15, }, // Australia/Lord_Howe
+ { 688, 6441, 221940, 9, }, // Europe/Amsterdam
{ 688, 6216, 33638, 6, }, // Europe/Andorra
{ 688, 3620, 33644, 8, }, // Europe/Astrakhan
{ 688, 2300, 5911, 5, }, // Europe/Athens
{ 688, 6336, 58906, 8, }, // Europe/Belgrade
- { 688, 6488, 221958, 10, }, // Europe/Bratislava
+ { 688, 6488, 221949, 10, }, // Europe/Bratislava
{ 688, 2167, 27022, 6, }, // Europe/Brussels
{ 688, 3928, 21073, 8, }, // Europe/Bucharest
{ 688, 8772, 27037, 8, }, // Europe/Busingen
{ 688, 6289, 95331, 10, }, // Europe/Copenhagen
- { 688, 6307, 221968, 9, }, // Europe/Gibraltar
- { 688, 8804, 221977, 12, }, // Europe/Isle_of_Man
+ { 688, 6307, 221959, 9, }, // Europe/Gibraltar
+ { 688, 8804, 221968, 12, }, // Europe/Isle_of_Man
{ 688, 1130, 164893, 8, }, // Europe/Istanbul
{ 688, 3979, 63006, 12, }, // Europe/Kaliningrad
{ 688, 2527, 8148, 4, }, // Europe/Kyiv
{ 688, 3213, 157721, 7, }, // Europe/Lisbon
- { 688, 6506, 221989, 8, }, // Europe/Ljubljana
+ { 688, 6506, 221980, 8, }, // Europe/Ljubljana
{ 688, 2501, 95370, 6, }, // Europe/London
- { 688, 6365, 221997, 10, }, // Europe/Luxembourg
+ { 688, 6365, 221988, 10, }, // Europe/Luxembourg
{ 688, 6410, 44570, 6, }, // Europe/Monaco
{ 688, 3537, 95387, 5, }, // Europe/Moscow
- { 688, 6458, 222007, 4, }, // Europe/Oslo
- { 688, 4284, 222011, 6, }, // Europe/Paris
+ { 688, 6458, 221998, 4, }, // Europe/Oslo
+ { 688, 4284, 222002, 6, }, // Europe/Paris
{ 688, 6424, 196828, 9, }, // Europe/Podgorica
{ 688, 6275, 21185, 5, }, // Europe/Prague
{ 688, 6324, 6064, 4, }, // Europe/Rome
{ 688, 6470, 65868, 9, }, // Europe/San_Marino
- { 688, 8849, 222017, 11, }, // Europe/Simferopol
- { 688, 6523, 222028, 8, }, // Europe/Stockholm
+ { 688, 8849, 222008, 11, }, // Europe/Simferopol
+ { 688, 6523, 222019, 8, }, // Europe/Stockholm
{ 688, 8867, 8250, 5, }, // Europe/Tallinn
{ 688, 6202, 21213, 6, }, // Europe/Tirane
- { 688, 8882, 222036, 8, }, // Europe/Ulyanovsk
- { 688, 6567, 222044, 7, }, // Europe/Vatican
+ { 688, 8882, 222027, 8, }, // Europe/Ulyanovsk
+ { 688, 6567, 222035, 7, }, // Europe/Vatican
{ 688, 6231, 21230, 5, }, // Europe/Vienna
{ 688, 4727, 63187, 10, }, // Europe/Volgograd
{ 688, 3190, 95436, 8, }, // Europe/Warsaw
{ 688, 6540, 95452, 6, }, // Europe/Zurich
- { 688, 6947, 222051, 6, }, // Indian/Chagos
- { 688, 6046, 222057, 15, }, // Indian/Christmas
- { 688, 6063, 222072, 11, }, // Indian/Cocos
- { 688, 5029, 222083, 12, }, // Indian/Comoro
+ { 688, 6947, 222042, 6, }, // Indian/Chagos
+ { 688, 6046, 222048, 15, }, // Indian/Christmas
+ { 688, 6063, 222063, 11, }, // Indian/Cocos
+ { 688, 5029, 222074, 12, }, // Indian/Comoro
{ 688, 7260, 27115, 4, }, // Indian/Mahe
- { 688, 7050, 222095, 13, }, // Indian/Maldives
- { 688, 4069, 222108, 14, }, // Indian/Mauritius
- { 688, 5098, 222122, 12, }, // Indian/Mayotte
- { 688, 7211, 222134, 13, }, // Indian/Reunion
- { 688, 3706, 222147, 18, }, // Pacific/Bougainville
- { 688, 3015, 222165, 12, }, // Pacific/Chatham
- { 688, 3157, 222177, 11, }, // Pacific/Chuuk
- { 688, 2237, 222188, 15, }, // Pacific/Easter
- { 688, 7360, 222203, 11, }, // Pacific/Efate
- { 688, 7327, 222214, 13, }, // Pacific/Fakaofo
- { 688, 7343, 222227, 14, }, // Pacific/Funafuti
+ { 688, 7050, 222086, 13, }, // Indian/Maldives
+ { 688, 4069, 222099, 14, }, // Indian/Mauritius
+ { 688, 5098, 222113, 12, }, // Indian/Mayotte
+ { 688, 7211, 222125, 13, }, // Indian/Reunion
+ { 688, 3706, 222138, 18, }, // Pacific/Bougainville
+ { 688, 3015, 222156, 12, }, // Pacific/Chatham
+ { 688, 3157, 222168, 11, }, // Pacific/Chuuk
+ { 688, 2237, 222179, 15, }, // Pacific/Easter
+ { 688, 7360, 222194, 11, }, // Pacific/Efate
+ { 688, 7327, 222205, 13, }, // Pacific/Fakaofo
+ { 688, 7343, 222218, 14, }, // Pacific/Funafuti
{ 688, 6678, 167332, 9, }, // Pacific/Galapagos
- { 688, 6696, 222241, 13, }, // Pacific/Gambier
- { 688, 3822, 222254, 17, }, // Pacific/Guadalcanal
- { 688, 3049, 222271, 12, }, // Pacific/Kanton
- { 688, 3998, 222283, 16, }, // Pacific/Kiritimati
- { 688, 7019, 222299, 12, }, // Pacific/Kosrae
- { 688, 2842, 222311, 15, }, // Pacific/Kwajalein
- { 688, 4051, 222326, 14, }, // Pacific/Marquesas
- { 688, 8914, 222340, 12, }, // Pacific/Midway
- { 688, 7084, 222352, 11, }, // Pacific/Nauru
- { 688, 7132, 222363, 10, }, // Pacific/Niue
- { 688, 4168, 222373, 13, }, // Pacific/Norfolk
+ { 688, 6696, 222232, 13, }, // Pacific/Gambier
+ { 688, 3822, 222245, 17, }, // Pacific/Guadalcanal
+ { 688, 3049, 222262, 12, }, // Pacific/Kanton
+ { 688, 3998, 222274, 16, }, // Pacific/Kiritimati
+ { 688, 7019, 222290, 12, }, // Pacific/Kosrae
+ { 688, 2842, 222302, 15, }, // Pacific/Kwajalein
+ { 688, 4051, 222317, 14, }, // Pacific/Marquesas
+ { 688, 8914, 222331, 12, }, // Pacific/Midway
+ { 688, 7084, 222343, 11, }, // Pacific/Nauru
+ { 688, 7132, 222354, 10, }, // Pacific/Niue
+ { 688, 4168, 222364, 13, }, // Pacific/Norfolk
{ 688, 7098, 4628, 6, }, // Pacific/Noumea
{ 688, 3126, 135456, 11, }, // Pacific/Pago_Pago
- { 688, 7155, 222386, 5, }, // Pacific/Palau
- { 688, 7194, 222391, 14, }, // Pacific/Pitcairn
- { 688, 3096, 222405, 12, }, // Pacific/Pohnpei
- { 688, 4807, 222417, 13, }, // Pacific/Port_Moresby
- { 688, 6076, 222430, 15, }, // Pacific/Rarotonga
- { 688, 6031, 222445, 12, }, // Pacific/Saipan
- { 688, 7312, 222457, 11, }, // Pacific/Tahiti
- { 688, 6712, 222468, 13, }, // Pacific/Tarawa
- { 688, 4583, 222481, 15, }, // Pacific/Tongatapu
- { 688, 7392, 222496, 10, }, // Pacific/Wake
- { 688, 7405, 222506, 12, }, // Pacific/Wallis
- { 689, 6788, 222518, 7, }, // Africa/Abidjan Kuvi/Latin/India
- { 689, 6760, 222525, 4, }, // Africa/Accra
- { 689, 5059, 222529, 10, }, // Africa/Addis_Ababa
- { 689, 7420, 222539, 7, }, // Africa/Algiers
- { 689, 14, 222546, 6, }, // Africa/Asmara
- { 689, 44, 222552, 6, }, // Africa/Bamako
- { 689, 5257, 222558, 6, }, // Africa/Bangui
- { 689, 6746, 222564, 6, }, // Africa/Banjul
- { 689, 7435, 222570, 6, }, // Africa/Bissau
- { 689, 4957, 222576, 8, }, // Africa/Blantyre
- { 689, 5287, 222584, 9, }, // Africa/Brazzaville
- { 689, 4922, 222593, 9, }, // Africa/Bujumbura
- { 689, 2320, 222602, 5, }, // Africa/Cairo
- { 689, 4117, 222607, 10, }, // Africa/Casablanca
- { 689, 7449, 222617, 5, }, // Africa/Ceuta
- { 689, 6773, 222622, 7, }, // Africa/Conakry
- { 689, 6840, 222629, 4, }, // Africa/Dakar
- { 689, 5130, 222633, 13, }, // Africa/Dar_es_Salaam
+ { 688, 7155, 222377, 5, }, // Pacific/Palau
+ { 688, 7194, 222382, 14, }, // Pacific/Pitcairn
+ { 688, 3096, 222396, 12, }, // Pacific/Pohnpei
+ { 688, 4807, 222408, 13, }, // Pacific/Port_Moresby
+ { 688, 6076, 222421, 15, }, // Pacific/Rarotonga
+ { 688, 6031, 222436, 12, }, // Pacific/Saipan
+ { 688, 7312, 222448, 11, }, // Pacific/Tahiti
+ { 688, 6712, 222459, 13, }, // Pacific/Tarawa
+ { 688, 4583, 222472, 15, }, // Pacific/Tongatapu
+ { 688, 7392, 222487, 10, }, // Pacific/Wake
+ { 688, 7405, 222497, 12, }, // Pacific/Wallis
+ { 689, 6788, 222509, 7, }, // Africa/Abidjan Kuvi/Latin/India
+ { 689, 6760, 222516, 4, }, // Africa/Accra
+ { 689, 5059, 222520, 10, }, // Africa/Addis_Ababa
+ { 689, 7420, 222530, 7, }, // Africa/Algiers
+ { 689, 14, 222537, 6, }, // Africa/Asmara
+ { 689, 44, 222543, 6, }, // Africa/Bamako
+ { 689, 5257, 222549, 6, }, // Africa/Bangui
+ { 689, 6746, 222555, 6, }, // Africa/Banjul
+ { 689, 7435, 222561, 6, }, // Africa/Bissau
+ { 689, 4957, 222567, 8, }, // Africa/Blantyre
+ { 689, 5287, 222575, 9, }, // Africa/Brazzaville
+ { 689, 4922, 222584, 9, }, // Africa/Bujumbura
+ { 689, 2320, 222593, 5, }, // Africa/Cairo
+ { 689, 4117, 222598, 10, }, // Africa/Casablanca
+ { 689, 7449, 222608, 5, }, // Africa/Ceuta
+ { 689, 6773, 222613, 7, }, // Africa/Conakry
+ { 689, 6840, 222620, 4, }, // Africa/Dakar
+ { 689, 5130, 222624, 13, }, // Africa/Dar_es_Salaam
{ 689, 5043, 26493, 6, }, // Africa/Djibouti
- { 689, 5243, 222646, 5, }, // Africa/Douala
- { 689, 5166, 222651, 9, }, // Africa/El_Aaiun
- { 689, 6853, 222660, 7, }, // Africa/Freetown
- { 689, 4906, 222667, 7, }, // Africa/Gaborone
- { 689, 5015, 222674, 5, }, // Africa/Harare
- { 689, 4479, 222679, 12, }, // Africa/Johannesburg
- { 689, 4499, 222691, 4, }, // Africa/Juba
- { 689, 5151, 222695, 6, }, // Africa/Kampala
- { 689, 4524, 222701, 7, }, // Africa/Khartoum
- { 689, 4973, 222708, 6, }, // Africa/Kigali
- { 689, 5306, 222714, 7, }, // Africa/Kinshasa
- { 689, 4744, 222721, 5, }, // Africa/Lagos
- { 689, 5336, 222726, 9, }, // Africa/Libreville
+ { 689, 5243, 222637, 5, }, // Africa/Douala
+ { 689, 5166, 222642, 9, }, // Africa/El_Aaiun
+ { 689, 6853, 222651, 7, }, // Africa/Freetown
+ { 689, 4906, 222658, 7, }, // Africa/Gaborone
+ { 689, 5015, 222665, 5, }, // Africa/Harare
+ { 689, 4479, 222670, 12, }, // Africa/Johannesburg
+ { 689, 4499, 222682, 4, }, // Africa/Juba
+ { 689, 5151, 222686, 6, }, // Africa/Kampala
+ { 689, 4524, 222692, 7, }, // Africa/Khartoum
+ { 689, 4973, 222699, 6, }, // Africa/Kigali
+ { 689, 5306, 222705, 7, }, // Africa/Kinshasa
+ { 689, 4744, 222712, 5, }, // Africa/Lagos
+ { 689, 5336, 222717, 9, }, // Africa/Libreville
{ 689, 6869, 4087, 3, }, // Africa/Lome
- { 689, 5211, 222735, 6, }, // Africa/Luanda
- { 689, 4939, 222741, 9, }, // Africa/Lubumbashi
- { 689, 5001, 222750, 6, }, // Africa/Lusaka
- { 689, 5322, 222756, 6, }, // Africa/Malabo
- { 689, 4987, 222762, 6, }, // Africa/Maputo
- { 689, 5197, 222768, 6, }, // Africa/Maseru
- { 689, 5182, 222774, 7, }, // Africa/Mbabane
- { 689, 5113, 222781, 8, }, // Africa/Mogadishu
- { 689, 7034, 222789, 8, }, // Africa/Monrovia
- { 689, 3853, 222797, 7, }, // Africa/Nairobi
- { 689, 5271, 222804, 7, }, // Africa/Ndjamena
- { 689, 5354, 222811, 6, }, // Africa/Niamey
- { 689, 6803, 222817, 6, }, // Africa/Nouakchott
- { 689, 6727, 222823, 7, }, // Africa/Ouagadougou
- { 689, 5225, 222830, 10, }, // Africa/Porto-Novo
- { 689, 4435, 222840, 7, }, // Africa/Sao_Tome
- { 689, 2866, 222847, 7, }, // Africa/Tripoli
- { 689, 6554, 222854, 5, }, // Africa/Tunis
- { 689, 4152, 222859, 7, }, // Africa/Windhoek
- { 689, 132, 222866, 4, }, // America/Adak
- { 689, 3346, 222870, 7, }, // America/Anchorage
- { 689, 5607, 222877, 8, }, // America/Anguilla
- { 689, 5624, 222885, 7, }, // America/Antigua
- { 689, 4554, 222892, 9, }, // America/Araguaina
- { 689, 166, 222901, 13, }, // America/Argentina/Buenos_Aires
- { 689, 91, 222914, 9, }, // America/Argentina/Catamarca
- { 689, 270, 222923, 7, }, // America/Argentina/Cordoba
- { 689, 441, 222930, 5, }, // America/Argentina/Jujuy
- { 689, 7462, 222935, 8, }, // America/Argentina/La_Rioja
- { 689, 565, 222943, 7, }, // America/Argentina/Mendoza
- { 689, 7489, 222950, 13, }, // America/Argentina/Rio_Gallegos
- { 689, 7520, 222963, 5, }, // America/Argentina/Salta
- { 689, 7544, 222968, 8, }, // America/Argentina/San_Juan
- { 689, 5580, 222976, 8, }, // America/Argentina/San_Luis
- { 689, 7571, 222984, 6, }, // America/Argentina/Tucuman
- { 689, 7597, 222990, 7, }, // America/Argentina/Ushuaia
- { 689, 5640, 222997, 5, }, // America/Aruba
- { 689, 4252, 223002, 8, }, // America/Asuncion
- { 689, 237, 223010, 8, }, // America/Atikokan
- { 689, 3679, 223018, 5, }, // America/Bahia
- { 689, 7623, 223023, 13, }, // America/Bahia_Banderas
- { 689, 5654, 223036, 8, }, // America/Barbados
- { 689, 7646, 223044, 5, }, // America/Belem
- { 689, 5407, 223049, 5, }, // America/Belize
- { 689, 7660, 223054, 12, }, // America/Blanc-Sablon
- { 689, 7681, 223066, 9, }, // America/Boa_Vista
- { 689, 4361, 223075, 6, }, // America/Bogota
- { 689, 7699, 223081, 5, }, // America/Boise
- { 689, 7713, 223086, 10, }, // America/Cambridge_Bay
- { 689, 7735, 223096, 12, }, // America/Campo_Grande
- { 689, 3868, 223108, 6, }, // America/Cancun
- { 689, 4694, 223114, 7, }, // America/Caracas
- { 689, 4345, 223121, 5, }, // America/Cayenne
- { 689, 5496, 223126, 6, }, // America/Cayman
- { 689, 2260, 223132, 6, }, // America/Chicago
- { 689, 7756, 223138, 9, }, // America/Chihuahua
+ { 689, 5211, 222726, 6, }, // Africa/Luanda
+ { 689, 4939, 222732, 9, }, // Africa/Lubumbashi
+ { 689, 5001, 222741, 6, }, // Africa/Lusaka
+ { 689, 5322, 222747, 6, }, // Africa/Malabo
+ { 689, 4987, 222753, 6, }, // Africa/Maputo
+ { 689, 5197, 222759, 6, }, // Africa/Maseru
+ { 689, 5182, 222765, 7, }, // Africa/Mbabane
+ { 689, 5113, 222772, 8, }, // Africa/Mogadishu
+ { 689, 7034, 222780, 8, }, // Africa/Monrovia
+ { 689, 3853, 222788, 7, }, // Africa/Nairobi
+ { 689, 5271, 222795, 7, }, // Africa/Ndjamena
+ { 689, 5354, 222802, 6, }, // Africa/Niamey
+ { 689, 6803, 222808, 6, }, // Africa/Nouakchott
+ { 689, 6727, 222814, 7, }, // Africa/Ouagadougou
+ { 689, 5225, 222821, 10, }, // Africa/Porto-Novo
+ { 689, 4435, 222831, 7, }, // Africa/Sao_Tome
+ { 689, 2866, 222838, 7, }, // Africa/Tripoli
+ { 689, 6554, 222845, 5, }, // Africa/Tunis
+ { 689, 4152, 222850, 7, }, // Africa/Windhoek
+ { 689, 132, 222857, 4, }, // America/Adak
+ { 689, 3346, 222861, 7, }, // America/Anchorage
+ { 689, 5607, 222868, 8, }, // America/Anguilla
+ { 689, 5624, 222876, 7, }, // America/Antigua
+ { 689, 4554, 222883, 9, }, // America/Araguaina
+ { 689, 166, 222892, 13, }, // America/Argentina/Buenos_Aires
+ { 689, 91, 222905, 9, }, // America/Argentina/Catamarca
+ { 689, 270, 222914, 7, }, // America/Argentina/Cordoba
+ { 689, 441, 222921, 5, }, // America/Argentina/Jujuy
+ { 689, 7462, 222926, 8, }, // America/Argentina/La_Rioja
+ { 689, 565, 222934, 7, }, // America/Argentina/Mendoza
+ { 689, 7489, 222941, 13, }, // America/Argentina/Rio_Gallegos
+ { 689, 7520, 222954, 5, }, // America/Argentina/Salta
+ { 689, 7544, 222959, 8, }, // America/Argentina/San_Juan
+ { 689, 5580, 222967, 8, }, // America/Argentina/San_Luis
+ { 689, 7571, 222975, 6, }, // America/Argentina/Tucuman
+ { 689, 7597, 222981, 7, }, // America/Argentina/Ushuaia
+ { 689, 5640, 222988, 5, }, // America/Aruba
+ { 689, 4252, 222993, 8, }, // America/Asuncion
+ { 689, 237, 223001, 8, }, // America/Atikokan
+ { 689, 3679, 223009, 5, }, // America/Bahia
+ { 689, 7623, 223014, 13, }, // America/Bahia_Banderas
+ { 689, 5654, 223027, 8, }, // America/Barbados
+ { 689, 7646, 223035, 5, }, // America/Belem
+ { 689, 5407, 223040, 5, }, // America/Belize
+ { 689, 7660, 223045, 12, }, // America/Blanc-Sablon
+ { 689, 7681, 223057, 9, }, // America/Boa_Vista
+ { 689, 4361, 223066, 6, }, // America/Bogota
+ { 689, 7699, 223072, 5, }, // America/Boise
+ { 689, 7713, 223077, 10, }, // America/Cambridge_Bay
+ { 689, 7735, 223087, 12, }, // America/Campo_Grande
+ { 689, 3868, 223099, 6, }, // America/Cancun
+ { 689, 4694, 223105, 7, }, // America/Caracas
+ { 689, 4345, 223112, 5, }, // America/Cayenne
+ { 689, 5496, 223117, 6, }, // America/Cayman
+ { 689, 2260, 223123, 6, }, // America/Chicago
+ { 689, 7756, 223129, 9, }, // America/Chihuahua
{ 689, 7774, 53, 13, }, // America/Ciudad_Juarez
- { 689, 5422, 223147, 10, }, // America/Costa_Rica
- { 689, 7796, 223157, 7, }, // America/Creston
- { 689, 3791, 223164, 6, }, // America/Cuiaba
- { 689, 5723, 223170, 7, }, // America/Curacao
- { 689, 7812, 223177, 11, }, // America/Danmarkshavn
- { 689, 7833, 223188, 5, }, // America/Dawson
- { 689, 7848, 223193, 11, }, // America/Dawson_Creek
- { 689, 805, 223204, 6, }, // America/Denver
- { 689, 3465, 223210, 7, }, // America/Detroit
- { 689, 5739, 223217, 8, }, // America/Dominica
- { 689, 893, 223225, 8, }, // America/Edmonton
- { 689, 7869, 223233, 8, }, // America/Eirunepe
- { 689, 5441, 223241, 11, }, // America/El_Salvador
- { 689, 7886, 223252, 11, }, // America/Fort_Nelson
- { 689, 7906, 223263, 9, }, // America/Fortaleza
- { 689, 7924, 223272, 8, }, // America/Glace_Bay
- { 689, 6881, 223280, 7, }, // America/Goose_Bay
- { 689, 4612, 223287, 10, }, // America/Grand_Turk
- { 689, 5770, 223297, 7, }, // America/Grenada
- { 689, 5786, 223304, 10, }, // America/Guadeloupe
- { 689, 3760, 223314, 9, }, // America/Guatemala
- { 689, 4841, 223323, 8, }, // America/Guayaquil
- { 689, 6932, 223331, 6, }, // America/Guyana
- { 689, 1939, 223337, 8, }, // America/Halifax
- { 689, 2281, 223345, 6, }, // America/Havana
+ { 689, 5422, 223138, 10, }, // America/Costa_Rica
+ { 689, 7796, 223148, 7, }, // America/Creston
+ { 689, 3791, 223155, 6, }, // America/Cuiaba
+ { 689, 5723, 223161, 7, }, // America/Curacao
+ { 689, 7812, 223168, 11, }, // America/Danmarkshavn
+ { 689, 7833, 223179, 5, }, // America/Dawson
+ { 689, 7848, 223184, 11, }, // America/Dawson_Creek
+ { 689, 805, 223195, 6, }, // America/Denver
+ { 689, 3465, 223201, 7, }, // America/Detroit
+ { 689, 5739, 223208, 8, }, // America/Dominica
+ { 689, 893, 223216, 8, }, // America/Edmonton
+ { 689, 7869, 223224, 8, }, // America/Eirunepe
+ { 689, 5441, 223232, 11, }, // America/El_Salvador
+ { 689, 7886, 223243, 11, }, // America/Fort_Nelson
+ { 689, 7906, 223254, 9, }, // America/Fortaleza
+ { 689, 7924, 223263, 8, }, // America/Glace_Bay
+ { 689, 6881, 223271, 7, }, // America/Goose_Bay
+ { 689, 4612, 223278, 10, }, // America/Grand_Turk
+ { 689, 5770, 223288, 7, }, // America/Grenada
+ { 689, 5786, 223295, 10, }, // America/Guadeloupe
+ { 689, 3760, 223305, 9, }, // America/Guatemala
+ { 689, 4841, 223314, 8, }, // America/Guayaquil
+ { 689, 6932, 223322, 6, }, // America/Guyana
+ { 689, 1939, 223328, 8, }, // America/Halifax
+ { 689, 2281, 223336, 6, }, // America/Havana
{ 689, 7942, 6920, 8, }, // America/Hermosillo
- { 689, 348, 223351, 12, }, // America/Indiana/Indianapolis
- { 689, 481, 223363, 14, }, // America/Indiana/Knox
- { 689, 7961, 223377, 17, }, // America/Indiana/Marengo
- { 689, 7985, 223394, 20, }, // America/Indiana/Petersburg
- { 689, 8012, 223414, 19, }, // America/Indiana/Tell_City
- { 689, 8038, 223433, 14, }, // America/Indiana/Vevay
- { 689, 8060, 223447, 17, }, // America/Indiana/Vincennes
- { 689, 8086, 223464, 17, }, // America/Indiana/Winamac
- { 689, 8110, 223481, 6, }, // America/Inuvik
- { 689, 660, 223487, 7, }, // America/Iqaluit
- { 689, 2799, 223494, 7, }, // America/Jamaica
- { 689, 5380, 223501, 5, }, // America/Juneau
- { 689, 521, 223506, 9, }, // America/Kentucky/Louisville
- { 689, 8125, 223515, 19, }, // America/Kentucky/Monticello
- { 689, 5704, 223534, 10, }, // America/Kralendijk
- { 689, 4376, 223544, 6, }, // America/La_Paz
+ { 689, 348, 223342, 12, }, // America/Indiana/Indianapolis
+ { 689, 481, 223354, 14, }, // America/Indiana/Knox
+ { 689, 7961, 223368, 17, }, // America/Indiana/Marengo
+ { 689, 7985, 223385, 20, }, // America/Indiana/Petersburg
+ { 689, 8012, 223405, 19, }, // America/Indiana/Tell_City
+ { 689, 8038, 223424, 14, }, // America/Indiana/Vevay
+ { 689, 8060, 223438, 17, }, // America/Indiana/Vincennes
+ { 689, 8086, 223455, 17, }, // America/Indiana/Winamac
+ { 689, 8110, 223472, 6, }, // America/Inuvik
+ { 689, 660, 223478, 7, }, // America/Iqaluit
+ { 689, 2799, 223485, 7, }, // America/Jamaica
+ { 689, 5380, 223492, 5, }, // America/Juneau
+ { 689, 521, 223497, 9, }, // America/Kentucky/Louisville
+ { 689, 8125, 223506, 19, }, // America/Kentucky/Monticello
+ { 689, 5704, 223525, 10, }, // America/Kralendijk
+ { 689, 4376, 223535, 6, }, // America/La_Paz
{ 689, 7169, 157373, 4, }, // America/Lima
- { 689, 3239, 223550, 11, }, // America/Los_Angeles
- { 689, 5932, 223561, 21, }, // America/Lower_Princes
- { 689, 8153, 223582, 5, }, // America/Maceio
- { 689, 8168, 223587, 7, }, // America/Managua
- { 689, 1908, 223594, 6, }, // America/Manaus
- { 689, 5897, 223600, 7, }, // America/Marigot
- { 689, 5805, 223607, 8, }, // America/Martinique
- { 689, 8184, 223615, 9, }, // America/Matamoros
- { 689, 2917, 223624, 8, }, // America/Mazatlan
- { 689, 8202, 223632, 8, }, // America/Menominee
- { 689, 8220, 223640, 6, }, // America/Merida
- { 689, 8235, 223646, 10, }, // America/Metlakatla
- { 689, 2949, 223656, 12, }, // America/Mexico_City
- { 689, 4391, 223668, 7, }, // America/Miquelon
- { 689, 8254, 223675, 7, }, // America/Moncton
- { 689, 8270, 223682, 8, }, // America/Monterrey
- { 689, 4098, 223690, 10, }, // America/Montevideo
- { 689, 5824, 223700, 10, }, // America/Montserrat
- { 689, 5481, 223710, 5, }, // America/Nassau
- { 689, 2379, 223715, 9, }, // America/New_York
+ { 689, 3239, 223541, 11, }, // America/Los_Angeles
+ { 689, 5932, 223552, 21, }, // America/Lower_Princes
+ { 689, 8153, 223573, 5, }, // America/Maceio
+ { 689, 8168, 223578, 7, }, // America/Managua
+ { 689, 1908, 223585, 6, }, // America/Manaus
+ { 689, 5897, 223591, 7, }, // America/Marigot
+ { 689, 5805, 223598, 8, }, // America/Martinique
+ { 689, 8184, 223606, 9, }, // America/Matamoros
+ { 689, 2917, 223615, 8, }, // America/Mazatlan
+ { 689, 8202, 223623, 8, }, // America/Menominee
+ { 689, 8220, 223631, 6, }, // America/Merida
+ { 689, 8235, 223637, 10, }, // America/Metlakatla
+ { 689, 2949, 223647, 12, }, // America/Mexico_City
+ { 689, 4391, 223659, 7, }, // America/Miquelon
+ { 689, 8254, 223666, 7, }, // America/Moncton
+ { 689, 8270, 223673, 8, }, // America/Monterrey
+ { 689, 4098, 223681, 10, }, // America/Montevideo
+ { 689, 5824, 223691, 10, }, // America/Montserrat
+ { 689, 5481, 223701, 5, }, // America/Nassau
+ { 689, 2379, 223706, 9, }, // America/New_York
{ 689, 8288, 7120, 3, }, // America/Nome
- { 689, 1850, 223724, 7, }, // America/Noronha
- { 689, 8301, 223731, 20, }, // America/North_Dakota/Beulah
- { 689, 8329, 223751, 19, }, // America/North_Dakota/Center
- { 689, 8357, 223770, 23, }, // America/North_Dakota/New_Salem
- { 689, 393, 223793, 3, }, // America/Nuuk
- { 689, 8388, 223796, 7, }, // America/Ojinaga
- { 689, 2356, 223803, 6, }, // America/Panama
- { 689, 6173, 223809, 10, }, // America/Paramaribo
- { 689, 2973, 223819, 6, }, // America/Phoenix
- { 689, 3945, 223825, 14, }, // America/Port-au-Prince
- { 689, 5954, 223839, 13, }, // America/Port_of_Spain
- { 689, 8404, 223852, 11, }, // America/Porto_Velho
- { 689, 5843, 223863, 11, }, // America/Puerto_Rico
- { 689, 4030, 223874, 12, }, // America/Punta_Arenas
- { 689, 8424, 223886, 13, }, // America/Rankin_Inlet
- { 689, 8445, 223899, 6, }, // America/Recife
- { 689, 1995, 223905, 6, }, // America/Regina
- { 689, 8460, 223911, 8, }, // America/Resolute
- { 689, 695, 223919, 10, }, // America/Rio_Branco
- { 689, 8477, 223929, 6, }, // America/Santarem
- { 689, 2201, 223935, 8, }, // America/Santiago
- { 689, 6111, 223943, 13, }, // America/Santo_Domingo
- { 689, 1878, 223956, 9, }, // America/Sao_Paulo
- { 689, 6899, 223965, 11, }, // America/Scoresbysund
- { 689, 8494, 223976, 5, }, // America/Sitka
- { 689, 8508, 223981, 14, }, // America/St_Barthelemy
- { 689, 2061, 223995, 9, }, // America/St_Johns
- { 689, 5863, 224004, 10, }, // America/St_Kitts
- { 689, 5880, 224014, 10, }, // America/St_Lucia
- { 689, 855, 224024, 10, }, // America/St_Thomas
- { 689, 5913, 224034, 12, }, // America/St_Vincent
- { 689, 8530, 224046, 13, }, // America/Swift_Current
- { 689, 5461, 224059, 4, }, // America/Tegucigalpa
- { 689, 5756, 224063, 4, }, // America/Thule
- { 689, 313, 224067, 7, }, // America/Tijuana
- { 689, 608, 224074, 7, }, // America/Toronto
- { 689, 5688, 224081, 7, }, // America/Tortola
- { 689, 2093, 224088, 8, }, // America/Vancouver
- { 689, 2144, 224096, 9, }, // America/Whitehorse
- { 689, 734, 224105, 8, }, // America/Winnipeg
- { 689, 8552, 224113, 7, }, // America/Yakutat
- { 689, 6001, 224120, 5, }, // Antarctica/Casey
- { 689, 6094, 224125, 5, }, // Antarctica/Davis
- { 689, 6133, 224130, 17, }, // Antarctica/DumontDUrville
- { 689, 8568, 224147, 7, }, // Antarctica/Macquarie
- { 689, 7066, 224154, 6, }, // Antarctica/Mawson
- { 689, 7113, 224160, 9, }, // Antarctica/McMurdo
- { 689, 8589, 224169, 6, }, // Antarctica/Palmer
- { 689, 7226, 224175, 6, }, // Antarctica/Rothera
- { 689, 7295, 224181, 5, }, // Antarctica/Syowa
- { 689, 8607, 224186, 5, }, // Antarctica/Troll
- { 689, 7374, 224191, 6, }, // Antarctica/Vostok
- { 689, 1429, 224197, 10, }, // Arctic/Longyearbyen
- { 689, 5570, 224207, 4, }, // Asia/Aden
- { 689, 5395, 224211, 6, }, // Asia/Almaty
- { 689, 3968, 224217, 5, }, // Asia/Amman
- { 689, 5511, 224222, 6, }, // Asia/Anadyr
- { 689, 5523, 224228, 5, }, // Asia/Aqtau
- { 689, 5368, 224233, 7, }, // Asia/Aqtobe
- { 689, 964, 224240, 7, }, // Asia/Ashgabat
- { 689, 8624, 224247, 6, }, // Asia/Atyrau
- { 689, 3607, 224253, 6, }, // Asia/Baghdad
- { 689, 5534, 224259, 7, }, // Asia/Bahrain
- { 689, 3653, 224266, 4, }, // Asia/Baku
- { 689, 4466, 224270, 7, }, // Asia/Bangkok
- { 689, 3571, 224277, 7, }, // Asia/Barnaul
- { 689, 4086, 224284, 6, }, // Asia/Beirut
- { 689, 3778, 224290, 6, }, // Asia/Bishkek
- { 689, 5989, 224296, 6, }, // Asia/Brunei
- { 689, 4601, 224302, 4, }, // Asia/Chita
- { 689, 4511, 224306, 7, }, // Asia/Colombo
- { 689, 4540, 224313, 8, }, // Asia/Damascus
- { 689, 1093, 222867, 4, }, // Asia/Dhaka
- { 689, 6192, 224321, 4, }, // Asia/Dili
- { 689, 3596, 224325, 5, }, // Asia/Dubai
- { 689, 6159, 224330, 7, }, // Asia/Dushanbe
- { 689, 8636, 224337, 9, }, // Asia/Famagusta
- { 689, 8651, 224346, 4, }, // Asia/Gaza
- { 689, 4795, 224350, 6, }, // Asia/Hebron
- { 689, 1259, 224356, 15, }, // Asia/Ho_Chi_Minh
- { 689, 2704, 224371, 9, }, // Asia/Hong_Kong
+ { 689, 1850, 223715, 7, }, // America/Noronha
+ { 689, 8301, 223722, 20, }, // America/North_Dakota/Beulah
+ { 689, 8329, 223742, 19, }, // America/North_Dakota/Center
+ { 689, 8357, 223761, 23, }, // America/North_Dakota/New_Salem
+ { 689, 393, 223784, 3, }, // America/Nuuk
+ { 689, 8388, 223787, 7, }, // America/Ojinaga
+ { 689, 2356, 223794, 6, }, // America/Panama
+ { 689, 6173, 223800, 10, }, // America/Paramaribo
+ { 689, 2973, 223810, 6, }, // America/Phoenix
+ { 689, 3945, 223816, 14, }, // America/Port-au-Prince
+ { 689, 5954, 223830, 13, }, // America/Port_of_Spain
+ { 689, 8404, 223843, 11, }, // America/Porto_Velho
+ { 689, 5843, 223854, 11, }, // America/Puerto_Rico
+ { 689, 4030, 223865, 12, }, // America/Punta_Arenas
+ { 689, 8424, 223877, 13, }, // America/Rankin_Inlet
+ { 689, 8445, 223890, 6, }, // America/Recife
+ { 689, 1995, 223896, 6, }, // America/Regina
+ { 689, 8460, 223902, 8, }, // America/Resolute
+ { 689, 695, 223910, 10, }, // America/Rio_Branco
+ { 689, 8477, 223920, 6, }, // America/Santarem
+ { 689, 2201, 223926, 8, }, // America/Santiago
+ { 689, 6111, 223934, 13, }, // America/Santo_Domingo
+ { 689, 1878, 223947, 9, }, // America/Sao_Paulo
+ { 689, 6899, 223956, 11, }, // America/Scoresbysund
+ { 689, 8494, 223967, 5, }, // America/Sitka
+ { 689, 8508, 223972, 14, }, // America/St_Barthelemy
+ { 689, 2061, 223986, 9, }, // America/St_Johns
+ { 689, 5863, 223995, 10, }, // America/St_Kitts
+ { 689, 5880, 224005, 10, }, // America/St_Lucia
+ { 689, 855, 224015, 10, }, // America/St_Thomas
+ { 689, 5913, 224025, 12, }, // America/St_Vincent
+ { 689, 8530, 224037, 13, }, // America/Swift_Current
+ { 689, 5461, 224050, 4, }, // America/Tegucigalpa
+ { 689, 5756, 224054, 4, }, // America/Thule
+ { 689, 313, 224058, 7, }, // America/Tijuana
+ { 689, 608, 224065, 7, }, // America/Toronto
+ { 689, 5688, 224072, 7, }, // America/Tortola
+ { 689, 2093, 224079, 8, }, // America/Vancouver
+ { 689, 2144, 224087, 9, }, // America/Whitehorse
+ { 689, 734, 224096, 8, }, // America/Winnipeg
+ { 689, 8552, 224104, 7, }, // America/Yakutat
+ { 689, 6001, 224111, 5, }, // Antarctica/Casey
+ { 689, 6094, 224116, 5, }, // Antarctica/Davis
+ { 689, 6133, 224121, 17, }, // Antarctica/DumontDUrville
+ { 689, 8568, 224138, 7, }, // Antarctica/Macquarie
+ { 689, 7066, 224145, 6, }, // Antarctica/Mawson
+ { 689, 7113, 224151, 9, }, // Antarctica/McMurdo
+ { 689, 8589, 224160, 6, }, // Antarctica/Palmer
+ { 689, 7226, 224166, 6, }, // Antarctica/Rothera
+ { 689, 7295, 224172, 5, }, // Antarctica/Syowa
+ { 689, 8607, 224177, 5, }, // Antarctica/Troll
+ { 689, 7374, 224182, 6, }, // Antarctica/Vostok
+ { 689, 1429, 224188, 10, }, // Arctic/Longyearbyen
+ { 689, 5570, 224198, 4, }, // Asia/Aden
+ { 689, 5395, 224202, 6, }, // Asia/Almaty
+ { 689, 3968, 224208, 5, }, // Asia/Amman
+ { 689, 5511, 224213, 6, }, // Asia/Anadyr
+ { 689, 5523, 224219, 5, }, // Asia/Aqtau
+ { 689, 5368, 224224, 7, }, // Asia/Aqtobe
+ { 689, 964, 224231, 7, }, // Asia/Ashgabat
+ { 689, 8624, 224238, 6, }, // Asia/Atyrau
+ { 689, 3607, 224244, 6, }, // Asia/Baghdad
+ { 689, 5534, 224250, 7, }, // Asia/Bahrain
+ { 689, 3653, 224257, 4, }, // Asia/Baku
+ { 689, 4466, 224261, 7, }, // Asia/Bangkok
+ { 689, 3571, 224268, 7, }, // Asia/Barnaul
+ { 689, 4086, 224275, 6, }, // Asia/Beirut
+ { 689, 3778, 224281, 6, }, // Asia/Bishkek
+ { 689, 5989, 224287, 6, }, // Asia/Brunei
+ { 689, 4601, 224293, 4, }, // Asia/Chita
+ { 689, 4511, 224297, 7, }, // Asia/Colombo
+ { 689, 4540, 224304, 8, }, // Asia/Damascus
+ { 689, 1093, 222858, 4, }, // Asia/Dhaka
+ { 689, 6192, 224312, 4, }, // Asia/Dili
+ { 689, 3596, 224316, 5, }, // Asia/Dubai
+ { 689, 6159, 224321, 7, }, // Asia/Dushanbe
+ { 689, 8636, 224328, 9, }, // Asia/Famagusta
+ { 689, 8651, 224337, 4, }, // Asia/Gaza
+ { 689, 4795, 224341, 6, }, // Asia/Hebron
+ { 689, 1259, 224347, 15, }, // Asia/Ho_Chi_Minh
+ { 689, 2704, 224362, 9, }, // Asia/Hong_Kong
{ 689, 4771, 26836, 4, }, // Asia/Hovd
- { 689, 4184, 224380, 7, }, // Asia/Irkutsk
+ { 689, 4184, 224371, 7, }, // Asia/Irkutsk
{ 689, 7006, 4248, 7, }, // Asia/Jakarta
- { 689, 6992, 224387, 8, }, // Asia/Jayapura
- { 689, 1290, 224395, 9, }, // Asia/Jerusalem
- { 689, 3560, 224404, 5, }, // Asia/Kabul
- { 689, 4316, 224409, 8, }, // Asia/Kamchatka
- { 689, 4239, 224417, 6, }, // Asia/Karachi
- { 689, 1185, 224423, 8, }, // Asia/Kathmandu
- { 689, 8661, 224431, 7, }, // Asia/Khandyga
- { 689, 992, 224438, 7, }, // Asia/Kolkata
- { 689, 4197, 224445, 11, }, // Asia/Krasnoyarsk
- { 689, 4859, 224456, 12, }, // Asia/Kuala_Lumpur
- { 689, 5976, 224468, 6, }, // Asia/Kuching
- { 689, 5547, 224474, 6, }, // Asia/Kuwait
- { 689, 1211, 224480, 4, }, // Asia/Macau
- { 689, 4017, 224484, 7, }, // Asia/Magadan
- { 689, 1349, 224491, 7, }, // Asia/Makassar
- { 689, 7182, 224498, 6, }, // Asia/Manila
- { 689, 6920, 224504, 6, }, // Asia/Muscat
- { 689, 2554, 224510, 8, }, // Asia/Nicosia
- { 689, 8675, 224518, 12, }, // Asia/Novokuznetsk
- { 689, 4135, 224530, 11, }, // Asia/Novosibirsk
+ { 689, 6992, 224378, 8, }, // Asia/Jayapura
+ { 689, 1290, 224386, 9, }, // Asia/Jerusalem
+ { 689, 3560, 224395, 5, }, // Asia/Kabul
+ { 689, 4316, 224400, 8, }, // Asia/Kamchatka
+ { 689, 4239, 224408, 6, }, // Asia/Karachi
+ { 689, 1185, 224414, 8, }, // Asia/Kathmandu
+ { 689, 8661, 224422, 7, }, // Asia/Khandyga
+ { 689, 992, 224429, 7, }, // Asia/Kolkata
+ { 689, 4197, 224436, 11, }, // Asia/Krasnoyarsk
+ { 689, 4859, 224447, 12, }, // Asia/Kuala_Lumpur
+ { 689, 5976, 224459, 6, }, // Asia/Kuching
+ { 689, 5547, 224465, 6, }, // Asia/Kuwait
+ { 689, 1211, 224471, 4, }, // Asia/Macau
+ { 689, 4017, 224475, 7, }, // Asia/Magadan
+ { 689, 1349, 224482, 7, }, // Asia/Makassar
+ { 689, 7182, 224489, 6, }, // Asia/Manila
+ { 689, 6920, 224495, 6, }, // Asia/Muscat
+ { 689, 2554, 224501, 8, }, // Asia/Nicosia
+ { 689, 8675, 224509, 12, }, // Asia/Novokuznetsk
+ { 689, 4135, 224521, 11, }, // Asia/Novosibirsk
{ 689, 4229, 123801, 4, }, // Asia/Omsk
{ 689, 7145, 91266, 4, }, // Asia/Oral
- { 689, 6961, 224541, 9, }, // Asia/Phnom_Penh
- { 689, 8693, 224550, 9, }, // Asia/Pontianak
- { 689, 4214, 224559, 9, }, // Asia/Pyongyang
+ { 689, 6961, 224532, 9, }, // Asia/Phnom_Penh
+ { 689, 8693, 224541, 9, }, // Asia/Pontianak
+ { 689, 4214, 224550, 9, }, // Asia/Pyongyang
{ 689, 5559, 210375, 5, }, // Asia/Qatar
- { 689, 8708, 224568, 7, }, // Asia/Qostanay
- { 689, 4269, 224575, 8, }, // Asia/Qyzylorda
- { 689, 3584, 224583, 5, }, // Asia/Riyadh
- { 689, 4408, 224588, 7, }, // Asia/Sakhalin
- { 689, 7245, 224595, 9, }, // Asia/Samarkand
- { 689, 3279, 224604, 4, }, // Asia/Seoul
- { 689, 1053, 224608, 6, }, // Asia/Shanghai
- { 689, 3300, 224614, 8, }, // Asia/Singapore
- { 689, 4297, 224622, 13, }, // Asia/Srednekolymsk
- { 689, 3263, 224635, 6, }, // Asia/Taipei
- { 689, 4781, 224641, 7, }, // Asia/Tashkent
- { 689, 3915, 224648, 7, }, // Asia/Tbilisi
- { 689, 2772, 224655, 6, }, // Asia/Tehran
- { 689, 1317, 224661, 6, }, // Asia/Thimphu
- { 689, 2821, 224667, 5, }, // Asia/Tokyo
- { 689, 4572, 224672, 5, }, // Asia/Tomsk
- { 689, 1021, 224677, 9, }, // Asia/Ulaanbaatar
- { 689, 1159, 224686, 6, }, // Asia/Urumqi
- { 689, 8722, 224692, 9, }, // Asia/Ust-Nera
- { 689, 6977, 224701, 9, }, // Asia/Vientiane
- { 689, 4710, 224710, 11, }, // Asia/Vladivostok
- { 689, 4828, 224721, 7, }, // Asia/Yakutsk
- { 689, 1235, 224728, 6, }, // Asia/Yangon
- { 689, 3883, 224734, 13, }, // Asia/Yekaterinburg
- { 689, 3747, 224747, 7, }, // Asia/Yerevan
- { 689, 3663, 224754, 6, }, // Atlantic/Azores
- { 689, 5671, 224760, 7, }, // Atlantic/Bermuda
- { 689, 6628, 224767, 6, }, // Atlantic/Canary
- { 689, 3727, 224773, 9, }, // Atlantic/Cape_Verde
- { 689, 1395, 224782, 4, }, // Atlantic/Faroe
- { 689, 8736, 224786, 7, }, // Atlantic/Madeira
- { 689, 2748, 224793, 9, }, // Atlantic/Reykjavik
- { 689, 7272, 224802, 11, }, // Atlantic/South_Georgia
- { 689, 6821, 224813, 11, }, // Atlantic/St_Helena
- { 689, 6644, 224824, 6, }, // Atlantic/Stanley
- { 689, 1670, 224830, 8, }, // Australia/Adelaide
- { 689, 1635, 224838, 8, }, // Australia/Brisbane
- { 689, 1799, 224846, 11, }, // Australia/Broken_Hill
- { 689, 1583, 224857, 6, }, // Australia/Darwin
- { 689, 3637, 224863, 5, }, // Australia/Eucla
- { 689, 1516, 224868, 6, }, // Australia/Hobart
- { 689, 8753, 224874, 9, }, // Australia/Lindeman
- { 689, 1547, 224883, 9, }, // Australia/Lord_Howe
- { 689, 1727, 224892, 8, }, // Australia/Melbourne
- { 689, 1762, 224900, 4, }, // Australia/Perth
- { 689, 1463, 224904, 5, }, // Australia/Sydney
- { 689, 6441, 224909, 9, }, // Europe/Amsterdam
- { 689, 6216, 224918, 7, }, // Europe/Andorra
- { 689, 3620, 224925, 9, }, // Europe/Astrakhan
- { 689, 2300, 224934, 5, }, // Europe/Athens
- { 689, 6336, 224939, 8, }, // Europe/Belgrade
- { 689, 4757, 224947, 6, }, // Europe/Berlin
- { 689, 6488, 224953, 10, }, // Europe/Bratislava
- { 689, 2167, 224963, 8, }, // Europe/Brussels
- { 689, 3928, 224971, 8, }, // Europe/Bucharest
- { 689, 3806, 224979, 8, }, // Europe/Budapest
- { 689, 8772, 224987, 8, }, // Europe/Busingen
- { 689, 2583, 224995, 7, }, // Europe/Chisinau
- { 689, 6289, 225002, 10, }, // Europe/Copenhagen
- { 689, 2338, 225012, 5, }, // Europe/Dublin
- { 689, 6307, 225017, 9, }, // Europe/Gibraltar
- { 689, 8788, 225026, 6, }, // Europe/Guernsey
- { 689, 6612, 225032, 8, }, // Europe/Helsinki
- { 689, 8804, 225040, 11, }, // Europe/Isle_of_Man
- { 689, 1130, 225051, 8, }, // Europe/Istanbul
- { 689, 8823, 225059, 5, }, // Europe/Jersey
- { 689, 3979, 225064, 11, }, // Europe/Kaliningrad
- { 689, 8929, 225075, 5, }, // Europe/Kirov
- { 689, 2527, 225080, 4, }, // Europe/Kyiv
- { 689, 3213, 225084, 6, }, // Europe/Lisbon
- { 689, 6506, 225090, 9, }, // Europe/Ljubljana
- { 689, 2501, 225099, 4, }, // Europe/London
- { 689, 6365, 225103, 8, }, // Europe/Luxembourg
- { 689, 4892, 225111, 6, }, // Europe/Madrid
- { 689, 6397, 225117, 5, }, // Europe/Malta
- { 689, 6582, 225122, 8, }, // Europe/Mariehamn
- { 689, 3693, 225130, 5, }, // Europe/Minsk
- { 689, 6410, 225135, 6, }, // Europe/Monaco
- { 689, 3537, 225141, 5, }, // Europe/Moscow
- { 689, 6458, 225146, 4, }, // Europe/Oslo
- { 689, 4284, 225150, 5, }, // Europe/Paris
- { 689, 6424, 225155, 9, }, // Europe/Podgorica
- { 689, 6275, 225164, 4, }, // Europe/Prague
- { 689, 8837, 225168, 4, }, // Europe/Riga
+ { 689, 8708, 224559, 7, }, // Asia/Qostanay
+ { 689, 4269, 224566, 8, }, // Asia/Qyzylorda
+ { 689, 3584, 224574, 5, }, // Asia/Riyadh
+ { 689, 4408, 224579, 7, }, // Asia/Sakhalin
+ { 689, 7245, 224586, 9, }, // Asia/Samarkand
+ { 689, 3279, 224595, 4, }, // Asia/Seoul
+ { 689, 1053, 224599, 6, }, // Asia/Shanghai
+ { 689, 3300, 224605, 8, }, // Asia/Singapore
+ { 689, 4297, 224613, 13, }, // Asia/Srednekolymsk
+ { 689, 3263, 224626, 6, }, // Asia/Taipei
+ { 689, 4781, 224632, 7, }, // Asia/Tashkent
+ { 689, 3915, 224639, 7, }, // Asia/Tbilisi
+ { 689, 2772, 224646, 6, }, // Asia/Tehran
+ { 689, 1317, 224652, 6, }, // Asia/Thimphu
+ { 689, 2821, 224658, 5, }, // Asia/Tokyo
+ { 689, 4572, 224663, 5, }, // Asia/Tomsk
+ { 689, 1021, 224668, 9, }, // Asia/Ulaanbaatar
+ { 689, 1159, 224677, 6, }, // Asia/Urumqi
+ { 689, 8722, 224683, 9, }, // Asia/Ust-Nera
+ { 689, 6977, 224692, 9, }, // Asia/Vientiane
+ { 689, 4710, 224701, 11, }, // Asia/Vladivostok
+ { 689, 4828, 224712, 7, }, // Asia/Yakutsk
+ { 689, 1235, 224719, 6, }, // Asia/Yangon
+ { 689, 3883, 224725, 13, }, // Asia/Yekaterinburg
+ { 689, 3747, 224738, 7, }, // Asia/Yerevan
+ { 689, 3663, 224745, 6, }, // Atlantic/Azores
+ { 689, 5671, 224751, 7, }, // Atlantic/Bermuda
+ { 689, 6628, 224758, 6, }, // Atlantic/Canary
+ { 689, 3727, 224764, 9, }, // Atlantic/Cape_Verde
+ { 689, 1395, 224773, 4, }, // Atlantic/Faroe
+ { 689, 8736, 224777, 7, }, // Atlantic/Madeira
+ { 689, 2748, 224784, 9, }, // Atlantic/Reykjavik
+ { 689, 7272, 224793, 11, }, // Atlantic/South_Georgia
+ { 689, 6821, 224804, 11, }, // Atlantic/St_Helena
+ { 689, 6644, 224815, 6, }, // Atlantic/Stanley
+ { 689, 1670, 224821, 8, }, // Australia/Adelaide
+ { 689, 1635, 224829, 8, }, // Australia/Brisbane
+ { 689, 1799, 224837, 11, }, // Australia/Broken_Hill
+ { 689, 1583, 224848, 6, }, // Australia/Darwin
+ { 689, 3637, 224854, 5, }, // Australia/Eucla
+ { 689, 1516, 224859, 6, }, // Australia/Hobart
+ { 689, 8753, 224865, 9, }, // Australia/Lindeman
+ { 689, 1547, 224874, 9, }, // Australia/Lord_Howe
+ { 689, 1727, 224883, 8, }, // Australia/Melbourne
+ { 689, 1762, 224891, 4, }, // Australia/Perth
+ { 689, 1463, 224895, 5, }, // Australia/Sydney
+ { 689, 6441, 224900, 9, }, // Europe/Amsterdam
+ { 689, 6216, 224909, 7, }, // Europe/Andorra
+ { 689, 3620, 224916, 9, }, // Europe/Astrakhan
+ { 689, 2300, 224925, 5, }, // Europe/Athens
+ { 689, 6336, 224930, 8, }, // Europe/Belgrade
+ { 689, 4757, 224938, 6, }, // Europe/Berlin
+ { 689, 6488, 224944, 10, }, // Europe/Bratislava
+ { 689, 2167, 224954, 8, }, // Europe/Brussels
+ { 689, 3928, 224962, 8, }, // Europe/Bucharest
+ { 689, 3806, 224970, 8, }, // Europe/Budapest
+ { 689, 8772, 224978, 8, }, // Europe/Busingen
+ { 689, 2583, 224986, 7, }, // Europe/Chisinau
+ { 689, 6289, 224993, 10, }, // Europe/Copenhagen
+ { 689, 2338, 225003, 5, }, // Europe/Dublin
+ { 689, 6307, 225008, 9, }, // Europe/Gibraltar
+ { 689, 8788, 225017, 6, }, // Europe/Guernsey
+ { 689, 6612, 225023, 8, }, // Europe/Helsinki
+ { 689, 8804, 225031, 11, }, // Europe/Isle_of_Man
+ { 689, 1130, 225042, 8, }, // Europe/Istanbul
+ { 689, 8823, 225050, 5, }, // Europe/Jersey
+ { 689, 3979, 225055, 11, }, // Europe/Kaliningrad
+ { 689, 8929, 225066, 5, }, // Europe/Kirov
+ { 689, 2527, 225071, 4, }, // Europe/Kyiv
+ { 689, 3213, 225075, 6, }, // Europe/Lisbon
+ { 689, 6506, 225081, 9, }, // Europe/Ljubljana
+ { 689, 2501, 225090, 4, }, // Europe/London
+ { 689, 6365, 225094, 8, }, // Europe/Luxembourg
+ { 689, 4892, 225102, 6, }, // Europe/Madrid
+ { 689, 6397, 225108, 5, }, // Europe/Malta
+ { 689, 6582, 225113, 8, }, // Europe/Mariehamn
+ { 689, 3693, 225121, 5, }, // Europe/Minsk
+ { 689, 6410, 225126, 6, }, // Europe/Monaco
+ { 689, 3537, 225132, 5, }, // Europe/Moscow
+ { 689, 6458, 225137, 4, }, // Europe/Oslo
+ { 689, 4284, 225141, 5, }, // Europe/Paris
+ { 689, 6424, 225146, 9, }, // Europe/Podgorica
+ { 689, 6275, 225155, 4, }, // Europe/Prague
+ { 689, 8837, 225159, 4, }, // Europe/Riga
{ 689, 6324, 27088, 3, }, // Europe/Rome
- { 689, 4331, 225172, 6, }, // Europe/Samara
- { 689, 6470, 225178, 10, }, // Europe/San_Marino
- { 689, 6245, 225188, 8, }, // Europe/Sarajevo
- { 689, 4451, 225196, 7, }, // Europe/Saratov
- { 689, 8849, 225203, 10, }, // Europe/Simferopol
- { 689, 6383, 225213, 5, }, // Europe/Skopje
- { 689, 6599, 225218, 6, }, // Europe/Sofia
- { 689, 6523, 225224, 7, }, // Europe/Stockholm
- { 689, 8867, 225231, 5, }, // Europe/Tallinn
- { 689, 6202, 225236, 6, }, // Europe/Tirane
- { 689, 8882, 225242, 9, }, // Europe/Ulyanovsk
- { 689, 6352, 225251, 5, }, // Europe/Vaduz
- { 689, 6567, 225256, 7, }, // Europe/Vatican
- { 689, 6231, 225263, 6, }, // Europe/Vienna
- { 689, 8899, 225269, 7, }, // Europe/Vilnius
- { 689, 4727, 225276, 9, }, // Europe/Volgograd
- { 689, 3190, 225285, 5, }, // Europe/Warsaw
- { 689, 6261, 225290, 11, }, // Europe/Zagreb
- { 689, 6540, 225301, 5, }, // Europe/Zurich
- { 689, 5078, 225306, 9, }, // Indian/Antananarivo
- { 689, 6947, 225315, 6, }, // Indian/Chagos
- { 689, 6046, 225321, 8, }, // Indian/Christmas
- { 689, 6063, 225329, 5, }, // Indian/Cocos
- { 689, 5029, 225334, 6, }, // Indian/Comoro
- { 689, 6661, 225340, 9, }, // Indian/Kerguelen
- { 689, 7260, 225349, 4, }, // Indian/Mahe
- { 689, 7050, 225353, 8, }, // Indian/Maldives
- { 689, 4069, 225361, 9, }, // Indian/Mauritius
- { 689, 5098, 225370, 5, }, // Indian/Mayotte
- { 689, 7211, 225375, 7, }, // Indian/Reunion
- { 689, 4422, 225382, 4, }, // Pacific/Apia
- { 689, 932, 225386, 6, }, // Pacific/Auckland
- { 689, 3706, 225392, 10, }, // Pacific/Bougainville
- { 689, 3015, 225402, 5, }, // Pacific/Chatham
- { 689, 3157, 225407, 3, }, // Pacific/Chuuk
- { 689, 2237, 225410, 5, }, // Pacific/Easter
- { 689, 7360, 225415, 5, }, // Pacific/Efate
- { 689, 7327, 225420, 7, }, // Pacific/Fakaofo
- { 689, 3902, 225427, 4, }, // Pacific/Fiji
- { 689, 7343, 225431, 8, }, // Pacific/Funafuti
- { 689, 6678, 225439, 9, }, // Pacific/Galapagos
- { 689, 6696, 225448, 7, }, // Pacific/Gambier
- { 689, 3822, 225455, 11, }, // Pacific/Guadalcanal
- { 689, 6018, 223591, 4, }, // Pacific/Guam
- { 689, 3049, 225466, 6, }, // Pacific/Kanton
- { 689, 3998, 225472, 10, }, // Pacific/Kiritimati
- { 689, 7019, 225482, 6, }, // Pacific/Kosrae
- { 689, 2842, 225488, 9, }, // Pacific/Kwajalein
- { 689, 4877, 225497, 6, }, // Pacific/Majuro
- { 689, 4051, 225503, 8, }, // Pacific/Marquesas
- { 689, 8914, 225511, 6, }, // Pacific/Midway
- { 689, 7084, 225517, 5, }, // Pacific/Nauru
- { 689, 7132, 225522, 4, }, // Pacific/Niue
- { 689, 4168, 225526, 6, }, // Pacific/Norfolk
- { 689, 7098, 225532, 5, }, // Pacific/Noumea
- { 689, 3126, 225537, 11, }, // Pacific/Pago_Pago
- { 689, 7155, 225548, 5, }, // Pacific/Palau
- { 689, 7194, 225553, 7, }, // Pacific/Pitcairn
- { 689, 3096, 225560, 6, }, // Pacific/Pohnpei
- { 689, 4807, 225566, 12, }, // Pacific/Port_Moresby
- { 689, 6076, 225578, 9, }, // Pacific/Rarotonga
- { 689, 6031, 225587, 6, }, // Pacific/Saipan
- { 689, 7312, 225593, 6, }, // Pacific/Tahiti
- { 689, 6712, 225599, 6, }, // Pacific/Tarawa
- { 689, 4583, 225605, 9, }, // Pacific/Tongatapu
- { 689, 7392, 225614, 3, }, // Pacific/Wake
- { 689, 7405, 225617, 6, }, // Pacific/Wallis
+ { 689, 4331, 225163, 6, }, // Europe/Samara
+ { 689, 6470, 225169, 10, }, // Europe/San_Marino
+ { 689, 6245, 225179, 8, }, // Europe/Sarajevo
+ { 689, 4451, 225187, 7, }, // Europe/Saratov
+ { 689, 8849, 225194, 10, }, // Europe/Simferopol
+ { 689, 6383, 225204, 5, }, // Europe/Skopje
+ { 689, 6599, 225209, 6, }, // Europe/Sofia
+ { 689, 6523, 225215, 7, }, // Europe/Stockholm
+ { 689, 8867, 225222, 5, }, // Europe/Tallinn
+ { 689, 6202, 225227, 6, }, // Europe/Tirane
+ { 689, 8882, 225233, 9, }, // Europe/Ulyanovsk
+ { 689, 6352, 225242, 5, }, // Europe/Vaduz
+ { 689, 6567, 225247, 7, }, // Europe/Vatican
+ { 689, 6231, 225254, 6, }, // Europe/Vienna
+ { 689, 8899, 225260, 7, }, // Europe/Vilnius
+ { 689, 4727, 225267, 9, }, // Europe/Volgograd
+ { 689, 3190, 225276, 5, }, // Europe/Warsaw
+ { 689, 6261, 225281, 11, }, // Europe/Zagreb
+ { 689, 6540, 225292, 5, }, // Europe/Zurich
+ { 689, 5078, 225297, 9, }, // Indian/Antananarivo
+ { 689, 6947, 225306, 6, }, // Indian/Chagos
+ { 689, 6046, 225312, 8, }, // Indian/Christmas
+ { 689, 6063, 225320, 5, }, // Indian/Cocos
+ { 689, 5029, 225325, 6, }, // Indian/Comoro
+ { 689, 6661, 225331, 9, }, // Indian/Kerguelen
+ { 689, 7260, 225340, 4, }, // Indian/Mahe
+ { 689, 7050, 225344, 8, }, // Indian/Maldives
+ { 689, 4069, 225352, 9, }, // Indian/Mauritius
+ { 689, 5098, 225361, 5, }, // Indian/Mayotte
+ { 689, 7211, 225366, 7, }, // Indian/Reunion
+ { 689, 4422, 225373, 4, }, // Pacific/Apia
+ { 689, 932, 225377, 6, }, // Pacific/Auckland
+ { 689, 3706, 225383, 10, }, // Pacific/Bougainville
+ { 689, 3015, 225393, 5, }, // Pacific/Chatham
+ { 689, 3157, 225398, 3, }, // Pacific/Chuuk
+ { 689, 2237, 225401, 5, }, // Pacific/Easter
+ { 689, 7360, 225406, 5, }, // Pacific/Efate
+ { 689, 7327, 225411, 7, }, // Pacific/Fakaofo
+ { 689, 3902, 225418, 4, }, // Pacific/Fiji
+ { 689, 7343, 225422, 8, }, // Pacific/Funafuti
+ { 689, 6678, 225430, 9, }, // Pacific/Galapagos
+ { 689, 6696, 225439, 7, }, // Pacific/Gambier
+ { 689, 3822, 225446, 11, }, // Pacific/Guadalcanal
+ { 689, 6018, 223582, 4, }, // Pacific/Guam
+ { 689, 3049, 225457, 6, }, // Pacific/Kanton
+ { 689, 3998, 225463, 10, }, // Pacific/Kiritimati
+ { 689, 7019, 225473, 6, }, // Pacific/Kosrae
+ { 689, 2842, 225479, 9, }, // Pacific/Kwajalein
+ { 689, 4877, 225488, 6, }, // Pacific/Majuro
+ { 689, 4051, 225494, 8, }, // Pacific/Marquesas
+ { 689, 8914, 225502, 6, }, // Pacific/Midway
+ { 689, 7084, 225508, 5, }, // Pacific/Nauru
+ { 689, 7132, 225513, 4, }, // Pacific/Niue
+ { 689, 4168, 225517, 6, }, // Pacific/Norfolk
+ { 689, 7098, 225523, 5, }, // Pacific/Noumea
+ { 689, 3126, 225528, 11, }, // Pacific/Pago_Pago
+ { 689, 7155, 225539, 5, }, // Pacific/Palau
+ { 689, 7194, 225544, 7, }, // Pacific/Pitcairn
+ { 689, 3096, 225551, 6, }, // Pacific/Pohnpei
+ { 689, 4807, 225557, 12, }, // Pacific/Port_Moresby
+ { 689, 6076, 225569, 9, }, // Pacific/Rarotonga
+ { 689, 6031, 225578, 6, }, // Pacific/Saipan
+ { 689, 7312, 225584, 6, }, // Pacific/Tahiti
+ { 689, 6712, 225590, 6, }, // Pacific/Tarawa
+ { 689, 4583, 225596, 9, }, // Pacific/Tongatapu
+ { 689, 7392, 225605, 3, }, // Pacific/Wake
+ { 689, 7405, 225608, 6, }, // Pacific/Wallis
{ 690, 6788, 29964, 7, }, // Africa/Abidjan Kuvi/Devanagari/India
{ 690, 6760, 88252, 5, }, // Africa/Accra
{ 690, 5059, 88257, 10, }, // Africa/Addis_Ababa
@@ -50854,7 +50854,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 14, 88276, 7, }, // Africa/Asmara
{ 690, 44, 88283, 6, }, // Africa/Bamako
{ 690, 5257, 88289, 6, }, // Africa/Bangui
- { 690, 6746, 225623, 9, }, // Africa/Banjul
+ { 690, 6746, 225614, 9, }, // Africa/Banjul
{ 690, 7435, 88301, 5, }, // Africa/Bissau
{ 690, 4957, 88306, 9, }, // Africa/Blantyre
{ 690, 5287, 88315, 11, }, // Africa/Brazzaville
@@ -50868,31 +50868,31 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 5043, 88368, 6, }, // Africa/Djibouti
{ 690, 5243, 88374, 5, }, // Africa/Douala
{ 690, 5166, 88379, 8, }, // Africa/El_Aaiun
- { 690, 6853, 225632, 9, }, // Africa/Freetown
+ { 690, 6853, 225623, 9, }, // Africa/Freetown
{ 690, 4906, 88396, 7, }, // Africa/Gaborone
{ 690, 5015, 88403, 5, }, // Africa/Harare
{ 690, 4479, 88408, 10, }, // Africa/Johannesburg
{ 690, 4499, 30154, 4, }, // Africa/Juba
{ 690, 5151, 88418, 6, }, // Africa/Kampala
- { 690, 4524, 225641, 7, }, // Africa/Khartoum
+ { 690, 4524, 225632, 7, }, // Africa/Khartoum
{ 690, 4973, 88424, 6, }, // Africa/Kigali
- { 690, 5306, 225648, 7, }, // Africa/Kinshasa
+ { 690, 5306, 225639, 7, }, // Africa/Kinshasa
{ 690, 4744, 88437, 5, }, // Africa/Lagos
{ 690, 5336, 88442, 10, }, // Africa/Libreville
{ 690, 6869, 88452, 3, }, // Africa/Lome
{ 690, 5211, 88455, 6, }, // Africa/Luanda
- { 690, 4939, 225655, 9, }, // Africa/Lubumbashi
+ { 690, 4939, 225646, 9, }, // Africa/Lubumbashi
{ 690, 5001, 30221, 6, }, // Africa/Lusaka
{ 690, 5322, 88470, 5, }, // Africa/Malabo
{ 690, 4987, 88475, 6, }, // Africa/Maputo
{ 690, 5197, 30239, 6, }, // Africa/Maseru
- { 690, 5182, 225664, 9, }, // Africa/Mbabane
- { 690, 5113, 225673, 8, }, // Africa/Mogadishu
+ { 690, 5182, 225655, 9, }, // Africa/Mbabane
+ { 690, 5113, 225664, 8, }, // Africa/Mogadishu
{ 690, 7034, 88496, 9, }, // Africa/Monrovia
- { 690, 3853, 225681, 7, }, // Africa/Nairobi
+ { 690, 3853, 225672, 7, }, // Africa/Nairobi
{ 690, 5271, 88513, 8, }, // Africa/Ndjamena
{ 690, 5354, 88521, 6, }, // Africa/Niamey
- { 690, 6803, 225688, 7, }, // Africa/Nouakchott
+ { 690, 6803, 225679, 7, }, // Africa/Nouakchott
{ 690, 6727, 88534, 7, }, // Africa/Ouagadougou
{ 690, 5225, 88541, 11, }, // Africa/Porto-Novo
{ 690, 4435, 88552, 7, }, // Africa/Sao_Tome
@@ -50912,45 +50912,45 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 565, 88633, 8, }, // America/Argentina/Mendoza
{ 690, 7489, 88641, 12, }, // America/Argentina/Rio_Gallegos
{ 690, 7520, 30437, 6, }, // America/Argentina/Salta
- { 690, 7544, 225695, 11, }, // America/Argentina/San_Juan
- { 690, 5580, 225706, 10, }, // America/Argentina/San_Luis
+ { 690, 7544, 225686, 11, }, // America/Argentina/San_Juan
+ { 690, 5580, 225697, 10, }, // America/Argentina/San_Luis
{ 690, 7571, 88669, 6, }, // America/Argentina/Tucuman
- { 690, 7597, 225716, 7, }, // America/Argentina/Ushuaia
+ { 690, 7597, 225707, 7, }, // America/Argentina/Ushuaia
{ 690, 5640, 88682, 5, }, // America/Aruba
- { 690, 4252, 225723, 8, }, // America/Asuncion
+ { 690, 4252, 225714, 8, }, // America/Asuncion
{ 690, 237, 88695, 8, }, // America/Atikokan
{ 690, 3679, 88703, 5, }, // America/Bahia
{ 690, 7623, 88708, 15, }, // America/Bahia_Banderas
{ 690, 5654, 88723, 8, }, // America/Barbados
{ 690, 7646, 30526, 5, }, // America/Belem
{ 690, 5407, 88731, 6, }, // America/Belize
- { 690, 7660, 225731, 12, }, // America/Blanc-Sablon
+ { 690, 7660, 225722, 12, }, // America/Blanc-Sablon
{ 690, 7681, 88750, 10, }, // America/Boa_Vista
{ 690, 4361, 88760, 6, }, // America/Bogota
{ 690, 7699, 88766, 5, }, // America/Boise
- { 690, 7713, 225743, 12, }, // America/Cambridge_Bay
- { 690, 7735, 225755, 16, }, // America/Campo_Grande
- { 690, 3868, 225771, 8, }, // America/Cancun
+ { 690, 7713, 225734, 12, }, // America/Cambridge_Bay
+ { 690, 7735, 225746, 16, }, // America/Campo_Grande
+ { 690, 3868, 225762, 8, }, // America/Cancun
{ 690, 4694, 88805, 6, }, // America/Caracas
{ 690, 4345, 30609, 5, }, // America/Cayenne
{ 690, 5496, 138409, 7, }, // America/Cayman
- { 690, 2260, 225779, 6, }, // America/Chicago
+ { 690, 2260, 225770, 6, }, // America/Chicago
{ 690, 7756, 88817, 8, }, // America/Chihuahua
{ 690, 5422, 88841, 11, }, // America/Costa_Rica
{ 690, 7796, 30642, 8, }, // America/Creston
{ 690, 3791, 88852, 7, }, // America/Cuiaba
{ 690, 5723, 88859, 7, }, // America/Curacao
- { 690, 7812, 225785, 11, }, // America/Danmarkshavn
+ { 690, 7812, 225776, 11, }, // America/Danmarkshavn
{ 690, 7833, 88877, 4, }, // America/Dawson
{ 690, 7848, 88881, 10, }, // America/Dawson_Creek
{ 690, 805, 88891, 5, }, // America/Denver
{ 690, 3465, 88896, 8, }, // America/Detroit
{ 690, 5739, 88904, 8, }, // America/Dominica
{ 690, 893, 88912, 6, }, // America/Edmonton
- { 690, 7869, 225796, 8, }, // America/Eirunepe
+ { 690, 7869, 225787, 8, }, // America/Eirunepe
{ 690, 5441, 88918, 11, }, // America/El_Salvador
- { 690, 7886, 225804, 13, }, // America/Fort_Nelson
- { 690, 7906, 225817, 12, }, // America/Fortaleza
+ { 690, 7886, 225795, 13, }, // America/Fort_Nelson
+ { 690, 7906, 225808, 12, }, // America/Fortaleza
{ 690, 7924, 30760, 8, }, // America/Glace_Bay
{ 690, 6881, 113910, 6, }, // America/Goose_Bay
{ 690, 4612, 88974, 11, }, // America/Grand_Turk
@@ -50959,7 +50959,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 3760, 30806, 10, }, // America/Guatemala
{ 690, 4841, 88994, 9, }, // America/Guayaquil
{ 690, 6932, 89003, 5, }, // America/Guyana
- { 690, 1939, 225829, 9, }, // America/Halifax
+ { 690, 1939, 225820, 9, }, // America/Halifax
{ 690, 2281, 89018, 5, }, // America/Havana
{ 690, 7942, 89023, 11, }, // America/Hermosillo
{ 690, 348, 89034, 13, }, // America/Indiana/Indianapolis
@@ -50971,20 +50971,20 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 8060, 89131, 18, }, // America/Indiana/Vincennes
{ 690, 8086, 89149, 17, }, // America/Indiana/Winamac
{ 690, 8110, 30999, 6, }, // America/Inuvik
- { 690, 660, 225838, 8, }, // America/Iqaluit
+ { 690, 660, 225829, 8, }, // America/Iqaluit
{ 690, 2799, 138734, 6, }, // America/Jamaica
{ 690, 5380, 89178, 7, }, // America/Juneau
{ 690, 521, 89185, 8, }, // America/Kentucky/Louisville
{ 690, 8125, 89193, 17, }, // America/Kentucky/Monticello
- { 690, 5704, 225846, 13, }, // America/Kralendijk
+ { 690, 5704, 225837, 13, }, // America/Kralendijk
{ 690, 4376, 89222, 7, }, // America/La_Paz
{ 690, 7169, 31064, 4, }, // America/Lima
{ 690, 3239, 89229, 11, }, // America/Los_Angeles
{ 690, 5932, 89240, 22, }, // America/Lower_Princes
{ 690, 8153, 89262, 5, }, // America/Maceio
{ 690, 8168, 89267, 7, }, // America/Managua
- { 690, 1908, 225859, 4, }, // America/Manaus
- { 690, 5897, 225863, 7, }, // America/Marigot
+ { 690, 1908, 225850, 4, }, // America/Manaus
+ { 690, 5897, 225854, 7, }, // America/Marigot
{ 690, 5805, 89285, 9, }, // America/Martinique
{ 690, 8184, 89294, 9, }, // America/Matamoros
{ 690, 2917, 89303, 9, }, // America/Mazatlan
@@ -51001,43 +51001,43 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 2379, 89392, 9, }, // America/New_York
{ 690, 8288, 89314, 3, }, // America/Nome
{ 690, 1850, 89401, 8, }, // America/Noronha
- { 690, 8301, 225870, 19, }, // America/North_Dakota/Beulah
- { 690, 8329, 225889, 18, }, // America/North_Dakota/Center
- { 690, 8357, 225907, 23, }, // America/North_Dakota/New_Salem
+ { 690, 8301, 225861, 19, }, // America/North_Dakota/Beulah
+ { 690, 8329, 225880, 18, }, // America/North_Dakota/Center
+ { 690, 8357, 225898, 23, }, // America/North_Dakota/New_Salem
{ 690, 393, 89472, 3, }, // America/Nuuk
- { 690, 8388, 225930, 9, }, // America/Ojinaga
+ { 690, 8388, 225921, 9, }, // America/Ojinaga
{ 690, 2356, 89484, 5, }, // America/Panama
{ 690, 6173, 89489, 10, }, // America/Paramaribo
- { 690, 2973, 225939, 8, }, // America/Phoenix
+ { 690, 2973, 225930, 8, }, // America/Phoenix
{ 690, 3945, 89507, 14, }, // America/Port-au-Prince
- { 690, 5954, 225947, 15, }, // America/Port_of_Spain
+ { 690, 5954, 225938, 15, }, // America/Port_of_Spain
{ 690, 8404, 89536, 13, }, // America/Porto_Velho
{ 690, 5843, 89549, 11, }, // America/Puerto_Rico
{ 690, 4030, 89560, 12, }, // America/Punta_Arenas
{ 690, 8424, 89572, 12, }, // America/Rankin_Inlet
- { 690, 8445, 225962, 7, }, // America/Recife
+ { 690, 8445, 225953, 7, }, // America/Recife
{ 690, 1995, 31431, 6, }, // America/Regina
{ 690, 8460, 89591, 9, }, // America/Resolute
{ 690, 695, 89600, 12, }, // America/Rio_Branco
- { 690, 8477, 225969, 9, }, // America/Santarem
- { 690, 2201, 225978, 8, }, // America/Santiago
+ { 690, 8477, 225960, 9, }, // America/Santarem
+ { 690, 2201, 225969, 8, }, // America/Santiago
{ 690, 6111, 89629, 13, }, // America/Santo_Domingo
{ 690, 1878, 89642, 9, }, // America/Sao_Paulo
{ 690, 6899, 89651, 13, }, // America/Scoresbysund
{ 690, 8494, 89664, 6, }, // America/Sitka
- { 690, 8508, 225986, 15, }, // America/St_Barthelemy
+ { 690, 8508, 225977, 15, }, // America/St_Barthelemy
{ 690, 2061, 114496, 10, }, // America/St_Johns
{ 690, 5863, 89694, 10, }, // America/St_Kitts
{ 690, 5880, 89704, 11, }, // America/St_Lucia
- { 690, 855, 226001, 9, }, // America/St_Thomas
+ { 690, 855, 225992, 9, }, // America/St_Thomas
{ 690, 5913, 89724, 12, }, // America/St_Vincent
- { 690, 8530, 226010, 13, }, // America/Swift_Current
+ { 690, 8530, 226001, 13, }, // America/Swift_Current
{ 690, 5461, 89749, 11, }, // America/Tegucigalpa
{ 690, 5756, 129890, 4, }, // America/Thule
{ 690, 313, 89766, 7, }, // America/Tijuana
{ 690, 608, 89773, 6, }, // America/Toronto
{ 690, 5688, 89779, 8, }, // America/Tortola
- { 690, 2093, 226023, 10, }, // America/Vancouver
+ { 690, 2093, 226014, 10, }, // America/Vancouver
{ 690, 2144, 89794, 11, }, // America/Whitehorse
{ 690, 734, 89805, 7, }, // America/Winnipeg
{ 690, 8552, 89812, 7, }, // America/Yakutat
@@ -51046,37 +51046,37 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 6133, 89824, 19, }, // Antarctica/DumontDUrville
{ 690, 8568, 89843, 7, }, // Antarctica/Macquarie
{ 690, 7066, 89850, 4, }, // Antarctica/Mawson
- { 690, 7113, 226033, 11, }, // Antarctica/McMurdo
+ { 690, 7113, 226024, 11, }, // Antarctica/McMurdo
{ 690, 8589, 89863, 4, }, // Antarctica/Palmer
{ 690, 7226, 89867, 6, }, // Antarctica/Rothera
{ 690, 7295, 89873, 6, }, // Antarctica/Syowa
{ 690, 8607, 89879, 5, }, // Antarctica/Troll
{ 690, 7374, 89884, 7, }, // Antarctica/Vostok
- { 690, 1429, 226044, 12, }, // Arctic/Longyearbyen
+ { 690, 1429, 226035, 12, }, // Arctic/Longyearbyen
{ 690, 5570, 89904, 4, }, // Asia/Aden
{ 690, 5395, 89908, 7, }, // Asia/Almaty
{ 690, 3968, 89915, 6, }, // Asia/Amman
{ 690, 5511, 89921, 6, }, // Asia/Anadyr
{ 690, 5523, 31778, 6, }, // Asia/Aqtau
{ 690, 5368, 114670, 7, }, // Asia/Aqtobe
- { 690, 964, 226056, 8, }, // Asia/Ashgabat
+ { 690, 964, 226047, 8, }, // Asia/Ashgabat
{ 690, 8624, 89933, 5, }, // Asia/Atyrau
{ 690, 3607, 89938, 5, }, // Asia/Baghdad
{ 690, 5534, 89943, 5, }, // Asia/Bahrain
{ 690, 3653, 88857, 4, }, // Asia/Baku
- { 690, 4466, 226064, 9, }, // Asia/Bangkok
+ { 690, 4466, 226055, 9, }, // Asia/Bangkok
{ 690, 3571, 89954, 6, }, // Asia/Barnaul
{ 690, 4086, 89960, 5, }, // Asia/Beirut
- { 690, 3778, 226073, 7, }, // Asia/Bishkek
- { 690, 5989, 226080, 8, }, // Asia/Brunei
- { 690, 4601, 226088, 6, }, // Asia/Chita
+ { 690, 3778, 226064, 7, }, // Asia/Bishkek
+ { 690, 5989, 226071, 8, }, // Asia/Brunei
+ { 690, 4601, 226079, 6, }, // Asia/Chita
{ 690, 4511, 89978, 6, }, // Asia/Colombo
{ 690, 4540, 89984, 7, }, // Asia/Damascus
{ 690, 1093, 89991, 4, }, // Asia/Dhaka
{ 690, 6192, 89995, 4, }, // Asia/Dili
- { 690, 3596, 226094, 5, }, // Asia/Dubai
- { 690, 6159, 226099, 7, }, // Asia/Dushanbe
- { 690, 8636, 226106, 11, }, // Asia/Famagusta
+ { 690, 3596, 226085, 5, }, // Asia/Dubai
+ { 690, 6159, 226090, 7, }, // Asia/Dushanbe
+ { 690, 8636, 226097, 11, }, // Asia/Famagusta
{ 690, 8651, 90021, 5, }, // Asia/Gaza
{ 690, 4795, 90026, 7, }, // Asia/Hebron
{ 690, 1259, 90033, 16, }, // Asia/Ho_Chi_Minh
@@ -51085,12 +51085,12 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 4184, 90063, 10, }, // Asia/Irkutsk
{ 690, 7006, 90073, 7, }, // Asia/Jakarta
{ 690, 6992, 31943, 7, }, // Asia/Jayapura
- { 690, 1290, 226117, 8, }, // Asia/Jerusalem
+ { 690, 1290, 226108, 8, }, // Asia/Jerusalem
{ 690, 3560, 90086, 5, }, // Asia/Kabul
{ 690, 4316, 90091, 7, }, // Asia/Kamchatka
{ 690, 4239, 31972, 5, }, // Asia/Karachi
{ 690, 1185, 90098, 8, }, // Asia/Kathmandu
- { 690, 8661, 226125, 7, }, // Asia/Khandyga
+ { 690, 8661, 226116, 7, }, // Asia/Khandyga
{ 690, 992, 90113, 7, }, // Asia/Kolkata
{ 690, 4197, 90120, 15, }, // Asia/Krasnoyarsk
{ 690, 4859, 90135, 10, }, // Asia/Kuala_Lumpur
@@ -51106,22 +51106,22 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 4135, 90184, 13, }, // Asia/Novosibirsk
{ 690, 4229, 90197, 6, }, // Asia/Omsk
{ 690, 7145, 90203, 3, }, // Asia/Oral
- { 690, 6961, 226132, 10, }, // Asia/Phnom_Penh
+ { 690, 6961, 226123, 10, }, // Asia/Phnom_Penh
{ 690, 8693, 90215, 9, }, // Asia/Pontianak
{ 690, 4214, 90224, 10, }, // Asia/Pyongyang
{ 690, 5559, 90234, 3, }, // Asia/Qatar
{ 690, 8708, 90237, 8, }, // Asia/Qostanay
- { 690, 4269, 226142, 10, }, // Asia/Qyzylorda
+ { 690, 4269, 226133, 10, }, // Asia/Qyzylorda
{ 690, 3584, 90256, 5, }, // Asia/Riyadh
- { 690, 4408, 226152, 7, }, // Asia/Sakhalin
+ { 690, 4408, 226143, 7, }, // Asia/Sakhalin
{ 690, 7245, 90267, 6, }, // Asia/Samarkand
{ 690, 3279, 90273, 4, }, // Asia/Seoul
- { 690, 1053, 226159, 6, }, // Asia/Shanghai
+ { 690, 1053, 226150, 6, }, // Asia/Shanghai
{ 690, 3300, 32190, 8, }, // Asia/Singapore
{ 690, 4297, 90282, 16, }, // Asia/Srednekolymsk
- { 690, 3263, 226165, 8, }, // Asia/Taipei
- { 690, 4781, 226173, 6, }, // Asia/Tashkent
- { 690, 3915, 226179, 9, }, // Asia/Tbilisi
+ { 690, 3263, 226156, 8, }, // Asia/Taipei
+ { 690, 4781, 226164, 6, }, // Asia/Tashkent
+ { 690, 3915, 226170, 9, }, // Asia/Tbilisi
{ 690, 2772, 32236, 6, }, // Asia/Tehran
{ 690, 1317, 90317, 5, }, // Asia/Thimphu
{ 690, 2821, 90322, 6, }, // Asia/Tokyo
@@ -51132,19 +51132,19 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 6977, 90360, 9, }, // Asia/Vientiane
{ 690, 4710, 90369, 13, }, // Asia/Vladivostok
{ 690, 4828, 32305, 9, }, // Asia/Yakutsk
- { 690, 1235, 226188, 6, }, // Asia/Yangon
+ { 690, 1235, 226179, 6, }, // Asia/Yangon
{ 690, 3883, 90382, 13, }, // Asia/Yekaterinburg
{ 690, 3747, 90395, 7, }, // Asia/Yerevan
{ 690, 3663, 90402, 7, }, // Atlantic/Azores
{ 690, 5671, 90409, 6, }, // Atlantic/Bermuda
- { 690, 6628, 226194, 8, }, // Atlantic/Canary
+ { 690, 6628, 226185, 8, }, // Atlantic/Canary
{ 690, 3727, 90421, 8, }, // Atlantic/Cape_Verde
- { 690, 1395, 226202, 6, }, // Atlantic/Faroe
+ { 690, 1395, 226193, 6, }, // Atlantic/Faroe
{ 690, 8736, 90434, 5, }, // Atlantic/Madeira
{ 690, 2748, 90439, 9, }, // Atlantic/Reykjavik
- { 690, 7272, 226208, 18, }, // Atlantic/South_Georgia
+ { 690, 7272, 226199, 18, }, // Atlantic/South_Georgia
{ 690, 6821, 90463, 11, }, // Atlantic/St_Helena
- { 690, 6644, 226226, 9, }, // Atlantic/Stanley
+ { 690, 6644, 226217, 9, }, // Atlantic/Stanley
{ 690, 1670, 90481, 6, }, // Australia/Adelaide
{ 690, 1635, 90487, 8, }, // Australia/Brisbane
{ 690, 1799, 90495, 10, }, // Australia/Broken_Hill
@@ -51158,8 +51158,8 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 1463, 32494, 5, }, // Australia/Sydney
{ 690, 6441, 90549, 10, }, // Europe/Amsterdam
{ 690, 6216, 90559, 6, }, // Europe/Andorra
- { 690, 3620, 226235, 10, }, // Europe/Astrakhan
- { 690, 2300, 226245, 6, }, // Europe/Athens
+ { 690, 3620, 226226, 10, }, // Europe/Astrakhan
+ { 690, 2300, 226236, 6, }, // Europe/Athens
{ 690, 6336, 32532, 8, }, // Europe/Belgrade
{ 690, 4757, 90580, 6, }, // Europe/Berlin
{ 690, 6488, 90586, 12, }, // Europe/Bratislava
@@ -51173,7 +51173,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 6307, 90657, 10, }, // Europe/Gibraltar
{ 690, 8788, 90667, 6, }, // Europe/Guernsey
{ 690, 6612, 90673, 8, }, // Europe/Helsinki
- { 690, 8804, 226251, 13, }, // Europe/Isle_of_Man
+ { 690, 8804, 226242, 13, }, // Europe/Isle_of_Man
{ 690, 1130, 90692, 9, }, // Europe/Istanbul
{ 690, 8823, 90701, 5, }, // Europe/Jersey
{ 690, 3979, 90706, 12, }, // Europe/Kaliningrad
@@ -51199,9 +51199,9 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 6470, 90814, 10, }, // Europe/San_Marino
{ 690, 6245, 90824, 8, }, // Europe/Sarajevo
{ 690, 4451, 90832, 7, }, // Europe/Saratov
- { 690, 8849, 226264, 12, }, // Europe/Simferopol
- { 690, 6383, 226276, 8, }, // Europe/Skopje
- { 690, 6599, 226284, 7, }, // Europe/Sofia
+ { 690, 8849, 226255, 12, }, // Europe/Simferopol
+ { 690, 6383, 226267, 8, }, // Europe/Skopje
+ { 690, 6599, 226275, 7, }, // Europe/Sofia
{ 690, 6523, 90866, 8, }, // Europe/Stockholm
{ 690, 8867, 90874, 5, }, // Europe/Tallinn
{ 690, 6202, 90879, 6, }, // Europe/Tirane
@@ -51213,7 +51213,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 4727, 90922, 11, }, // Europe/Volgograd
{ 690, 3190, 90933, 5, }, // Europe/Warsaw
{ 690, 6261, 90938, 8, }, // Europe/Zagreb
- { 690, 6540, 226291, 9, }, // Europe/Zurich
+ { 690, 6540, 226282, 9, }, // Europe/Zurich
{ 690, 5078, 90955, 11, }, // Indian/Antananarivo
{ 690, 6947, 115401, 5, }, // Indian/Chagos
{ 690, 6046, 90971, 7, }, // Indian/Christmas
@@ -51222,38 +51222,38 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 6661, 90989, 7, }, // Indian/Kerguelen
{ 690, 7260, 32983, 4, }, // Indian/Mahe
{ 690, 7050, 90996, 6, }, // Indian/Maldives
- { 690, 4069, 226300, 6, }, // Indian/Mauritius
+ { 690, 4069, 226291, 6, }, // Indian/Mauritius
{ 690, 5098, 91008, 8, }, // Indian/Mayotte
{ 690, 7211, 91016, 8, }, // Indian/Reunion
{ 690, 4422, 91024, 5, }, // Pacific/Apia
- { 690, 932, 226306, 6, }, // Pacific/Auckland
+ { 690, 932, 226297, 6, }, // Pacific/Auckland
{ 690, 3706, 91035, 8, }, // Pacific/Bougainville
- { 690, 3015, 226312, 6, }, // Pacific/Chatham
+ { 690, 3015, 226303, 6, }, // Pacific/Chatham
{ 690, 3157, 91047, 2, }, // Pacific/Chuuk
- { 690, 2237, 226318, 6, }, // Pacific/Easter
- { 690, 7360, 226324, 5, }, // Pacific/Efate
- { 690, 7327, 226329, 9, }, // Pacific/Fakaofo
- { 690, 3902, 226338, 5, }, // Pacific/Fiji
- { 690, 7343, 226343, 12, }, // Pacific/Funafuti
+ { 690, 2237, 226309, 6, }, // Pacific/Easter
+ { 690, 7360, 226315, 5, }, // Pacific/Efate
+ { 690, 7327, 226320, 9, }, // Pacific/Fakaofo
+ { 690, 3902, 226329, 5, }, // Pacific/Fiji
+ { 690, 7343, 226334, 12, }, // Pacific/Funafuti
{ 690, 6678, 91085, 9, }, // Pacific/Galapagos
- { 690, 6696, 226355, 9, }, // Pacific/Gambier
+ { 690, 6696, 226346, 9, }, // Pacific/Gambier
{ 690, 3822, 91101, 10, }, // Pacific/Guadalcanal
{ 690, 6018, 31112, 4, }, // Pacific/Guam
- { 690, 3049, 226364, 5, }, // Pacific/Kanton
+ { 690, 3049, 226355, 5, }, // Pacific/Kanton
{ 690, 3998, 33132, 10, }, // Pacific/Kiritimati
{ 690, 7019, 91126, 6, }, // Pacific/Kosrae
{ 690, 2842, 91132, 10, }, // Pacific/Kwajalein
{ 690, 4877, 91142, 6, }, // Pacific/Majuro
{ 690, 4051, 91148, 8, }, // Pacific/Marquesas
{ 690, 8914, 91156, 5, }, // Pacific/Midway
- { 690, 7084, 226369, 6, }, // Pacific/Nauru
+ { 690, 7084, 226360, 6, }, // Pacific/Nauru
{ 690, 7132, 91165, 4, }, // Pacific/Niue
- { 690, 4168, 226375, 7, }, // Pacific/Norfolk
- { 690, 7098, 226382, 6, }, // Pacific/Noumea
+ { 690, 4168, 226366, 7, }, // Pacific/Norfolk
+ { 690, 7098, 226373, 6, }, // Pacific/Noumea
{ 690, 3126, 91182, 9, }, // Pacific/Pago_Pago
{ 690, 7155, 91191, 4, }, // Pacific/Palau
{ 690, 7194, 137202, 8, }, // Pacific/Pitcairn
- { 690, 3096, 226388, 7, }, // Pacific/Pohnpei
+ { 690, 3096, 226379, 7, }, // Pacific/Pohnpei
{ 690, 4807, 91201, 14, }, // Pacific/Port_Moresby
{ 690, 6076, 91215, 9, }, // Pacific/Rarotonga
{ 690, 6031, 91224, 6, }, // Pacific/Saipan
@@ -51263,7 +51263,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 690, 7392, 33268, 3, }, // Pacific/Wake
{ 690, 7405, 33271, 5, }, // Pacific/Wallis
{ 691, 6788, 148234, 7, }, // Africa/Abidjan Kuvi/Odia/India
- { 691, 6760, 226395, 5, }, // Africa/Accra
+ { 691, 6760, 226386, 5, }, // Africa/Accra
{ 691, 5059, 148246, 12, }, // Africa/Addis_Ababa
{ 691, 7420, 148258, 8, }, // Africa/Algiers
{ 691, 14, 148266, 5, }, // Africa/Asmara
@@ -51272,217 +51272,217 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 691, 6746, 148284, 7, }, // Africa/Banjul
{ 691, 7435, 148291, 5, }, // Africa/Bissau
{ 691, 4957, 148296, 13, }, // Africa/Blantyre
- { 691, 5287, 226400, 12, }, // Africa/Brazzaville
- { 691, 4922, 226412, 10, }, // Africa/Bujumbura
+ { 691, 5287, 226391, 12, }, // Africa/Brazzaville
+ { 691, 4922, 226403, 10, }, // Africa/Bujumbura
{ 691, 2320, 148331, 4, }, // Africa/Cairo
{ 691, 4117, 148336, 12, }, // Africa/Casablanca
{ 691, 7449, 148348, 5, }, // Africa/Ceuta
- { 691, 6773, 226422, 7, }, // Africa/Conakry
+ { 691, 6773, 226413, 7, }, // Africa/Conakry
{ 691, 6840, 148361, 4, }, // Africa/Dakar
{ 691, 5130, 148365, 15, }, // Africa/Dar_es_Salaam
- { 691, 5043, 226429, 5, }, // Africa/Djibouti
+ { 691, 5043, 226420, 5, }, // Africa/Djibouti
{ 691, 5243, 148386, 4, }, // Africa/Douala
{ 691, 5166, 148390, 9, }, // Africa/El_Aaiun
- { 691, 6853, 226434, 10, }, // Africa/Freetown
- { 691, 4906, 226444, 8, }, // Africa/Gaborone
+ { 691, 6853, 226425, 10, }, // Africa/Freetown
+ { 691, 4906, 226435, 8, }, // Africa/Gaborone
{ 691, 5015, 148418, 5, }, // Africa/Harare
- { 691, 4479, 226452, 10, }, // Africa/Johannesburg
+ { 691, 4479, 226443, 10, }, // Africa/Johannesburg
{ 691, 4499, 148434, 4, }, // Africa/Juba
{ 691, 5151, 148438, 8, }, // Africa/Kampala
- { 691, 4524, 226462, 7, }, // Africa/Khartoum
+ { 691, 4524, 226453, 7, }, // Africa/Khartoum
{ 691, 4973, 148453, 6, }, // Africa/Kigali
{ 691, 5306, 148459, 8, }, // Africa/Kinshasa
- { 691, 4744, 226469, 6, }, // Africa/Lagos
- { 691, 5336, 226475, 12, }, // Africa/Libreville
- { 691, 6869, 226487, 4, }, // Africa/Lome
+ { 691, 4744, 226460, 6, }, // Africa/Lagos
+ { 691, 5336, 226466, 12, }, // Africa/Libreville
+ { 691, 6869, 226478, 4, }, // Africa/Lome
{ 691, 5211, 148491, 7, }, // Africa/Luanda
{ 691, 4939, 148498, 10, }, // Africa/Lubumbashi
{ 691, 5001, 148508, 6, }, // Africa/Lusaka
{ 691, 5322, 148514, 5, }, // Africa/Malabo
{ 691, 4987, 148520, 6, }, // Africa/Maputo
{ 691, 5197, 148526, 6, }, // Africa/Maseru
- { 691, 5182, 226491, 9, }, // Africa/Mbabane
- { 691, 5113, 226500, 8, }, // Africa/Mogadishu
- { 691, 7034, 226508, 7, }, // Africa/Monrovia
- { 691, 3853, 226515, 6, }, // Africa/Nairobi
+ { 691, 5182, 226482, 9, }, // Africa/Mbabane
+ { 691, 5113, 226491, 8, }, // Africa/Mogadishu
+ { 691, 7034, 226499, 7, }, // Africa/Monrovia
+ { 691, 3853, 226506, 6, }, // Africa/Nairobi
{ 691, 5271, 148561, 6, }, // Africa/Ndjamena
{ 691, 5354, 148567, 5, }, // Africa/Niamey
- { 691, 6803, 226521, 6, }, // Africa/Nouakchott
- { 691, 6727, 226527, 6, }, // Africa/Ouagadougou
- { 691, 5225, 226533, 7, }, // Africa/Porto-Novo
- { 691, 4435, 226540, 7, }, // Africa/Sao_Tome
- { 691, 2866, 226547, 7, }, // Africa/Tripoli
+ { 691, 6803, 226512, 6, }, // Africa/Nouakchott
+ { 691, 6727, 226518, 6, }, // Africa/Ouagadougou
+ { 691, 5225, 226524, 7, }, // Africa/Porto-Novo
+ { 691, 4435, 226531, 7, }, // Africa/Sao_Tome
+ { 691, 2866, 226538, 7, }, // Africa/Tripoli
{ 691, 6554, 148614, 7, }, // Africa/Tunis
- { 691, 4152, 226554, 8, }, // Africa/Windhoek
+ { 691, 4152, 226545, 8, }, // Africa/Windhoek
{ 691, 132, 148631, 5, }, // America/Adak
{ 691, 3346, 148636, 8, }, // America/Anchorage
{ 691, 5607, 148644, 8, }, // America/Anguilla
{ 691, 5624, 148652, 8, }, // America/Antigua
{ 691, 4554, 148660, 8, }, // America/Araguaina
- { 691, 166, 226562, 13, }, // America/Argentina/Buenos_Aires
- { 691, 91, 226575, 10, }, // America/Argentina/Catamarca
- { 691, 270, 226585, 6, }, // America/Argentina/Cordoba
- { 691, 441, 226591, 5, }, // America/Argentina/Jujuy
- { 691, 7462, 226596, 9, }, // America/Argentina/La_Rioja
- { 691, 565, 226605, 7, }, // America/Argentina/Mendoza
- { 691, 7489, 226612, 12, }, // America/Argentina/Rio_Gallegos
- { 691, 7520, 226624, 6, }, // America/Argentina/Salta
- { 691, 7544, 226630, 11, }, // America/Argentina/San_Juan
- { 691, 5580, 226641, 9, }, // America/Argentina/San_Luis
- { 691, 7571, 226650, 6, }, // America/Argentina/Tucuman
- { 691, 7597, 226656, 7, }, // America/Argentina/Ushuaia
- { 691, 5640, 226663, 5, }, // America/Aruba
+ { 691, 166, 226553, 13, }, // America/Argentina/Buenos_Aires
+ { 691, 91, 226566, 10, }, // America/Argentina/Catamarca
+ { 691, 270, 226576, 6, }, // America/Argentina/Cordoba
+ { 691, 441, 226582, 5, }, // America/Argentina/Jujuy
+ { 691, 7462, 226587, 9, }, // America/Argentina/La_Rioja
+ { 691, 565, 226596, 7, }, // America/Argentina/Mendoza
+ { 691, 7489, 226603, 12, }, // America/Argentina/Rio_Gallegos
+ { 691, 7520, 226615, 6, }, // America/Argentina/Salta
+ { 691, 7544, 226621, 11, }, // America/Argentina/San_Juan
+ { 691, 5580, 226632, 9, }, // America/Argentina/San_Luis
+ { 691, 7571, 226641, 6, }, // America/Argentina/Tucuman
+ { 691, 7597, 226647, 7, }, // America/Argentina/Ushuaia
+ { 691, 5640, 226654, 5, }, // America/Aruba
{ 691, 4252, 148781, 9, }, // America/Asuncion
{ 691, 237, 148790, 9, }, // America/Atikokan
{ 691, 3679, 148799, 5, }, // America/Bahia
{ 691, 7623, 148804, 18, }, // America/Bahia_Banderas
- { 691, 5654, 226668, 7, }, // America/Barbados
+ { 691, 5654, 226659, 7, }, // America/Barbados
{ 691, 7646, 148832, 5, }, // America/Belem
{ 691, 5407, 148837, 6, }, // America/Belize
- { 691, 7660, 226675, 14, }, // America/Blanc-Sablon
- { 691, 7681, 226689, 10, }, // America/Boa_Vista
- { 691, 4361, 226699, 4, }, // America/Bogota
- { 691, 7699, 226703, 4, }, // America/Boise
+ { 691, 7660, 226666, 14, }, // America/Blanc-Sablon
+ { 691, 7681, 226680, 10, }, // America/Boa_Vista
+ { 691, 4361, 226690, 4, }, // America/Bogota
+ { 691, 7699, 226694, 4, }, // America/Boise
{ 691, 7713, 148879, 13, }, // America/Cambridge_Bay
- { 691, 7735, 226707, 14, }, // America/Campo_Grande
+ { 691, 7735, 226698, 14, }, // America/Campo_Grande
{ 691, 3868, 148907, 7, }, // America/Cancun
{ 691, 4694, 148914, 8, }, // America/Caracas
{ 691, 4345, 148922, 8, }, // America/Cayenne
{ 691, 5496, 148930, 9, }, // America/Cayman
- { 691, 2260, 226721, 5, }, // America/Chicago
+ { 691, 2260, 226712, 5, }, // America/Chicago
{ 691, 7756, 148945, 8, }, // America/Chihuahua
- { 691, 5422, 226726, 10, }, // America/Costa_Rica
- { 691, 7796, 226736, 9, }, // America/Creston
+ { 691, 5422, 226717, 10, }, // America/Costa_Rica
+ { 691, 7796, 226727, 9, }, // America/Creston
{ 691, 3791, 148989, 5, }, // America/Cuiaba
{ 691, 5723, 148994, 5, }, // America/Curacao
{ 691, 7812, 149000, 13, }, // America/Danmarkshavn
{ 691, 7833, 149013, 5, }, // America/Dawson
{ 691, 7848, 149018, 12, }, // America/Dawson_Creek
- { 691, 805, 226745, 7, }, // America/Denver
- { 691, 3465, 226752, 8, }, // America/Detroit
- { 691, 5739, 226760, 7, }, // America/Dominica
- { 691, 893, 226767, 9, }, // America/Edmonton
+ { 691, 805, 226736, 7, }, // America/Denver
+ { 691, 3465, 226743, 8, }, // America/Detroit
+ { 691, 5739, 226751, 7, }, // America/Dominica
+ { 691, 893, 226758, 9, }, // America/Edmonton
{ 691, 7869, 149063, 7, }, // America/Eirunepe
- { 691, 5441, 226776, 13, }, // America/El_Salvador
- { 691, 7886, 226789, 11, }, // America/Fort_Nelson
- { 691, 7906, 226800, 8, }, // America/Fortaleza
+ { 691, 5441, 226767, 13, }, // America/El_Salvador
+ { 691, 7886, 226780, 11, }, // America/Fort_Nelson
+ { 691, 7906, 226791, 8, }, // America/Fortaleza
{ 691, 7924, 149106, 9, }, // America/Glace_Bay
{ 691, 6881, 149115, 7, }, // America/Goose_Bay
{ 691, 4612, 149122, 14, }, // America/Grand_Turk
{ 691, 5770, 149136, 8, }, // America/Grenada
- { 691, 5786, 226808, 9, }, // America/Guadeloupe
- { 691, 3760, 226817, 9, }, // America/Guatemala
+ { 691, 5786, 226799, 9, }, // America/Guadeloupe
+ { 691, 3760, 226808, 9, }, // America/Guatemala
{ 691, 4841, 149163, 9, }, // America/Guayaquil
{ 691, 6932, 149172, 5, }, // America/Guyana
{ 691, 1939, 149177, 12, }, // America/Halifax
- { 691, 2281, 226826, 5, }, // America/Havana
- { 691, 7942, 226831, 8, }, // America/Hermosillo
- { 691, 348, 226839, 13, }, // America/Indiana/Indianapolis
+ { 691, 2281, 226817, 5, }, // America/Havana
+ { 691, 7942, 226822, 8, }, // America/Hermosillo
+ { 691, 348, 226830, 13, }, // America/Indiana/Indianapolis
{ 691, 481, 149218, 17, }, // America/Indiana/Knox
- { 691, 7961, 226852, 16, }, // America/Indiana/Marengo
+ { 691, 7961, 226843, 16, }, // America/Indiana/Marengo
{ 691, 7985, 149252, 22, }, // America/Indiana/Petersburg
{ 691, 8012, 149274, 19, }, // America/Indiana/Tell_City
- { 691, 8038, 226868, 15, }, // America/Indiana/Vevay
+ { 691, 8038, 226859, 15, }, // America/Indiana/Vevay
{ 691, 8060, 149308, 21, }, // America/Indiana/Vincennes
{ 691, 8086, 149329, 18, }, // America/Indiana/Winamac
- { 691, 8110, 226883, 7, }, // America/Inuvik
+ { 691, 8110, 226874, 7, }, // America/Inuvik
{ 691, 660, 149354, 10, }, // America/Iqaluit
{ 691, 2799, 149364, 7, }, // America/Jamaica
{ 691, 5380, 149371, 6, }, // America/Juneau
- { 691, 521, 226890, 10, }, // America/Kentucky/Louisville
- { 691, 8125, 226900, 20, }, // America/Kentucky/Monticello
- { 691, 5704, 226920, 13, }, // America/Kralendijk
+ { 691, 521, 226881, 10, }, // America/Kentucky/Louisville
+ { 691, 8125, 226891, 20, }, // America/Kentucky/Monticello
+ { 691, 5704, 226911, 13, }, // America/Kralendijk
{ 691, 4376, 149420, 6, }, // America/La_Paz
{ 691, 7169, 149428, 4, }, // America/Lima
{ 691, 3239, 149432, 13, }, // America/Los_Angeles
{ 691, 5932, 149445, 23, }, // America/Lower_Princes
- { 691, 8153, 226933, 5, }, // America/Maceio
+ { 691, 8153, 226924, 5, }, // America/Maceio
{ 691, 8168, 149473, 7, }, // America/Managua
{ 691, 1908, 149480, 8, }, // America/Manaus
- { 691, 5897, 226938, 7, }, // America/Marigot
+ { 691, 5897, 226929, 7, }, // America/Marigot
{ 691, 5805, 149496, 12, }, // America/Martinique
- { 691, 8184, 226945, 8, }, // America/Matamoros
- { 691, 2917, 226953, 9, }, // America/Mazatlan
+ { 691, 8184, 226936, 8, }, // America/Matamoros
+ { 691, 2917, 226944, 9, }, // America/Mazatlan
{ 691, 8202, 149527, 8, }, // America/Menominee
{ 691, 8220, 149535, 6, }, // America/Merida
{ 691, 8235, 149541, 10, }, // America/Metlakatla
{ 691, 2949, 149551, 13, }, // America/Mexico_City
- { 691, 4391, 226962, 9, }, // America/Miquelon
- { 691, 8254, 226971, 7, }, // America/Moncton
- { 691, 8270, 226978, 7, }, // America/Monterrey
- { 691, 4098, 226985, 10, }, // America/Montevideo
- { 691, 5824, 226995, 10, }, // America/Montserrat
+ { 691, 4391, 226953, 9, }, // America/Miquelon
+ { 691, 8254, 226962, 7, }, // America/Moncton
+ { 691, 8270, 226969, 7, }, // America/Monterrey
+ { 691, 4098, 226976, 10, }, // America/Montevideo
+ { 691, 5824, 226986, 10, }, // America/Montserrat
{ 691, 5481, 149611, 5, }, // America/Nassau
- { 691, 2379, 227005, 10, }, // America/New_York
+ { 691, 2379, 226996, 10, }, // America/New_York
{ 691, 8288, 149627, 4, }, // America/Nome
- { 691, 1850, 227015, 5, }, // America/Noronha
- { 691, 8301, 227020, 19, }, // America/North_Dakota/Beulah
- { 691, 8329, 227039, 20, }, // America/North_Dakota/Center
- { 691, 8357, 227059, 24, }, // America/North_Dakota/New_Salem
+ { 691, 1850, 227006, 5, }, // America/Noronha
+ { 691, 8301, 227011, 19, }, // America/North_Dakota/Beulah
+ { 691, 8329, 227030, 20, }, // America/North_Dakota/Center
+ { 691, 8357, 227050, 24, }, // America/North_Dakota/New_Salem
{ 691, 393, 149705, 5, }, // America/Nuuk
- { 691, 8388, 227083, 7, }, // America/Ojinaga
+ { 691, 8388, 227074, 7, }, // America/Ojinaga
{ 691, 2356, 149717, 6, }, // America/Panama
{ 691, 6173, 149723, 9, }, // America/Paramaribo
- { 691, 2973, 227090, 7, }, // America/Phoenix
- { 691, 3945, 227097, 17, }, // America/Port-au-Prince
- { 691, 5954, 227114, 16, }, // America/Port_of_Spain
+ { 691, 2973, 227081, 7, }, // America/Phoenix
+ { 691, 3945, 227088, 17, }, // America/Port-au-Prince
+ { 691, 5954, 227105, 16, }, // America/Port_of_Spain
{ 691, 8404, 149776, 11, }, // America/Porto_Velho
- { 691, 5843, 227130, 10, }, // America/Puerto_Rico
+ { 691, 5843, 227121, 10, }, // America/Puerto_Rico
{ 691, 4030, 149799, 15, }, // America/Punta_Arenas
{ 691, 8424, 149814, 14, }, // America/Rankin_Inlet
- { 691, 8445, 227140, 6, }, // America/Recife
+ { 691, 8445, 227131, 6, }, // America/Recife
{ 691, 1995, 149834, 6, }, // America/Regina
{ 691, 8460, 149840, 8, }, // America/Resolute
- { 691, 695, 227146, 11, }, // America/Rio_Branco
- { 691, 8477, 227157, 9, }, // America/Santarem
+ { 691, 695, 227137, 11, }, // America/Rio_Branco
+ { 691, 8477, 227148, 9, }, // America/Santarem
{ 691, 2201, 149871, 8, }, // America/Santiago
- { 691, 6111, 227166, 12, }, // America/Santo_Domingo
+ { 691, 6111, 227157, 12, }, // America/Santo_Domingo
{ 691, 1878, 149895, 9, }, // America/Sao_Paulo
- { 691, 6899, 227178, 14, }, // America/Scoresbysund
+ { 691, 6899, 227169, 14, }, // America/Scoresbysund
{ 691, 8494, 149921, 5, }, // America/Sitka
- { 691, 8508, 227192, 16, }, // America/St_Barthelemy
+ { 691, 8508, 227183, 16, }, // America/St_Barthelemy
{ 691, 2061, 149944, 12, }, // America/St_Johns
- { 691, 5863, 227208, 13, }, // America/St_Kitts
+ { 691, 5863, 227199, 13, }, // America/St_Kitts
{ 691, 5880, 149969, 13, }, // America/St_Lucia
- { 691, 855, 227221, 13, }, // America/St_Thomas
- { 691, 5913, 227234, 17, }, // America/St_Vincent
+ { 691, 855, 227212, 13, }, // America/St_Thomas
+ { 691, 5913, 227225, 17, }, // America/St_Vincent
{ 691, 8530, 150013, 15, }, // America/Swift_Current
{ 691, 5461, 150028, 11, }, // America/Tegucigalpa
- { 691, 5756, 227251, 4, }, // America/Thule
+ { 691, 5756, 227242, 4, }, // America/Thule
{ 691, 313, 150043, 7, }, // America/Tijuana
- { 691, 608, 227255, 5, }, // America/Toronto
- { 691, 5688, 227260, 5, }, // America/Tortola
- { 691, 2093, 227265, 9, }, // America/Vancouver
+ { 691, 608, 227246, 5, }, // America/Toronto
+ { 691, 5688, 227251, 5, }, // America/Tortola
+ { 691, 2093, 227256, 9, }, // America/Vancouver
{ 691, 2144, 150074, 11, }, // America/Whitehorse
{ 691, 734, 150085, 8, }, // America/Winnipeg
{ 691, 8552, 150093, 8, }, // America/Yakutat
- { 691, 6001, 227274, 4, }, // Antarctica/Casey
- { 691, 6094, 227278, 6, }, // Antarctica/Davis
- { 691, 6133, 227284, 19, }, // Antarctica/DumontDUrville
- { 691, 8568, 227303, 7, }, // Antarctica/Macquarie
- { 691, 7066, 227310, 5, }, // Antarctica/Mawson
- { 691, 7113, 227315, 10, }, // Antarctica/McMurdo
- { 691, 8589, 227325, 5, }, // Antarctica/Palmer
- { 691, 7226, 227330, 6, }, // Antarctica/Rothera
+ { 691, 6001, 227265, 4, }, // Antarctica/Casey
+ { 691, 6094, 227269, 6, }, // Antarctica/Davis
+ { 691, 6133, 227275, 19, }, // Antarctica/DumontDUrville
+ { 691, 8568, 227294, 7, }, // Antarctica/Macquarie
+ { 691, 7066, 227301, 5, }, // Antarctica/Mawson
+ { 691, 7113, 227306, 10, }, // Antarctica/McMurdo
+ { 691, 8589, 227316, 5, }, // Antarctica/Palmer
+ { 691, 7226, 227321, 6, }, // Antarctica/Rothera
{ 691, 7295, 150167, 4, }, // Antarctica/Syowa
- { 691, 8607, 227336, 4, }, // Antarctica/Troll
- { 691, 7374, 227340, 7, }, // Antarctica/Vostok
- { 691, 1429, 227347, 10, }, // Arctic/Longyearbyen
+ { 691, 8607, 227327, 4, }, // Antarctica/Troll
+ { 691, 7374, 227331, 7, }, // Antarctica/Vostok
+ { 691, 1429, 227338, 10, }, // Arctic/Longyearbyen
{ 691, 5570, 150199, 6, }, // Asia/Aden
{ 691, 5395, 150205, 6, }, // Asia/Almaty
{ 691, 3968, 150211, 6, }, // Asia/Amman
{ 691, 5511, 150217, 8, }, // Asia/Anadyr
{ 691, 5523, 150225, 5, }, // Asia/Aqtau
- { 691, 5368, 227357, 6, }, // Asia/Aqtobe
- { 691, 964, 227363, 9, }, // Asia/Ashgabat
+ { 691, 5368, 227348, 6, }, // Asia/Aqtobe
+ { 691, 964, 227354, 9, }, // Asia/Ashgabat
{ 691, 8624, 150248, 6, }, // Asia/Atyrau
{ 691, 3607, 150254, 8, }, // Asia/Baghdad
- { 691, 5534, 227372, 6, }, // Asia/Bahrain
+ { 691, 5534, 227363, 6, }, // Asia/Bahrain
{ 691, 3653, 148992, 4, }, // Asia/Baku
{ 691, 4466, 150270, 11, }, // Asia/Bangkok
{ 691, 3571, 150281, 8, }, // Asia/Barnaul
{ 691, 4086, 150289, 7, }, // Asia/Beirut
- { 691, 3778, 227378, 8, }, // Asia/Bishkek
+ { 691, 3778, 227369, 8, }, // Asia/Bishkek
{ 691, 5989, 150304, 7, }, // Asia/Brunei
{ 691, 4601, 150311, 4, }, // Asia/Chita
{ 691, 4511, 150315, 6, }, // Asia/Colombo
@@ -51490,24 +51490,24 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 691, 1093, 150849, 4, }, // Asia/Dhaka
{ 691, 6192, 150334, 6, }, // Asia/Dili
{ 691, 3596, 150340, 5, }, // Asia/Dubai
- { 691, 6159, 227386, 7, }, // Asia/Dushanbe
- { 691, 8636, 227393, 10, }, // Asia/Famagusta
+ { 691, 6159, 227377, 7, }, // Asia/Dushanbe
+ { 691, 8636, 227384, 10, }, // Asia/Famagusta
{ 691, 8651, 150362, 4, }, // Asia/Gaza
{ 691, 4795, 150366, 8, }, // Asia/Hebron
- { 691, 1259, 227403, 15, }, // Asia/Ho_Chi_Minh
+ { 691, 1259, 227394, 15, }, // Asia/Ho_Chi_Minh
{ 691, 2704, 150390, 5, }, // Asia/Hong_Kong
- { 691, 4771, 227418, 6, }, // Asia/Hovd
+ { 691, 4771, 227409, 6, }, // Asia/Hovd
{ 691, 4184, 150401, 8, }, // Asia/Irkutsk
- { 691, 7006, 227424, 7, }, // Asia/Jakarta
+ { 691, 7006, 227415, 7, }, // Asia/Jakarta
{ 691, 6992, 150418, 6, }, // Asia/Jayapura
{ 691, 1290, 150424, 8, }, // Asia/Jerusalem
- { 691, 3560, 227431, 5, }, // Asia/Kabul
+ { 691, 3560, 227422, 5, }, // Asia/Kabul
{ 691, 4316, 150437, 8, }, // Asia/Kamchatka
{ 691, 4239, 150445, 5, }, // Asia/Karachi
- { 691, 1185, 227436, 9, }, // Asia/Kathmandu
- { 691, 8661, 227445, 9, }, // Asia/Khandyga
+ { 691, 1185, 227427, 9, }, // Asia/Kathmandu
+ { 691, 8661, 227436, 9, }, // Asia/Khandyga
{ 691, 992, 150468, 7, }, // Asia/Kolkata
- { 691, 4197, 227454, 12, }, // Asia/Krasnoyarsk
+ { 691, 4197, 227445, 12, }, // Asia/Krasnoyarsk
{ 691, 4859, 150488, 12, }, // Asia/Kuala_Lumpur
{ 691, 5976, 150500, 5, }, // Asia/Kuching
{ 691, 5547, 150505, 4, }, // Asia/Kuwait
@@ -51516,83 +51516,83 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 691, 1349, 150522, 9, }, // Asia/Makassar
{ 691, 7182, 150531, 6, }, // Asia/Manila
{ 691, 6920, 150537, 8, }, // Asia/Muscat
- { 691, 2554, 227466, 6, }, // Asia/Nicosia
- { 691, 8675, 227472, 11, }, // Asia/Novokuznetsk
- { 691, 4135, 227483, 10, }, // Asia/Novosibirsk
+ { 691, 2554, 227457, 6, }, // Asia/Nicosia
+ { 691, 8675, 227463, 11, }, // Asia/Novokuznetsk
+ { 691, 4135, 227474, 10, }, // Asia/Novosibirsk
{ 691, 4229, 150577, 5, }, // Asia/Omsk
- { 691, 7145, 227493, 6, }, // Asia/Oral
- { 691, 6961, 227499, 10, }, // Asia/Phnom_Penh
- { 691, 8693, 227509, 11, }, // Asia/Pontianak
+ { 691, 7145, 227484, 6, }, // Asia/Oral
+ { 691, 6961, 227490, 10, }, // Asia/Phnom_Penh
+ { 691, 8693, 227500, 11, }, // Asia/Pontianak
{ 691, 4214, 150611, 11, }, // Asia/Pyongyang
{ 691, 5559, 150622, 5, }, // Asia/Qatar
- { 691, 8708, 227520, 6, }, // Asia/Qostanay
- { 691, 4269, 227526, 9, }, // Asia/Qyzylorda
+ { 691, 8708, 227511, 6, }, // Asia/Qostanay
+ { 691, 4269, 227517, 9, }, // Asia/Qyzylorda
{ 691, 3584, 150644, 4, }, // Asia/Riyadh
- { 691, 4408, 227535, 7, }, // Asia/Sakhalin
+ { 691, 4408, 227526, 7, }, // Asia/Sakhalin
{ 691, 7245, 150655, 7, }, // Asia/Samarkand
- { 691, 3279, 227542, 4, }, // Asia/Seoul
- { 691, 1053, 227546, 5, }, // Asia/Shanghai
+ { 691, 3279, 227533, 4, }, // Asia/Seoul
+ { 691, 1053, 227537, 5, }, // Asia/Shanghai
{ 691, 3300, 150672, 11, }, // Asia/Singapore
- { 691, 4297, 227551, 14, }, // Asia/Srednekolymsk
+ { 691, 4297, 227542, 14, }, // Asia/Srednekolymsk
{ 691, 3263, 150698, 6, }, // Asia/Taipei
- { 691, 4781, 227565, 8, }, // Asia/Tashkent
+ { 691, 4781, 227556, 8, }, // Asia/Tashkent
{ 691, 3915, 150712, 8, }, // Asia/Tbilisi
{ 691, 2772, 150720, 8, }, // Asia/Tehran
- { 691, 1317, 227573, 6, }, // Asia/Thimphu
- { 691, 2821, 227579, 4, }, // Asia/Tokyo
- { 691, 4572, 227583, 5, }, // Asia/Tomsk
+ { 691, 1317, 227564, 6, }, // Asia/Thimphu
+ { 691, 2821, 227570, 4, }, // Asia/Tokyo
+ { 691, 4572, 227574, 5, }, // Asia/Tomsk
{ 691, 1021, 150745, 12, }, // Asia/Ulaanbaatar
{ 691, 1159, 150757, 6, }, // Asia/Urumqi
- { 691, 8722, 227588, 11, }, // Asia/Ust-Nera
- { 691, 6977, 227599, 11, }, // Asia/Vientiane
- { 691, 4710, 227610, 13, }, // Asia/Vladivostok
+ { 691, 8722, 227579, 11, }, // Asia/Ust-Nera
+ { 691, 6977, 227590, 11, }, // Asia/Vientiane
+ { 691, 4710, 227601, 13, }, // Asia/Vladivostok
{ 691, 4828, 150798, 8, }, // Asia/Yakutsk
{ 691, 1235, 150806, 9, }, // Asia/Yangon
{ 691, 3883, 150815, 14, }, // Asia/Yekaterinburg
- { 691, 3747, 227623, 8, }, // Asia/Yerevan
- { 691, 3663, 227631, 6, }, // Atlantic/Azores
- { 691, 5671, 227637, 6, }, // Atlantic/Bermuda
+ { 691, 3747, 227614, 8, }, // Asia/Yerevan
+ { 691, 3663, 227622, 6, }, // Atlantic/Azores
+ { 691, 5671, 227628, 6, }, // Atlantic/Bermuda
{ 691, 6628, 150851, 6, }, // Atlantic/Canary
- { 691, 3727, 227643, 11, }, // Atlantic/Cape_Verde
- { 691, 1395, 227654, 3, }, // Atlantic/Faroe
+ { 691, 3727, 227634, 11, }, // Atlantic/Cape_Verde
+ { 691, 1395, 227645, 3, }, // Atlantic/Faroe
{ 691, 8736, 150873, 7, }, // Atlantic/Madeira
- { 691, 2748, 227657, 9, }, // Atlantic/Reykjavik
+ { 691, 2748, 227648, 9, }, // Atlantic/Reykjavik
{ 691, 7272, 150890, 13, }, // Atlantic/South_Georgia
{ 691, 6821, 150903, 14, }, // Atlantic/St_Helena
- { 691, 6644, 227666, 8, }, // Atlantic/Stanley
- { 691, 1670, 227674, 7, }, // Australia/Adelaide
- { 691, 1635, 227681, 8, }, // Australia/Brisbane
- { 691, 1799, 227689, 10, }, // Australia/Broken_Hill
- { 691, 1583, 227699, 8, }, // Australia/Darwin
+ { 691, 6644, 227657, 8, }, // Atlantic/Stanley
+ { 691, 1670, 227665, 7, }, // Australia/Adelaide
+ { 691, 1635, 227672, 8, }, // Australia/Brisbane
+ { 691, 1799, 227680, 10, }, // Australia/Broken_Hill
+ { 691, 1583, 227690, 8, }, // Australia/Darwin
{ 691, 3637, 150965, 5, }, // Australia/Eucla
{ 691, 1516, 150970, 7, }, // Australia/Hobart
- { 691, 8753, 227707, 9, }, // Australia/Lindeman
- { 691, 1547, 227716, 10, }, // Australia/Lord_Howe
- { 691, 1727, 227726, 7, }, // Australia/Melbourne
- { 691, 1762, 227733, 4, }, // Australia/Perth
+ { 691, 8753, 227698, 9, }, // Australia/Lindeman
+ { 691, 1547, 227707, 10, }, // Australia/Lord_Howe
+ { 691, 1727, 227717, 7, }, // Australia/Melbourne
+ { 691, 1762, 227724, 4, }, // Australia/Perth
{ 691, 1463, 151017, 5, }, // Australia/Sydney
- { 691, 6441, 227737, 12, }, // Europe/Amsterdam
- { 691, 6216, 227749, 6, }, // Europe/Andorra
- { 691, 3620, 227755, 10, }, // Europe/Astrakhan
- { 691, 2300, 227765, 6, }, // Europe/Athens
- { 691, 6336, 227771, 9, }, // Europe/Belgrade
+ { 691, 6441, 227728, 12, }, // Europe/Amsterdam
+ { 691, 6216, 227740, 6, }, // Europe/Andorra
+ { 691, 3620, 227746, 10, }, // Europe/Astrakhan
+ { 691, 2300, 227756, 6, }, // Europe/Athens
+ { 691, 6336, 227762, 9, }, // Europe/Belgrade
{ 691, 4757, 151065, 7, }, // Europe/Berlin
- { 691, 6488, 227780, 11, }, // Europe/Bratislava
- { 691, 2167, 227791, 10, }, // Europe/Brussels
- { 691, 3928, 227801, 9, }, // Europe/Bucharest
- { 691, 3806, 227810, 9, }, // Europe/Budapest
+ { 691, 6488, 227771, 11, }, // Europe/Bratislava
+ { 691, 2167, 227782, 10, }, // Europe/Brussels
+ { 691, 3928, 227792, 9, }, // Europe/Bucharest
+ { 691, 3806, 227801, 9, }, // Europe/Budapest
{ 691, 8772, 151111, 9, }, // Europe/Busingen
- { 691, 2583, 227819, 7, }, // Europe/Chisinau
- { 691, 6289, 227826, 10, }, // Europe/Copenhagen
+ { 691, 2583, 227810, 7, }, // Europe/Chisinau
+ { 691, 6289, 227817, 10, }, // Europe/Copenhagen
{ 691, 2338, 151137, 6, }, // Europe/Dublin
{ 691, 6307, 151143, 11, }, // Europe/Gibraltar
{ 691, 8788, 151154, 7, }, // Europe/Guernsey
{ 691, 6612, 151161, 8, }, // Europe/Helsinki
- { 691, 8804, 227836, 15, }, // Europe/Isle_of_Man
+ { 691, 8804, 227827, 15, }, // Europe/Isle_of_Man
{ 691, 1130, 151182, 9, }, // Europe/Istanbul
{ 691, 8823, 151191, 5, }, // Europe/Jersey
{ 691, 3979, 151196, 13, }, // Europe/Kaliningrad
- { 691, 8929, 227851, 4, }, // Europe/Kirov
+ { 691, 8929, 227842, 4, }, // Europe/Kirov
{ 691, 2527, 151214, 5, }, // Europe/Kyiv
{ 691, 3213, 151219, 7, }, // Europe/Lisbon
{ 691, 6506, 151226, 10, }, // Europe/Ljubljana
@@ -51600,61 +51600,61 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 691, 6365, 151242, 9, }, // Europe/Luxembourg
{ 691, 4892, 151251, 8, }, // Europe/Madrid
{ 691, 6397, 151259, 5, }, // Europe/Malta
- { 691, 6582, 227855, 9, }, // Europe/Mariehamn
+ { 691, 6582, 227846, 9, }, // Europe/Mariehamn
{ 691, 3693, 151274, 6, }, // Europe/Minsk
- { 691, 6410, 227864, 4, }, // Europe/Monaco
+ { 691, 6410, 227855, 4, }, // Europe/Monaco
{ 691, 3537, 150537, 4, }, // Europe/Moscow
- { 691, 6458, 227868, 4, }, // Europe/Oslo
+ { 691, 6458, 227859, 4, }, // Europe/Oslo
{ 691, 4284, 151295, 6, }, // Europe/Paris
- { 691, 6424, 227872, 7, }, // Europe/Podgorica
+ { 691, 6424, 227863, 7, }, // Europe/Podgorica
{ 691, 6275, 151310, 6, }, // Europe/Prague
{ 691, 8837, 151316, 4, }, // Europe/Riga
- { 691, 6324, 227879, 3, }, // Europe/Rome
+ { 691, 6324, 227870, 3, }, // Europe/Rome
{ 691, 4331, 151324, 6, }, // Europe/Samara
{ 691, 6470, 151330, 11, }, // Europe/San_Marino
- { 691, 6245, 227882, 7, }, // Europe/Sarajevo
- { 691, 4451, 227889, 7, }, // Europe/Saratov
- { 691, 8849, 227896, 9, }, // Europe/Simferopol
- { 691, 6383, 227905, 6, }, // Europe/Skopje
- { 691, 6599, 227911, 5, }, // Europe/Sofia
- { 691, 6523, 227916, 10, }, // Europe/Stockholm
+ { 691, 6245, 227873, 7, }, // Europe/Sarajevo
+ { 691, 4451, 227880, 7, }, // Europe/Saratov
+ { 691, 8849, 227887, 9, }, // Europe/Simferopol
+ { 691, 6383, 227896, 6, }, // Europe/Skopje
+ { 691, 6599, 227902, 5, }, // Europe/Sofia
+ { 691, 6523, 227907, 10, }, // Europe/Stockholm
{ 691, 8867, 151389, 7, }, // Europe/Tallinn
- { 691, 6202, 227926, 7, }, // Europe/Tirane
- { 691, 8882, 227933, 10, }, // Europe/Ulyanovsk
- { 691, 6352, 227943, 5, }, // Europe/Vaduz
- { 691, 6567, 227948, 8, }, // Europe/Vatican
- { 691, 6231, 227956, 5, }, // Europe/Vienna
- { 691, 8899, 227961, 8, }, // Europe/Vilnius
- { 691, 4727, 227969, 9, }, // Europe/Volgograd
+ { 691, 6202, 227917, 7, }, // Europe/Tirane
+ { 691, 8882, 227924, 10, }, // Europe/Ulyanovsk
+ { 691, 6352, 227934, 5, }, // Europe/Vaduz
+ { 691, 6567, 227939, 8, }, // Europe/Vatican
+ { 691, 6231, 227947, 5, }, // Europe/Vienna
+ { 691, 8899, 227952, 8, }, // Europe/Vilnius
+ { 691, 4727, 227960, 9, }, // Europe/Volgograd
{ 691, 3190, 151450, 6, }, // Europe/Warsaw
{ 691, 6261, 151456, 8, }, // Europe/Zagreb
{ 691, 6540, 151464, 6, }, // Europe/Zurich
{ 691, 5078, 151470, 12, }, // Indian/Antananarivo
{ 691, 6947, 151483, 7, }, // Indian/Chagos
- { 691, 6046, 227978, 12, }, // Indian/Christmas
- { 691, 6063, 227990, 5, }, // Indian/Cocos
- { 691, 5029, 227995, 3, }, // Indian/Comoro
- { 691, 6661, 227998, 8, }, // Indian/Kerguelen
+ { 691, 6046, 227969, 12, }, // Indian/Christmas
+ { 691, 6063, 227981, 5, }, // Indian/Cocos
+ { 691, 5029, 227986, 3, }, // Indian/Comoro
+ { 691, 6661, 227989, 8, }, // Indian/Kerguelen
{ 691, 7260, 151522, 4, }, // Indian/Mahe
{ 691, 7050, 151526, 8, }, // Indian/Maldives
- { 691, 4069, 228006, 6, }, // Indian/Mauritius
- { 691, 5098, 228012, 5, }, // Indian/Mayotte
+ { 691, 4069, 227997, 6, }, // Indian/Mauritius
+ { 691, 5098, 228003, 5, }, // Indian/Mayotte
{ 691, 7211, 151547, 10, }, // Indian/Reunion
{ 691, 4422, 151557, 4, }, // Pacific/Apia
{ 691, 932, 151561, 7, }, // Pacific/Auckland
- { 691, 3706, 228017, 12, }, // Pacific/Bougainville
- { 691, 3015, 228029, 7, }, // Pacific/Chatham
+ { 691, 3706, 228008, 12, }, // Pacific/Bougainville
+ { 691, 3015, 228020, 7, }, // Pacific/Chatham
{ 691, 3157, 151588, 5, }, // Pacific/Chuuk
{ 691, 2237, 151593, 7, }, // Pacific/Easter
{ 691, 7360, 151600, 6, }, // Pacific/Efate
- { 691, 7327, 228036, 5, }, // Pacific/Fakaofo
- { 691, 3902, 228041, 4, }, // Pacific/Fiji
+ { 691, 7327, 228027, 5, }, // Pacific/Fakaofo
+ { 691, 3902, 228032, 4, }, // Pacific/Fiji
{ 691, 7343, 151617, 8, }, // Pacific/Funafuti
- { 691, 6678, 228045, 8, }, // Pacific/Galapagos
+ { 691, 6678, 228036, 8, }, // Pacific/Galapagos
{ 691, 6696, 151634, 10, }, // Pacific/Gambier
{ 691, 3822, 151644, 11, }, // Pacific/Guadalcanal
{ 691, 6018, 149477, 4, }, // Pacific/Guam
- { 691, 3049, 228053, 6, }, // Pacific/Kanton
+ { 691, 3049, 228044, 6, }, // Pacific/Kanton
{ 691, 3998, 151673, 10, }, // Pacific/Kiritimati
{ 691, 7019, 151683, 6, }, // Pacific/Kosrae
{ 691, 2842, 151689, 11, }, // Pacific/Kwajalein
@@ -51663,18 +51663,18 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 691, 8914, 151719, 7, }, // Pacific/Midway
{ 691, 7084, 151726, 5, }, // Pacific/Nauru
{ 691, 7132, 151731, 4, }, // Pacific/Niue
- { 691, 4168, 228059, 6, }, // Pacific/Norfolk
- { 691, 7098, 228065, 5, }, // Pacific/Noumea
+ { 691, 4168, 228050, 6, }, // Pacific/Norfolk
+ { 691, 7098, 228056, 5, }, // Pacific/Noumea
{ 691, 3126, 151747, 9, }, // Pacific/Pago_Pago
{ 691, 7155, 151756, 5, }, // Pacific/Palau
{ 691, 7194, 151761, 10, }, // Pacific/Pitcairn
- { 691, 3096, 228070, 6, }, // Pacific/Pohnpei
- { 691, 4807, 228076, 13, }, // Pacific/Port_Moresby
- { 691, 6076, 228089, 8, }, // Pacific/Rarotonga
+ { 691, 3096, 228061, 6, }, // Pacific/Pohnpei
+ { 691, 4807, 228067, 13, }, // Pacific/Port_Moresby
+ { 691, 6076, 228080, 8, }, // Pacific/Rarotonga
{ 691, 6031, 151803, 7, }, // Pacific/Saipan
{ 691, 7312, 151810, 6, }, // Pacific/Tahiti
{ 691, 6712, 151816, 5, }, // Pacific/Tarawa
- { 691, 4583, 228097, 9, }, // Pacific/Tongatapu
+ { 691, 4583, 228088, 9, }, // Pacific/Tongatapu
{ 691, 7392, 151831, 4, }, // Pacific/Wake
{ 691, 7405, 151835, 7, }, // Pacific/Wallis
{ 692, 6788, 186476, 9, }, // Africa/Abidjan Kuvi/Telugu/India
@@ -51731,7 +51731,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 692, 4152, 186868, 9, }, // Africa/Windhoek
{ 692, 132, 186877, 5, }, // America/Adak
{ 692, 3346, 186882, 8, }, // America/Anchorage
- { 692, 5607, 228106, 10, }, // America/Anguilla
+ { 692, 5607, 228097, 10, }, // America/Anguilla
{ 692, 5624, 186900, 8, }, // America/Antigua
{ 692, 4554, 186908, 11, }, // America/Araguaina
{ 692, 166, 186919, 16, }, // America/Argentina/Buenos_Aires
@@ -51975,7 +51975,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 692, 7272, 189115, 15, }, // Atlantic/South_Georgia
{ 692, 6821, 189130, 14, }, // Atlantic/St_Helena
{ 692, 6644, 189144, 8, }, // Atlantic/Stanley
- { 692, 1670, 228116, 36, }, // Australia/Adelaide
+ { 692, 1670, 228107, 36, }, // Australia/Adelaide
{ 692, 1635, 189159, 13, }, // Australia/Brisbane
{ 692, 1799, 189172, 13, }, // Australia/Broken_Hill
{ 692, 1583, 189185, 8, }, // Australia/Darwin
@@ -52069,7 +52069,7 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 692, 6696, 189891, 9, }, // Pacific/Gambier
{ 692, 3822, 189900, 13, }, // Pacific/Guadalcanal
{ 692, 6018, 189913, 6, }, // Pacific/Guam
- { 692, 3049, 228152, 6, }, // Pacific/Kanton
+ { 692, 3049, 228143, 6, }, // Pacific/Kanton
{ 692, 3998, 189936, 10, }, // Pacific/Kiritimati
{ 692, 7019, 189946, 6, }, // Pacific/Kosrae
{ 692, 2842, 189952, 10, }, // Pacific/Kwajalein
@@ -52137,12 +52137,12 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 695, 14, 0, 6, }, // Africa/Asmara Swampy Cree/Canadian Aboriginal/Canada
{ 695, 4435, 6, 8, }, // Africa/Sao_Tome
{ 695, 4252, 14, 8, }, // America/Asuncion
- { 695, 237, 228158, 6, }, // America/Atikokan
+ { 695, 237, 228149, 6, }, // America/Atikokan
{ 695, 7623, 30, 17, }, // America/Bahia_Banderas
{ 695, 3868, 47, 6, }, // America/Cancun
{ 695, 7774, 53, 13, }, // America/Ciudad_Juarez
{ 695, 5723, 66, 7, }, // America/Curacao
- { 695, 893, 228164, 6, }, // America/Edmonton
+ { 695, 893, 228155, 6, }, // America/Edmonton
{ 695, 481, 73, 13, }, // America/Indiana/Knox
{ 695, 7961, 86, 16, }, // America/Indiana/Marengo
{ 695, 7985, 102, 19, }, // America/Indiana/Petersburg
@@ -52150,8 +52150,8 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 695, 8038, 139, 14, }, // America/Indiana/Vevay
{ 695, 8060, 153, 18, }, // America/Indiana/Vincennes
{ 695, 8086, 171, 16, }, // America/Indiana/Winamac
- { 695, 8110, 228170, 4, }, // America/Inuvik
- { 695, 660, 228174, 6, }, // America/Iqaluit
+ { 695, 8110, 228161, 4, }, // America/Inuvik
+ { 695, 660, 228165, 6, }, // America/Iqaluit
{ 695, 8125, 187, 20, }, // America/Kentucky/Monticello
{ 695, 5932, 207, 22, }, // America/Lower_Princes
{ 695, 8220, 229, 6, }, // America/Merida
@@ -52167,8 +52167,8 @@ static inline constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {
{ 695, 5880, 370, 9, }, // America/St_Lucia
{ 695, 855, 379, 10, }, // America/St_Thomas
{ 695, 5913, 389, 11, }, // America/St_Vincent
- { 695, 8530, 228180, 7, }, // America/Swift_Current
- { 695, 734, 228187, 4, }, // America/Winnipeg
+ { 695, 8530, 228171, 7, }, // America/Swift_Current
+ { 695, 734, 228178, 4, }, // America/Winnipeg
{ 695, 6133, 400, 16, }, // Antarctica/DumontDUrville
{ 695, 1259, 432, 11, }, // Asia/Ho_Chi_Minh
{ 695, 1185, 448, 9, }, // Asia/Kathmandu
@@ -102034,603 +102034,603 @@ static inline constexpr char16_t exemplarCityTable[] = {
0x62, 0x69, 0x69, 0x52, 0x61, 0x72, 0x6f, 0x74, 0x254, 0x14b, 0x67, 0x61,
0x53, 0x61, 0x269, 0x70, 0x61, 0x6e, 0x54, 0x61, 0x72, 0x61, 0x77, 0x61,
0x61, 0x54, 0x254, 0x14b, 0x67, 0x61, 0x74, 0x61, 0x70, 0x75, 0x75, 0x57,
-0x65, 0x65, 0x6b, 0x905, 0x932, 0x20, 0x906, 0x907, 0x92f, 0x942, 0x928, 0x3c,
-0x92e, 0x91c, 0x93c, 0x93e, 0x91f, 0x932, 0x93e, 0x928, 0x921, 0x92c, 0x908, 0x915,
-0x93e, 0x92c, 0x932, 0x926, 0x916, 0x923, 0x940, 0x20, 0x91c, 0x949, 0x930, 0x94d,
-0x91c, 0x93f, 0x92f, 0x93e, 0x90f, 0x92e, 0x94d, 0x938, 0x94d, 0x91f, 0x930, 0x921,
-0x92e, 0x92a, 0x948, 0x930, 0x938, 0x915, 0x94d, 0x930, 0x93f, 0x938, 0x92e, 0x93f,
-0x938, 0x915, 0x948, 0x902, 0x91f, 0x928, 0x92a, 0x93e, 0x917, 0x94b, 0x20, 0x917,
-0x902, 0x917, 0x94b, 0x41, 0x6c, 0x6a, 0x65, 0x72, 0x69, 0x41, 0x7a, 0x6d,
-0x61, 0x72, 0x61, 0x42, 0x61, 0x6e, 0x67, 0x68, 0xec, 0x42, 0x69, 0x73,
-0xe0, 0x6f, 0x42, 0x75, 0x6a, 0x75, 0x6e, 0x62, 0x75, 0x72, 0x61, 0x43,
-0x61, 0x7a, 0x61, 0x62, 0x6c, 0x61, 0x6e, 0x63, 0x61, 0x4b, 0x61, 0x6e,
-0x70, 0x61, 0x6c, 0x61, 0x4c, 0x75, 0x62, 0x75, 0x6e, 0x62, 0x61, 0x73,
-0x68, 0x69, 0x4d, 0x61, 0x7a, 0x65, 0x72, 0x75, 0x4e, 0x62, 0x61, 0x62,
-0x61, 0x6e, 0x65, 0x4d, 0x6f, 0x67, 0x61, 0x64, 0x69, 0x73, 0x6f, 0x55,
-0x61, 0x67, 0x61, 0x64, 0x75, 0x67, 0xf9, 0xcc, 0x7a, 0x6f, 0x6c, 0x61,
-0x20, 0x53, 0x2e, 0x20, 0x54, 0x6f, 0x6d, 0x61, 0x7a, 0x6f, 0x54, 0xf9,
-0x6e, 0x65, 0x7a, 0x69, 0x43, 0xf2, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x52,
-0x69, 0x6f, 0x20, 0x47, 0xe0, 0x6c, 0x65, 0x67, 0x6f, 0x73, 0x42, 0x61,
-0x69, 0x61, 0x20, 0x64, 0x65, 0x20, 0x42, 0x61, 0x6e, 0x64, 0x65, 0x72,
-0x61, 0x73, 0x43, 0x61, 0x6e, 0x70, 0x6f, 0x20, 0x47, 0x72, 0x61, 0x6e,
-0x64, 0x65, 0x43, 0x75, 0x69, 0x61, 0x62, 0xe0, 0x44, 0xe8, 0x6e, 0x76,
-0x65, 0x72, 0x44, 0x6f, 0x6d, 0xe9, 0x6e, 0x65, 0x67, 0x61, 0x49, 0x6e,
-0x64, 0x69, 0x61, 0x6e, 0xe0, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x4b, 0x6e,
-0x6f, 0x78, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x29,
-0x4d, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x6f, 0x20, 0x28, 0x49, 0x6e, 0x64,
-0x69, 0x61, 0x6e, 0x61, 0x29, 0x50, 0x65, 0x74, 0x65, 0x72, 0x73, 0x62,
-0x75, 0x72, 0x67, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61,
-0x29, 0x54, 0x65, 0x6c, 0x6c, 0x20, 0x43, 0x69, 0x74, 0x79, 0x20, 0x28,
-0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, 0x56, 0x65, 0x76, 0x61,
+0x65, 0x65, 0x6b, 0x92e, 0x91c, 0x93c, 0x93e, 0x91f, 0x932, 0x93e, 0x928, 0x921,
+0x92c, 0x908, 0x915, 0x93e, 0x92c, 0x932, 0x926, 0x916, 0x923, 0x940, 0x20, 0x91c,
+0x949, 0x930, 0x94d, 0x91c, 0x93f, 0x92f, 0x93e, 0x90f, 0x92e, 0x94d, 0x938, 0x94d,
+0x91f, 0x930, 0x921, 0x92e, 0x92a, 0x948, 0x930, 0x938, 0x915, 0x94d, 0x930, 0x93f,
+0x938, 0x92e, 0x93f, 0x938, 0x915, 0x948, 0x902, 0x91f, 0x928, 0x92a, 0x93e, 0x917,
+0x94b, 0x20, 0x917, 0x902, 0x917, 0x94b, 0x41, 0x6c, 0x6a, 0x65, 0x72, 0x69,
+0x41, 0x7a, 0x6d, 0x61, 0x72, 0x61, 0x42, 0x61, 0x6e, 0x67, 0x68, 0xec,
+0x42, 0x69, 0x73, 0xe0, 0x6f, 0x42, 0x75, 0x6a, 0x75, 0x6e, 0x62, 0x75,
+0x72, 0x61, 0x43, 0x61, 0x7a, 0x61, 0x62, 0x6c, 0x61, 0x6e, 0x63, 0x61,
+0x4b, 0x61, 0x6e, 0x70, 0x61, 0x6c, 0x61, 0x4c, 0x75, 0x62, 0x75, 0x6e,
+0x62, 0x61, 0x73, 0x68, 0x69, 0x4d, 0x61, 0x7a, 0x65, 0x72, 0x75, 0x4e,
+0x62, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x4d, 0x6f, 0x67, 0x61, 0x64, 0x69,
+0x73, 0x6f, 0x55, 0x61, 0x67, 0x61, 0x64, 0x75, 0x67, 0xf9, 0xcc, 0x7a,
+0x6f, 0x6c, 0x61, 0x20, 0x53, 0x2e, 0x20, 0x54, 0x6f, 0x6d, 0x61, 0x7a,
+0x6f, 0x54, 0xf9, 0x6e, 0x65, 0x7a, 0x69, 0x43, 0xf2, 0x72, 0x64, 0x6f,
+0x62, 0x61, 0x52, 0x69, 0x6f, 0x20, 0x47, 0xe0, 0x6c, 0x65, 0x67, 0x6f,
+0x73, 0x42, 0x61, 0x69, 0x61, 0x20, 0x64, 0x65, 0x20, 0x42, 0x61, 0x6e,
+0x64, 0x65, 0x72, 0x61, 0x73, 0x43, 0x61, 0x6e, 0x70, 0x6f, 0x20, 0x47,
+0x72, 0x61, 0x6e, 0x64, 0x65, 0x43, 0x75, 0x69, 0x61, 0x62, 0xe0, 0x44,
+0xe8, 0x6e, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x6d, 0xe9, 0x6e, 0x65, 0x67,
+0x61, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0xe0, 0x70, 0x6f, 0x6c, 0x69,
+0x73, 0x4b, 0x6e, 0x6f, 0x78, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61,
+0x6e, 0x61, 0x29, 0x4d, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x6f, 0x20, 0x28,
+0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, 0x50, 0x65, 0x74, 0x65,
+0x72, 0x73, 0x62, 0x75, 0x72, 0x67, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69,
+0x61, 0x6e, 0x61, 0x29, 0x54, 0x65, 0x6c, 0x6c, 0x20, 0x43, 0x69, 0x74,
0x79, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, 0x56,
-0x69, 0x6e, 0x63, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x20, 0x28, 0x49, 0x6e,
-0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, 0x57, 0x69, 0x6e, 0x61, 0x6d, 0x61,
-0x63, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, 0x4a,
-0x61, 0x6d, 0xe0, 0x65, 0x67, 0x61, 0x4d, 0x6f, 0x6e, 0x74, 0x69, 0x63,
-0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x28, 0x4b, 0x65, 0x6e, 0x74, 0x75, 0x63,
-0x6b, 0x79, 0x29, 0x4c, 0x6f, 0x73, 0x20, 0xc0, 0x6e, 0x67, 0x65, 0x6c,
-0x65, 0x73, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x67, 0x61, 0x53,
-0x69, 0x74, 0xe0, 0x20, 0x64, 0x65, 0x2019, 0x6c, 0x20, 0x4d, 0xe8, 0x73,
-0x65, 0x67, 0x6f, 0x4d, 0x69, 0x63, 0x68, 0x65, 0x6c, 0x6f, 0x6e, 0x42,
-0x65, 0x75, 0x6c, 0x61, 0x68, 0x20, 0x28, 0x4e, 0x6f, 0x72, 0x64, 0x20,
-0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x29, 0x43, 0x65, 0x6e, 0x74, 0x65,
-0x72, 0x20, 0x28, 0x4e, 0x6f, 0x72, 0x64, 0x20, 0x44, 0x61, 0x6b, 0x6f,
-0x74, 0x61, 0x29, 0x4e, 0x65, 0x77, 0x20, 0x53, 0x61, 0x6c, 0x65, 0x6d,
-0x20, 0x28, 0x4e, 0x6f, 0x72, 0x64, 0x20, 0x44, 0x61, 0x6b, 0x6f, 0x74,
-0x61, 0x29, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x20, 0x50, 0x72, 0xec, 0x6e,
-0x73, 0x69, 0x70, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x20, 0x64, 0x65,
-0x20, 0x53, 0x70, 0x61, 0x67, 0x6e, 0x61, 0x53, 0x61, 0x6e, 0x20, 0x50,
-0x6f, 0x6c, 0x6f, 0x53, 0x2e, 0x20, 0x42, 0x61, 0x72, 0x74, 0x6f, 0x6c,
-0x6f, 0x6d, 0xe8, 0x6f, 0x53, 0x2e, 0x20, 0x4a, 0x6f, 0x61, 0x6e, 0x69,
-0x53, 0x2e, 0x20, 0x43, 0x72, 0x69, 0x73, 0x74, 0x6f, 0x66, 0x65, 0x72,
-0x53, 0x2e, 0x20, 0x4c, 0x75, 0x73, 0xec, 0x61, 0x53, 0x2e, 0x20, 0x56,
-0x69, 0x6e, 0x63, 0x65, 0x6e, 0x73, 0x6f, 0xcc, 0x7a, 0x6f, 0x6c, 0x61,
-0x20, 0x4d, 0x61, 0x63, 0x71, 0x75, 0x61, 0x72, 0x69, 0x65, 0x41, 0x6e,
-0xe0, 0x64, 0x79, 0x72, 0x41, 0x6b, 0x74, 0xe0, 0x75, 0x41, 0x7a, 0x67,
-0x61, 0x62, 0x61, 0x64, 0x41, 0x74, 0x79, 0x72, 0xe0, 0x75, 0x43, 0x6f,
-0x6c, 0x6f, 0x6e, 0x62, 0x6f, 0x44, 0x75, 0x62, 0xe0, 0x69, 0x44, 0x75,
-0x73, 0x61, 0x6e, 0x62, 0xe9, 0x4b, 0x61, 0x74, 0x6d, 0x61, 0x6e, 0x64,
-0xf9, 0x48, 0xe0, 0x6e, 0x64, 0x69, 0x67, 0x61, 0x4b, 0x72, 0x61, 0x7a,
-0x6e, 0x61, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x4b, 0x75, 0x61, 0x6c, 0x61,
-0x20, 0x4c, 0x75, 0x6e, 0x70, 0x75, 0x72, 0x4d, 0x61, 0x63, 0xe0, 0x6f,
-0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, 0x7a, 0x6e, 0x69, 0x65, 0x74, 0x73,
-0x6b, 0x4b, 0x6f, 0x73, 0x74, 0x61, 0x6e, 0xe0, 0x69, 0x53, 0x68, 0x61,
-0x6e, 0x67, 0x68, 0xe0, 0x69, 0x5a, 0x72, 0xe9, 0x64, 0x6e, 0x65, 0x6b,
-0x6f, 0x6c, 0x69, 0x6d, 0x73, 0x6b, 0x54, 0x69, 0x6e, 0x70, 0x75, 0x55,
-0x6c, 0x61, 0x6e, 0x20, 0x42, 0xe0, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x74,
-0x2d, 0x47, 0x6e, 0x65, 0x72, 0x61, 0x59, 0x65, 0x6b, 0x61, 0x74, 0x65,
-0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x6f, 0x4a, 0xe8, 0x72, 0x65,
-0x76, 0x61, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x41, 0x7a, 0x6f,
-0x72, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x61, 0x6e, 0x61,
-0x72, 0x69, 0x65, 0x43, 0x61, 0x6f, 0x20, 0x56, 0x65, 0x72, 0x64, 0x6f,
-0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x46, 0xe0, 0x72, 0x6f, 0x65, 0xcc,
-0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4d, 0x61, 0x64, 0xe8, 0x69, 0x72, 0x61,
-0x52, 0x65, 0x6b, 0x69, 0x61, 0x76, 0x69, 0x6b, 0x47, 0x65, 0x6f, 0x72,
-0x67, 0x69, 0x61, 0x20, 0x64, 0x65, 0x2019, 0x6c, 0x20, 0x73, 0x75, 0x64,
-0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x53, 0x2e, 0x20, 0x45, 0x6c, 0x65,
-0x6e, 0x61, 0x41, 0x64, 0x65, 0x6c, 0xe0, 0x69, 0x64, 0x65, 0x42, 0x72,
-0x69, 0x7a, 0x62, 0x61, 0x6e, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20,
-0x4c, 0x6f, 0x72, 0x64, 0x20, 0x48, 0x6f, 0x77, 0x65, 0xc0, 0x6d, 0x73,
-0x74, 0x65, 0x72, 0x64, 0x61, 0x6d, 0x42, 0x72, 0x61, 0x74, 0x69, 0x7a,
-0x6c, 0x61, 0x76, 0x61, 0x4a, 0x69, 0x62, 0x69, 0x6c, 0x74, 0x65, 0x72,
-0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x61,
-0x6e, 0x4c, 0x75, 0x62, 0x6c, 0x69, 0x61, 0x6e, 0x61, 0x4c, 0x75, 0x73,
-0x65, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x6f, 0x4f, 0x7a, 0x6c, 0x6f, 0x50,
-0x61, 0x72, 0x69, 0x6a, 0x69, 0x53, 0x69, 0x6e, 0x66, 0x65, 0x72, 0xf2,
-0x70, 0x6f, 0x6c, 0x69, 0x53, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x6d, 0x61,
-0x55, 0x6c, 0x69, 0xe0, 0x6e, 0x6f, 0x73, 0x6b, 0x56, 0x61, 0x74, 0x65,
-0x67, 0x61, 0x6e, 0x43, 0x69, 0x61, 0x67, 0x6f, 0x73, 0xcc, 0x7a, 0x6f,
-0x6c, 0x61, 0x20, 0x64, 0x65, 0x20, 0x4e, 0x61, 0x64, 0x61, 0x6c, 0x65,
-0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0xcc,
-0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x65, 0xcc,
-0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x64, 0x69, 0x76, 0x65,
-0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x73,
-0x69, 0x6f, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x69, 0x6f,
-0x74, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x52, 0x65, 0x75, 0x6e,
-0x69, 0x6f, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x42, 0x6f, 0x75,
-0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0xcc, 0x7a, 0x6f,
-0x6c, 0x65, 0x20, 0x43, 0x69, 0x61, 0x74, 0x65, 0x6d, 0xcc, 0x7a, 0x6f,
-0x6c, 0x65, 0x20, 0x43, 0x68, 0x75, 0x75, 0x6b, 0xcc, 0x7a, 0x6f, 0x6c,
-0x61, 0x20, 0x64, 0x65, 0x20, 0x50, 0x61, 0x73, 0x63, 0x75, 0x61, 0xcc,
-0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x45, 0x66, 0x61, 0x74, 0x65, 0x41, 0x74,
-0x6f, 0x6c, 0x6f, 0x20, 0x46, 0x61, 0x6b, 0x61, 0x6f, 0x66, 0x6f, 0x41,
-0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x46, 0x75, 0x6e, 0x61, 0x66, 0x75, 0x74,
-0x69, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x47, 0x61, 0x6d, 0x62, 0x69,
-0x65, 0x72, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x47, 0x75, 0x61, 0x64,
-0x61, 0x6c, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x41, 0x74, 0x6f, 0x6c, 0x6f,
-0x20, 0x43, 0x61, 0x6e, 0x74, 0x6f, 0x6e, 0x41, 0x74, 0x6f, 0x6c, 0x6f,
-0x20, 0x4b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x69, 0xcc,
-0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4b, 0x6f, 0x73, 0x72, 0x61, 0x65, 0x41,
-0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x4b, 0x77, 0x61, 0x6a, 0x61, 0x6c, 0x65,
-0x69, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x72, 0x63,
-0x68, 0x65, 0x7a, 0x69, 0x41, 0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x4d, 0x69,
-0x64, 0x77, 0x61, 0x79, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4e, 0x61,
-0x75, 0x72, 0x75, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4e, 0x69, 0x75,
-0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4e, 0x6f, 0x72, 0x66, 0x6f,
-0x6c, 0x6b, 0x50, 0x61, 0x6c, 0xe0, 0x75, 0xcc, 0x7a, 0x6f, 0x6c, 0x61,
-0x20, 0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0xcc, 0x7a, 0x6f,
-0x6c, 0x61, 0x20, 0x50, 0x6f, 0x6e, 0x70, 0xe8, 0x69, 0x50, 0x6f, 0x72,
-0x74, 0x6f, 0x20, 0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 0xcc, 0x7a,
-0x6f, 0x6c, 0x61, 0x20, 0x52, 0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67,
-0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x53, 0x61, 0x69, 0x70, 0xe0,
-0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x54, 0x61, 0x69, 0x74, 0x69,
-0x41, 0x74, 0x6f, 0x6c, 0x6c, 0x6f, 0x20, 0x54, 0x61, 0x72, 0x61, 0x77,
-0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x54, 0x6f, 0x6e, 0x67, 0x61,
-0x74, 0x61, 0x70, 0x75, 0x41, 0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x57, 0x61,
-0x6b, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x57, 0x61, 0x6c, 0x6c,
-0x69, 0x73, 0x61, 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e, 0x65, 0x63, 0x72,
-0x61, 0x61, 0x1e0d, 0x69, 0x73, 0x20, 0x61, 0x62, 0x61, 0x62, 0x61, 0x61,
-0x6c, 0x6a, 0x12b, 0x79, 0x72, 0x73, 0x61, 0x73, 0x6d, 0x61, 0x72, 0x61,
-0x62, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x62, 0x61, 0x6e, 0x67, 0x75, 0x69,
-0x62, 0x61, 0x6e, 0x6a, 0x75, 0x6c, 0x62, 0x69, 0x73, 0x73, 0x61, 0x75,
-0x62, 0x6c, 0x61, 0x6e, 0x1e6d, 0x61, 0x65, 0x72, 0x62, 0x72, 0x61, 0x6a,
-0x61, 0x76, 0x69, 0x6c, 0x6c, 0x62, 0x75, 0x6a, 0x75, 0x6d, 0x62, 0x75,
-0x72, 0x61, 0x6b, 0x61, 0x69, 0x72, 0x6f, 0x6b, 0x61, 0x73, 0x61, 0x62,
-0x6c, 0x61, 0x6e, 0x6b, 0x61, 0x73, 0x65, 0x75, 0x1e6d, 0x61, 0x6b, 0x6f,
-0x6e, 0x61, 0x6b, 0x72, 0x12b, 0x1e0d, 0x6b, 0x61, 0x72, 0x64, 0x61, 0x72,
-0x20, 0x65, 0x73, 0x20, 0x73, 0x61, 0x6c, 0x61, 0x61, 0x6d, 0x64, 0x75,
-0x61, 0x6c, 0x61, 0x65, 0x6c, 0x20, 0x61, 0x61, 0x69, 0x79, 0x75, 0x6e,
-0x70, 0x72, 0x12b, 0x1e6d, 0x61, 0x75, 0x6e, 0x67, 0x61, 0x62, 0x6f, 0x72,
-0x6f, 0x6e, 0x68, 0x72, 0x61, 0x72, 0x65, 0x6a, 0x6f, 0x68, 0x61, 0x6e,
-0x6e, 0x65, 0x73, 0x62, 0x75, 0x72, 0x67, 0x6a, 0x75, 0x62, 0x61, 0x6b,
-0x6d, 0x70, 0x61, 0x6c, 0x61, 0x6b, 0x61, 0x72, 0x1e6d, 0x6f, 0x75, 0x6d,
-0x6b, 0x69, 0x67, 0x61, 0x6c, 0x69, 0x6b, 0x69, 0x6e, 0x73, 0x61, 0x73,
-0x61, 0x6c, 0x61, 0x67, 0x6f, 0x73, 0x6c, 0x69, 0x62, 0x72, 0x65, 0x76,
-0x69, 0x6c, 0x6c, 0x6c, 0x75, 0x61, 0x6e, 0x1e0d, 0x61, 0x6c, 0x75, 0x62,
-0x75, 0x6d, 0x62, 0x61, 0x73, 0x69, 0x6c, 0x75, 0x73, 0x61, 0x6b, 0x61,
-0x6d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x6d, 0x61, 0x70, 0x75, 0x1e6d, 0x75,
-0x6d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x6d, 0x62, 0x61, 0x62, 0x61, 0x6e,
-0x65, 0x6d, 0x6f, 0x67, 0x61, 0x1e0d, 0x69, 0x73, 0x75, 0x6d, 0x6f, 0x6e,
-0x72, 0x6f, 0x76, 0x69, 0x61, 0x6e, 0x61, 0x69, 0x72, 0x6f, 0x62, 0x69,
-0x6e, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x6d,
-0x65, 0x6e, 0x75, 0x65, 0x6b, 0x73, 0x61, 0x76, 0x61, 0x67, 0x64, 0x75,
-0x67, 0x75, 0x70, 0x6f, 0x72, 0x1e6d, 0x6f, 0x2d, 0x1e47, 0x6f, 0x76, 0x6f,
-0x73, 0x61, 0x6f, 0x20, 0x1e6d, 0x6f, 0x6d, 0x74, 0x72, 0x69, 0x70, 0x6f,
-0x6c, 0x69, 0x1e6d, 0x75, 0x6e, 0x69, 0x73, 0x76, 0x69, 0x6e, 0x64, 0x68,
-0x75, 0x6b, 0x61, 0x1e0d, 0x61, 0x6b, 0x61, 0x6e, 0x6b, 0x6f, 0x72, 0x61,
-0x6a, 0x65, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61, 0x65, 0x6e, 0x1e6d,
-0x69, 0x67, 0x75, 0x61, 0x61, 0x72, 0x61, 0x67, 0x76, 0x61, 0x69, 0x6e,
-0x61, 0x62, 0x75, 0x65, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x61, 0x69, 0x72,
-0x65, 0x73, 0x6b, 0x61, 0x74, 0x61, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x6b,
-0x6f, 0x72, 0x1e0d, 0x61, 0x62, 0x61, 0x68, 0x75, 0x68, 0x75, 0x65, 0x6c,
-0x61, 0x20, 0x72, 0x69, 0x6f, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x1e0d, 0x6f,
-0x6a, 0x61, 0x72, 0x69, 0x79, 0x6f, 0x20, 0x67, 0x61, 0x6c, 0x6c, 0x65,
-0x67, 0x6f, 0x73, 0x73, 0x61, 0x6c, 0x1e6d, 0x61, 0x73, 0x61, 0x6e, 0x20,
-0x68, 0x75, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x20, 0x6c, 0x75, 0x69, 0x73,
-0x1e6d, 0x75, 0x6b, 0x16b, 0x6d, 0x6e, 0x75, 0x73, 0x76, 0x61, 0x69, 0x79,
-0x61, 0x61, 0x72, 0x75, 0x62, 0x61, 0x65, 0x73, 0x75, 0x6e, 0x73, 0x69,
-0x6f, 0x6e, 0x65, 0x1e6d, 0x69, 0x6b, 0x6f, 0x6b, 0x65, 0x6e, 0x62, 0x61,
-0x68, 0x69, 0x61, 0x62, 0x61, 0x69, 0x61, 0x20, 0x62, 0x61, 0x6e, 0x1e0d,
-0x65, 0x72, 0x61, 0x73, 0x62, 0x61, 0x72, 0x62, 0x61, 0x1e0d, 0x6f, 0x73,
-0x62, 0x65, 0x6c, 0x65, 0x6d, 0x62, 0x65, 0x6c, 0x69, 0x6a, 0x62, 0x6c,
-0x61, 0x6e, 0x6b, 0x2d, 0x73, 0x61, 0x62, 0x6c, 0x6f, 0x6e, 0x62, 0x6f,
-0x61, 0x20, 0x76, 0x69, 0x73, 0x74, 0x61, 0x62, 0x6f, 0x67, 0x6f, 0x1e6d,
-0x61, 0x62, 0x6f, 0x69, 0x73, 0x12b, 0x6b, 0x65, 0x6d, 0x62, 0x72, 0x69,
-0x6a, 0x20, 0x62, 0x65, 0x6b, 0x61, 0x6d, 0x70, 0x6f, 0x20, 0x67, 0x72,
-0x61, 0x6e, 0x1e0d, 0x65, 0x6b, 0x61, 0x6e, 0x6b, 0x75, 0x6e, 0x6b, 0x61,
-0x72, 0x61, 0x6b, 0x61, 0x73, 0x6b, 0x65, 0x79, 0x65, 0x6e, 0x6b, 0x65,
-0x69, 0x6d, 0x61, 0x6e, 0x63, 0x69, 0x6b, 0x61, 0x67, 0x6f, 0x63, 0x68,
-0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x6b, 0x6f, 0x73, 0x1e6d, 0x61,
-0x20, 0x72, 0x69, 0x6b, 0x61, 0x6b, 0x72, 0x65, 0x73, 0x1e6d, 0x6f, 0x6e,
-0x6b, 0x75, 0x61, 0x61, 0x62, 0x61, 0x6b, 0x79, 0x75, 0x72, 0x61, 0x73,
-0x6f, 0x1e0d, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x61, 0x76, 0x6e,
-0x1e0d, 0x61, 0x6f, 0x73, 0x6e, 0x1e0d, 0x61, 0x6f, 0x73, 0x6f, 0x6e, 0x20,
-0x6b, 0x72, 0x12b, 0x6b, 0x1e0d, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x1e0d, 0x65,
-0x1e6d, 0x72, 0x6f, 0x69, 0x1e6d, 0x1e0d, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x6b,
-0x61, 0x65, 0x1e0d, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x6f, 0x6e, 0x65, 0x69, 0x72,
-0x75, 0x6e, 0x65, 0x70, 0x65, 0x65, 0x6c, 0x20, 0x73, 0x61, 0x6c, 0x76,
-0x61, 0x1e0d, 0x6f, 0x72, 0x70, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x6e, 0x65,
-0x6c, 0x73, 0x6e, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x65, 0x6a, 0x61,
-0x67, 0x6c, 0x61, 0x73, 0x20, 0x62, 0x61, 0x79, 0x67, 0x6f, 0x6f, 0x73,
-0x20, 0x62, 0x65, 0x67, 0x72, 0x61, 0x6e, 0x1e0d, 0x20, 0x1e6d, 0x75, 0x72,
-0x6b, 0x67, 0x72, 0x65, 0x6e, 0x61, 0x1e0d, 0x61, 0x67, 0x75, 0x61, 0x1e0d,
-0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x67, 0x75, 0x61, 0x74, 0x65, 0x6d,
-0x61, 0x6c, 0x61, 0x67, 0x75, 0x61, 0x6a, 0x61, 0x6b, 0x69, 0x6c, 0x67,
-0x75, 0x79, 0x61, 0x6e, 0x61, 0x68, 0x65, 0x6c, 0x69, 0x70, 0x61, 0x6b,
-0x73, 0x68, 0x61, 0x76, 0x61, 0x6e, 0x61, 0x69, 0x6e, 0x1e0d, 0x69, 0x61,
-0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x6e, 0x6f, 0x6b, 0x73, 0x2c,
-0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x72,
-0x65, 0x6e, 0x67, 0x6f, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61,
-0x6e, 0x61, 0x70, 0x69, 0x1e6d, 0x74, 0x72, 0x73, 0x62, 0x65, 0x72, 0x67,
-0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, 0x1e6d, 0x65,
-0x6c, 0x6c, 0x20, 0x73, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d,
-0x69, 0x79, 0x61, 0x6e, 0x61, 0x76, 0x69, 0x76, 0x69, 0x2c, 0x20, 0x69,
-0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, 0x76, 0x69, 0x6e, 0x63, 0x65,
-0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61,
-0x76, 0x69, 0x6e, 0x61, 0x6d, 0x61, 0x6b, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d,
-0x69, 0x79, 0x61, 0x6e, 0x61, 0x69, 0x6e, 0x16b, 0x76, 0x69, 0x6b, 0x69,
-0x6b, 0x61, 0x6c, 0x75, 0x69, 0x1e6d, 0x6a, 0x61, 0x6d, 0x61, 0x69, 0x6b,
-0x61, 0x6a, 0x75, 0x6e, 0x6f, 0x76, 0x6c, 0x6f, 0x75, 0x69, 0x76, 0x69,
-0x6c, 0x6c, 0x65, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x69, 0x73, 0x65, 0x6c, 0x6c,
-0x6f, 0x2c, 0x20, 0x6b, 0x65, 0x6e, 0x1e6d, 0x75, 0x6b, 0x12b, 0x6b, 0x72,
-0x65, 0x6c, 0x65, 0x6e, 0x1e0d, 0x65, 0x69, 0x6b, 0x6c, 0x61, 0x20, 0x70,
-0x61, 0x6a, 0x6c, 0x6f, 0x73, 0x20, 0x61, 0x6e, 0x6a, 0x65, 0x6c, 0x65,
-0x73, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63,
-0x2019, 0x73, 0x20, 0x6b, 0x75, 0x76, 0x61, 0x1e6d, 0x61, 0x72, 0x6d, 0x61,
-0x73, 0x12b, 0x6f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x75, 0x61, 0x6d, 0x61,
-0x6e, 0x61, 0x75, 0x73, 0x6d, 0x61, 0x72, 0x69, 0x67, 0x6f, 0x1e6d, 0x6d,
-0x61, 0x72, 0x1e6d, 0x69, 0x6e, 0x69, 0x6b, 0x6d, 0x61, 0x1e6d, 0x61, 0x6d,
-0x6f, 0x72, 0x6f, 0x73, 0x6d, 0x61, 0x73, 0x61, 0x1e6d, 0x6c, 0x61, 0x6e,
-0x6d, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x12b, 0x6d, 0x65, 0x72, 0x69,
-0x1e0d, 0x61, 0x6d, 0x65, 0x1e6d, 0x6c, 0x61, 0x6b, 0x61, 0x1e6d, 0x6c, 0x61,
-0x6d, 0x65, 0x6b, 0x73, 0x69, 0x63, 0x6f, 0x20, 0x73, 0x69, 0x1e6d, 0x79,
-0x6d, 0x69, 0x6b, 0x76, 0x69, 0x6c, 0xf5, 0x6d, 0x6f, 0x6e, 0x6b, 0x1e6d,
-0x6f, 0x6e, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x65, 0x72, 0x72, 0x65, 0x6d, 0x6f,
-0x6e, 0x1e6d, 0x65, 0x76, 0x69, 0x64, 0x69, 0x6f, 0x6d, 0x6f, 0x6e, 0x1e6d,
-0x73, 0x65, 0x72, 0x72, 0x65, 0x1e6d, 0x6e, 0x61, 0x73, 0x61, 0x75, 0x6e,
-0x69, 0x79, 0x75, 0x20, 0x79, 0x6f, 0x72, 0x6b, 0x6e, 0x6f, 0x72, 0x6f,
-0x6e, 0x68, 0x61, 0x62, 0x69, 0x79, 0x75, 0x6c, 0x61, 0x2c, 0x20, 0x75,
-0x74, 0x74, 0x61, 0x72, 0x20, 0x1e0d, 0x61, 0x6b, 0x6f, 0x1e6d, 0x61, 0x6d,
-0x61, 0x1e0d, 0x69, 0x6e, 0x12b, 0x20, 0x75, 0x74, 0x74, 0x61, 0x72, 0x20,
-0x1e0d, 0x61, 0x6b, 0x6f, 0x1e6d, 0x61, 0x6e, 0x65, 0x75, 0x20, 0x73, 0x61,
-0x6c, 0x65, 0x6d, 0x2c, 0x20, 0x75, 0x74, 0x74, 0x61, 0x72, 0x20, 0x1e0d,
-0x61, 0x6b, 0x6f, 0x1e6d, 0x61, 0x6e, 0x16b, 0x6b, 0x6f, 0x6a, 0x69, 0x6e,
-0x61, 0x67, 0x61, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x70, 0x61, 0x72,
-0x61, 0x6d, 0x61, 0x72, 0x69, 0x62, 0x6f, 0x70, 0x69, 0x6e, 0x69, 0x6b,
-0x73, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x61, 0x75, 0x2d, 0x70, 0x72, 0x69,
-0x6e, 0x73, 0x65, 0x70, 0x6f, 0x72, 0x1e6d, 0x20, 0x61, 0x70, 0x20, 0x73,
-0x70, 0x61, 0x69, 0x6e, 0x70, 0x6f, 0x72, 0x1e6d, 0x70, 0x20, 0x76, 0x65,
-0x6c, 0x68, 0x6f, 0x70, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x20, 0x72, 0x69,
-0x6b, 0x6f, 0x70, 0x75, 0x1e47, 0x1e6d, 0x61, 0x20, 0x65, 0x72, 0x65, 0x6e,
-0x61, 0x73, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x6c,
-0x65, 0x64, 0x1e6d, 0x72, 0x65, 0x73, 0x69, 0x70, 0x69, 0x72, 0x65, 0x6a,
-0x69, 0x6e, 0x61, 0x72, 0x65, 0x6a, 0x61, 0x6c, 0x79, 0x75, 0x1e6d, 0x72,
-0x69, 0x6f, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x6b, 0x6f, 0x73, 0x61, 0x74,
-0x61, 0x72, 0x69, 0x73, 0x61, 0x6e, 0x1e6d, 0x69, 0x61, 0x67, 0x6f, 0x73,
-0x65, 0x6e, 0x74, 0x6f, 0x20, 0x1e0d, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f,
-0x73, 0x61, 0x6f, 0x20, 0x70, 0x61, 0x75, 0x6c, 0x6f, 0x69, 0x1e6d, 0x6f,
-0x6b, 0x6f, 0x1e6d, 0x6f, 0x72, 0x6d, 0x69, 0x1e6d, 0x73, 0x69, 0x74, 0x6b,
-0x61, 0x73, 0x65, 0x6e, 0x1e6d, 0x20, 0x62, 0x61, 0x72, 0x74, 0x65, 0x6c,
-0x65, 0x6d, 0x69, 0x73, 0x65, 0x6e, 0x1e6d, 0x20, 0x6a, 0x6f, 0x6e, 0x73,
-0x73, 0x65, 0x6e, 0x74, 0x20, 0x6b, 0x69, 0x1e6d, 0x1e6d, 0x73, 0x73, 0x65,
-0x6e, 0x74, 0x20, 0x6c, 0x75, 0x73, 0x69, 0x61, 0x73, 0x65, 0x6e, 0x1e6d,
-0x20, 0x74, 0x6f, 0x6d, 0x61, 0x73, 0x73, 0x65, 0x6e, 0x1e6d, 0x20, 0x76,
-0x69, 0x6e, 0x73, 0x65, 0x6e, 0x1e6d, 0x73, 0x76, 0x69, 0x70, 0x1e6d, 0x20,
-0x6b, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x1e6d, 0x74, 0x65, 0x67, 0x75, 0x74,
-0x75, 0x6c, 0x65, 0x74, 0x69, 0x68, 0x76, 0x61, 0x6e, 0x61, 0x1e6d, 0x6f,
-0x72, 0x6f, 0x6e, 0x1e6d, 0x6f, 0x1e6d, 0x6f, 0x72, 0x1e6d, 0x6f, 0x6c, 0x61,
-0x76, 0x61, 0x6e, 0x6b, 0x16b, 0x76, 0x65, 0x72, 0x76, 0x68, 0x61, 0x69,
-0x1e6d, 0x68, 0x6f, 0x72, 0x73, 0x76, 0x69, 0x6e, 0x6e, 0x69, 0x70, 0x65,
-0x67, 0x79, 0x61, 0x6b, 0x75, 0x1e6d, 0x61, 0x1e6d, 0x6b, 0x65, 0x73, 0x65,
-0x65, 0x1e0d, 0x65, 0x76, 0x69, 0x73, 0x1e0d, 0x79, 0x75, 0x6d, 0x6f, 0x6e,
-0x74, 0x20, 0x64, 0x65, 0x20, 0x75, 0x72, 0x76, 0x69, 0x6c, 0x6c, 0x6d,
-0x65, 0x6b, 0x76, 0x61, 0x72, 0x69, 0x6d, 0x61, 0x76, 0x73, 0x6f, 0x6e,
-0x6d, 0x65, 0x6b, 0x20, 0x6d, 0x75, 0x72, 0x1e0d, 0x6f, 0x70, 0x61, 0x6c,
-0x6d, 0x65, 0x72, 0x72, 0x6f, 0x74, 0x65, 0x72, 0x61, 0x73, 0x79, 0x6f,
-0x76, 0x61, 0x1e6d, 0x72, 0x6f, 0x6c, 0x6c, 0x76, 0x6f, 0x73, 0x1e6d, 0x6f,
-0x6b, 0x6c, 0x6e, 0x67, 0x79, 0x61, 0x72, 0x62, 0x79, 0x65, 0x6e, 0x65,
-0x1e0d, 0x65, 0x6e, 0x61, 0x6c, 0x6d, 0x61, 0x1e6d, 0x79, 0x61, 0x6d, 0x6d,
-0x61, 0x6e, 0x61, 0x6e, 0x61, 0x1e0d, 0x69, 0x72, 0x61, 0x6b, 0x74, 0x61,
-0x75, 0x61, 0x61, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x61, 0x73, 0x67, 0x61,
-0x62, 0x61, 0x1e6d, 0x61, 0x74, 0x61, 0x72, 0x61, 0x75, 0x62, 0x61, 0x67,
-0x64, 0x61, 0x64, 0x62, 0x61, 0x68, 0x72, 0x61, 0x69, 0x6e, 0x62, 0x61,
-0x6b, 0x75, 0x62, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x62, 0x61, 0x72,
-0x6e, 0x61, 0x75, 0x6c, 0x62, 0x65, 0x69, 0x72, 0x75, 0x74, 0x62, 0x69,
-0x73, 0x6b, 0x65, 0x6b, 0x62, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x63, 0x69,
-0x74, 0x61, 0x6b, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, 0x1e0d, 0x61, 0x6d,
-0x61, 0x73, 0x6b, 0x75, 0x73, 0x1e0d, 0x69, 0x6c, 0x69, 0x64, 0x75, 0x62,
-0x61, 0x69, 0x64, 0x75, 0x73, 0x61, 0x6d, 0x62, 0x65, 0x70, 0x61, 0x6d,
-0x61, 0x67, 0x75, 0x73, 0x74, 0x61, 0x67, 0x61, 0x6a, 0x61, 0x68, 0x65,
-0x62, 0x72, 0x6f, 0x6e, 0x68, 0x6f, 0x20, 0x63, 0x69, 0x20, 0x6d, 0x69,
-0x6e, 0x68, 0x20, 0x73, 0x69, 0x74, 0x69, 0x68, 0x6f, 0x6e, 0x67, 0x20,
-0x6b, 0x6f, 0x6e, 0x67, 0x69, 0x72, 0x6b, 0x75, 0x1e6d, 0x73, 0x6b, 0x6a,
-0x61, 0x79, 0x61, 0x70, 0x75, 0x72, 0x61, 0x6a, 0x65, 0x72, 0x75, 0x73,
-0x61, 0x6c, 0x65, 0x6d, 0x6b, 0x61, 0x62, 0x75, 0x6c, 0x6b, 0x61, 0x6d,
-0x63, 0x61, 0x1e6d, 0x6b, 0x61, 0x6b, 0x61, 0x72, 0x61, 0x63, 0x12b, 0x6b,
-0x61, 0x1e6d, 0x6d, 0x61, 0x6e, 0x1e0d, 0x75, 0x6b, 0x61, 0x6e, 0x64, 0x69,
-0x67, 0x61, 0x6b, 0x6f, 0x6c, 0x6b, 0x61, 0x74, 0x61, 0x6b, 0x72, 0x61,
-0x73, 0x6e, 0x65, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x6b, 0x75, 0x61, 0x6c,
-0x61, 0x20, 0x6c, 0x75, 0x6d, 0x70, 0x75, 0x72, 0x6b, 0x75, 0x63, 0x69,
-0x6e, 0x67, 0x6b, 0x75, 0x76, 0x61, 0x69, 0x74, 0x6d, 0x6b, 0x61, 0x6f,
-0x6d, 0x65, 0x67, 0x61, 0x1e0d, 0x61, 0x6e, 0x6d, 0x61, 0x6b, 0x61, 0x73,
-0x61, 0x72, 0x6d, 0x61, 0x6e, 0x12b, 0x6c, 0x61, 0x6d, 0x61, 0x73, 0x6b,
-0x61, 0x74, 0x6e, 0x69, 0x6b, 0x6f, 0x73, 0x69, 0x79, 0x61, 0x6e, 0x65,
-0x76, 0x6f, 0x6b, 0x75, 0x6a, 0x6e, 0x65, 0x1e6d, 0x73, 0x6b, 0x6e, 0x6f,
-0x76, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x70, 0x6e, 0x6f,
-0x6d, 0x20, 0x70, 0x65, 0x6e, 0x68, 0x70, 0x6f, 0x6e, 0x1e6d, 0x69, 0x61,
-0x6e, 0x61, 0x6b, 0x70, 0x79, 0x6f, 0x6e, 0x67, 0x79, 0x61, 0x6e, 0x67,
-0x6b, 0x6f, 0x73, 0x1e6d, 0x61, 0x6e, 0x65, 0x6b, 0x69, 0x6a, 0x75, 0x6f,
-0x72, 0x64, 0x61, 0x72, 0x69, 0x79, 0x61, 0x64, 0x73, 0x61, 0x68, 0x61,
-0x6c, 0x69, 0x6e, 0x73, 0x61, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x6e, 0x64,
-0x73, 0x65, 0x6f, 0x6c, 0x73, 0x65, 0x6e, 0x67, 0x61, 0x69, 0x73, 0x69,
-0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x73, 0x72, 0x65, 0x1e0d, 0x6e, 0x65,
-0x6b, 0x6f, 0x6c, 0x79, 0x6d, 0x73, 0x6b, 0x74, 0x61, 0x69, 0x70, 0x65,
-0x69, 0x74, 0x61, 0x73, 0x6b, 0x65, 0x6e, 0x1e6d, 0x74, 0x62, 0x69, 0x6c,
-0x69, 0x73, 0x69, 0x74, 0x65, 0x68, 0x72, 0x61, 0x6e, 0x74, 0x69, 0x6d,
-0x70, 0x68, 0x75, 0x1e6d, 0x6f, 0x6b, 0x79, 0x6f, 0x1e6d, 0x6f, 0x6d, 0x73,
-0x6b, 0x75, 0x6c, 0x61, 0x6e, 0x62, 0x61, 0x1e6d, 0x61, 0x72, 0x75, 0x72,
-0x75, 0x6d, 0x63, 0x69, 0x79, 0x75, 0x73, 0x74, 0x2d, 0x6e, 0x65, 0x72,
-0x61, 0x76, 0x69, 0x65, 0x6e, 0x1e6d, 0x69, 0x61, 0x61, 0x6e, 0x76, 0x6c,
-0x61, 0x1e0d, 0x69, 0x76, 0x6f, 0x73, 0x1e6d, 0x6f, 0x6b, 0x79, 0x61, 0x6b,
-0x75, 0x1e6d, 0x73, 0x6b, 0x79, 0x61, 0x6e, 0x67, 0x6f, 0x6e, 0x79, 0x69,
-0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x79,
-0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x61, 0x6a, 0x6f, 0x72, 0x65, 0x73,
-0x62, 0x65, 0x72, 0x6d, 0x16b, 0x64, 0x61, 0x6b, 0x65, 0x6e, 0x65, 0x72,
-0x69, 0x6b, 0x65, 0x70, 0x20, 0x76, 0x65, 0x72, 0x1e0d, 0x65, 0x70, 0x65,
-0x72, 0x6f, 0x6d, 0x61, 0x1e0d, 0x69, 0x65, 0x72, 0x61, 0x72, 0x65, 0x79,
-0x6b, 0x79, 0x61, 0x76, 0x69, 0x6b, 0x64, 0x6b, 0x69, 0x1e47, 0x20, 0x6a,
-0x6f, 0x72, 0x6a, 0x69, 0x61, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x68, 0x65,
-0x6c, 0x65, 0x6e, 0x61, 0x73, 0x1e6d, 0x61, 0x6e, 0x6c, 0x69, 0x61, 0x65,
-0x64, 0x69, 0x6c, 0x65, 0x69, 0x64, 0x62, 0x72, 0x69, 0x73, 0x62, 0x61,
-0x6e, 0x65, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x68, 0x69, 0x6c,
-0x6c, 0x1e0d, 0x61, 0x72, 0x76, 0x69, 0x6e, 0x79, 0x75, 0x6b, 0x6c, 0x61,
-0x68, 0x6f, 0x62, 0x61, 0x72, 0x1e6d, 0x6c, 0x69, 0x6e, 0x1e0d, 0x65, 0x72,
-0x6d, 0x61, 0x6e, 0x6c, 0x6f, 0x72, 0x1e0d, 0x20, 0x68, 0x6f, 0x76, 0x65,
-0x6d, 0x65, 0x6c, 0x62, 0x6f, 0x72, 0x6e, 0x65, 0x70, 0x65, 0x72, 0x74,
-0x73, 0x79, 0x1e0d, 0x6e, 0x12b, 0x61, 0x6d, 0x73, 0x1e6d, 0x65, 0x72, 0x1e0d,
-0x61, 0x6d, 0x61, 0x61, 0x1e47, 0x1e0d, 0x6f, 0x72, 0x61, 0x61, 0x61, 0x73,
-0x1e6d, 0x72, 0x61, 0x68, 0x61, 0x6e, 0x65, 0x74, 0x65, 0x6e, 0x73, 0x62,
-0x65, 0x6c, 0x67, 0x72, 0x61, 0x1e0d, 0x65, 0x62, 0x65, 0x72, 0x6c, 0x69,
-0x6e, 0x62, 0x72, 0x61, 0x1e6d, 0x69, 0x73, 0x6c, 0x61, 0x76, 0x61, 0x62,
-0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x62, 0x75, 0x6b, 0x61, 0x72,
-0x65, 0x73, 0x74, 0x62, 0x75, 0x1e0d, 0x61, 0x70, 0x65, 0x73, 0x74, 0x62,
-0x75, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x6e, 0x6b, 0x69, 0x73, 0x69, 0x6e,
-0x61, 0x75, 0x6b, 0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61, 0x67, 0x65, 0x6e,
-0x1e0d, 0x62, 0x6c, 0x69, 0x6e, 0x6a, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x1e6d,
-0x61, 0x72, 0x67, 0x65, 0x72, 0x6e, 0x73, 0x69, 0x68, 0x65, 0x6c, 0x73,
-0x69, 0x6e, 0x6b, 0x69, 0x61, 0x61, 0x69, 0x6c, 0x20, 0x61, 0x70, 0x20,
-0x6d, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x6c, 0x6a,
-0x65, 0x72, 0x73, 0x69, 0x6b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67,
-0x72, 0x61, 0x1e0d, 0x6b, 0x69, 0x72, 0x6f, 0x76, 0x6b, 0x69, 0x79, 0x76,
-0x6c, 0x69, 0x73, 0x62, 0x6f, 0x6e, 0x6c, 0x79, 0x75, 0x62, 0x6c, 0x79,
-0x61, 0x6e, 0x61, 0x6c, 0x6e, 0x1e0d, 0x6e, 0x6c, 0x6b, 0x73, 0x65, 0x6d,
-0x62, 0x72, 0x67, 0x6d, 0x65, 0x1e0d, 0x72, 0x69, 0x1e0d, 0x6d, 0x61, 0x6c,
-0x1e6d, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x68, 0x61, 0x6d, 0x6d, 0x69,
-0x6e, 0x73, 0x6b, 0x6d, 0x6f, 0x6e, 0x61, 0x6b, 0x6f, 0x6d, 0x6f, 0x73,
-0x6b, 0x6f, 0x6f, 0x73, 0x6c, 0x6f, 0x70, 0x61, 0x72, 0x69, 0x73, 0x70,
-0x1e0d, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x73, 0x61, 0x70, 0x72, 0x61, 0x67,
-0x72, 0x69, 0x67, 0x61, 0x73, 0x61, 0x6d, 0x61, 0x72, 0x61, 0x73, 0x61,
-0x6e, 0x20, 0x6d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x73, 0x61, 0x72, 0x61,
-0x6a, 0x65, 0x76, 0x6f, 0x73, 0x61, 0x72, 0x61, 0x1e6d, 0x6f, 0x76, 0x73,
-0x69, 0x6d, 0x70, 0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x6f,
-0x70, 0x69, 0x73, 0x6f, 0x70, 0x69, 0x79, 0x61, 0x73, 0x1e6d, 0x6f, 0x6b,
-0x68, 0x6f, 0x6d, 0x74, 0x61, 0x6c, 0x69, 0x6e, 0x1e6d, 0x69, 0x72, 0x61,
-0x6e, 0x65, 0x75, 0x6c, 0x79, 0x61, 0x6e, 0x6f, 0x76, 0x73, 0x6b, 0x76,
-0x61, 0x1e0d, 0x75, 0x6a, 0x76, 0x61, 0x1e6d, 0x69, 0x6b, 0x61, 0x6e, 0x76,
-0x69, 0x65, 0x6e, 0x6e, 0x61, 0x76, 0x69, 0x6c, 0x6e, 0x69, 0x75, 0x73,
-0x76, 0x6f, 0x6c, 0x67, 0x6f, 0x67, 0x72, 0x61, 0x1e0d, 0x76, 0x61, 0x72,
-0x73, 0x61, 0x74, 0x65, 0x67, 0x75, 0x73, 0x69, 0x67, 0x61, 0x6c, 0x70,
-0x61, 0x6a, 0x75, 0x72, 0x69, 0x63, 0x1e6d, 0x61, 0x6e, 0x61, 0x6e, 0x61,
-0x72, 0x69, 0x76, 0x63, 0x68, 0x61, 0x67, 0x6f, 0x73, 0x6b, 0x72, 0x69,
-0x73, 0x1e6d, 0x6d, 0x61, 0x73, 0x6b, 0x6f, 0x6b, 0x6f, 0x73, 0x6b, 0x6f,
-0x6d, 0x6f, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x67, 0x75, 0x65, 0x6c, 0x65,
-0x6e, 0x6d, 0x61, 0x68, 0x65, 0x6d, 0x61, 0x6c, 0x64, 0x69, 0x76, 0x65,
-0x73, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x73, 0x69, 0x75, 0x73, 0x6d, 0x61,
-0x79, 0x6f, 0x1e6d, 0x72, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x61, 0x70,
-0x69, 0x61, 0x101, 0x6b, 0x6c, 0x61, 0x6e, 0x1e0d, 0x62, 0x6f, 0x75, 0x67,
-0x61, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x63, 0x65, 0x1e6d, 0x61, 0x6d, 0x63,
-0x16b, 0x6b, 0x12b, 0x73, 0x74, 0x65, 0x72, 0x69, 0x70, 0x65, 0x1e6d, 0x65,
-0x70, 0x61, 0x6b, 0x61, 0x6f, 0x70, 0x6f, 0x70, 0x69, 0x6a, 0x69, 0x70,
-0x75, 0x6e, 0x61, 0x70, 0x75, 0x74, 0x69, 0x67, 0x61, 0x6c, 0x61, 0x70,
-0x61, 0x67, 0x6f, 0x73, 0x67, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x72, 0x67,
-0x75, 0x61, 0x1e0d, 0x61, 0x6c, 0x6b, 0x65, 0x6e, 0x61, 0x6c, 0x6b, 0x61,
-0x6e, 0x1e6d, 0x6f, 0x6e, 0x6b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61,
-0x74, 0x69, 0x6b, 0x69, 0x73, 0x72, 0x61, 0x65, 0x6b, 0x76, 0x61, 0x6a,
-0x61, 0x6c, 0x65, 0x69, 0x6e, 0x6d, 0x61, 0x6a, 0x75, 0x72, 0x6f, 0x6d,
-0x61, 0x72, 0x6b, 0x69, 0x73, 0x61, 0x73, 0x6d, 0x69, 0x1e0d, 0x76, 0x61,
-0x79, 0x6e, 0x61, 0x75, 0x72, 0x75, 0x6e, 0x69, 0x75, 0x65, 0x6e, 0x6f,
-0x72, 0x70, 0x6f, 0x6b, 0x6e, 0x75, 0x6d, 0x69, 0x65, 0x70, 0x61, 0x6e,
-0x67, 0x6f, 0x20, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x70, 0x61, 0x6c, 0x61,
-0x75, 0x70, 0x69, 0x1e6d, 0x6b, 0x65, 0x72, 0x6e, 0x70, 0x6f, 0x6e, 0x70,
-0x65, 0x69, 0x70, 0x6f, 0x72, 0x1e6d, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x73,
-0x62, 0x69, 0x72, 0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x73,
-0x61, 0x69, 0x70, 0x61, 0x6e, 0x1e6d, 0x61, 0x68, 0x69, 0x1e6d, 0x69, 0x74,
-0x61, 0x72, 0x61, 0x76, 0x61, 0x1e6d, 0x6f, 0x6e, 0x67, 0x61, 0x1e6d, 0x61,
-0x70, 0x75, 0x76, 0x65, 0x6b, 0x76, 0x61, 0x6c, 0x6c, 0x69, 0x73, 0x92c,
-0x94d, 0x92f, 0x93e, 0x928, 0x94d, 0x91c, 0x941, 0x932, 0x92a, 0x93c, 0x94d, 0x930,
-0x940, 0x91f, 0x93e, 0x909, 0x928, 0x915, 0x93e, 0x930, 0x94d, 0x924, 0x941, 0x92e,
-0x915, 0x93f, 0x902, 0x938, 0x93e, 0x938, 0x93e, 0x932, 0x941, 0x92c, 0x941, 0x92e,
-0x92c, 0x93e, 0x938, 0x940, 0x92e, 0x94d, 0x2d, 0x92c, 0x93e, 0x92c, 0x93e, 0x928,
-0x947, 0x92e, 0x94b, 0x917, 0x93e, 0x926, 0x93f, 0x938, 0x941, 0x928, 0x93e, 0x907,
-0x930, 0x94b, 0x92c, 0x93f, 0x928, 0x941, 0x906, 0x915, 0x91a, 0x949, 0x91f, 0x938,
-0x94d, 0x92f, 0x93e, 0x928, 0x20, 0x939, 0x94d, 0x935, 0x93e, 0x928, 0x938, 0x94d,
-0x92f, 0x93e, 0x928, 0x20, 0x932, 0x942, 0x924, 0x93f, 0x909, 0x938, 0x941, 0x906,
-0x907, 0x92f, 0x93e, 0x90f, 0x938, 0x928, 0x938, 0x93f, 0x92f, 0x949, 0x928, 0x92c,
-0x94d, 0x932, 0x93e, 0x902, 0x2d, 0x938, 0x947, 0x92c, 0x932, 0x94b, 0x928, 0x915,
-0x947, 0x92e, 0x94d, 0x92c, 0x94d, 0x930, 0x93f, 0x91c, 0x20, 0x92c, 0x947, 0x915,
-0x94d, 0x92f, 0x93e, 0x92e, 0x94d, 0x92a, 0x94b, 0x20, 0x917, 0x94d, 0x930, 0x93e,
-0x902, 0x921, 0x947, 0x915, 0x94d, 0x92f, 0x93e, 0x928, 0x915, 0x941, 0x928, 0x938,
-0x93f, 0x915, 0x93e, 0x917, 0x94b, 0x921, 0x947, 0x928, 0x92e, 0x93e, 0x930, 0x94d,
-0x915, 0x938, 0x949, 0x928, 0x924, 0x93f, 0x930, 0x941, 0x928, 0x947, 0x92a, 0x947,
-0x92a, 0x93c, 0x94b, 0x930, 0x94d, 0x91f, 0x20, 0x928, 0x947, 0x932, 0x94d, 0x938,
-0x928, 0x92a, 0x93c, 0x94b, 0x930, 0x94d, 0x91f, 0x93e, 0x932, 0x947, 0x91c, 0x93c,
-0x93e, 0x939, 0x947, 0x932, 0x93f, 0x92a, 0x947, 0x915, 0x94d, 0x938, 0x907, 0x915,
-0x93e, 0x932, 0x941, 0x924, 0x93f, 0x91f, 0x915, 0x94d, 0x930, 0x93e, 0x932, 0x947,
-0x928, 0x94d, 0x921, 0x93f, 0x91c, 0x93f, 0x915, 0x92e, 0x928, 0x94b, 0x938, 0x92e,
-0x947, 0x930, 0x93f, 0x917, 0x94b, 0x91f, 0x92c, 0x94d, 0x92f, 0x942, 0x932, 0x93e,
-0x2c, 0x20, 0x909, 0x924, 0x949, 0x930, 0x949, 0x20, 0x921, 0x915, 0x94b, 0x91f,
-0x93e, 0x92e, 0x93e, 0x926, 0x93f, 0x928, 0x940, 0x20, 0x909, 0x924, 0x949, 0x930,
-0x949, 0x20, 0x921, 0x915, 0x94b, 0x91f, 0x93e, 0x928, 0x94d, 0x92f, 0x942, 0x20,
-0x938, 0x93e, 0x932, 0x947, 0x92e, 0x2c, 0x20, 0x909, 0x924, 0x949, 0x930, 0x949,
-0x20, 0x921, 0x915, 0x94b, 0x91f, 0x93e, 0x913, 0x915, 0x93e, 0x91c, 0x940, 0x928,
-0x93e, 0x917, 0x93e, 0x92a, 0x93c, 0x940, 0x928, 0x93f, 0x915, 0x94d, 0x938, 0x92a,
-0x94b, 0x930, 0x94d, 0x91f, 0x20, 0x911, 0x92a, 0x93c, 0x20, 0x938, 0x94d, 0x92a,
-0x947, 0x928, 0x930, 0x947, 0x938, 0x93e, 0x907, 0x92a, 0x93c, 0x938, 0x947, 0x928,
-0x94d, 0x91f, 0x93e, 0x930, 0x947, 0x92e, 0x938, 0x947, 0x902, 0x924, 0x93f, 0x906,
-0x917, 0x94b, 0x938, 0x947, 0x902, 0x91f, 0x20, 0x92c, 0x93e, 0x930, 0x94d, 0x924,
-0x947, 0x932, 0x947, 0x92e, 0x93f, 0x938, 0x947, 0x902, 0x91f, 0x20, 0x924, 0x949,
-0x92e, 0x938, 0x938, 0x94d, 0x935, 0x93f, 0x92a, 0x93c, 0x94d, 0x91f, 0x20, 0x915,
-0x930, 0x902, 0x91f, 0x935, 0x94d, 0x92f, 0x93e, 0x928, 0x94d, 0x915, 0x942, 0x935,
-0x930, 0x92e, 0x94d, 0x92f, 0x93e, 0x915, 0x92e, 0x941, 0x930, 0x94d, 0x921, 0x94b,
-0x932, 0x949, 0x928, 0x94d, 0x917, 0x92f, 0x930, 0x92c, 0x94d, 0x92f, 0x947, 0x928,
-0x905, 0x938, 0x94d, 0x917, 0x93e, 0x92c, 0x93e, 0x924, 0x92c, 0x94d, 0x92f, 0x93e,
-0x902, 0x917, 0x915, 0x949, 0x915, 0x92c, 0x93f, 0x938, 0x94d, 0x915, 0x947, 0x915,
-0x92c, 0x94d, 0x930, 0x942, 0x928, 0x947, 0x924, 0x93f, 0x924, 0x94d, 0x938, 0x93f,
-0x924, 0x93e, 0x926, 0x941, 0x92c, 0x924, 0x93f, 0x926, 0x941, 0x938, 0x93e, 0x902,
-0x92c, 0x947, 0x92a, 0x93c, 0x93e, 0x92e, 0x93e, 0x917, 0x941, 0x938, 0x94d, 0x924,
-0x93e, 0x92f, 0x947, 0x930, 0x941, 0x938, 0x932, 0x947, 0x92e, 0x915, 0x93e, 0x921,
-0x93f, 0x902, 0x917, 0x93e, 0x92a, 0x928, 0x949, 0x92e, 0x20, 0x92a, 0x947, 0x928,
-0x94d, 0x939, 0x915, 0x93f, 0x91c, 0x93f, 0x932, 0x949, 0x930, 0x94d, 0x921, 0x93e,
-0x938, 0x93e, 0x915, 0x93e, 0x932, 0x93f, 0x928, 0x938, 0x902, 0x918, 0x93e, 0x924,
-0x93f, 0x924, 0x93e, 0x924, 0x93f, 0x92a, 0x947, 0x924, 0x93f, 0x924, 0x93e, 0x938,
-0x915, 0x902, 0x924, 0x91f, 0x94d, 0x2d, 0x92c, 0x93f, 0x932, 0x93f, 0x938, 0x93f,
-0x92f, 0x93e, 0x902, 0x917, 0x949, 0x928, 0x915, 0x94d, 0x92f, 0x93e, 0x928, 0x947,
-0x930, 0x940, 0x92a, 0x94d, 0x92f, 0x93e, 0x930, 0x94b, 0x926, 0x93e, 0x945, 0x915,
-0x93f, 0x923, 0x93e, 0x945, 0x20, 0x91c, 0x93e, 0x945, 0x930, 0x94d, 0x91c, 0x93f,
-0x92f, 0x93e, 0x938, 0x94d, 0x91f, 0x94d, 0x92f, 0x93e, 0x928, 0x932, 0x940, 0x906,
-0x938, 0x94d, 0x91f, 0x94d, 0x930, 0x93e, 0x915, 0x93e, 0x928, 0x90f, 0x924, 0x947,
-0x928, 0x94d, 0x938, 0x906, 0x907, 0x932, 0x20, 0x911, 0x92a, 0x94d, 0x20, 0x92e,
-0x94d, 0x92f, 0x93e, 0x928, 0x938, 0x93f, 0x92e, 0x94d, 0x92a, 0x93c, 0x947, 0x930,
-0x94b, 0x92a, 0x94b, 0x932, 0x938, 0x94d, 0x915, 0x94b, 0x92a, 0x94d, 0x92f, 0x947,
-0x938, 0x94b, 0x92a, 0x93c, 0x93f, 0x92f, 0x93e, 0x91c, 0x93c, 0x94d, 0x92f, 0x942,
-0x930, 0x93f, 0x915, 0x93c, 0x92e, 0x949, 0x930, 0x940, 0x938, 0x938, 0x911, 0x915,
-0x932, 0x947, 0x902, 0x921, 0x91a, 0x94d, 0x92f, 0x93e, 0x925, 0x92e, 0x924, 0x93f,
-0x938, 0x94d, 0x91f, 0x930, 0x90f, 0x92a, 0x93c, 0x947, 0x91f, 0x92a, 0x93c, 0x93e,
-0x915, 0x93e, 0x913, 0x92a, 0x93c, 0x94b, 0x92a, 0x93c, 0x93f, 0x91c, 0x940, 0x92a,
-0x93c, 0x94d, 0x92f, 0x942, 0x928, 0x93e, 0x92a, 0x93c, 0x941, 0x91f, 0x940, 0x917,
-0x94d, 0x92f, 0x93e, 0x92e, 0x92c, 0x93f, 0x92f, 0x930, 0x915, 0x947, 0x902, 0x91f,
-0x928, 0x928, 0x93e, 0x945, 0x909, 0x930, 0x941, 0x928, 0x949, 0x930, 0x92a, 0x93c,
-0x949, 0x915, 0x928, 0x949, 0x92e, 0x93f, 0x92f, 0x93e, 0x92a, 0x94b, 0x928, 0x92a,
-0x947, 0x924, 0x93f, 0xb0f, 0xb15, 0xb4d, 0xb30, 0xb3e, 0xb2c, 0xb4d, 0xb30, 0xb3e,
-0xb1c, 0xb3e, 0xb71, 0xb3f, 0xb32, 0xb4d, 0xb32, 0xb47, 0xb2c, 0xb41, 0xb1c, 0xb42,
-0xb2e, 0xb4d, 0xb2c, 0xb41, 0xb30, 0xb3e, 0xb15, 0xb28, 0xb3e, 0xb15, 0xb4d, 0xb30,
-0xb3f, 0xb1c, 0xb3f, 0xb2c, 0xb1f, 0xb3f, 0xb2a, 0xb4d, 0xb30, 0xb3f, 0xb1f, 0xb3e,
-0xb09, 0xb28, 0xb4d, 0x200c, 0xb17, 0xb3e, 0xb2c, 0xb30, 0xb4d, 0xb23, 0xb4d, 0xb23,
-0xb1c, 0xb39, 0xb3e, 0xb28, 0xb4d, 0xb38, 0xb2c, 0xb30, 0xb4d, 0xb17, 0xb15, 0xb30,
-0xb1f, 0xb09, 0xb2e, 0xb4d, 0x200c, 0xb32, 0xb3e, 0xb17, 0xb38, 0xb4d, 0x200c, 0xb32,
-0xb3f, 0xb2c, 0xb4d, 0xb30, 0xb47, 0xb71, 0xb3f, 0xb32, 0xb4d, 0xb32, 0xb47, 0xb32,
-0xb2e, 0xb4d, 0x200c, 0xb2e, 0xb4d, 0x2d, 0xb2c, 0xb3e, 0xb2c, 0xb3e, 0xb28, 0xb47,
-0xb2e, 0xb4b, 0xb17, 0xb3e, 0xb21, 0xb3f, 0xb38, 0xb41, 0xb2e, 0xb28, 0xb30, 0xb4b,
-0xb2c, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb07, 0xb30, 0xb2c, 0xb3f, 0xb28, 0xb41, 0xb06,
-0xb15, 0xb1a, 0xb1f, 0xb05, 0xb17, 0xb3e, 0xb21, 0xb17, 0xb41, 0xb2a, 0xb30, 0xb4d,
-0xb1f, 0x2d, 0xb28, 0xb71, 0xb38, 0xb3e, 0xb05, 0x20, 0xb1f, 0xb2e, 0xb47, 0xb24,
-0xb4d, 0xb30, 0xb3f, 0xb2a, 0xb32, 0xb3f, 0xb71, 0xb3f, 0xb23, 0xb4d, 0xb21, 0xb39,
-0xb15, 0xb4d, 0xb2c, 0xb41, 0xb0f, 0xb28, 0xb38, 0xb4d, 0x20, 0xb06, 0xb07, 0xb30,
-0xb47, 0xb38, 0xb4d, 0xb15, 0xb3e, 0xb3c, 0xb1f, 0xb3e, 0xb2e, 0xb3e, 0xb15, 0xb3e,
-0xb01, 0xb15, 0xb4b, 0xb21, 0xb4b, 0xb2c, 0xb3e, 0xb1c, 0xb41, 0xb1c, 0xb4b, 0xb0f,
-0xb32, 0xb3e, 0x20, 0xb30, 0xb3f, 0xb4d, 0xb05, 0xb1c, 0xb3e, 0xb2e, 0xb47, 0xb23,
-0xb4d, 0xb21, 0xb1c, 0xb3e, 0xb30, 0xb3f, 0xb5f, 0xb4b, 0x20, 0xb17, 0xb3e, 0xb32,
-0xb47, 0xb17, 0xb4b, 0xb38, 0xb38, 0xb3e, 0xb32, 0xb4d, 0xb1f, 0xb3e, 0xb38, 0xb3e,
-0xb5f, 0xb3e, 0xb28, 0xb4d, 0x20, 0xb71, 0xb3e, 0xb28, 0xb4d, 0xb38, 0xb5f, 0xb3e,
-0xb28, 0x20, 0xb32, 0xb41, 0xb07, 0xb38, 0xb1f, 0xb4b, 0xb15, 0xb41, 0xb2e, 0xb28,
-0xb09, 0xb38, 0xb41, 0xb06, 0xb07, 0xb5f, 0xb3e, 0xb05, 0xb30, 0xb41, 0xb2c, 0xb3e,
-0xb2c, 0xb3e, 0xb30, 0xb2c, 0xb3e, 0xb21, 0xb38, 0xb2c, 0xb4d, 0xb32, 0xb3e, 0xb19,
-0xb4d, 0xb15, 0x2d, 0xb38, 0xb3e, 0xb2c, 0xb32, 0xb28, 0xb4d, 0xb2c, 0xb4b, 0xb06,
-0x20, 0xb71, 0xb3f, 0xb38, 0xb4d, 0xb1f, 0xb3e, 0xb2c, 0xb17, 0xb1f, 0xb3e, 0xb2c,
-0xb07, 0xb38, 0xb47, 0xb15, 0xb3e, 0xb2e, 0xb4d, 0xb2a, 0x20, 0xb17, 0xb4d, 0xb30,
-0xb3e, 0xb23, 0xb4d, 0xb21, 0xb47, 0xb38, 0xb3f, 0xb15, 0xb3e, 0xb17, 0xb15, 0xb37,
-0xb4d, 0xb1f, 0xb3e, 0x20, 0xb30, 0xb3f, 0xb15, 0xb3e, 0xb15, 0xb4d, 0xb30, 0xb47,
-0xb38, 0xb4d, 0x200d, 0xb1f, 0xb28, 0xb21, 0xb47, 0xb28, 0xb71, 0xb3f, 0xb30, 0xb4d,
-0xb21, 0xb47, 0xb1f, 0xb4d, 0xb30, 0xb07, 0xb1f, 0xb4d, 0xb21, 0xb2e, 0xb3f, 0xb28,
-0xb3f, 0xb15, 0xb3e, 0xb0f, 0xb21, 0xb4d, 0x200d, 0xb2e, 0xb28, 0xb1f, 0xb28, 0xb4d,
-0xb0f, 0xb32, 0xb4d, 0x20, 0xb38, 0xb3e, 0xb32, 0xb71, 0xb3e, 0xb21, 0xb4b, 0xb30,
-0xb4d, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0x20, 0xb28, 0xb47, 0xb32, 0xb38, 0xb28, 0xb4d,
-0xb2a, 0xb30, 0xb4d, 0xb1f, 0xb32, 0xb47, 0xb1c, 0xb3e, 0xb17, 0xb41, 0xb06, 0xb21,
-0xb47, 0xb32, 0xb09, 0xb2a, 0xb47, 0xb17, 0xb41, 0xb06, 0xb24, 0xb47, 0xb2e, 0xb3e,
-0xb32, 0xb3e, 0xb39, 0xb3e, 0xb71, 0xb28, 0xb3e, 0xb39, 0xb47, 0xb30, 0xb2e, 0xb38,
-0xb3f, 0xb32, 0xb4b, 0xb07, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb2a,
-0xb32, 0xb3f, 0xb38, 0xb4d, 0xb2e, 0xb3e, 0xb30, 0xb47, 0xb28, 0xb17, 0x2c, 0x20,
-0xb07, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb71, 0xb47, 0xb71, 0xb3e,
-0xb5f, 0x2c, 0x20, 0xb07, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb07,
-0xb28, 0xb41, 0xb71, 0xb3f, 0xb15, 0xb4d, 0xb32, 0xb09, 0xb07, 0xb38, 0xb71, 0xb3f,
-0xb32, 0xb4d, 0xb32, 0xb47, 0xb2e, 0xb23, 0xb4d, 0xb1f, 0xb3f, 0xb38, 0xb47, 0xb32,
-0x2c, 0x20, 0xb15, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb09, 0xb15, 0xb3f, 0xb15, 0xb47,
-0xb15, 0xb4d, 0xb30, 0xb3e, 0xb32, 0xb47, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb1c, 0xb3f,
-0xb15, 0xb2e, 0xb3e, 0xb38, 0xb3f, 0xb05, 0xb2e, 0xb3e, 0xb30, 0xb3f, 0xb17, 0xb1f,
-0xb4d, 0xb2e, 0xb3e, 0xb1f, 0xb3e, 0xb2e, 0xb30, 0xb38, 0xb4d, 0xb2e, 0xb3e, 0xb1c,
-0xb3e, 0xb1f, 0xb32, 0xb3e, 0xb28, 0xb4d, 0xb2e, 0xb3f, 0xb15, 0xb4d, 0xb35, 0xb47,
-0xb32, 0xb28, 0xb4d, 0xb2e, 0xb3e, 0xb28, 0xb15, 0xb1f, 0xb28, 0xb4d, 0xb2e, 0xb28,
-0xb1f, 0xb47, 0xb30, 0xb3f, 0xb0f, 0xb2e, 0xb23, 0xb4d, 0xb1f, 0xb47, 0xb2d, 0xb3f,
-0xb21, 0xb3f, 0xb05, 0xb2e, 0xb28, 0xb1f, 0xb38, 0xb47, 0xb30, 0xb30, 0xb3e, 0xb1f,
-0xb4d, 0xb28, 0xb4d, 0xb5f, 0xb41, 0x20, 0xb5f, 0xb30, 0xb4d, 0xb15, 0xb4d, 0xb28,
-0xb30, 0xb39, 0xb4d, 0xb28, 0xb2c, 0xb47, 0xb09, 0xb32, 0xb3e, 0xb39, 0x2c, 0x20,
-0xb09, 0xb24, 0xb4d, 0xb24, 0xb30, 0x20, 0xb21, 0xb3e, 0xb15, 0xb1f, 0xb3e, 0xb15,
-0xb47, 0xb28, 0xb4d, 0xb26, 0xb4d, 0xb30, 0x2c, 0x20, 0xb09, 0xb24, 0xb4d, 0xb24,
-0xb30, 0x20, 0xb21, 0xb3e, 0xb15, 0xb1f, 0xb3e, 0xb28, 0xb4d, 0xb5f, 0xb41, 0x20,
-0xb38, 0xb3e, 0xb32, 0xb47, 0xb2e, 0xb4d, 0x2c, 0x20, 0xb09, 0xb24, 0xb4d, 0xb24,
-0xb30, 0x20, 0xb21, 0xb3e, 0xb15, 0xb1f, 0xb3e, 0xb05, 0xb1c, 0xb3f, 0xb28, 0xb3e,
-0xb17, 0xb3e, 0xb2a, 0xb07, 0xb28, 0xb3f, 0xb15, 0xb4d, 0xb38, 0xb2a, 0xb30, 0xb4d,
-0xb1f, 0x2d, 0xb0f, 0xb5f, 0xb41, 0x2d, 0xb2a, 0xb4d, 0xb30, 0xb3f, 0xb28, 0xb4d,
-0x200d, 0xb38, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0xb4d, 0x20, 0xb05, 0xb2b, 0xb4d, 0x20,
-0xb38, 0xb4d, 0xb2a, 0xb47, 0xb28, 0xb4d, 0xb2a, 0xb41, 0xb0f, 0xb30, 0xb4d, 0xb24,
-0x20, 0xb30, 0xb3f, 0xb15, 0xb30, 0xb47, 0xb38, 0xb3f, 0xb2a, 0xb3f, 0xb30, 0xb3f,
-0xb5f, 0x20, 0xb2c, 0xb4d, 0xb30, 0xb3e, 0xb19, 0xb4d, 0xb15, 0xb38, 0xb3e, 0xb28,
-0xb4d, 0xb24, 0xb30, 0xb47, 0xb2e, 0xb4d, 0xb38, 0xb3e, 0xb23, 0xb4d, 0xb1f, 0x20,
-0xb21, 0xb2e, 0xb3f, 0xb19, 0xb4d, 0xb17, 0xb07, 0xb1f, 0xb4d, 0xb1f, 0xb15, 0xb4d,
-0xb35, 0xb30, 0xb1f, 0xb30, 0xb2e, 0xb3f, 0xb1f, 0xb4d, 0xb38, 0xb47, 0xb23, 0xb4d,
-0xb1f, 0x20, 0xb2c, 0xb3e, 0xb30, 0xb4d, 0xb24, 0xb47, 0xb32, 0xb47, 0xb2e, 0xb3f,
-0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0x20, 0xb15, 0xb3f, 0xb1f, 0xb4d, 0x200d,
-0xb38, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0x2e, 0x20, 0xb25, 0xb2e, 0xb3e,
-0xb38, 0xb4d, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0x2e, 0x20, 0xb71, 0xb3f,
-0xb28, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0xb24, 0xb41, 0xb32, 0xb47, 0xb1f,
-0xb30, 0xb23, 0xb4d, 0xb1f, 0xb1f, 0xb30, 0xb1f, 0xb32, 0xb3e, 0xb71, 0xb3e, 0xb19,
-0xb4d, 0xb15, 0xb41, 0xb71, 0xb30, 0xb4d, 0xb15, 0xb47, 0xb38, 0xb3f, 0xb21, 0xb47,
-0xb71, 0xb3f, 0xb38, 0xb4d, 0xb21, 0xb4d, 0xb5f, 0xb41, 0xb2e, 0xb3e, 0xb23, 0xb4d,
-0xb1f, 0x20, 0xb21, 0xb3f, 0x20, 0xb09, 0xb30, 0xb71, 0xb3f, 0xb32, 0xb47, 0xb2e,
-0xb15, 0xb4d, 0xb71, 0xb3e, 0xb30, 0xb3f, 0xb2e, 0xb3e, 0xb01, 0xb38, 0xb28, 0xb2e,
-0xb4d, 0xb5f, 0xb3e, 0xb15, 0xb2e, 0xb41, 0xb30, 0xb4d, 0xb21, 0xb2a, 0xb3e, 0xb01,
-0xb2e, 0xb30, 0xb30, 0xb4b, 0xb24, 0xb47, 0xb30, 0xb3e, 0xb1f, 0xb4b, 0xb32, 0xb4d,
-0xb71, 0xb4b, 0xb38, 0xb4d, 0xb24, 0xb15, 0xb4b, 0xb33, 0xb19, 0xb4d, 0xb16, 0xb5f,
-0xb3e, 0xb30, 0xb2c, 0xb47, 0xb28, 0xb06, 0xb15, 0xb4d, 0xb1f, 0xb2c, 0xb47, 0xb06,
-0xb38, 0xb4d, 0x200d, 0xb17, 0xb3e, 0xb2c, 0xb1f, 0xb4d, 0xb2c, 0xb39, 0xb3e, 0xb30,
-0xb47, 0xb28, 0xb2c, 0xb3f, 0xb38, 0xb15, 0xb47, 0xb15, 0xb4d, 0x200c, 0xb26, 0xb41,
-0xb38, 0xb3e, 0xb28, 0xb2c, 0xb47, 0xb2a, 0xb3e, 0xb2e, 0xb3e, 0xb17, 0xb41, 0xb38,
-0xb4d, 0xb1f, 0xb3e, 0xb39, 0x20, 0xb1a, 0xb3f, 0x20, 0xb2e, 0xb3f, 0xb28, 0xb4d,
-0x200c, 0x20, 0xb38, 0xb3f, 0xb1f, 0xb3f, 0xb39, 0xb4b, 0xb71, 0xb21, 0xb4d, 0x200c,
-0xb1c, 0xb3e, 0xb15, 0xb30, 0xb4d, 0xb24, 0xb3e, 0xb15, 0xb2c, 0xb41, 0xb32, 0xb4d,
-0xb15, 0xb3e, 0xb1f, 0xb2e, 0xb3e, 0xb23, 0xb4d, 0xb21, 0xb41, 0xb15, 0xb3e, 0xb28,
-0xb21, 0xb4d, 0xb5f, 0xb3e, 0xb17, 0xb3e, 0xb15, 0xb4d, 0xb30, 0xb3e, 0xb38, 0xb28,
-0xb5f, 0xb3e, 0xb30, 0xb38, 0xb4d, 0xb15, 0xb28, 0xb3f, 0xb15, 0xb38, 0xb3f, 0xb06,
-0xb28, 0xb71, 0xb15, 0xb41, 0xb1c, 0xb28, 0xb47, 0xb1f, 0xb38, 0xb4d, 0xb15, 0xb28,
-0xb71, 0xb38, 0xb3f, 0xb2c, 0xb3f, 0xb30, 0xb38, 0xb4d, 0xb15, 0xb05, 0xb30, 0xb3e,
-0xb32, 0xb4d, 0x200c, 0xb2a, 0xb28, 0xb2e, 0xb4d, 0x200c, 0x20, 0xb2a, 0xb47, 0xb28,
-0xb39, 0xb2a, 0xb23, 0xb4d, 0xb1f, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb15, 0xb4d, 0x200c,
-0xb15, 0xb37, 0xb4d, 0xb1f, 0xb28, 0xb47, 0xb15, 0xb40, 0xb1c, 0xb3f, 0xb32, 0xb30,
-0xb4d, 0xb21, 0xb3e, 0xb38, 0xb15, 0xb3e, 0xb32, 0xb3f, 0xb28, 0xb4d, 0xb38, 0xb3f,
-0xb05, 0xb32, 0xb38, 0xb02, 0xb17, 0xb3e, 0xb07, 0xb38, 0xb4d, 0xb30, 0xb47, 0xb21,
-0xb28, 0xb47, 0xb15, 0xb32, 0xb5f, 0xb2e, 0xb38, 0xb4d, 0xb15, 0xb24, 0xb3e, 0xb38,
-0xb15, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb24, 0xb3f, 0xb2e, 0xb4d, 0xb2a, 0xb41, 0xb1f,
-0xb15, 0xb3f, 0xb05, 0xb1f, 0xb2e, 0xb38, 0xb4d, 0xb15, 0xb5f, 0xb41, 0xb38, 0xb4d,
-0x200d, 0xb1f, 0x2d, 0xb28, 0xb47, 0xb30, 0xb3e, 0xb71, 0xb3f, 0xb0f, 0xb23, 0xb4d,
-0xb1f, 0xb3f, 0xb0f, 0xb28, 0xb4d, 0x200c, 0xb71, 0xb4d, 0xb32, 0xb3e, 0xb21, 0xb3f,
-0xb71, 0xb37, 0xb4d, 0xb1f, 0xb4b, 0xb15, 0xb4d, 0xb5f, 0xb47, 0xb30, 0xb47, 0xb2c,
-0xb3e, 0xb28, 0xb4d, 0xb06, 0xb1c, 0xb30, 0xb47, 0xb38, 0xb4d, 0xb2c, 0xb30, 0xb2e,
-0xb41, 0xb21, 0xb3e, 0xb15, 0xb47, 0xb2a, 0xb4d, 0x200c, 0x20, 0xb71, 0xb30, 0xb4d,
-0xb26, 0xb47, 0xb2a, 0xb30, 0xb0f, 0xb30, 0xb47, 0xb15, 0xb4d, 0xb5f, 0xb3e, 0xb2c,
-0xb3f, 0xb15, 0xb38, 0xb4d, 0x200d, 0xb1f, 0xb3e, 0xb32, 0xb3f, 0xb28, 0xb0f, 0xb21,
-0xb3f, 0xb32, 0xb47, 0xb21, 0xb4d, 0xb2c, 0xb4d, 0xb30, 0xb3f, 0xb38, 0xb2c, 0xb28,
-0xb4d, 0xb2c, 0xb4d, 0xb30, 0xb4b, 0xb15, 0xb28, 0x20, 0xb39, 0xb3f, 0xb32, 0xb21,
-0xb3e, 0xb30, 0xb4d, 0xb71, 0xb3f, 0xb28, 0xb4d, 0xb32, 0xb3f, 0xb23, 0xb4d, 0xb21,
-0xb47, 0xb2e, 0xb3e, 0xb28, 0xb32, 0xb30, 0xb4d, 0x200d, 0xb21, 0x20, 0xb39, 0xb3e,
-0xb71, 0xb47, 0xb2e, 0xb47, 0xb32, 0xb2c, 0xb4b, 0xb28, 0xb01, 0xb2a, 0xb30, 0xb4d,
-0xb24, 0xb06, 0xb2e, 0xb37, 0xb4d, 0xb1f, 0xb4d, 0xb30, 0xb47, 0xb21, 0xb3e, 0xb2e,
-0xb4d, 0xb06, 0xb23, 0xb4d, 0xb21, 0xb30, 0xb3e, 0xb06, 0xb38, 0xb4d, 0x200d, 0xb1f,
-0xb30, 0xb3e, 0xb15, 0xb3e, 0xb28, 0xb0f, 0xb24, 0xb47, 0xb28, 0xb4d, 0xb38, 0xb2c,
-0xb47, 0xb32, 0xb17, 0xb4d, 0xb30, 0xb47, 0xb21, 0xb47, 0xb2c, 0xb4d, 0xb30, 0xb3e,
-0xb1f, 0xb3f, 0xb38, 0xb32, 0xb3e, 0xb71, 0xb3e, 0xb2c, 0xb4d, 0xb30, 0xb41, 0xb38,
-0xb3f, 0xb32, 0xb4d, 0x200d, 0xb38, 0xb2c, 0xb41, 0xb1a, 0xb3e, 0xb30, 0xb47, 0xb38,
-0xb4d, 0xb1f, 0xb2c, 0xb41, 0xb21, 0xb3e, 0xb2a, 0xb47, 0xb38, 0xb4d, 0xb1f, 0xb1a,
-0xb3f, 0xb38, 0xb3f, 0xb28, 0xb3e, 0xb09, 0xb15, 0xb2a, 0xb47, 0xb28, 0xb39, 0xb3e,
-0xb17, 0xb47, 0xb28, 0xb4d, 0xb06, 0xb07, 0xb32, 0xb4d, 0x20, 0xb05, 0xb2a, 0xb4d,
-0x20, 0xb2e, 0xb4d, 0xb5f, 0xb3e, 0xb28, 0xb4d, 0xb15, 0xb3f, 0xb30, 0xb71, 0xb2e,
-0xb3e, 0xb30, 0xb3f, 0xb5f, 0xb3e, 0xb39, 0xb47, 0xb2e, 0xb2e, 0xb28, 0xb3e, 0xb15,
-0xb05, 0xb38, 0xb32, 0xb4b, 0xb2a, 0xb21, 0xb17, 0xb30, 0xb3f, 0xb15, 0xb3e, 0xb30,
-0xb2e, 0xb4d, 0xb38, 0xb3e, 0xb30, 0xb3e, 0xb1c, 0xb47, 0xb2c, 0xb38, 0xb3e, 0xb30,
-0xb3e, 0xb1f, 0xb71, 0xb4d, 0xb38, 0xb3f, 0xb2e, 0xb2b, 0xb47, 0xb30, 0xb2a, 0xb32,
-0xb4d, 0xb38, 0xb4d, 0xb15, 0xb2a, 0xb5f, 0xb47, 0xb38, 0xb2a, 0xb3f, 0xb5f, 0xb3e,
-0xb38, 0xb4d, 0xb1f, 0xb15, 0xb4d, 0x20, 0xb39, 0xb2e, 0xb4d, 0x200c, 0xb1f, 0xb3e,
-0xb07, 0xb30, 0xb47, 0xb28, 0xb4d, 0xb5f, 0xb41, 0xb32, 0xb5f, 0xb3e, 0xb28, 0xb71,
-0xb38, 0xb4d, 0xb15, 0xb2c, 0xb3e, 0xb21, 0xb41, 0xb1c, 0xb71, 0xb3e, 0xb1f, 0xb3f,
-0xb15, 0xb3e, 0xb28, 0xb4d, 0xb71, 0xb3f, 0xb0f, 0xb28, 0xb3e, 0xb71, 0xb3f, 0xb32,
-0xb28, 0xb3f, 0xb09, 0xb38, 0xb4d, 0xb71, 0xb32, 0xb17, 0xb17, 0xb4d, 0xb30, 0xb3e,
-0xb21, 0xb4d, 0xb16, 0xb4d, 0xb30, 0xb40, 0xb38, 0xb4d, 0x200d, 0xb1f, 0x20, 0xb2e,
-0xb3e, 0xb38, 0xb15, 0xb15, 0xb38, 0xb4d, 0x200c, 0xb15, 0xb2e, 0xb30, 0xb15, 0xb47,
-0xb30, 0xb17, 0xb41, 0xb32, 0xb47, 0xb28, 0xb2e, 0xb30, 0xb3f, 0xb38, 0xb38, 0xb4d,
-0xb2e, 0xb3e, 0xb5f, 0xb1f, 0xb47, 0xb2c, 0xb17, 0xb47, 0xb28, 0xb4d, 0x200c, 0xb71,
-0xb3f, 0xb32, 0xb4d, 0xb32, 0xb47, 0xb1a, 0xb3e, 0xb24, 0xb3e, 0xb2e, 0xb4d, 0x200c,
-0xb2a, 0xb15, 0xb3e, 0xb05, 0xb2a, 0xb2a, 0xb3f, 0xb1c, 0xb3f, 0xb17, 0xb3e, 0xb32,
-0xb3e, 0xb2a, 0xb3e, 0xb17, 0xb38, 0xb15, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb28, 0xb28,
-0xb30, 0xb2a, 0xb15, 0xb4d, 0x200c, 0xb28, 0xb09, 0xb2e, 0xb3f, 0xb5f, 0xb2a, 0xb39,
-0xb28, 0xb2a, 0xb47, 0xb07, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0xb4d, 0x200c, 0x20, 0xb2e,
-0xb30, 0xb47, 0xb38, 0xb2c, 0xb3f, 0xb30, 0xb3e, 0xb30, 0xb1f, 0xb19, 0xb4d, 0xb17,
-0xb3e, 0xb1f, 0xb19, 0xb4d, 0xb17, 0xb3e, 0xb1f, 0xb3e, 0xb2a, 0xb41, 0xc0e, 0xc02,
-0xc17, 0xc4d, 0xc35, 0xc3f, 0xc32, 0xc4d, 0xc32, 0xc3e, 0x3c, 0x65, 0x78, 0x65,
-0x6d, 0x70, 0x6c, 0x61, 0x72, 0x43, 0x69, 0x74, 0x79, 0x3e, 0xc05, 0xc21,
-0xc46, 0xc32, 0xc48, 0xc21, 0xc4d, 0x3c, 0x2f, 0x65, 0x78, 0x65, 0x6d, 0x70,
-0x6c, 0x61, 0x72, 0x43, 0x69, 0x74, 0x79, 0x3e, 0xc15, 0xc3e, 0xc02, 0xc1f,
-0xc28, 0xc4d, 0x140a, 0x144e, 0x1426, 0x146f, 0x1472, 0x1423, 0x1401, 0x141f, 0x14aa, 0x1423,
-0x1450, 0x1423, 0x1403, 0x14c4, 0x1431, 0x1420, 0x1403, 0x1473, 0x14eb, 0x1405, 0x1403, 0x141f,
-0x14f4, 0x1422, 0x1473, 0x141f, 0x1489, 0x1418, 0x1423, 0x1411, 0x14c2, 0x142f, 0x1420
+0x65, 0x76, 0x61, 0x79, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e,
+0x61, 0x29, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x20,
+0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x29, 0x57, 0x69, 0x6e,
+0x61, 0x6d, 0x61, 0x63, 0x20, 0x28, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e,
+0x61, 0x29, 0x4a, 0x61, 0x6d, 0xe0, 0x65, 0x67, 0x61, 0x4d, 0x6f, 0x6e,
+0x74, 0x69, 0x63, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x28, 0x4b, 0x65, 0x6e,
+0x74, 0x75, 0x63, 0x6b, 0x79, 0x29, 0x4c, 0x6f, 0x73, 0x20, 0xc0, 0x6e,
+0x67, 0x65, 0x6c, 0x65, 0x73, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69,
+0x67, 0x61, 0x53, 0x69, 0x74, 0xe0, 0x20, 0x64, 0x65, 0x2019, 0x6c, 0x20,
+0x4d, 0xe8, 0x73, 0x65, 0x67, 0x6f, 0x4d, 0x69, 0x63, 0x68, 0x65, 0x6c,
+0x6f, 0x6e, 0x42, 0x65, 0x75, 0x6c, 0x61, 0x68, 0x20, 0x28, 0x4e, 0x6f,
+0x72, 0x64, 0x20, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x29, 0x43, 0x65,
+0x6e, 0x74, 0x65, 0x72, 0x20, 0x28, 0x4e, 0x6f, 0x72, 0x64, 0x20, 0x44,
+0x61, 0x6b, 0x6f, 0x74, 0x61, 0x29, 0x4e, 0x65, 0x77, 0x20, 0x53, 0x61,
+0x6c, 0x65, 0x6d, 0x20, 0x28, 0x4e, 0x6f, 0x72, 0x64, 0x20, 0x44, 0x61,
+0x6b, 0x6f, 0x74, 0x61, 0x29, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x20, 0x50,
+0x72, 0xec, 0x6e, 0x73, 0x69, 0x70, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x6f,
+0x20, 0x64, 0x65, 0x20, 0x53, 0x70, 0x61, 0x67, 0x6e, 0x61, 0x53, 0x61,
+0x6e, 0x20, 0x50, 0x6f, 0x6c, 0x6f, 0x53, 0x2e, 0x20, 0x42, 0x61, 0x72,
+0x74, 0x6f, 0x6c, 0x6f, 0x6d, 0xe8, 0x6f, 0x53, 0x2e, 0x20, 0x4a, 0x6f,
+0x61, 0x6e, 0x69, 0x53, 0x2e, 0x20, 0x43, 0x72, 0x69, 0x73, 0x74, 0x6f,
+0x66, 0x65, 0x72, 0x53, 0x2e, 0x20, 0x4c, 0x75, 0x73, 0xec, 0x61, 0x53,
+0x2e, 0x20, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x73, 0x6f, 0xcc, 0x7a,
+0x6f, 0x6c, 0x61, 0x20, 0x4d, 0x61, 0x63, 0x71, 0x75, 0x61, 0x72, 0x69,
+0x65, 0x41, 0x6e, 0xe0, 0x64, 0x79, 0x72, 0x41, 0x6b, 0x74, 0xe0, 0x75,
+0x41, 0x7a, 0x67, 0x61, 0x62, 0x61, 0x64, 0x41, 0x74, 0x79, 0x72, 0xe0,
+0x75, 0x43, 0x6f, 0x6c, 0x6f, 0x6e, 0x62, 0x6f, 0x44, 0x75, 0x62, 0xe0,
+0x69, 0x44, 0x75, 0x73, 0x61, 0x6e, 0x62, 0xe9, 0x4b, 0x61, 0x74, 0x6d,
+0x61, 0x6e, 0x64, 0xf9, 0x48, 0xe0, 0x6e, 0x64, 0x69, 0x67, 0x61, 0x4b,
+0x72, 0x61, 0x7a, 0x6e, 0x61, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x4b, 0x75,
+0x61, 0x6c, 0x61, 0x20, 0x4c, 0x75, 0x6e, 0x70, 0x75, 0x72, 0x4d, 0x61,
+0x63, 0xe0, 0x6f, 0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, 0x7a, 0x6e, 0x69,
+0x65, 0x74, 0x73, 0x6b, 0x4b, 0x6f, 0x73, 0x74, 0x61, 0x6e, 0xe0, 0x69,
+0x53, 0x68, 0x61, 0x6e, 0x67, 0x68, 0xe0, 0x69, 0x5a, 0x72, 0xe9, 0x64,
+0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x69, 0x6d, 0x73, 0x6b, 0x54, 0x69, 0x6e,
+0x70, 0x75, 0x55, 0x6c, 0x61, 0x6e, 0x20, 0x42, 0xe0, 0x74, 0x6f, 0x72,
+0x55, 0x73, 0x74, 0x2d, 0x47, 0x6e, 0x65, 0x72, 0x61, 0x59, 0x65, 0x6b,
+0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x6f, 0x4a,
+0xe8, 0x72, 0x65, 0x76, 0x61, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20,
+0x41, 0x7a, 0x6f, 0x72, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43,
+0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x43, 0x61, 0x6f, 0x20, 0x56, 0x65,
+0x72, 0x64, 0x6f, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x46, 0xe0, 0x72,
+0x6f, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4d, 0x61, 0x64, 0xe8,
+0x69, 0x72, 0x61, 0x52, 0x65, 0x6b, 0x69, 0x61, 0x76, 0x69, 0x6b, 0x47,
+0x65, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x20, 0x64, 0x65, 0x2019, 0x6c, 0x20,
+0x73, 0x75, 0x64, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x53, 0x2e, 0x20,
+0x45, 0x6c, 0x65, 0x6e, 0x61, 0x41, 0x64, 0x65, 0x6c, 0xe0, 0x69, 0x64,
+0x65, 0x42, 0x72, 0x69, 0x7a, 0x62, 0x61, 0x6e, 0x65, 0xcc, 0x7a, 0x6f,
+0x6c, 0x61, 0x20, 0x4c, 0x6f, 0x72, 0x64, 0x20, 0x48, 0x6f, 0x77, 0x65,
+0xc0, 0x6d, 0x73, 0x74, 0x65, 0x72, 0x64, 0x61, 0x6d, 0x42, 0x72, 0x61,
+0x74, 0x69, 0x7a, 0x6c, 0x61, 0x76, 0x61, 0x4a, 0x69, 0x62, 0x69, 0x6c,
+0x74, 0x65, 0x72, 0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x64, 0x65,
+0x20, 0x4d, 0x61, 0x6e, 0x4c, 0x75, 0x62, 0x6c, 0x69, 0x61, 0x6e, 0x61,
+0x4c, 0x75, 0x73, 0x65, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x6f, 0x4f, 0x7a,
+0x6c, 0x6f, 0x50, 0x61, 0x72, 0x69, 0x6a, 0x69, 0x53, 0x69, 0x6e, 0x66,
+0x65, 0x72, 0xf2, 0x70, 0x6f, 0x6c, 0x69, 0x53, 0x74, 0x6f, 0x63, 0x6f,
+0x6c, 0x6d, 0x61, 0x55, 0x6c, 0x69, 0xe0, 0x6e, 0x6f, 0x73, 0x6b, 0x56,
+0x61, 0x74, 0x65, 0x67, 0x61, 0x6e, 0x43, 0x69, 0x61, 0x67, 0x6f, 0x73,
+0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x64, 0x65, 0x20, 0x4e, 0x61, 0x64,
+0x61, 0x6c, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x6f, 0x63,
+0x6f, 0x73, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x6f, 0x6d, 0x6f,
+0x72, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x6c, 0x64,
+0x69, 0x76, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x61, 0x75,
+0x72, 0x69, 0x73, 0x69, 0x6f, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d,
+0x61, 0x69, 0x6f, 0x74, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x52,
+0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20,
+0x42, 0x6f, 0x75, 0x67, 0x61, 0x69, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x65,
+0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x69, 0x61, 0x74, 0x65, 0x6d,
+0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x43, 0x68, 0x75, 0x75, 0x6b, 0xcc,
+0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x64, 0x65, 0x20, 0x50, 0x61, 0x73, 0x63,
+0x75, 0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x45, 0x66, 0x61, 0x74,
+0x65, 0x41, 0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x46, 0x61, 0x6b, 0x61, 0x6f,
+0x66, 0x6f, 0x41, 0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x46, 0x75, 0x6e, 0x61,
+0x66, 0x75, 0x74, 0x69, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x47, 0x61,
+0x6d, 0x62, 0x69, 0x65, 0x72, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x47,
+0x75, 0x61, 0x64, 0x61, 0x6c, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x41, 0x74,
+0x6f, 0x6c, 0x6f, 0x20, 0x43, 0x61, 0x6e, 0x74, 0x6f, 0x6e, 0x41, 0x74,
+0x6f, 0x6c, 0x6f, 0x20, 0x4b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61,
+0x74, 0x69, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4b, 0x6f, 0x73, 0x72,
+0x61, 0x65, 0x41, 0x74, 0x6f, 0x6c, 0x6f, 0x20, 0x4b, 0x77, 0x61, 0x6a,
+0x61, 0x6c, 0x65, 0x69, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x65, 0x20, 0x4d,
+0x61, 0x72, 0x63, 0x68, 0x65, 0x7a, 0x69, 0x41, 0x74, 0x6f, 0x6c, 0x6f,
+0x20, 0x4d, 0x69, 0x64, 0x77, 0x61, 0x79, 0xcc, 0x7a, 0x6f, 0x6c, 0x61,
+0x20, 0x4e, 0x61, 0x75, 0x72, 0x75, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20,
+0x4e, 0x69, 0x75, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x4e, 0x6f,
+0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x50, 0x61, 0x6c, 0xe0, 0x75, 0xcc, 0x7a,
+0x6f, 0x6c, 0x61, 0x20, 0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e,
+0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x50, 0x6f, 0x6e, 0x70, 0xe8, 0x69,
+0x50, 0x6f, 0x72, 0x74, 0x6f, 0x20, 0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62,
+0x79, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x52, 0x61, 0x72, 0x6f, 0x74,
+0x6f, 0x6e, 0x67, 0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x53, 0x61,
+0x69, 0x70, 0xe0, 0x6e, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x54, 0x61,
+0x69, 0x74, 0x69, 0x41, 0x74, 0x6f, 0x6c, 0x6c, 0x6f, 0x20, 0x54, 0x61,
+0x72, 0x61, 0x77, 0x61, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x54, 0x6f,
+0x6e, 0x67, 0x61, 0x74, 0x61, 0x70, 0x75, 0x41, 0x74, 0x6f, 0x6c, 0x6f,
+0x20, 0x57, 0x61, 0x6b, 0x65, 0xcc, 0x7a, 0x6f, 0x6c, 0x61, 0x20, 0x57,
+0x61, 0x6c, 0x6c, 0x69, 0x73, 0x61, 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e,
+0x65, 0x63, 0x72, 0x61, 0x61, 0x1e0d, 0x69, 0x73, 0x20, 0x61, 0x62, 0x61,
+0x62, 0x61, 0x61, 0x6c, 0x6a, 0x12b, 0x79, 0x72, 0x73, 0x61, 0x73, 0x6d,
+0x61, 0x72, 0x61, 0x62, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x62, 0x61, 0x6e,
+0x67, 0x75, 0x69, 0x62, 0x61, 0x6e, 0x6a, 0x75, 0x6c, 0x62, 0x69, 0x73,
+0x73, 0x61, 0x75, 0x62, 0x6c, 0x61, 0x6e, 0x1e6d, 0x61, 0x65, 0x72, 0x62,
+0x72, 0x61, 0x6a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x62, 0x75, 0x6a, 0x75,
+0x6d, 0x62, 0x75, 0x72, 0x61, 0x6b, 0x61, 0x69, 0x72, 0x6f, 0x6b, 0x61,
+0x73, 0x61, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x61, 0x73, 0x65, 0x75, 0x1e6d,
+0x61, 0x6b, 0x6f, 0x6e, 0x61, 0x6b, 0x72, 0x12b, 0x1e0d, 0x6b, 0x61, 0x72,
+0x64, 0x61, 0x72, 0x20, 0x65, 0x73, 0x20, 0x73, 0x61, 0x6c, 0x61, 0x61,
+0x6d, 0x64, 0x75, 0x61, 0x6c, 0x61, 0x65, 0x6c, 0x20, 0x61, 0x61, 0x69,
+0x79, 0x75, 0x6e, 0x70, 0x72, 0x12b, 0x1e6d, 0x61, 0x75, 0x6e, 0x67, 0x61,
+0x62, 0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x72, 0x61, 0x72, 0x65, 0x6a, 0x6f,
+0x68, 0x61, 0x6e, 0x6e, 0x65, 0x73, 0x62, 0x75, 0x72, 0x67, 0x6a, 0x75,
+0x62, 0x61, 0x6b, 0x6d, 0x70, 0x61, 0x6c, 0x61, 0x6b, 0x61, 0x72, 0x1e6d,
+0x6f, 0x75, 0x6d, 0x6b, 0x69, 0x67, 0x61, 0x6c, 0x69, 0x6b, 0x69, 0x6e,
+0x73, 0x61, 0x73, 0x61, 0x6c, 0x61, 0x67, 0x6f, 0x73, 0x6c, 0x69, 0x62,
+0x72, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x6c, 0x75, 0x61, 0x6e, 0x1e0d, 0x61,
+0x6c, 0x75, 0x62, 0x75, 0x6d, 0x62, 0x61, 0x73, 0x69, 0x6c, 0x75, 0x73,
+0x61, 0x6b, 0x61, 0x6d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x6d, 0x61, 0x70,
+0x75, 0x1e6d, 0x75, 0x6d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x6d, 0x62, 0x61,
+0x62, 0x61, 0x6e, 0x65, 0x6d, 0x6f, 0x67, 0x61, 0x1e0d, 0x69, 0x73, 0x75,
+0x6d, 0x6f, 0x6e, 0x72, 0x6f, 0x76, 0x69, 0x61, 0x6e, 0x61, 0x69, 0x72,
+0x6f, 0x62, 0x69, 0x6e, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x6e, 0x69,
+0x79, 0x61, 0x6d, 0x65, 0x6e, 0x75, 0x65, 0x6b, 0x73, 0x61, 0x76, 0x61,
+0x67, 0x64, 0x75, 0x67, 0x75, 0x70, 0x6f, 0x72, 0x1e6d, 0x6f, 0x2d, 0x1e47,
+0x6f, 0x76, 0x6f, 0x73, 0x61, 0x6f, 0x20, 0x1e6d, 0x6f, 0x6d, 0x74, 0x72,
+0x69, 0x70, 0x6f, 0x6c, 0x69, 0x1e6d, 0x75, 0x6e, 0x69, 0x73, 0x76, 0x69,
+0x6e, 0x64, 0x68, 0x75, 0x6b, 0x61, 0x1e0d, 0x61, 0x6b, 0x61, 0x6e, 0x6b,
+0x6f, 0x72, 0x61, 0x6a, 0x65, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61,
+0x65, 0x6e, 0x1e6d, 0x69, 0x67, 0x75, 0x61, 0x61, 0x72, 0x61, 0x67, 0x76,
+0x61, 0x69, 0x6e, 0x61, 0x62, 0x75, 0x65, 0x6e, 0x6f, 0x75, 0x73, 0x20,
+0x61, 0x69, 0x72, 0x65, 0x73, 0x6b, 0x61, 0x74, 0x61, 0x6d, 0x61, 0x72,
+0x6b, 0x61, 0x6b, 0x6f, 0x72, 0x1e0d, 0x61, 0x62, 0x61, 0x68, 0x75, 0x68,
+0x75, 0x65, 0x6c, 0x61, 0x20, 0x72, 0x69, 0x6f, 0x6a, 0x61, 0x6d, 0x65,
+0x6e, 0x1e0d, 0x6f, 0x6a, 0x61, 0x72, 0x69, 0x79, 0x6f, 0x20, 0x67, 0x61,
+0x6c, 0x6c, 0x65, 0x67, 0x6f, 0x73, 0x73, 0x61, 0x6c, 0x1e6d, 0x61, 0x73,
+0x61, 0x6e, 0x20, 0x68, 0x75, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x20, 0x6c,
+0x75, 0x69, 0x73, 0x1e6d, 0x75, 0x6b, 0x16b, 0x6d, 0x6e, 0x75, 0x73, 0x76,
+0x61, 0x69, 0x79, 0x61, 0x61, 0x72, 0x75, 0x62, 0x61, 0x65, 0x73, 0x75,
+0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x1e6d, 0x69, 0x6b, 0x6f, 0x6b, 0x65,
+0x6e, 0x62, 0x61, 0x68, 0x69, 0x61, 0x62, 0x61, 0x69, 0x61, 0x20, 0x62,
+0x61, 0x6e, 0x1e0d, 0x65, 0x72, 0x61, 0x73, 0x62, 0x61, 0x72, 0x62, 0x61,
+0x1e0d, 0x6f, 0x73, 0x62, 0x65, 0x6c, 0x65, 0x6d, 0x62, 0x65, 0x6c, 0x69,
+0x6a, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x2d, 0x73, 0x61, 0x62, 0x6c, 0x6f,
+0x6e, 0x62, 0x6f, 0x61, 0x20, 0x76, 0x69, 0x73, 0x74, 0x61, 0x62, 0x6f,
+0x67, 0x6f, 0x1e6d, 0x61, 0x62, 0x6f, 0x69, 0x73, 0x12b, 0x6b, 0x65, 0x6d,
+0x62, 0x72, 0x69, 0x6a, 0x20, 0x62, 0x65, 0x6b, 0x61, 0x6d, 0x70, 0x6f,
+0x20, 0x67, 0x72, 0x61, 0x6e, 0x1e0d, 0x65, 0x6b, 0x61, 0x6e, 0x6b, 0x75,
+0x6e, 0x6b, 0x61, 0x72, 0x61, 0x6b, 0x61, 0x73, 0x6b, 0x65, 0x79, 0x65,
+0x6e, 0x6b, 0x65, 0x69, 0x6d, 0x61, 0x6e, 0x63, 0x69, 0x6b, 0x61, 0x67,
+0x6f, 0x63, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x6b, 0x6f,
+0x73, 0x1e6d, 0x61, 0x20, 0x72, 0x69, 0x6b, 0x61, 0x6b, 0x72, 0x65, 0x73,
+0x1e6d, 0x6f, 0x6e, 0x6b, 0x75, 0x61, 0x61, 0x62, 0x61, 0x6b, 0x79, 0x75,
+0x72, 0x61, 0x73, 0x6f, 0x1e0d, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x73,
+0x61, 0x76, 0x6e, 0x1e0d, 0x61, 0x6f, 0x73, 0x6e, 0x1e0d, 0x61, 0x6f, 0x73,
+0x6f, 0x6e, 0x20, 0x6b, 0x72, 0x12b, 0x6b, 0x1e0d, 0x65, 0x6e, 0x76, 0x65,
+0x72, 0x1e0d, 0x65, 0x1e6d, 0x72, 0x6f, 0x69, 0x1e6d, 0x1e0d, 0x6f, 0x6d, 0x69,
+0x6e, 0x69, 0x6b, 0x61, 0x65, 0x1e0d, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x6f, 0x6e,
+0x65, 0x69, 0x72, 0x75, 0x6e, 0x65, 0x70, 0x65, 0x65, 0x6c, 0x20, 0x73,
+0x61, 0x6c, 0x76, 0x61, 0x1e0d, 0x6f, 0x72, 0x70, 0x68, 0x6f, 0x72, 0x74,
+0x20, 0x6e, 0x65, 0x6c, 0x73, 0x6e, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c,
+0x65, 0x6a, 0x61, 0x67, 0x6c, 0x61, 0x73, 0x20, 0x62, 0x61, 0x79, 0x67,
+0x6f, 0x6f, 0x73, 0x20, 0x62, 0x65, 0x67, 0x72, 0x61, 0x6e, 0x1e0d, 0x20,
+0x1e6d, 0x75, 0x72, 0x6b, 0x67, 0x72, 0x65, 0x6e, 0x61, 0x1e0d, 0x61, 0x67,
+0x75, 0x61, 0x1e0d, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x67, 0x75, 0x61,
+0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x67, 0x75, 0x61, 0x6a, 0x61, 0x6b,
+0x69, 0x6c, 0x67, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x68, 0x65, 0x6c, 0x69,
+0x70, 0x61, 0x6b, 0x73, 0x68, 0x61, 0x76, 0x61, 0x6e, 0x61, 0x69, 0x6e,
+0x1e0d, 0x69, 0x61, 0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x6e, 0x6f,
+0x6b, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61,
+0x6d, 0x61, 0x72, 0x65, 0x6e, 0x67, 0x6f, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d,
+0x69, 0x79, 0x61, 0x6e, 0x61, 0x70, 0x69, 0x1e6d, 0x74, 0x72, 0x73, 0x62,
+0x65, 0x72, 0x67, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e,
+0x61, 0x1e6d, 0x65, 0x6c, 0x6c, 0x20, 0x73, 0x69, 0x74, 0x79, 0x2c, 0x20,
+0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, 0x76, 0x69, 0x76, 0x69,
+0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, 0x76, 0x69,
+0x6e, 0x63, 0x65, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x1e0d, 0x69, 0x79,
+0x61, 0x6e, 0x61, 0x76, 0x69, 0x6e, 0x61, 0x6d, 0x61, 0x6b, 0x2c, 0x20,
+0x69, 0x6e, 0x1e0d, 0x69, 0x79, 0x61, 0x6e, 0x61, 0x69, 0x6e, 0x16b, 0x76,
+0x69, 0x6b, 0x69, 0x6b, 0x61, 0x6c, 0x75, 0x69, 0x1e6d, 0x6a, 0x61, 0x6d,
+0x61, 0x69, 0x6b, 0x61, 0x6a, 0x75, 0x6e, 0x6f, 0x76, 0x6c, 0x6f, 0x75,
+0x69, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x69, 0x73,
+0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x6b, 0x65, 0x6e, 0x1e6d, 0x75, 0x6b,
+0x12b, 0x6b, 0x72, 0x65, 0x6c, 0x65, 0x6e, 0x1e0d, 0x65, 0x69, 0x6b, 0x6c,
+0x61, 0x20, 0x70, 0x61, 0x6a, 0x6c, 0x6f, 0x73, 0x20, 0x61, 0x6e, 0x6a,
+0x65, 0x6c, 0x65, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x70, 0x72,
+0x69, 0x6e, 0x63, 0x2019, 0x73, 0x20, 0x6b, 0x75, 0x76, 0x61, 0x1e6d, 0x61,
+0x72, 0x6d, 0x61, 0x73, 0x12b, 0x6f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x75,
+0x61, 0x6d, 0x61, 0x6e, 0x61, 0x75, 0x73, 0x6d, 0x61, 0x72, 0x69, 0x67,
+0x6f, 0x1e6d, 0x6d, 0x61, 0x72, 0x1e6d, 0x69, 0x6e, 0x69, 0x6b, 0x6d, 0x61,
+0x1e6d, 0x61, 0x6d, 0x6f, 0x72, 0x6f, 0x73, 0x6d, 0x61, 0x73, 0x61, 0x1e6d,
+0x6c, 0x61, 0x6e, 0x6d, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x12b, 0x6d,
+0x65, 0x72, 0x69, 0x1e0d, 0x61, 0x6d, 0x65, 0x1e6d, 0x6c, 0x61, 0x6b, 0x61,
+0x1e6d, 0x6c, 0x61, 0x6d, 0x65, 0x6b, 0x73, 0x69, 0x63, 0x6f, 0x20, 0x73,
+0x69, 0x1e6d, 0x79, 0x6d, 0x69, 0x6b, 0x76, 0x69, 0x6c, 0xf5, 0x6d, 0x6f,
+0x6e, 0x6b, 0x1e6d, 0x6f, 0x6e, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x65, 0x72, 0x72,
+0x65, 0x6d, 0x6f, 0x6e, 0x1e6d, 0x65, 0x76, 0x69, 0x64, 0x69, 0x6f, 0x6d,
+0x6f, 0x6e, 0x1e6d, 0x73, 0x65, 0x72, 0x72, 0x65, 0x1e6d, 0x6e, 0x61, 0x73,
+0x61, 0x75, 0x6e, 0x69, 0x79, 0x75, 0x20, 0x79, 0x6f, 0x72, 0x6b, 0x6e,
+0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x61, 0x62, 0x69, 0x79, 0x75, 0x6c, 0x61,
+0x2c, 0x20, 0x75, 0x74, 0x74, 0x61, 0x72, 0x20, 0x1e0d, 0x61, 0x6b, 0x6f,
+0x1e6d, 0x61, 0x6d, 0x61, 0x1e0d, 0x69, 0x6e, 0x12b, 0x20, 0x75, 0x74, 0x74,
+0x61, 0x72, 0x20, 0x1e0d, 0x61, 0x6b, 0x6f, 0x1e6d, 0x61, 0x6e, 0x65, 0x75,
+0x20, 0x73, 0x61, 0x6c, 0x65, 0x6d, 0x2c, 0x20, 0x75, 0x74, 0x74, 0x61,
+0x72, 0x20, 0x1e0d, 0x61, 0x6b, 0x6f, 0x1e6d, 0x61, 0x6e, 0x16b, 0x6b, 0x6f,
+0x6a, 0x69, 0x6e, 0x61, 0x67, 0x61, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x61,
+0x70, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x62, 0x6f, 0x70, 0x69,
+0x6e, 0x69, 0x6b, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2d, 0x61, 0x75, 0x2d,
+0x70, 0x72, 0x69, 0x6e, 0x73, 0x65, 0x70, 0x6f, 0x72, 0x1e6d, 0x20, 0x61,
+0x70, 0x20, 0x73, 0x70, 0x61, 0x69, 0x6e, 0x70, 0x6f, 0x72, 0x1e6d, 0x70,
+0x20, 0x76, 0x65, 0x6c, 0x68, 0x6f, 0x70, 0x75, 0x65, 0x72, 0x74, 0x6f,
+0x20, 0x72, 0x69, 0x6b, 0x6f, 0x70, 0x75, 0x1e47, 0x1e6d, 0x61, 0x20, 0x65,
+0x72, 0x65, 0x6e, 0x61, 0x73, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x20,
+0x69, 0x6e, 0x6c, 0x65, 0x64, 0x1e6d, 0x72, 0x65, 0x73, 0x69, 0x70, 0x69,
+0x72, 0x65, 0x6a, 0x69, 0x6e, 0x61, 0x72, 0x65, 0x6a, 0x61, 0x6c, 0x79,
+0x75, 0x1e6d, 0x72, 0x69, 0x6f, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x6b, 0x6f,
+0x73, 0x61, 0x74, 0x61, 0x72, 0x69, 0x73, 0x61, 0x6e, 0x1e6d, 0x69, 0x61,
+0x67, 0x6f, 0x73, 0x65, 0x6e, 0x74, 0x6f, 0x20, 0x1e0d, 0x6f, 0x6d, 0x69,
+0x6e, 0x67, 0x6f, 0x73, 0x61, 0x6f, 0x20, 0x70, 0x61, 0x75, 0x6c, 0x6f,
+0x69, 0x1e6d, 0x6f, 0x6b, 0x6f, 0x1e6d, 0x6f, 0x72, 0x6d, 0x69, 0x1e6d, 0x73,
+0x69, 0x74, 0x6b, 0x61, 0x73, 0x65, 0x6e, 0x1e6d, 0x20, 0x62, 0x61, 0x72,
+0x74, 0x65, 0x6c, 0x65, 0x6d, 0x69, 0x73, 0x65, 0x6e, 0x1e6d, 0x20, 0x6a,
+0x6f, 0x6e, 0x73, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x6b, 0x69, 0x1e6d, 0x1e6d,
+0x73, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x75, 0x73, 0x69, 0x61, 0x73,
+0x65, 0x6e, 0x1e6d, 0x20, 0x74, 0x6f, 0x6d, 0x61, 0x73, 0x73, 0x65, 0x6e,
+0x1e6d, 0x20, 0x76, 0x69, 0x6e, 0x73, 0x65, 0x6e, 0x1e6d, 0x73, 0x76, 0x69,
+0x70, 0x1e6d, 0x20, 0x6b, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x1e6d, 0x74, 0x65,
+0x67, 0x75, 0x74, 0x75, 0x6c, 0x65, 0x74, 0x69, 0x68, 0x76, 0x61, 0x6e,
+0x61, 0x1e6d, 0x6f, 0x72, 0x6f, 0x6e, 0x1e6d, 0x6f, 0x1e6d, 0x6f, 0x72, 0x1e6d,
+0x6f, 0x6c, 0x61, 0x76, 0x61, 0x6e, 0x6b, 0x16b, 0x76, 0x65, 0x72, 0x76,
+0x68, 0x61, 0x69, 0x1e6d, 0x68, 0x6f, 0x72, 0x73, 0x76, 0x69, 0x6e, 0x6e,
+0x69, 0x70, 0x65, 0x67, 0x79, 0x61, 0x6b, 0x75, 0x1e6d, 0x61, 0x1e6d, 0x6b,
+0x65, 0x73, 0x65, 0x65, 0x1e0d, 0x65, 0x76, 0x69, 0x73, 0x1e0d, 0x79, 0x75,
+0x6d, 0x6f, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x20, 0x75, 0x72, 0x76, 0x69,
+0x6c, 0x6c, 0x6d, 0x65, 0x6b, 0x76, 0x61, 0x72, 0x69, 0x6d, 0x61, 0x76,
+0x73, 0x6f, 0x6e, 0x6d, 0x65, 0x6b, 0x20, 0x6d, 0x75, 0x72, 0x1e0d, 0x6f,
+0x70, 0x61, 0x6c, 0x6d, 0x65, 0x72, 0x72, 0x6f, 0x74, 0x65, 0x72, 0x61,
+0x73, 0x79, 0x6f, 0x76, 0x61, 0x1e6d, 0x72, 0x6f, 0x6c, 0x6c, 0x76, 0x6f,
+0x73, 0x1e6d, 0x6f, 0x6b, 0x6c, 0x6e, 0x67, 0x79, 0x61, 0x72, 0x62, 0x79,
+0x65, 0x6e, 0x65, 0x1e0d, 0x65, 0x6e, 0x61, 0x6c, 0x6d, 0x61, 0x1e6d, 0x79,
+0x61, 0x6d, 0x6d, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x1e0d, 0x69, 0x72, 0x61,
+0x6b, 0x74, 0x61, 0x75, 0x61, 0x61, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x61,
+0x73, 0x67, 0x61, 0x62, 0x61, 0x1e6d, 0x61, 0x74, 0x61, 0x72, 0x61, 0x75,
+0x62, 0x61, 0x67, 0x64, 0x61, 0x64, 0x62, 0x61, 0x68, 0x72, 0x61, 0x69,
+0x6e, 0x62, 0x61, 0x6b, 0x75, 0x62, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b,
+0x62, 0x61, 0x72, 0x6e, 0x61, 0x75, 0x6c, 0x62, 0x65, 0x69, 0x72, 0x75,
+0x74, 0x62, 0x69, 0x73, 0x6b, 0x65, 0x6b, 0x62, 0x72, 0x75, 0x6e, 0x65,
+0x69, 0x63, 0x69, 0x74, 0x61, 0x6b, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f,
+0x1e0d, 0x61, 0x6d, 0x61, 0x73, 0x6b, 0x75, 0x73, 0x1e0d, 0x69, 0x6c, 0x69,
+0x64, 0x75, 0x62, 0x61, 0x69, 0x64, 0x75, 0x73, 0x61, 0x6d, 0x62, 0x65,
+0x70, 0x61, 0x6d, 0x61, 0x67, 0x75, 0x73, 0x74, 0x61, 0x67, 0x61, 0x6a,
+0x61, 0x68, 0x65, 0x62, 0x72, 0x6f, 0x6e, 0x68, 0x6f, 0x20, 0x63, 0x69,
+0x20, 0x6d, 0x69, 0x6e, 0x68, 0x20, 0x73, 0x69, 0x74, 0x69, 0x68, 0x6f,
+0x6e, 0x67, 0x20, 0x6b, 0x6f, 0x6e, 0x67, 0x69, 0x72, 0x6b, 0x75, 0x1e6d,
+0x73, 0x6b, 0x6a, 0x61, 0x79, 0x61, 0x70, 0x75, 0x72, 0x61, 0x6a, 0x65,
+0x72, 0x75, 0x73, 0x61, 0x6c, 0x65, 0x6d, 0x6b, 0x61, 0x62, 0x75, 0x6c,
+0x6b, 0x61, 0x6d, 0x63, 0x61, 0x1e6d, 0x6b, 0x61, 0x6b, 0x61, 0x72, 0x61,
+0x63, 0x12b, 0x6b, 0x61, 0x1e6d, 0x6d, 0x61, 0x6e, 0x1e0d, 0x75, 0x6b, 0x61,
+0x6e, 0x64, 0x69, 0x67, 0x61, 0x6b, 0x6f, 0x6c, 0x6b, 0x61, 0x74, 0x61,
+0x6b, 0x72, 0x61, 0x73, 0x6e, 0x65, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x6b,
+0x75, 0x61, 0x6c, 0x61, 0x20, 0x6c, 0x75, 0x6d, 0x70, 0x75, 0x72, 0x6b,
+0x75, 0x63, 0x69, 0x6e, 0x67, 0x6b, 0x75, 0x76, 0x61, 0x69, 0x74, 0x6d,
+0x6b, 0x61, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x1e0d, 0x61, 0x6e, 0x6d, 0x61,
+0x6b, 0x61, 0x73, 0x61, 0x72, 0x6d, 0x61, 0x6e, 0x12b, 0x6c, 0x61, 0x6d,
+0x61, 0x73, 0x6b, 0x61, 0x74, 0x6e, 0x69, 0x6b, 0x6f, 0x73, 0x69, 0x79,
+0x61, 0x6e, 0x65, 0x76, 0x6f, 0x6b, 0x75, 0x6a, 0x6e, 0x65, 0x1e6d, 0x73,
+0x6b, 0x6e, 0x6f, 0x76, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b,
+0x70, 0x6e, 0x6f, 0x6d, 0x20, 0x70, 0x65, 0x6e, 0x68, 0x70, 0x6f, 0x6e,
+0x1e6d, 0x69, 0x61, 0x6e, 0x61, 0x6b, 0x70, 0x79, 0x6f, 0x6e, 0x67, 0x79,
+0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x73, 0x1e6d, 0x61, 0x6e, 0x65, 0x6b, 0x69,
+0x6a, 0x75, 0x6f, 0x72, 0x64, 0x61, 0x72, 0x69, 0x79, 0x61, 0x64, 0x73,
+0x61, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x73, 0x61, 0x6d, 0x61, 0x72, 0x6b,
+0x61, 0x6e, 0x64, 0x73, 0x65, 0x6f, 0x6c, 0x73, 0x65, 0x6e, 0x67, 0x61,
+0x69, 0x73, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x73, 0x72, 0x65,
+0x1e0d, 0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x79, 0x6d, 0x73, 0x6b, 0x74, 0x61,
+0x69, 0x70, 0x65, 0x69, 0x74, 0x61, 0x73, 0x6b, 0x65, 0x6e, 0x1e6d, 0x74,
+0x62, 0x69, 0x6c, 0x69, 0x73, 0x69, 0x74, 0x65, 0x68, 0x72, 0x61, 0x6e,
+0x74, 0x69, 0x6d, 0x70, 0x68, 0x75, 0x1e6d, 0x6f, 0x6b, 0x79, 0x6f, 0x1e6d,
+0x6f, 0x6d, 0x73, 0x6b, 0x75, 0x6c, 0x61, 0x6e, 0x62, 0x61, 0x1e6d, 0x61,
+0x72, 0x75, 0x72, 0x75, 0x6d, 0x63, 0x69, 0x79, 0x75, 0x73, 0x74, 0x2d,
+0x6e, 0x65, 0x72, 0x61, 0x76, 0x69, 0x65, 0x6e, 0x1e6d, 0x69, 0x61, 0x61,
+0x6e, 0x76, 0x6c, 0x61, 0x1e0d, 0x69, 0x76, 0x6f, 0x73, 0x1e6d, 0x6f, 0x6b,
+0x79, 0x61, 0x6b, 0x75, 0x1e6d, 0x73, 0x6b, 0x79, 0x61, 0x6e, 0x67, 0x6f,
+0x6e, 0x79, 0x69, 0x6b, 0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75,
+0x72, 0x67, 0x79, 0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x61, 0x6a, 0x6f,
+0x72, 0x65, 0x73, 0x62, 0x65, 0x72, 0x6d, 0x16b, 0x64, 0x61, 0x6b, 0x65,
+0x6e, 0x65, 0x72, 0x69, 0x6b, 0x65, 0x70, 0x20, 0x76, 0x65, 0x72, 0x1e0d,
+0x65, 0x70, 0x65, 0x72, 0x6f, 0x6d, 0x61, 0x1e0d, 0x69, 0x65, 0x72, 0x61,
+0x72, 0x65, 0x79, 0x6b, 0x79, 0x61, 0x76, 0x69, 0x6b, 0x64, 0x6b, 0x69,
+0x1e47, 0x20, 0x6a, 0x6f, 0x72, 0x6a, 0x69, 0x61, 0x73, 0x65, 0x6e, 0x74,
+0x20, 0x68, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x73, 0x1e6d, 0x61, 0x6e, 0x6c,
+0x69, 0x61, 0x65, 0x64, 0x69, 0x6c, 0x65, 0x69, 0x64, 0x62, 0x72, 0x69,
+0x73, 0x62, 0x61, 0x6e, 0x65, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x20,
+0x68, 0x69, 0x6c, 0x6c, 0x1e0d, 0x61, 0x72, 0x76, 0x69, 0x6e, 0x79, 0x75,
+0x6b, 0x6c, 0x61, 0x68, 0x6f, 0x62, 0x61, 0x72, 0x1e6d, 0x6c, 0x69, 0x6e,
+0x1e0d, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x6c, 0x6f, 0x72, 0x1e0d, 0x20, 0x68,
+0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6c, 0x62, 0x6f, 0x72, 0x6e, 0x65, 0x70,
+0x65, 0x72, 0x74, 0x73, 0x79, 0x1e0d, 0x6e, 0x12b, 0x61, 0x6d, 0x73, 0x1e6d,
+0x65, 0x72, 0x1e0d, 0x61, 0x6d, 0x61, 0x61, 0x1e47, 0x1e0d, 0x6f, 0x72, 0x61,
+0x61, 0x61, 0x73, 0x1e6d, 0x72, 0x61, 0x68, 0x61, 0x6e, 0x65, 0x74, 0x65,
+0x6e, 0x73, 0x62, 0x65, 0x6c, 0x67, 0x72, 0x61, 0x1e0d, 0x65, 0x62, 0x65,
+0x72, 0x6c, 0x69, 0x6e, 0x62, 0x72, 0x61, 0x1e6d, 0x69, 0x73, 0x6c, 0x61,
+0x76, 0x61, 0x62, 0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x62, 0x75,
+0x6b, 0x61, 0x72, 0x65, 0x73, 0x74, 0x62, 0x75, 0x1e0d, 0x61, 0x70, 0x65,
+0x73, 0x74, 0x62, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x6e, 0x6b, 0x69,
+0x73, 0x69, 0x6e, 0x61, 0x75, 0x6b, 0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61,
+0x67, 0x65, 0x6e, 0x1e0d, 0x62, 0x6c, 0x69, 0x6e, 0x6a, 0x69, 0x62, 0x72,
+0x61, 0x6c, 0x1e6d, 0x61, 0x72, 0x67, 0x65, 0x72, 0x6e, 0x73, 0x69, 0x68,
+0x65, 0x6c, 0x73, 0x69, 0x6e, 0x6b, 0x69, 0x61, 0x61, 0x69, 0x6c, 0x20,
+0x61, 0x70, 0x20, 0x6d, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x62,
+0x75, 0x6c, 0x6a, 0x65, 0x72, 0x73, 0x69, 0x6b, 0x61, 0x6c, 0x69, 0x6e,
+0x69, 0x6e, 0x67, 0x72, 0x61, 0x1e0d, 0x6b, 0x69, 0x72, 0x6f, 0x76, 0x6b,
+0x69, 0x79, 0x76, 0x6c, 0x69, 0x73, 0x62, 0x6f, 0x6e, 0x6c, 0x79, 0x75,
+0x62, 0x6c, 0x79, 0x61, 0x6e, 0x61, 0x6c, 0x6e, 0x1e0d, 0x6e, 0x6c, 0x6b,
+0x73, 0x65, 0x6d, 0x62, 0x72, 0x67, 0x6d, 0x65, 0x1e0d, 0x72, 0x69, 0x1e0d,
+0x6d, 0x61, 0x6c, 0x1e6d, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x68, 0x61,
+0x6d, 0x6d, 0x69, 0x6e, 0x73, 0x6b, 0x6d, 0x6f, 0x6e, 0x61, 0x6b, 0x6f,
+0x6d, 0x6f, 0x73, 0x6b, 0x6f, 0x6f, 0x73, 0x6c, 0x6f, 0x70, 0x61, 0x72,
+0x69, 0x73, 0x70, 0x1e0d, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x73, 0x61, 0x70,
+0x72, 0x61, 0x67, 0x72, 0x69, 0x67, 0x61, 0x73, 0x61, 0x6d, 0x61, 0x72,
+0x61, 0x73, 0x61, 0x6e, 0x20, 0x6d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x73,
+0x61, 0x72, 0x61, 0x6a, 0x65, 0x76, 0x6f, 0x73, 0x61, 0x72, 0x61, 0x1e6d,
+0x6f, 0x76, 0x73, 0x69, 0x6d, 0x70, 0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c,
+0x73, 0x6b, 0x6f, 0x70, 0x69, 0x73, 0x6f, 0x70, 0x69, 0x79, 0x61, 0x73,
+0x1e6d, 0x6f, 0x6b, 0x68, 0x6f, 0x6d, 0x74, 0x61, 0x6c, 0x69, 0x6e, 0x1e6d,
+0x69, 0x72, 0x61, 0x6e, 0x65, 0x75, 0x6c, 0x79, 0x61, 0x6e, 0x6f, 0x76,
+0x73, 0x6b, 0x76, 0x61, 0x1e0d, 0x75, 0x6a, 0x76, 0x61, 0x1e6d, 0x69, 0x6b,
+0x61, 0x6e, 0x76, 0x69, 0x65, 0x6e, 0x6e, 0x61, 0x76, 0x69, 0x6c, 0x6e,
+0x69, 0x75, 0x73, 0x76, 0x6f, 0x6c, 0x67, 0x6f, 0x67, 0x72, 0x61, 0x1e0d,
+0x76, 0x61, 0x72, 0x73, 0x61, 0x74, 0x65, 0x67, 0x75, 0x73, 0x69, 0x67,
+0x61, 0x6c, 0x70, 0x61, 0x6a, 0x75, 0x72, 0x69, 0x63, 0x1e6d, 0x61, 0x6e,
+0x61, 0x6e, 0x61, 0x72, 0x69, 0x76, 0x63, 0x68, 0x61, 0x67, 0x6f, 0x73,
+0x6b, 0x72, 0x69, 0x73, 0x1e6d, 0x6d, 0x61, 0x73, 0x6b, 0x6f, 0x6b, 0x6f,
+0x73, 0x6b, 0x6f, 0x6d, 0x6f, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x67, 0x75,
+0x65, 0x6c, 0x65, 0x6e, 0x6d, 0x61, 0x68, 0x65, 0x6d, 0x61, 0x6c, 0x64,
+0x69, 0x76, 0x65, 0x73, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x73, 0x69, 0x75,
+0x73, 0x6d, 0x61, 0x79, 0x6f, 0x1e6d, 0x72, 0x65, 0x75, 0x6e, 0x69, 0x6f,
+0x6e, 0x61, 0x70, 0x69, 0x61, 0x101, 0x6b, 0x6c, 0x61, 0x6e, 0x1e0d, 0x62,
+0x6f, 0x75, 0x67, 0x61, 0x6e, 0x76, 0x69, 0x6c, 0x6c, 0x63, 0x65, 0x1e6d,
+0x61, 0x6d, 0x63, 0x16b, 0x6b, 0x12b, 0x73, 0x74, 0x65, 0x72, 0x69, 0x70,
+0x65, 0x1e6d, 0x65, 0x70, 0x61, 0x6b, 0x61, 0x6f, 0x70, 0x6f, 0x70, 0x69,
+0x6a, 0x69, 0x70, 0x75, 0x6e, 0x61, 0x70, 0x75, 0x74, 0x69, 0x67, 0x61,
+0x6c, 0x61, 0x70, 0x61, 0x67, 0x6f, 0x73, 0x67, 0x61, 0x6d, 0x62, 0x69,
+0x65, 0x72, 0x67, 0x75, 0x61, 0x1e0d, 0x61, 0x6c, 0x6b, 0x65, 0x6e, 0x61,
+0x6c, 0x6b, 0x61, 0x6e, 0x1e6d, 0x6f, 0x6e, 0x6b, 0x69, 0x72, 0x69, 0x74,
+0x69, 0x6d, 0x61, 0x74, 0x69, 0x6b, 0x69, 0x73, 0x72, 0x61, 0x65, 0x6b,
+0x76, 0x61, 0x6a, 0x61, 0x6c, 0x65, 0x69, 0x6e, 0x6d, 0x61, 0x6a, 0x75,
+0x72, 0x6f, 0x6d, 0x61, 0x72, 0x6b, 0x69, 0x73, 0x61, 0x73, 0x6d, 0x69,
+0x1e0d, 0x76, 0x61, 0x79, 0x6e, 0x61, 0x75, 0x72, 0x75, 0x6e, 0x69, 0x75,
+0x65, 0x6e, 0x6f, 0x72, 0x70, 0x6f, 0x6b, 0x6e, 0x75, 0x6d, 0x69, 0x65,
+0x70, 0x61, 0x6e, 0x67, 0x6f, 0x20, 0x70, 0x61, 0x6e, 0x67, 0x6f, 0x70,
+0x61, 0x6c, 0x61, 0x75, 0x70, 0x69, 0x1e6d, 0x6b, 0x65, 0x72, 0x6e, 0x70,
+0x6f, 0x6e, 0x70, 0x65, 0x69, 0x70, 0x6f, 0x72, 0x1e6d, 0x20, 0x6d, 0x6f,
+0x72, 0x65, 0x73, 0x62, 0x69, 0x72, 0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e,
+0x67, 0x61, 0x73, 0x61, 0x69, 0x70, 0x61, 0x6e, 0x1e6d, 0x61, 0x68, 0x69,
+0x1e6d, 0x69, 0x74, 0x61, 0x72, 0x61, 0x76, 0x61, 0x1e6d, 0x6f, 0x6e, 0x67,
+0x61, 0x1e6d, 0x61, 0x70, 0x75, 0x76, 0x65, 0x6b, 0x76, 0x61, 0x6c, 0x6c,
+0x69, 0x73, 0x92c, 0x94d, 0x92f, 0x93e, 0x928, 0x94d, 0x91c, 0x941, 0x932, 0x92a,
+0x93c, 0x94d, 0x930, 0x940, 0x91f, 0x93e, 0x909, 0x928, 0x915, 0x93e, 0x930, 0x94d,
+0x924, 0x941, 0x92e, 0x915, 0x93f, 0x902, 0x938, 0x93e, 0x938, 0x93e, 0x932, 0x941,
+0x92c, 0x941, 0x92e, 0x92c, 0x93e, 0x938, 0x940, 0x92e, 0x94d, 0x2d, 0x92c, 0x93e,
+0x92c, 0x93e, 0x928, 0x947, 0x92e, 0x94b, 0x917, 0x93e, 0x926, 0x93f, 0x938, 0x941,
+0x928, 0x93e, 0x907, 0x930, 0x94b, 0x92c, 0x93f, 0x928, 0x941, 0x906, 0x915, 0x91a,
+0x949, 0x91f, 0x938, 0x94d, 0x92f, 0x93e, 0x928, 0x20, 0x939, 0x94d, 0x935, 0x93e,
+0x928, 0x938, 0x94d, 0x92f, 0x93e, 0x928, 0x20, 0x932, 0x942, 0x924, 0x93f, 0x909,
+0x938, 0x941, 0x906, 0x907, 0x92f, 0x93e, 0x90f, 0x938, 0x928, 0x938, 0x93f, 0x92f,
+0x949, 0x928, 0x92c, 0x94d, 0x932, 0x93e, 0x902, 0x2d, 0x938, 0x947, 0x92c, 0x932,
+0x94b, 0x928, 0x915, 0x947, 0x92e, 0x94d, 0x92c, 0x94d, 0x930, 0x93f, 0x91c, 0x20,
+0x92c, 0x947, 0x915, 0x94d, 0x92f, 0x93e, 0x92e, 0x94d, 0x92a, 0x94b, 0x20, 0x917,
+0x94d, 0x930, 0x93e, 0x902, 0x921, 0x947, 0x915, 0x94d, 0x92f, 0x93e, 0x928, 0x915,
+0x941, 0x928, 0x938, 0x93f, 0x915, 0x93e, 0x917, 0x94b, 0x921, 0x947, 0x928, 0x92e,
+0x93e, 0x930, 0x94d, 0x915, 0x938, 0x949, 0x928, 0x924, 0x93f, 0x930, 0x941, 0x928,
+0x947, 0x92a, 0x947, 0x92a, 0x93c, 0x94b, 0x930, 0x94d, 0x91f, 0x20, 0x928, 0x947,
+0x932, 0x94d, 0x938, 0x928, 0x92a, 0x93c, 0x94b, 0x930, 0x94d, 0x91f, 0x93e, 0x932,
+0x947, 0x91c, 0x93c, 0x93e, 0x939, 0x947, 0x932, 0x93f, 0x92a, 0x947, 0x915, 0x94d,
+0x938, 0x907, 0x915, 0x93e, 0x932, 0x941, 0x924, 0x93f, 0x91f, 0x915, 0x94d, 0x930,
+0x93e, 0x932, 0x947, 0x928, 0x94d, 0x921, 0x93f, 0x91c, 0x93f, 0x915, 0x92e, 0x928,
+0x94b, 0x938, 0x92e, 0x947, 0x930, 0x93f, 0x917, 0x94b, 0x91f, 0x92c, 0x94d, 0x92f,
+0x942, 0x932, 0x93e, 0x2c, 0x20, 0x909, 0x924, 0x949, 0x930, 0x949, 0x20, 0x921,
+0x915, 0x94b, 0x91f, 0x93e, 0x92e, 0x93e, 0x926, 0x93f, 0x928, 0x940, 0x20, 0x909,
+0x924, 0x949, 0x930, 0x949, 0x20, 0x921, 0x915, 0x94b, 0x91f, 0x93e, 0x928, 0x94d,
+0x92f, 0x942, 0x20, 0x938, 0x93e, 0x932, 0x947, 0x92e, 0x2c, 0x20, 0x909, 0x924,
+0x949, 0x930, 0x949, 0x20, 0x921, 0x915, 0x94b, 0x91f, 0x93e, 0x913, 0x915, 0x93e,
+0x91c, 0x940, 0x928, 0x93e, 0x917, 0x93e, 0x92a, 0x93c, 0x940, 0x928, 0x93f, 0x915,
+0x94d, 0x938, 0x92a, 0x94b, 0x930, 0x94d, 0x91f, 0x20, 0x911, 0x92a, 0x93c, 0x20,
+0x938, 0x94d, 0x92a, 0x947, 0x928, 0x930, 0x947, 0x938, 0x93e, 0x907, 0x92a, 0x93c,
+0x938, 0x947, 0x928, 0x94d, 0x91f, 0x93e, 0x930, 0x947, 0x92e, 0x938, 0x947, 0x902,
+0x924, 0x93f, 0x906, 0x917, 0x94b, 0x938, 0x947, 0x902, 0x91f, 0x20, 0x92c, 0x93e,
+0x930, 0x94d, 0x924, 0x947, 0x932, 0x947, 0x92e, 0x93f, 0x938, 0x947, 0x902, 0x91f,
+0x20, 0x924, 0x949, 0x92e, 0x938, 0x938, 0x94d, 0x935, 0x93f, 0x92a, 0x93c, 0x94d,
+0x91f, 0x20, 0x915, 0x930, 0x902, 0x91f, 0x935, 0x94d, 0x92f, 0x93e, 0x928, 0x94d,
+0x915, 0x942, 0x935, 0x930, 0x92e, 0x94d, 0x92f, 0x93e, 0x915, 0x92e, 0x941, 0x930,
+0x94d, 0x921, 0x94b, 0x932, 0x949, 0x928, 0x94d, 0x917, 0x92f, 0x930, 0x92c, 0x94d,
+0x92f, 0x947, 0x928, 0x905, 0x938, 0x94d, 0x917, 0x93e, 0x92c, 0x93e, 0x924, 0x92c,
+0x94d, 0x92f, 0x93e, 0x902, 0x917, 0x915, 0x949, 0x915, 0x92c, 0x93f, 0x938, 0x94d,
+0x915, 0x947, 0x915, 0x92c, 0x94d, 0x930, 0x942, 0x928, 0x947, 0x924, 0x93f, 0x924,
+0x94d, 0x938, 0x93f, 0x924, 0x93e, 0x926, 0x941, 0x92c, 0x924, 0x93f, 0x926, 0x941,
+0x938, 0x93e, 0x902, 0x92c, 0x947, 0x92a, 0x93c, 0x93e, 0x92e, 0x93e, 0x917, 0x941,
+0x938, 0x94d, 0x924, 0x93e, 0x92f, 0x947, 0x930, 0x941, 0x938, 0x932, 0x947, 0x92e,
+0x915, 0x93e, 0x921, 0x93f, 0x902, 0x917, 0x93e, 0x92a, 0x928, 0x949, 0x92e, 0x20,
+0x92a, 0x947, 0x928, 0x94d, 0x939, 0x915, 0x93f, 0x91c, 0x93f, 0x932, 0x949, 0x930,
+0x94d, 0x921, 0x93e, 0x938, 0x93e, 0x915, 0x93e, 0x932, 0x93f, 0x928, 0x938, 0x902,
+0x918, 0x93e, 0x924, 0x93f, 0x924, 0x93e, 0x924, 0x93f, 0x92a, 0x947, 0x924, 0x93f,
+0x924, 0x93e, 0x938, 0x915, 0x902, 0x924, 0x91f, 0x94d, 0x2d, 0x92c, 0x93f, 0x932,
+0x93f, 0x938, 0x93f, 0x92f, 0x93e, 0x902, 0x917, 0x949, 0x928, 0x915, 0x94d, 0x92f,
+0x93e, 0x928, 0x947, 0x930, 0x940, 0x92a, 0x94d, 0x92f, 0x93e, 0x930, 0x94b, 0x926,
+0x93e, 0x945, 0x915, 0x93f, 0x923, 0x93e, 0x945, 0x20, 0x91c, 0x93e, 0x945, 0x930,
+0x94d, 0x91c, 0x93f, 0x92f, 0x93e, 0x938, 0x94d, 0x91f, 0x94d, 0x92f, 0x93e, 0x928,
+0x932, 0x940, 0x906, 0x938, 0x94d, 0x91f, 0x94d, 0x930, 0x93e, 0x915, 0x93e, 0x928,
+0x90f, 0x924, 0x947, 0x928, 0x94d, 0x938, 0x906, 0x907, 0x932, 0x20, 0x911, 0x92a,
+0x94d, 0x20, 0x92e, 0x94d, 0x92f, 0x93e, 0x928, 0x938, 0x93f, 0x92e, 0x94d, 0x92a,
+0x93c, 0x947, 0x930, 0x94b, 0x92a, 0x94b, 0x932, 0x938, 0x94d, 0x915, 0x94b, 0x92a,
+0x94d, 0x92f, 0x947, 0x938, 0x94b, 0x92a, 0x93c, 0x93f, 0x92f, 0x93e, 0x91c, 0x93c,
+0x94d, 0x92f, 0x942, 0x930, 0x93f, 0x915, 0x93c, 0x92e, 0x949, 0x930, 0x940, 0x938,
+0x938, 0x911, 0x915, 0x932, 0x947, 0x902, 0x921, 0x91a, 0x94d, 0x92f, 0x93e, 0x925,
+0x92e, 0x924, 0x93f, 0x938, 0x94d, 0x91f, 0x930, 0x90f, 0x92a, 0x93c, 0x947, 0x91f,
+0x92a, 0x93c, 0x93e, 0x915, 0x93e, 0x913, 0x92a, 0x93c, 0x94b, 0x92a, 0x93c, 0x93f,
+0x91c, 0x940, 0x92a, 0x93c, 0x94d, 0x92f, 0x942, 0x928, 0x93e, 0x92a, 0x93c, 0x941,
+0x91f, 0x940, 0x917, 0x94d, 0x92f, 0x93e, 0x92e, 0x92c, 0x93f, 0x92f, 0x930, 0x915,
+0x947, 0x902, 0x91f, 0x928, 0x928, 0x93e, 0x945, 0x909, 0x930, 0x941, 0x928, 0x949,
+0x930, 0x92a, 0x93c, 0x949, 0x915, 0x928, 0x949, 0x92e, 0x93f, 0x92f, 0x93e, 0x92a,
+0x94b, 0x928, 0x92a, 0x947, 0x924, 0x93f, 0xb0f, 0xb15, 0xb4d, 0xb30, 0xb3e, 0xb2c,
+0xb4d, 0xb30, 0xb3e, 0xb1c, 0xb3e, 0xb71, 0xb3f, 0xb32, 0xb4d, 0xb32, 0xb47, 0xb2c,
+0xb41, 0xb1c, 0xb42, 0xb2e, 0xb4d, 0xb2c, 0xb41, 0xb30, 0xb3e, 0xb15, 0xb28, 0xb3e,
+0xb15, 0xb4d, 0xb30, 0xb3f, 0xb1c, 0xb3f, 0xb2c, 0xb1f, 0xb3f, 0xb2a, 0xb4d, 0xb30,
+0xb3f, 0xb1f, 0xb3e, 0xb09, 0xb28, 0xb4d, 0x200c, 0xb17, 0xb3e, 0xb2c, 0xb30, 0xb4d,
+0xb23, 0xb4d, 0xb23, 0xb1c, 0xb39, 0xb3e, 0xb28, 0xb4d, 0xb38, 0xb2c, 0xb30, 0xb4d,
+0xb17, 0xb15, 0xb30, 0xb1f, 0xb09, 0xb2e, 0xb4d, 0x200c, 0xb32, 0xb3e, 0xb17, 0xb38,
+0xb4d, 0x200c, 0xb32, 0xb3f, 0xb2c, 0xb4d, 0xb30, 0xb47, 0xb71, 0xb3f, 0xb32, 0xb4d,
+0xb32, 0xb47, 0xb32, 0xb2e, 0xb4d, 0x200c, 0xb2e, 0xb4d, 0x2d, 0xb2c, 0xb3e, 0xb2c,
+0xb3e, 0xb28, 0xb47, 0xb2e, 0xb4b, 0xb17, 0xb3e, 0xb21, 0xb3f, 0xb38, 0xb41, 0xb2e,
+0xb28, 0xb30, 0xb4b, 0xb2c, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb07, 0xb30, 0xb2c, 0xb3f,
+0xb28, 0xb41, 0xb06, 0xb15, 0xb1a, 0xb1f, 0xb05, 0xb17, 0xb3e, 0xb21, 0xb17, 0xb41,
+0xb2a, 0xb30, 0xb4d, 0xb1f, 0x2d, 0xb28, 0xb71, 0xb38, 0xb3e, 0xb05, 0x20, 0xb1f,
+0xb2e, 0xb47, 0xb24, 0xb4d, 0xb30, 0xb3f, 0xb2a, 0xb32, 0xb3f, 0xb71, 0xb3f, 0xb23,
+0xb4d, 0xb21, 0xb39, 0xb15, 0xb4d, 0xb2c, 0xb41, 0xb0f, 0xb28, 0xb38, 0xb4d, 0x20,
+0xb06, 0xb07, 0xb30, 0xb47, 0xb38, 0xb4d, 0xb15, 0xb3e, 0xb3c, 0xb1f, 0xb3e, 0xb2e,
+0xb3e, 0xb15, 0xb3e, 0xb01, 0xb15, 0xb4b, 0xb21, 0xb4b, 0xb2c, 0xb3e, 0xb1c, 0xb41,
+0xb1c, 0xb4b, 0xb0f, 0xb32, 0xb3e, 0x20, 0xb30, 0xb3f, 0xb4d, 0xb05, 0xb1c, 0xb3e,
+0xb2e, 0xb47, 0xb23, 0xb4d, 0xb21, 0xb1c, 0xb3e, 0xb30, 0xb3f, 0xb5f, 0xb4b, 0x20,
+0xb17, 0xb3e, 0xb32, 0xb47, 0xb17, 0xb4b, 0xb38, 0xb38, 0xb3e, 0xb32, 0xb4d, 0xb1f,
+0xb3e, 0xb38, 0xb3e, 0xb5f, 0xb3e, 0xb28, 0xb4d, 0x20, 0xb71, 0xb3e, 0xb28, 0xb4d,
+0xb38, 0xb5f, 0xb3e, 0xb28, 0x20, 0xb32, 0xb41, 0xb07, 0xb38, 0xb1f, 0xb4b, 0xb15,
+0xb41, 0xb2e, 0xb28, 0xb09, 0xb38, 0xb41, 0xb06, 0xb07, 0xb5f, 0xb3e, 0xb05, 0xb30,
+0xb41, 0xb2c, 0xb3e, 0xb2c, 0xb3e, 0xb30, 0xb2c, 0xb3e, 0xb21, 0xb38, 0xb2c, 0xb4d,
+0xb32, 0xb3e, 0xb19, 0xb4d, 0xb15, 0x2d, 0xb38, 0xb3e, 0xb2c, 0xb32, 0xb28, 0xb4d,
+0xb2c, 0xb4b, 0xb06, 0x20, 0xb71, 0xb3f, 0xb38, 0xb4d, 0xb1f, 0xb3e, 0xb2c, 0xb17,
+0xb1f, 0xb3e, 0xb2c, 0xb07, 0xb38, 0xb47, 0xb15, 0xb3e, 0xb2e, 0xb4d, 0xb2a, 0x20,
+0xb17, 0xb4d, 0xb30, 0xb3e, 0xb23, 0xb4d, 0xb21, 0xb47, 0xb38, 0xb3f, 0xb15, 0xb3e,
+0xb17, 0xb15, 0xb37, 0xb4d, 0xb1f, 0xb3e, 0x20, 0xb30, 0xb3f, 0xb15, 0xb3e, 0xb15,
+0xb4d, 0xb30, 0xb47, 0xb38, 0xb4d, 0x200d, 0xb1f, 0xb28, 0xb21, 0xb47, 0xb28, 0xb71,
+0xb3f, 0xb30, 0xb4d, 0xb21, 0xb47, 0xb1f, 0xb4d, 0xb30, 0xb07, 0xb1f, 0xb4d, 0xb21,
+0xb2e, 0xb3f, 0xb28, 0xb3f, 0xb15, 0xb3e, 0xb0f, 0xb21, 0xb4d, 0x200d, 0xb2e, 0xb28,
+0xb1f, 0xb28, 0xb4d, 0xb0f, 0xb32, 0xb4d, 0x20, 0xb38, 0xb3e, 0xb32, 0xb71, 0xb3e,
+0xb21, 0xb4b, 0xb30, 0xb4d, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0x20, 0xb28, 0xb47, 0xb32,
+0xb38, 0xb28, 0xb4d, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0xb32, 0xb47, 0xb1c, 0xb3e, 0xb17,
+0xb41, 0xb06, 0xb21, 0xb47, 0xb32, 0xb09, 0xb2a, 0xb47, 0xb17, 0xb41, 0xb06, 0xb24,
+0xb47, 0xb2e, 0xb3e, 0xb32, 0xb3e, 0xb39, 0xb3e, 0xb71, 0xb28, 0xb3e, 0xb39, 0xb47,
+0xb30, 0xb2e, 0xb38, 0xb3f, 0xb32, 0xb4b, 0xb07, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb06,
+0xb28, 0xb3e, 0xb2a, 0xb32, 0xb3f, 0xb38, 0xb4d, 0xb2e, 0xb3e, 0xb30, 0xb47, 0xb28,
+0xb17, 0x2c, 0x20, 0xb07, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb06, 0xb28, 0xb3e, 0xb71,
+0xb47, 0xb71, 0xb3e, 0xb5f, 0x2c, 0x20, 0xb07, 0xb23, 0xb4d, 0xb21, 0xb3f, 0xb06,
+0xb28, 0xb3e, 0xb07, 0xb28, 0xb41, 0xb71, 0xb3f, 0xb15, 0xb4d, 0xb32, 0xb09, 0xb07,
+0xb38, 0xb71, 0xb3f, 0xb32, 0xb4d, 0xb32, 0xb47, 0xb2e, 0xb23, 0xb4d, 0xb1f, 0xb3f,
+0xb38, 0xb47, 0xb32, 0x2c, 0x20, 0xb15, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb09, 0xb15,
+0xb3f, 0xb15, 0xb47, 0xb15, 0xb4d, 0xb30, 0xb3e, 0xb32, 0xb47, 0xb23, 0xb4d, 0xb21,
+0xb3f, 0xb1c, 0xb3f, 0xb15, 0xb2e, 0xb3e, 0xb38, 0xb3f, 0xb05, 0xb2e, 0xb3e, 0xb30,
+0xb3f, 0xb17, 0xb1f, 0xb4d, 0xb2e, 0xb3e, 0xb1f, 0xb3e, 0xb2e, 0xb30, 0xb38, 0xb4d,
+0xb2e, 0xb3e, 0xb1c, 0xb3e, 0xb1f, 0xb32, 0xb3e, 0xb28, 0xb4d, 0xb2e, 0xb3f, 0xb15,
+0xb4d, 0xb35, 0xb47, 0xb32, 0xb28, 0xb4d, 0xb2e, 0xb3e, 0xb28, 0xb15, 0xb1f, 0xb28,
+0xb4d, 0xb2e, 0xb28, 0xb1f, 0xb47, 0xb30, 0xb3f, 0xb0f, 0xb2e, 0xb23, 0xb4d, 0xb1f,
+0xb47, 0xb2d, 0xb3f, 0xb21, 0xb3f, 0xb05, 0xb2e, 0xb28, 0xb1f, 0xb38, 0xb47, 0xb30,
+0xb30, 0xb3e, 0xb1f, 0xb4d, 0xb28, 0xb4d, 0xb5f, 0xb41, 0x20, 0xb5f, 0xb30, 0xb4d,
+0xb15, 0xb4d, 0xb28, 0xb30, 0xb39, 0xb4d, 0xb28, 0xb2c, 0xb47, 0xb09, 0xb32, 0xb3e,
+0xb39, 0x2c, 0x20, 0xb09, 0xb24, 0xb4d, 0xb24, 0xb30, 0x20, 0xb21, 0xb3e, 0xb15,
+0xb1f, 0xb3e, 0xb15, 0xb47, 0xb28, 0xb4d, 0xb26, 0xb4d, 0xb30, 0x2c, 0x20, 0xb09,
+0xb24, 0xb4d, 0xb24, 0xb30, 0x20, 0xb21, 0xb3e, 0xb15, 0xb1f, 0xb3e, 0xb28, 0xb4d,
+0xb5f, 0xb41, 0x20, 0xb38, 0xb3e, 0xb32, 0xb47, 0xb2e, 0xb4d, 0x2c, 0x20, 0xb09,
+0xb24, 0xb4d, 0xb24, 0xb30, 0x20, 0xb21, 0xb3e, 0xb15, 0xb1f, 0xb3e, 0xb05, 0xb1c,
+0xb3f, 0xb28, 0xb3e, 0xb17, 0xb3e, 0xb2a, 0xb07, 0xb28, 0xb3f, 0xb15, 0xb4d, 0xb38,
+0xb2a, 0xb30, 0xb4d, 0xb1f, 0x2d, 0xb0f, 0xb5f, 0xb41, 0x2d, 0xb2a, 0xb4d, 0xb30,
+0xb3f, 0xb28, 0xb4d, 0x200d, 0xb38, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0xb4d, 0x20, 0xb05,
+0xb2b, 0xb4d, 0x20, 0xb38, 0xb4d, 0xb2a, 0xb47, 0xb28, 0xb4d, 0xb2a, 0xb41, 0xb0f,
+0xb30, 0xb4d, 0xb24, 0x20, 0xb30, 0xb3f, 0xb15, 0xb30, 0xb47, 0xb38, 0xb3f, 0xb2a,
+0xb3f, 0xb30, 0xb3f, 0xb5f, 0x20, 0xb2c, 0xb4d, 0xb30, 0xb3e, 0xb19, 0xb4d, 0xb15,
+0xb38, 0xb3e, 0xb28, 0xb4d, 0xb24, 0xb30, 0xb47, 0xb2e, 0xb4d, 0xb38, 0xb3e, 0xb23,
+0xb4d, 0xb1f, 0x20, 0xb21, 0xb2e, 0xb3f, 0xb19, 0xb4d, 0xb17, 0xb07, 0xb1f, 0xb4d,
+0xb1f, 0xb15, 0xb4d, 0xb35, 0xb30, 0xb1f, 0xb30, 0xb2e, 0xb3f, 0xb1f, 0xb4d, 0xb38,
+0xb47, 0xb23, 0xb4d, 0xb1f, 0x20, 0xb2c, 0xb3e, 0xb30, 0xb4d, 0xb24, 0xb47, 0xb32,
+0xb47, 0xb2e, 0xb3f, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0x20, 0xb15, 0xb3f,
+0xb1f, 0xb4d, 0x200d, 0xb38, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0x2e, 0x20,
+0xb25, 0xb2e, 0xb3e, 0xb38, 0xb4d, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0x2e,
+0x20, 0xb71, 0xb3f, 0xb28, 0xb38, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb4d, 0xb24, 0xb41,
+0xb32, 0xb47, 0xb1f, 0xb30, 0xb23, 0xb4d, 0xb1f, 0xb1f, 0xb30, 0xb1f, 0xb32, 0xb3e,
+0xb71, 0xb3e, 0xb19, 0xb4d, 0xb15, 0xb41, 0xb71, 0xb30, 0xb4d, 0xb15, 0xb47, 0xb38,
+0xb3f, 0xb21, 0xb47, 0xb71, 0xb3f, 0xb38, 0xb4d, 0xb21, 0xb4d, 0xb5f, 0xb41, 0xb2e,
+0xb3e, 0xb23, 0xb4d, 0xb1f, 0x20, 0xb21, 0xb3f, 0x20, 0xb09, 0xb30, 0xb71, 0xb3f,
+0xb32, 0xb47, 0xb2e, 0xb15, 0xb4d, 0xb71, 0xb3e, 0xb30, 0xb3f, 0xb2e, 0xb3e, 0xb01,
+0xb38, 0xb28, 0xb2e, 0xb4d, 0xb5f, 0xb3e, 0xb15, 0xb2e, 0xb41, 0xb30, 0xb4d, 0xb21,
+0xb2a, 0xb3e, 0xb01, 0xb2e, 0xb30, 0xb30, 0xb4b, 0xb24, 0xb47, 0xb30, 0xb3e, 0xb1f,
+0xb4b, 0xb32, 0xb4d, 0xb71, 0xb4b, 0xb38, 0xb4d, 0xb24, 0xb15, 0xb4b, 0xb33, 0xb19,
+0xb4d, 0xb16, 0xb5f, 0xb3e, 0xb30, 0xb2c, 0xb47, 0xb28, 0xb06, 0xb15, 0xb4d, 0xb1f,
+0xb2c, 0xb47, 0xb06, 0xb38, 0xb4d, 0x200d, 0xb17, 0xb3e, 0xb2c, 0xb1f, 0xb4d, 0xb2c,
+0xb39, 0xb3e, 0xb30, 0xb47, 0xb28, 0xb2c, 0xb3f, 0xb38, 0xb15, 0xb47, 0xb15, 0xb4d,
+0x200c, 0xb26, 0xb41, 0xb38, 0xb3e, 0xb28, 0xb2c, 0xb47, 0xb2a, 0xb3e, 0xb2e, 0xb3e,
+0xb17, 0xb41, 0xb38, 0xb4d, 0xb1f, 0xb3e, 0xb39, 0x20, 0xb1a, 0xb3f, 0x20, 0xb2e,
+0xb3f, 0xb28, 0xb4d, 0x200c, 0x20, 0xb38, 0xb3f, 0xb1f, 0xb3f, 0xb39, 0xb4b, 0xb71,
+0xb21, 0xb4d, 0x200c, 0xb1c, 0xb3e, 0xb15, 0xb30, 0xb4d, 0xb24, 0xb3e, 0xb15, 0xb2c,
+0xb41, 0xb32, 0xb4d, 0xb15, 0xb3e, 0xb1f, 0xb2e, 0xb3e, 0xb23, 0xb4d, 0xb21, 0xb41,
+0xb15, 0xb3e, 0xb28, 0xb21, 0xb4d, 0xb5f, 0xb3e, 0xb17, 0xb3e, 0xb15, 0xb4d, 0xb30,
+0xb3e, 0xb38, 0xb28, 0xb5f, 0xb3e, 0xb30, 0xb38, 0xb4d, 0xb15, 0xb28, 0xb3f, 0xb15,
+0xb38, 0xb3f, 0xb06, 0xb28, 0xb71, 0xb15, 0xb41, 0xb1c, 0xb28, 0xb47, 0xb1f, 0xb38,
+0xb4d, 0xb15, 0xb28, 0xb71, 0xb38, 0xb3f, 0xb2c, 0xb3f, 0xb30, 0xb38, 0xb4d, 0xb15,
+0xb05, 0xb30, 0xb3e, 0xb32, 0xb4d, 0x200c, 0xb2a, 0xb28, 0xb2e, 0xb4d, 0x200c, 0x20,
+0xb2a, 0xb47, 0xb28, 0xb39, 0xb2a, 0xb23, 0xb4d, 0xb1f, 0xb3f, 0xb06, 0xb28, 0xb3e,
+0xb15, 0xb4d, 0x200c, 0xb15, 0xb37, 0xb4d, 0xb1f, 0xb28, 0xb47, 0xb15, 0xb40, 0xb1c,
+0xb3f, 0xb32, 0xb30, 0xb4d, 0xb21, 0xb3e, 0xb38, 0xb15, 0xb3e, 0xb32, 0xb3f, 0xb28,
+0xb4d, 0xb38, 0xb3f, 0xb05, 0xb32, 0xb38, 0xb02, 0xb17, 0xb3e, 0xb07, 0xb38, 0xb4d,
+0xb30, 0xb47, 0xb21, 0xb28, 0xb47, 0xb15, 0xb32, 0xb5f, 0xb2e, 0xb38, 0xb4d, 0xb15,
+0xb24, 0xb3e, 0xb38, 0xb15, 0xb47, 0xb23, 0xb4d, 0xb1f, 0xb24, 0xb3f, 0xb2e, 0xb4d,
+0xb2a, 0xb41, 0xb1f, 0xb15, 0xb3f, 0xb05, 0xb1f, 0xb2e, 0xb38, 0xb4d, 0xb15, 0xb5f,
+0xb41, 0xb38, 0xb4d, 0x200d, 0xb1f, 0x2d, 0xb28, 0xb47, 0xb30, 0xb3e, 0xb71, 0xb3f,
+0xb0f, 0xb23, 0xb4d, 0xb1f, 0xb3f, 0xb0f, 0xb28, 0xb4d, 0x200c, 0xb71, 0xb4d, 0xb32,
+0xb3e, 0xb21, 0xb3f, 0xb71, 0xb37, 0xb4d, 0xb1f, 0xb4b, 0xb15, 0xb4d, 0xb5f, 0xb47,
+0xb30, 0xb47, 0xb2c, 0xb3e, 0xb28, 0xb4d, 0xb06, 0xb1c, 0xb30, 0xb47, 0xb38, 0xb4d,
+0xb2c, 0xb30, 0xb2e, 0xb41, 0xb21, 0xb3e, 0xb15, 0xb47, 0xb2a, 0xb4d, 0x200c, 0x20,
+0xb71, 0xb30, 0xb4d, 0xb26, 0xb47, 0xb2a, 0xb30, 0xb0f, 0xb30, 0xb47, 0xb15, 0xb4d,
+0xb5f, 0xb3e, 0xb2c, 0xb3f, 0xb15, 0xb38, 0xb4d, 0x200d, 0xb1f, 0xb3e, 0xb32, 0xb3f,
+0xb28, 0xb0f, 0xb21, 0xb3f, 0xb32, 0xb47, 0xb21, 0xb4d, 0xb2c, 0xb4d, 0xb30, 0xb3f,
+0xb38, 0xb2c, 0xb28, 0xb4d, 0xb2c, 0xb4d, 0xb30, 0xb4b, 0xb15, 0xb28, 0x20, 0xb39,
+0xb3f, 0xb32, 0xb21, 0xb3e, 0xb30, 0xb4d, 0xb71, 0xb3f, 0xb28, 0xb4d, 0xb32, 0xb3f,
+0xb23, 0xb4d, 0xb21, 0xb47, 0xb2e, 0xb3e, 0xb28, 0xb32, 0xb30, 0xb4d, 0x200d, 0xb21,
+0x20, 0xb39, 0xb3e, 0xb71, 0xb47, 0xb2e, 0xb47, 0xb32, 0xb2c, 0xb4b, 0xb28, 0xb01,
+0xb2a, 0xb30, 0xb4d, 0xb24, 0xb06, 0xb2e, 0xb37, 0xb4d, 0xb1f, 0xb4d, 0xb30, 0xb47,
+0xb21, 0xb3e, 0xb2e, 0xb4d, 0xb06, 0xb23, 0xb4d, 0xb21, 0xb30, 0xb3e, 0xb06, 0xb38,
+0xb4d, 0x200d, 0xb1f, 0xb30, 0xb3e, 0xb15, 0xb3e, 0xb28, 0xb0f, 0xb24, 0xb47, 0xb28,
+0xb4d, 0xb38, 0xb2c, 0xb47, 0xb32, 0xb17, 0xb4d, 0xb30, 0xb47, 0xb21, 0xb47, 0xb2c,
+0xb4d, 0xb30, 0xb3e, 0xb1f, 0xb3f, 0xb38, 0xb32, 0xb3e, 0xb71, 0xb3e, 0xb2c, 0xb4d,
+0xb30, 0xb41, 0xb38, 0xb3f, 0xb32, 0xb4d, 0x200d, 0xb38, 0xb2c, 0xb41, 0xb1a, 0xb3e,
+0xb30, 0xb47, 0xb38, 0xb4d, 0xb1f, 0xb2c, 0xb41, 0xb21, 0xb3e, 0xb2a, 0xb47, 0xb38,
+0xb4d, 0xb1f, 0xb1a, 0xb3f, 0xb38, 0xb3f, 0xb28, 0xb3e, 0xb09, 0xb15, 0xb2a, 0xb47,
+0xb28, 0xb39, 0xb3e, 0xb17, 0xb47, 0xb28, 0xb4d, 0xb06, 0xb07, 0xb32, 0xb4d, 0x20,
+0xb05, 0xb2a, 0xb4d, 0x20, 0xb2e, 0xb4d, 0xb5f, 0xb3e, 0xb28, 0xb4d, 0xb15, 0xb3f,
+0xb30, 0xb71, 0xb2e, 0xb3e, 0xb30, 0xb3f, 0xb5f, 0xb3e, 0xb39, 0xb47, 0xb2e, 0xb2e,
+0xb28, 0xb3e, 0xb15, 0xb05, 0xb38, 0xb32, 0xb4b, 0xb2a, 0xb21, 0xb17, 0xb30, 0xb3f,
+0xb15, 0xb3e, 0xb30, 0xb2e, 0xb4d, 0xb38, 0xb3e, 0xb30, 0xb3e, 0xb1c, 0xb47, 0xb2c,
+0xb38, 0xb3e, 0xb30, 0xb3e, 0xb1f, 0xb71, 0xb4d, 0xb38, 0xb3f, 0xb2e, 0xb2b, 0xb47,
+0xb30, 0xb2a, 0xb32, 0xb4d, 0xb38, 0xb4d, 0xb15, 0xb2a, 0xb5f, 0xb47, 0xb38, 0xb2a,
+0xb3f, 0xb5f, 0xb3e, 0xb38, 0xb4d, 0xb1f, 0xb15, 0xb4d, 0x20, 0xb39, 0xb2e, 0xb4d,
+0x200c, 0xb1f, 0xb3e, 0xb07, 0xb30, 0xb47, 0xb28, 0xb4d, 0xb5f, 0xb41, 0xb32, 0xb5f,
+0xb3e, 0xb28, 0xb71, 0xb38, 0xb4d, 0xb15, 0xb2c, 0xb3e, 0xb21, 0xb41, 0xb1c, 0xb71,
+0xb3e, 0xb1f, 0xb3f, 0xb15, 0xb3e, 0xb28, 0xb4d, 0xb71, 0xb3f, 0xb0f, 0xb28, 0xb3e,
+0xb71, 0xb3f, 0xb32, 0xb28, 0xb3f, 0xb09, 0xb38, 0xb4d, 0xb71, 0xb32, 0xb17, 0xb17,
+0xb4d, 0xb30, 0xb3e, 0xb21, 0xb4d, 0xb16, 0xb4d, 0xb30, 0xb40, 0xb38, 0xb4d, 0x200d,
+0xb1f, 0x20, 0xb2e, 0xb3e, 0xb38, 0xb15, 0xb15, 0xb38, 0xb4d, 0x200c, 0xb15, 0xb2e,
+0xb30, 0xb15, 0xb47, 0xb30, 0xb17, 0xb41, 0xb32, 0xb47, 0xb28, 0xb2e, 0xb30, 0xb3f,
+0xb38, 0xb38, 0xb4d, 0xb2e, 0xb3e, 0xb5f, 0xb1f, 0xb47, 0xb2c, 0xb17, 0xb47, 0xb28,
+0xb4d, 0x200c, 0xb71, 0xb3f, 0xb32, 0xb4d, 0xb32, 0xb47, 0xb1a, 0xb3e, 0xb24, 0xb3e,
+0xb2e, 0xb4d, 0x200c, 0xb2a, 0xb15, 0xb3e, 0xb05, 0xb2a, 0xb2a, 0xb3f, 0xb1c, 0xb3f,
+0xb17, 0xb3e, 0xb32, 0xb3e, 0xb2a, 0xb3e, 0xb17, 0xb38, 0xb15, 0xb47, 0xb23, 0xb4d,
+0xb1f, 0xb28, 0xb28, 0xb30, 0xb2a, 0xb15, 0xb4d, 0x200c, 0xb28, 0xb09, 0xb2e, 0xb3f,
+0xb5f, 0xb2a, 0xb39, 0xb28, 0xb2a, 0xb47, 0xb07, 0xb2a, 0xb30, 0xb4d, 0xb1f, 0xb4d,
+0x200c, 0x20, 0xb2e, 0xb30, 0xb47, 0xb38, 0xb2c, 0xb3f, 0xb30, 0xb3e, 0xb30, 0xb1f,
+0xb19, 0xb4d, 0xb17, 0xb3e, 0xb1f, 0xb19, 0xb4d, 0xb17, 0xb3e, 0xb1f, 0xb3e, 0xb2a,
+0xb41, 0xc0e, 0xc02, 0xc17, 0xc4d, 0xc35, 0xc3f, 0xc32, 0xc4d, 0xc32, 0xc3e, 0x3c,
+0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x43, 0x69, 0x74, 0x79,
+0x3e, 0xc05, 0xc21, 0xc46, 0xc32, 0xc48, 0xc21, 0xc4d, 0x3c, 0x2f, 0x65, 0x78,
+0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x43, 0x69, 0x74, 0x79, 0x3e, 0xc15,
+0xc3e, 0xc02, 0xc1f, 0xc28, 0xc4d, 0x140a, 0x144e, 0x1426, 0x146f, 0x1472, 0x1423, 0x1401,
+0x141f, 0x14aa, 0x1423, 0x1450, 0x1423, 0x1403, 0x14c4, 0x1431, 0x1420, 0x1403, 0x1473, 0x14eb,
+0x1405, 0x1403, 0x141f, 0x14f4, 0x1422, 0x1473, 0x141f, 0x1489, 0x1418, 0x1423, 0x1411, 0x14c2,
+0x142f, 0x1420
};
static inline constexpr char16_t shortZoneNameTable[] = {
diff --git a/src/corelib/tools/qarraydata.cpp b/src/corelib/tools/qarraydata.cpp
index 37d6dea35f9..54bd971cb36 100644
--- a/src/corelib/tools/qarraydata.cpp
+++ b/src/corelib/tools/qarraydata.cpp
@@ -181,13 +181,12 @@ allocateHelper(qsizetype objectSize, qsizetype alignment, qsizetype capacity,
return {};
void *data = nullptr;
- QArrayData *header = static_cast<QArrayData *>(::malloc(size_t(allocSize)));
- if (Q_LIKELY(header)) {
- header->ref_.storeRelaxed(1);
- header->flags = {};
+ void *mem = ::malloc(size_t(allocSize));
+ QArrayData *header = nullptr;
+ if (Q_LIKELY(mem)) {
+ header = new (mem) QArrayData{1, {}, capacity};
// find where offset should point to so that data() is aligned to alignment bytes
data = QTypedArrayData<void>::dataStart(header, alignment);
- header->alloc = capacity;
}
return { data, header };
@@ -245,8 +244,12 @@ QArrayData::reallocateUnaligned(QArrayData *data, void *dataPointer,
Q_ASSERT(offset > 0);
Q_ASSERT(offset <= allocSize); // equals when all free space is at the beginning
- QArrayData *header = static_cast<QArrayData *>(::realloc(data, size_t(allocSize)));
- if (header) {
+ const bool hadData = data;
+ void *mem = ::realloc(data, size_t(allocSize));
+ QArrayData *header = static_cast<QArrayData *>(mem);
+ if (mem) {
+ if (!hadData)
+ header = new (mem) QArrayData{0, {}, {}};
header->alloc = capacity;
dataPointer = reinterpret_cast<char *>(header) + offset;
} else {
diff --git a/src/corelib/tools/qarraydata.h b/src/corelib/tools/qarraydata.h
index 38d1091ac1f..71e183e646e 100644
--- a/src/corelib/tools/qarraydata.h
+++ b/src/corelib/tools/qarraydata.h
@@ -39,7 +39,7 @@ struct QArrayData
};
Q_DECLARE_FLAGS(ArrayOptions, ArrayOption)
- QBasicAtomicInt ref_;
+ QBasicAtomicInt m_ref;
ArrayOptions flags;
qsizetype alloc;
@@ -56,19 +56,19 @@ struct QArrayData
/// Returns true if sharing took place
bool ref() noexcept
{
- ref_.ref();
+ m_ref.ref();
return true;
}
/// Returns false if deallocation is necessary
bool deref() noexcept
{
- return ref_.deref();
+ return m_ref.deref();
}
bool isShared() const noexcept
{
- return ref_.loadRelaxed() != 1;
+ return m_ref.loadRelaxed() != 1;
}
// Returns true if a detach is necessary before modifying the data
@@ -76,7 +76,7 @@ struct QArrayData
// detaching is necessary, you should be in a non-const function already
bool needsDetach() noexcept
{
- return ref_.loadRelaxed() > 1;
+ return m_ref.loadRelaxed() > 1;
}
qsizetype detachCapacity(qsizetype newSize) const noexcept
diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h
index c20abd12c23..419585b0260 100644
--- a/src/corelib/tools/qarraydataops.h
+++ b/src/corelib/tools/qarraydataops.h
@@ -82,7 +82,7 @@ public:
void destroyAll() noexcept // Call from destructors, ONLY!
{
Q_ASSERT(this->d);
- Q_ASSERT(this->d->ref_.loadRelaxed() == 0);
+ Q_ASSERT(this->d->m_ref.loadRelaxed() == 0);
// As this is to be called only from destructor, it doesn't need to be
// exception safe; size not updated.
@@ -345,7 +345,7 @@ public:
// As this is to be called only from destructor, it doesn't need to be
// exception safe; size not updated.
- Q_ASSERT(this->d->ref_.loadRelaxed() == 0);
+ Q_ASSERT(this->d->m_ref.loadRelaxed() == 0);
std::destroy(this->begin(), this->end());
}
diff --git a/src/corelib/tools/qatomicscopedvaluerollback.h b/src/corelib/tools/qatomicscopedvaluerollback.h
index 8f653acba5e..929a2e2d466 100644
--- a/src/corelib/tools/qatomicscopedvaluerollback.h
+++ b/src/corelib/tools/qatomicscopedvaluerollback.h
@@ -11,6 +11,7 @@
#include <QtCore/qtconfigmacros.h>
#include <atomic>
+#include <type_traits>
QT_BEGIN_NAMESPACE
@@ -122,6 +123,33 @@ template <typename T>
QAtomicScopedValueRollback(QBasicAtomicPointer<T> &, std::memory_order)
-> QAtomicScopedValueRollback<T*>;
+template <typename T, typename V,
+ std::enable_if_t<std::is_convertible_v<V, T>, bool> = true>
+QAtomicScopedValueRollback(std::atomic<T>&, V)
+ -> QAtomicScopedValueRollback<T>;
+template <typename T, typename V,
+ std::enable_if_t<std::is_convertible_v<V, T>, bool> = true>
+QAtomicScopedValueRollback(std::atomic<T>&, V, std::memory_order)
+ -> QAtomicScopedValueRollback<T>;
+
+template <typename T, typename V,
+ std::enable_if_t<std::is_convertible_v<V, T>, bool> = true>
+QAtomicScopedValueRollback(QBasicAtomicInteger<T>&, V)
+ -> QAtomicScopedValueRollback<T>;
+template <typename T, typename V,
+ std::enable_if_t<std::is_convertible_v<V, T>, bool> = true>
+QAtomicScopedValueRollback(QBasicAtomicInteger<T>&, V, std::memory_order)
+ -> QAtomicScopedValueRollback<T>;
+
+template <typename T, typename V,
+ std::enable_if_t<std::is_convertible_v<V, T*>, bool> = true>
+QAtomicScopedValueRollback(QBasicAtomicPointer<T>&, V)
+ -> QAtomicScopedValueRollback<T*>;
+template <typename T, typename V,
+ std::enable_if_t<std::is_convertible_v<V, T*>, bool> = true>
+QAtomicScopedValueRollback(QBasicAtomicPointer<T>&, V, std::memory_order)
+ -> QAtomicScopedValueRollback<T*>;
+
QT_END_NAMESPACE
#endif // QATOMICASCOPEDVALUEROLLBACK_H
diff --git a/src/corelib/tools/qfreelist_p.h b/src/corelib/tools/qfreelist_p.h
index 5c12332aa4a..ecefd1f55df 100644
--- a/src/corelib/tools/qfreelist_p.h
+++ b/src/corelib/tools/qfreelist_p.h
@@ -199,27 +199,27 @@ inline typename QFreeList<T, ConstantsType>::ReferenceType QFreeList<T, Constant
template <typename T, typename ConstantsType>
inline int QFreeList<T, ConstantsType>::next()
{
- int id, newid, at;
- ElementType *v;
+ int newid;
+ int id = _next.loadAcquire();
do {
- id = _next.loadAcquire();
-
- at = id & ConstantsType::IndexMask;
+ int at = id & ConstantsType::IndexMask;
const int block = blockfor(at);
- v = _v[block].loadAcquire();
+ ElementType *v = _v[block].loadAcquire();
if (!v) {
- v = allocate((id & ConstantsType::IndexMask) - at, ConstantsType::Sizes[block]);
- if (!_v[block].testAndSetRelease(nullptr, v)) {
+ ElementType* const alloced = allocate((id & ConstantsType::IndexMask) - at,
+ ConstantsType::Sizes[block]);
+ if (_v[block].testAndSetRelease(nullptr, alloced, v)) {
+ v = alloced;
+ } else {
// race with another thread lost
- delete[] v;
- v = _v[block].loadAcquire();
+ delete[] alloced;
Q_ASSERT(v != nullptr);
}
}
newid = v[at].next.loadRelaxed() | (id & ~ConstantsType::IndexMask);
- } while (!_next.testAndSetRelease(id, newid));
+ } while (!_next.testAndSetOrdered(id, newid, id));
// qDebug("QFreeList::next(): returning %d (_next now %d, serial %d)",
// id & ConstantsType::IndexMask,
// newid & ConstantsType::IndexMask,
@@ -232,7 +232,7 @@ inline void QFreeList<T, ConstantsType>::release(int id)
{
int at = id & ConstantsType::IndexMask;
const int block = blockfor(at);
- ElementType *v = _v[block].loadRelaxed();
+ ElementType *v = _v[block].loadAcquire();
int x, newid;
do {
diff --git a/src/corelib/tools/qhashfunctions.h b/src/corelib/tools/qhashfunctions.h
index cbe217db11e..3e44f5f3442 100644
--- a/src/corelib/tools/qhashfunctions.h
+++ b/src/corelib/tools/qhashfunctions.h
@@ -298,19 +298,32 @@ bool qHashEquals(const T1 &a, const T2 &b)
}
namespace QtPrivate {
-template <typename Mixer> struct QHashCombiner : private Mixer
+template <typename Mixer> struct QHashCombinerWithSeed : private Mixer
{
- using result_type = typename Mixer::result_type ;
+ using result_type = typename Mixer::result_type;
+ size_t seed;
+ constexpr QHashCombinerWithSeed(result_type s) noexcept : seed(s) {}
+
+ template <typename T>
+ constexpr result_type operator()(result_type result, const T &t) const
+ noexcept(noexcept(qHash(t, seed)))
+ {
+ return Mixer::operator()(result, qHash(t, seed));
+ }
+};
#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) || defined(QT_BOOTSTRAPPED)
- // Qt 6.x didn't use to pass the seed; bootstrap has no seed
+// Earlier Qt 6.x versions of qHashMulti() failed to pass the seed as the seed
+// argument of qHash(), so this class exists for compatibility with user and
+// inline code that relies on the old behavior. For Qt 7, we'll replace with
+// the above version, except for the bootstrapped tools (which have no seed).
+template <typename Mixer> struct QHashCombiner : private Mixer
+{
+ using result_type = typename Mixer::result_type;
+
static constexpr size_t seed = 0;
constexpr QHashCombiner(result_type) noexcept {}
Q_DECL_DEPRECATED_X("pass the seed argument") constexpr QHashCombiner() noexcept {}
-#else
- size_t seed;
- constexpr QHashCombiner(result_type s) : seed(s) noexcept {}
-#endif
template <typename T>
constexpr result_type operator()(result_type result, const T &t) const
@@ -319,6 +332,9 @@ template <typename Mixer> struct QHashCombiner : private Mixer
return Mixer::operator()(result, qHash(t, seed));
}
};
+#else
+template <typename Mixer> using QHashCombiner = QHashCombinerWithSeed<Mixer>;
+#endif
struct QHashCombineMixer
{
@@ -330,6 +346,7 @@ struct QHashCombineMixer
}
};
using QHashCombine = QHashCombiner<QHashCombineMixer>;
+using QHashCombineWithSeed = QHashCombinerWithSeed<QHashCombineMixer>;
struct QHashCombineCommutativeMixer : std::plus<size_t>
{
@@ -341,6 +358,7 @@ struct QHashCombineCommutativeMixer : std::plus<size_t>
typedef size_t result_type;
};
using QHashCombineCommutative = QHashCombiner<QHashCombineCommutativeMixer>;
+using QHashCombineCommutativeWithSeed = QHashCombinerWithSeed<QHashCombineCommutativeMixer>;
template <typename... T>
using QHashMultiReturnType = decltype(
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h
index a9d334e28f3..e0c0110b794 100644
--- a/src/corelib/tools/qsharedpointer_impl.h
+++ b/src/corelib/tools/qsharedpointer_impl.h
@@ -592,7 +592,10 @@ class QWeakPointer
{
typedef QtSharedPointer::ExternalRefCountData Data;
template <typename X>
- using IfCompatible = typename std::enable_if<std::is_convertible<X*, T*>::value, bool>::type;
+ using IfCompatible = std::enable_if_t<std::conjunction_v<
+ std::negation<std::is_same<T, X>>, // don't make accidental copy/move SMFs
+ std::is_convertible<X*, T*>
+ >, bool>;
template <typename X>
using IfVirtualBase = typename std::enable_if<qxp::is_virtual_base_of_v<T, X>, bool>::type;
@@ -768,6 +771,11 @@ private:
{ return *this = QWeakPointer<T>(ptr, true); }
#ifndef QT_NO_QOBJECT
+ Q_NODISCARD_CTOR
+ QWeakPointer(T *ptr, bool)
+ : d{ptr ? Data::getAndRef(ptr) : nullptr}, value{ptr}
+ { }
+
template <class X, IfCompatible<X> = true>
Q_NODISCARD_CTOR
inline QWeakPointer(X *ptr, bool) : d(ptr ? Data::getAndRef(ptr) : nullptr), value(ptr)
diff --git a/src/gui/accessible/linux/atspiadaptor.cpp b/src/gui/accessible/linux/atspiadaptor.cpp
index 6154af00950..e0cd5aee25c 100644
--- a/src/gui/accessible/linux/atspiadaptor.cpp
+++ b/src/gui/accessible/linux/atspiadaptor.cpp
@@ -1462,9 +1462,12 @@ bool AtSpiAdaptor::handleMessage(const QDBusMessage &message, const QDBusConnect
// handle properties like regular functions
if (interface == "org.freedesktop.DBus.Properties"_L1) {
- interface = message.arguments().at(0).toString();
- // Get/Set + Name
- function = message.member() + message.arguments().at(1).toString();
+ const auto arguments = message.arguments();
+ if (arguments.size() > 0) {
+ interface = arguments.at(0).toString();
+ if (arguments.size() > 1) // e.g. Get/Set + Name
+ function = function + arguments.at(1).toString();
+ }
}
// switch interface to call
diff --git a/src/gui/compat/removed_api.cpp b/src/gui/compat/removed_api.cpp
index 6a39d8b8615..33549a06504 100644
--- a/src/gui/compat/removed_api.cpp
+++ b/src/gui/compat/removed_api.cpp
@@ -88,3 +88,16 @@ void QWindowSystemInterface::handleContextMenuEvent(QWindow *window, bool mouseT
// order sections alphabetically
#endif // QT_GUI_REMOVED_SINCE(6, 8)
+
+#if QT_GUI_REMOVED_SINCE(6, 11)
+
+#include "qpainter.h" // inlined API
+
+#include "qquaternion.h" // inlined API
+
+
+// #include "qotherheader.h"
+// // implement removed functions from qotherheader.h
+// order sections alphabetically
+
+#endif // QT_GUI_REMOVED_SINCE(6, 11)
diff --git a/src/gui/kernel/qaction.cpp b/src/gui/kernel/qaction.cpp
index 1768cd8aa1a..f965a5a30e9 100644
--- a/src/gui/kernel/qaction.cpp
+++ b/src/gui/kernel/qaction.cpp
@@ -1325,4 +1325,6 @@ Q_GUI_EXPORT QDebug operator<<(QDebug d, const QAction *action)
QT_END_NAMESPACE
+#undef QAPP_CHECK
+
#include "moc_qaction.cpp"
diff --git a/src/gui/kernel/qguivariant.cpp b/src/gui/kernel/qguivariant.cpp
index c6462dfed7b..6da0c4d387b 100644
--- a/src/gui/kernel/qguivariant.cpp
+++ b/src/gui/kernel/qguivariant.cpp
@@ -52,14 +52,13 @@
QT_BEGIN_NAMESPACE
namespace {
-
-// NOLINTNEXTLINE(cppcoreguidelines-virtual-class-destructor): this is not a base class
struct QVariantGuiHelper : QMetaTypeModuleHelper
{
#define QT_IMPL_METATYPEINTERFACE_GUI_TYPES(MetaTypeName, MetaTypeId, RealName) \
QT_METATYPE_INTERFACE_INIT(RealName),
- const QtPrivate::QMetaTypeInterface *interfaceForType(int type) const override {
+ static const QtPrivate::QMetaTypeInterface *interfaceForType(int type)
+ {
switch (type) {
QT_FOR_EACH_STATIC_GUI_CLASS(QT_METATYPE_CONVERT_ID_TO_TYPE)
default: return nullptr;
@@ -67,7 +66,7 @@ struct QVariantGuiHelper : QMetaTypeModuleHelper
}
#undef QT_IMPL_METATYPEINTERFACE_GUI_TYPES
- bool convert(const void *from, int fromTypeId, void *to, int toTypeId) const override
+ static bool convert(const void *from, int fromTypeId, void *to, int toTypeId)
{
Q_ASSERT(fromTypeId != toTypeId);
@@ -133,14 +132,14 @@ struct QVariantGuiHelper : QMetaTypeModuleHelper
return false;
}
};
-
-static constexpr QVariantGuiHelper qVariantGuiHelper;
-
} // namespace used to hide QVariant handler
void qRegisterGuiVariant()
{
- qMetaTypeGuiHelper = &qVariantGuiHelper;
+ qMetaTypeGuiHelper = QMetaTypeModuleHelper{
+ &QVariantGuiHelper::interfaceForType,
+ &QVariantGuiHelper::convert,
+ };
}
Q_CONSTRUCTOR_FUNCTION(qRegisterGuiVariant)
diff --git a/src/gui/kernel/qscreen.cpp b/src/gui/kernel/qscreen.cpp
index afe6de35305..caf4cb7fe5b 100644
--- a/src/gui/kernel/qscreen.cpp
+++ b/src/gui/kernel/qscreen.cpp
@@ -34,6 +34,12 @@ QT_BEGIN_NAMESPACE
\note Both physical and logical DPI are expressed in device-independent dots.
Multiply by QScreen::devicePixelRatio() to get device-dependent density.
+ To obtain a QScreen object, use QGuiApplication::primaryScreen() for the
+ primary screen, or QGuiApplication::screens() to get a list of all screens.
+
+ \sa QGuiApplication::primaryScreen()
+ \sa QGuiApplication::screens()
+
\inmodule QtGui
*/
diff --git a/src/gui/kernel/qshortcut.cpp b/src/gui/kernel/qshortcut.cpp
index 3f6822cb031..e730b5f9e8b 100644
--- a/src/gui/kernel/qshortcut.cpp
+++ b/src/gui/kernel/qshortcut.cpp
@@ -577,4 +577,6 @@ bool QShortcut::event(QEvent *e)
QT_END_NAMESPACE
+#undef QAPP_CHECK
+
#include "moc_qshortcut.cpp"
diff --git a/src/gui/kernel/qtestsupport_gui.cpp b/src/gui/kernel/qtestsupport_gui.cpp
index ca62798ddfd..dfcea928fd8 100644
--- a/src/gui/kernel/qtestsupport_gui.cpp
+++ b/src/gui/kernel/qtestsupport_gui.cpp
@@ -24,8 +24,19 @@ QT_BEGIN_NAMESPACE
/*!
\since 5.0
+ \overload
- Returns \c true, if \a window is active within \a timeout milliseconds. Otherwise returns \c false.
+ The \a timeout is in milliseconds.
+*/
+bool QTest::qWaitForWindowActive(QWindow *window, int timeout)
+{
+ return qWaitForWindowActive(window, QDeadlineTimer{timeout, Qt::TimerType::PreciseTimer});
+}
+
+/*!
+ \since 6.10
+
+ Returns \c true, if \a window is active within \a timeout. Otherwise returns \c false.
The method is useful in tests that call QWindow::show() and rely on the window actually being
active (i.e. being visible and having focus) before proceeding.
@@ -38,7 +49,7 @@ QT_BEGIN_NAMESPACE
\sa qWaitForWindowExposed(), qWaitForWindowFocused(), QWindow::isActive()
*/
-Q_GUI_EXPORT bool QTest::qWaitForWindowActive(QWindow *window, int timeout)
+bool QTest::qWaitForWindowActive(QWindow *window, QDeadlineTimer timeout)
{
if (Q_UNLIKELY(!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation))) {
qWarning() << "qWaitForWindowActive was called on a platform that doesn't support window"
@@ -52,6 +63,17 @@ Q_GUI_EXPORT bool QTest::qWaitForWindowActive(QWindow *window, int timeout)
}
/*!
+ \since 6.10
+ \overload
+
+ This function uses the default timeout of 5 seconds.
+*/
+bool QTest::qWaitForWindowActive(QWindow *window)
+{
+ return qWaitForWindowActive(window, Internal::defaultTryTimeout);
+}
+
+/*!
\since 6.7
Returns \c true, if \a window is the focus window within \a timeout. Otherwise returns \c false.
@@ -73,9 +95,31 @@ Q_GUI_EXPORT bool QTest::qWaitForWindowFocused(QWindow *window, QDeadlineTimer t
}
/*!
+ \since 6.10
+ \overload
+
+ This function uses the default timeout of 5 seconds.
+*/
+bool QTest::qWaitForWindowFocused(QWindow *window)
+{
+ return qWaitForWindowFocused(window, Internal::defaultTryTimeout);
+}
+
+/*!
\since 5.0
+ \overload
+
+ The \a timeout is in milliseconds.
+*/
+bool QTest::qWaitForWindowExposed(QWindow *window, int timeout)
+{
+ return qWaitForWindowExposed(window, std::chrono::milliseconds(timeout));
+}
- Returns \c true, if \a window is exposed within \a timeout milliseconds. Otherwise returns \c false.
+/*!
+ \since 6.10
+
+ Returns \c true, if \a window is exposed within \a timeout. Otherwise returns \c false.
The method is useful in tests that call QWindow::show() and rely on the window actually being
being visible before proceeding.
@@ -86,11 +130,22 @@ Q_GUI_EXPORT bool QTest::qWaitForWindowFocused(QWindow *window, QDeadlineTimer t
\sa qWaitForWindowActive(), QWindow::isExposed()
*/
-Q_GUI_EXPORT bool QTest::qWaitForWindowExposed(QWindow *window, int timeout)
+bool QTest::qWaitForWindowExposed(QWindow *window, QDeadlineTimer timeout)
{
return QTest::qWaitFor([&]() { return window->isExposed(); }, timeout);
}
+/*!
+ \since 6.10
+ \overload
+
+ This function uses the default timeout of 5 seconds.
+*/
+bool QTest::qWaitForWindowExposed(QWindow *window)
+{
+ return qWaitForWindowExposed(window, Internal::defaultTryTimeout);
+}
+
namespace QTest {
QTouchEventSequence::~QTouchEventSequence()
diff --git a/src/gui/kernel/qtestsupport_gui.h b/src/gui/kernel/qtestsupport_gui.h
index 951d9df1c7c..39278c2f034 100644
--- a/src/gui/kernel/qtestsupport_gui.h
+++ b/src/gui/kernel/qtestsupport_gui.h
@@ -23,12 +23,16 @@ Q_GUI_EXPORT bool qt_handleTouchEventv2(QWindow *w, const QPointingDevice *devic
namespace QTest {
-[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowActive(QWindow *window,
- int timeout = static_cast<int>(Internal::defaultTryTimeout.count()));
-[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowFocused(QWindow *window,
- QDeadlineTimer timeout = Internal::defaultTryTimeout);
-[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowExposed(QWindow *window,
- int timeout = static_cast<int>(Internal::defaultTryTimeout.count()));
+[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowActive(QWindow *window, int timeout);
+[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowActive(QWindow *window, QDeadlineTimer timeout);
+[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowActive(QWindow *window);
+
+[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowFocused(QWindow *window, QDeadlineTimer timeout);
+[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowFocused(QWindow *window);
+
+[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowExposed(QWindow *window, int timeout);
+[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowExposed(QWindow *window, QDeadlineTimer timeout);
+[[nodiscard]] Q_GUI_EXPORT bool qWaitForWindowExposed(QWindow *window);
Q_GUI_EXPORT QPointingDevice * createTouchDevice(QInputDevice::DeviceType devType = QInputDevice::DeviceType::TouchScreen,
QInputDevice::Capabilities caps = QInputDevice::Capability::Position);
diff --git a/src/gui/math3d/qquaternion.cpp b/src/gui/math3d/qquaternion.cpp
index 3454b498804..99061fb7163 100644
--- a/src/gui/math3d/qquaternion.cpp
+++ b/src/gui/math3d/qquaternion.cpp
@@ -336,6 +336,9 @@ QVector3D QQuaternion::rotatedVector(const QVector3D &vector) const
Extracts a 3D axis \a axis and a rotating angle \a angle (in degrees)
that corresponds to this quaternion.
+ Both \a axis and \a angle must be valid, non-\nullptr pointers,
+ otherwise the behavior is undefined.
+
\sa fromAxisAndAngle()
*/
@@ -366,6 +369,9 @@ QQuaternion QQuaternion::fromAxisAndAngle(const QVector3D &axis, float angle)
Extracts a 3D axis (\a x, \a y, \a z) and a rotating angle \a angle (in degrees)
that corresponds to this quaternion.
+ All of \a x, \a y, \a z, and \a angle must be valid, non-\nullptr pointers,
+ otherwise the behavior is undefined.
+
\sa fromAxisAndAngle()
*/
void QQuaternion::getAxisAndAngle(float *x, float *y, float *z, float *angle) const
@@ -421,7 +427,7 @@ QQuaternion QQuaternion::fromAxisAndAngle
\since 5.5
Calculates roll, pitch, and yaw Euler angles (in degrees)
- that corresponds to this quaternion.
+ that correspond to this quaternion.
\sa fromEulerAngles()
*/
@@ -432,8 +438,9 @@ QQuaternion QQuaternion::fromAxisAndAngle
\overload
Creates a quaternion that corresponds to a rotation of \a angles:
- angles.z() degrees around the z axis, angles.x() degrees around the x axis,
- and angles.y() degrees around the y axis (in that order).
+ angles.\l{QVector3D::}{z()} degrees around the z axis,
+ angles.\l{QVector3D::}{x()} degrees around the x axis, and
+ angles.\l{QVector3D::}{y()} degrees around the y axis (in that order).
\sa toEulerAngles()
*/
@@ -446,6 +453,9 @@ QQuaternion QQuaternion::fromAxisAndAngle
Calculates \a roll, \a pitch, and \a yaw Euler angles (in degrees)
that corresponds to this quaternion.
+ All of \a pitch, \a yaw, and \a roll must be valid, non-\nullptr pointers,
+ otherwise the behavior is undefined.
+
\sa fromEulerAngles()
*/
void QQuaternion::getEulerAngles(float *pitch, float *yaw, float *roll) const
@@ -547,7 +557,7 @@ QQuaternion QQuaternion::fromEulerAngles(float pitch, float yaw, float roll)
\note If this quaternion is not normalized,
the resulting rotation matrix will contain scaling information.
- \sa fromRotationMatrix(), getAxes()
+ \sa fromRotationMatrix(), toAxes()
*/
QMatrix3x3 QQuaternion::toRotationMatrix() const
{
@@ -630,23 +640,71 @@ QQuaternion QQuaternion::fromRotationMatrix(const QMatrix3x3 &rot3x3)
#ifndef QT_NO_VECTOR3D
/*!
- \since 5.5
+ \since 6.11
+ \class QQuaternion::Axes
+ \ingroup painting-3D
+ \inmodule QtGui
- Returns the 3 orthonormal axes (\a xAxis, \a yAxis, \a zAxis) defining the quaternion.
+ A struct containing the three orthonormal axes that define a
+ \l{QQuaternion}{quaternion}.
- \sa fromAxes(), toRotationMatrix()
+
+ \sa QQuaternion::toAxes(), QQuaternion::fromAxes(Axes)
+*/
+
+/*!
+ \variable QQuaternion::Axes::x
+
+ The x orthonormal axis that, together with \l{y} and \l{z}, defines a
+ quaternion.
+*/
+
+/*!
+ \variable QQuaternion::Axes::y
+
+ The y orthonormal axis that, together with \l{x} and \l{z}, defines a
+ quaternion.
+*/
+
+/*!
+ \variable QQuaternion::Axes::z
+
+ The z orthonormal axis that, together with \l{x} and \l{y}, defines a
+ quaternion.
*/
-void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const
-{
- Q_ASSERT(xAxis && yAxis && zAxis);
+/*!
+ \since 6.11
+
+ Returns the three orthonormal axes that define this quaternion.
+
+ \sa QQuaternion::Axes, fromAxes(QQuaternion::Axes), toRotationMatrix()
+*/
+auto QQuaternion::toAxes() const -> Axes
+{
const QMatrix3x3 rot3x3(toRotationMatrix());
- *xAxis = QVector3D(rot3x3(0, 0), rot3x3(1, 0), rot3x3(2, 0));
- *yAxis = QVector3D(rot3x3(0, 1), rot3x3(1, 1), rot3x3(2, 1));
- *zAxis = QVector3D(rot3x3(0, 2), rot3x3(1, 2), rot3x3(2, 2));
+ return { {rot3x3(0, 0), rot3x3(1, 0), rot3x3(2, 0)},
+ {rot3x3(0, 1), rot3x3(1, 1), rot3x3(2, 1)},
+ {rot3x3(0, 2), rot3x3(1, 2), rot3x3(2, 2)} };
}
+
+/*!
+ \fn void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const
+ \since 5.5
+
+ \obsolete
+ Use toAxes() instead.
+
+ Returns the 3 orthonormal axes (\a xAxis, \a yAxis, \a zAxis) defining the quaternion.
+
+ All of \a xAxis, \a yAxis, and \a zAxis must be valid, non-\nullptr pointers,
+ otherwise the behavior is undefined.
+
+ \sa fromAxes(), toRotationMatrix()
+*/
+
/*!
\since 5.5
@@ -654,7 +712,7 @@ void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis)
\note The axes are assumed to be orthonormal.
- \sa getAxes(), fromRotationMatrix()
+ \sa toAxes(), fromRotationMatrix()
*/
QQuaternion QQuaternion::fromAxes(const QVector3D &xAxis, const QVector3D &yAxis, const QVector3D &zAxis)
{
@@ -673,6 +731,17 @@ QQuaternion QQuaternion::fromAxes(const QVector3D &xAxis, const QVector3D &yAxis
}
/*!
+ \since 6.11
+ \overload
+
+ \sa toAxes(), fromRotationMatrix()
+*/
+QQuaternion QQuaternion::fromAxes(Axes axes) // clazy:exclude=function-args-by-ref
+{
+ return fromAxes(axes.x, axes.y, axes.z);
+}
+
+/*!
\since 5.5
Constructs the quaternion using specified forward direction \a direction
diff --git a/src/gui/math3d/qquaternion.h b/src/gui/math3d/qquaternion.h
index 0ea844ae41f..ffc95a852ce 100644
--- a/src/gui/math3d/qquaternion.h
+++ b/src/gui/math3d/qquaternion.h
@@ -118,7 +118,14 @@ QT_WARNING_POP
QT7_ONLY(Q_GUI_EXPORT) static QQuaternion fromRotationMatrix(const QMatrix3x3 &rot3x3);
#ifndef QT_NO_VECTOR3D
- QT7_ONLY(Q_GUI_EXPORT) void getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const;
+ struct Axes
+ {
+ QVector3D x, y, z;
+ };
+ QT7_ONLY(Q_GUI_EXPORT) Axes toAxes() const;
+ QT7_ONLY(Q_GUI_EXPORT) static QQuaternion fromAxes(Axes axes); // clazy:exclude=function-args-by-ref
+ QT_GUI_INLINE_SINCE(6, 11)
+ void getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const;
QT7_ONLY(Q_GUI_EXPORT) static QQuaternion fromAxes(const QVector3D &xAxis,
const QVector3D &yAxis,
const QVector3D &zAxis);
@@ -330,6 +337,19 @@ QQuaternion QQuaternion::fromEulerAngles(const QVector3D &angles)
return QQuaternion::fromEulerAngles(angles.x(), angles.y(), angles.z());
}
+#if QT_GUI_INLINE_IMPL_SINCE(6, 11)
+void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis) const
+{
+ Q_PRE(xAxis);
+ Q_PRE(yAxis);
+ Q_PRE(zAxis);
+ const Axes axes = toAxes();
+ *xAxis = axes.x;
+ *yAxis = axes.y;
+ *zAxis = axes.z;
+}
+#endif // QT_GUI_INLINE_IMPL_SINCE(6, 11)
+
#endif // QT_NO_VECTOR3D
constexpr void QQuaternion::setVector(float aX, float aY, float aZ) noexcept
diff --git a/src/gui/painting/qbackingstoredefaultcompositor.cpp b/src/gui/painting/qbackingstoredefaultcompositor.cpp
index c1452ca7688..41ab7c97f8c 100644
--- a/src/gui/painting/qbackingstoredefaultcompositor.cpp
+++ b/src/gui/painting/qbackingstoredefaultcompositor.cpp
@@ -460,11 +460,20 @@ QPlatformBackingStore::FlushResult QBackingStoreDefaultCompositor::flush(QPlatfo
const QRegion &region,
const QPoint &offset,
QPlatformTextureList *textures,
- bool translucentBackground)
+ bool translucentBackground,
+ qreal sourceTransformFactor)
{
if (!rhi)
return QPlatformBackingStore::FlushFailed;
+ // Note, the sourceTransformFactor is different from the sourceDevicePixelRatio,
+ // as the former may reflect the fact that the region and offset is pre-transformed,
+ // in which case we don't need to do a full transform here based on the source DPR.
+ // In the default case where no explicit source transform has been passed, we fall
+ // back to the source device pixel ratio.
+ if (!sourceTransformFactor)
+ sourceTransformFactor = sourceDevicePixelRatio;
+
Q_ASSERT(textures); // may be empty if there are no render-to-texture widgets at all, but null it cannot be
if (!m_rhi) {
@@ -508,7 +517,7 @@ QPlatformBackingStore::FlushResult QBackingStoreDefaultCompositor::flush(QPlatfo
const QImage::Format format = QImage::toImageFormat(graphicsBuffer->format());
const QSize size = graphicsBuffer->size();
QImage wrapperImage(graphicsBuffer->data(), size.width(), size.height(), graphicsBuffer->bytesPerLine(), format);
- toTexture(wrapperImage, rhi, resourceUpdates, scaledRegion(region, sourceDevicePixelRatio, offset), &flags);
+ toTexture(wrapperImage, rhi, resourceUpdates, scaledRegion(region, sourceTransformFactor, offset), &flags);
gotTextureFromGraphicsBuffer = true;
graphicsBuffer->unlock();
if (graphicsBuffer->origin() == QPlatformGraphicsBuffer::OriginBottomLeft)
@@ -516,7 +525,7 @@ QPlatformBackingStore::FlushResult QBackingStoreDefaultCompositor::flush(QPlatfo
}
}
if (!gotTextureFromGraphicsBuffer)
- toTexture(backingStore, rhi, resourceUpdates, scaledRegion(region, sourceDevicePixelRatio, offset), &flags);
+ toTexture(backingStore, rhi, resourceUpdates, scaledRegion(region, sourceTransformFactor, offset), &flags);
ensureResources(resourceUpdates, swapchain->renderPassDescriptor());
@@ -549,7 +558,7 @@ QPlatformBackingStore::FlushResult QBackingStoreDefaultCompositor::flush(QPlatfo
// The backingstore is for the entire tlw. In case of native children, offset tells the position
// relative to the tlw. The window rect is scaled by the source device pixel ratio to get
// the source rect.
- const QPoint sourceWindowOffset = scaledOffset(offset, sourceDevicePixelRatio);
+ const QPoint sourceWindowOffset = scaledOffset(offset, sourceTransformFactor);
const QRect srcRect = toBottomLeftRect(sourceWindowRect.translated(sourceWindowOffset), m_texture->pixelSize().height());
const QMatrix3x3 source = sourceTransform(srcRect, m_texture->pixelSize(), origin);
QMatrix4x4 target; // identity
diff --git a/src/gui/painting/qbackingstoredefaultcompositor_p.h b/src/gui/painting/qbackingstoredefaultcompositor_p.h
index c5a8ffd328e..cdc9d098099 100644
--- a/src/gui/painting/qbackingstoredefaultcompositor_p.h
+++ b/src/gui/painting/qbackingstoredefaultcompositor_p.h
@@ -41,7 +41,8 @@ public:
const QRegion &region,
const QPoint &offset,
QPlatformTextureList *textures,
- bool translucentBackground);
+ bool translucentBackground,
+ qreal sourceTransformFactor);
private:
enum UpdateUniformOption {
diff --git a/src/gui/painting/qdrawhelper_avx2.cpp b/src/gui/painting/qdrawhelper_avx2.cpp
index 8bc49f42ab5..72853be6e97 100644
--- a/src/gui/painting/qdrawhelper_avx2.cpp
+++ b/src/gui/painting/qdrawhelper_avx2.cpp
@@ -35,9 +35,7 @@ BYTE_MUL_AVX2(__m256i &pixelVector, __m256i alphaChannel, __m256i colorMask, __m
pixelVectorAG = _mm256_add_epi16(pixelVectorAG, half);
pixelVectorRB = _mm256_srli_epi16(pixelVectorRB, 8);
- pixelVectorAG = _mm256_andnot_si256(colorMask, pixelVectorAG);
-
- pixelVector = _mm256_or_si256(pixelVectorAG, pixelVectorRB);
+ pixelVector = _mm256_blendv_epi8(pixelVectorAG, pixelVectorRB, colorMask);
}
inline static void Q_DECL_VECTORCALL
@@ -55,9 +53,7 @@ BYTE_MUL_RGB64_AVX2(__m256i &pixelVector, __m256i alphaChannel, __m256i colorMas
pixelVectorAG = _mm256_add_epi32(pixelVectorAG, half);
pixelVectorRB = _mm256_srli_epi32(pixelVectorRB, 16);
- pixelVectorAG = _mm256_andnot_si256(colorMask, pixelVectorAG);
-
- pixelVector = _mm256_or_si256(pixelVectorAG, pixelVectorRB);
+ pixelVector = _mm256_blendv_epi8(pixelVectorAG, pixelVectorRB, colorMask);
}
// See INTERPOLATE_PIXEL_255_SSE2 for details.
@@ -78,10 +74,9 @@ INTERPOLATE_PIXEL_255_AVX2(__m256i srcVector, __m256i &dstVector, __m256i alphaC
finalRB = _mm256_add_epi16(finalRB, _mm256_srli_epi16(finalRB, 8));
finalAG = _mm256_add_epi16(finalAG, half);
finalRB = _mm256_add_epi16(finalRB, half);
- finalAG = _mm256_andnot_si256(colorMask, finalAG);
finalRB = _mm256_srli_epi16(finalRB, 8);
- dstVector = _mm256_or_si256(finalAG, finalRB);
+ dstVector = _mm256_blendv_epi8(finalAG, finalRB, colorMask);
}
inline static void Q_DECL_VECTORCALL
@@ -101,10 +96,8 @@ INTERPOLATE_PIXEL_RGB64_AVX2(__m256i srcVector, __m256i &dstVector, __m256i alph
finalRB = _mm256_add_epi32(finalRB, _mm256_srli_epi32(finalRB, 16));
finalAG = _mm256_add_epi32(finalAG, half);
finalRB = _mm256_add_epi32(finalRB, half);
- finalAG = _mm256_andnot_si256(colorMask, finalAG);
finalRB = _mm256_srli_epi32(finalRB, 16);
-
- dstVector = _mm256_or_si256(finalAG, finalRB);
+ dstVector = _mm256_blendv_epi8(finalAG, finalRB, colorMask);
}
// See BLEND_SOURCE_OVER_ARGB32_SSE2 for details.
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index 5013e96f740..344bb8f1bef 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -41,6 +41,8 @@
#include <private/qrawfont_p.h>
#include <private/qfont_p.h>
+#include <QtCore/private/qtclasshelper_p.h>
+
QT_BEGIN_NAMESPACE
using namespace Qt::StringLiterals;
@@ -3652,6 +3654,8 @@ void QPainter::setPen(const QColor &color)
}
/*!
+ \fn void QPainter::setPen(const QPen &pen)
+
Sets the painter's pen to be the given \a pen.
The \a pen defines how to draw lines and outlines, and it also
@@ -3660,7 +3664,13 @@ void QPainter::setPen(const QColor &color)
\sa pen(), {QPainter#Settings}{Settings}
*/
-void QPainter::setPen(const QPen &pen)
+/*!
+ \fn void QPainter::setPen(QPen &&pen)
+ \since 6.11
+ \overload
+*/
+
+void QPainter::doSetPen(const QPen &pen, QPen *rvalue)
{
#ifdef QT_DEBUG_DRAW
@@ -3677,7 +3687,7 @@ void QPainter::setPen(const QPen &pen)
if (d->state->pen == pen)
return;
- d->state->pen = pen;
+ q_choose_assign(d->state->pen, pen, rvalue);
if (d->extended) {
d->checkEmulation();
@@ -3733,6 +3743,8 @@ const QPen &QPainter::pen() const
/*!
+ \fn void QPainter::setBrush(const QBrush &brush)
+
Sets the painter's brush to the given \a brush.
The painter's brush defines how shapes are filled.
@@ -3740,7 +3752,13 @@ const QPen &QPainter::pen() const
\sa brush(), {QPainter#Settings}{Settings}
*/
-void QPainter::setBrush(const QBrush &brush)
+/*!
+ \fn void QPainter::setBrush(QBrush &&brush)
+ \since 6.11
+ \overload
+*/
+
+void QPainter::doSetBrush(const QBrush &brush, QBrush *rvalue)
{
#ifdef QT_DEBUG_DRAW
if constexpr (qt_show_painter_debug_output)
@@ -3756,13 +3774,13 @@ void QPainter::setBrush(const QBrush &brush)
return;
if (d->extended) {
- d->state->brush = brush;
+ q_choose_assign(d->state->brush, brush, rvalue);
d->checkEmulation();
d->extended->brushChanged();
return;
}
- d->state->brush = brush;
+ q_choose_assign(d->state->brush, brush, rvalue);
d->state->dirtyFlags |= QPaintEngine::DirtyBrush;
}
diff --git a/src/gui/painting/qpainter.h b/src/gui/painting/qpainter.h
index 3c09b632364..83bde3b8cad 100644
--- a/src/gui/painting/qpainter.h
+++ b/src/gui/painting/qpainter.h
@@ -150,11 +150,15 @@ public:
QFontInfo fontInfo() const;
void setPen(const QColor &color);
+ QT_GUI_INLINE_SINCE(6, 11)
void setPen(const QPen &pen);
+ void setPen(QPen &&pen) { doSetPen(pen, &pen); }
void setPen(Qt::PenStyle style);
const QPen &pen() const;
+ QT_GUI_INLINE_SINCE(6, 11)
void setBrush(const QBrush &brush);
+ void setBrush(QBrush &&brush) { doSetBrush(brush, &brush); }
void setBrush(Qt::BrushStyle style);
void setBrush(QColor color);
void setBrush(Qt::GlobalColor color) { setBrush(QColor(color)); }
@@ -419,6 +423,9 @@ public:
private:
Q_DISABLE_COPY(QPainter)
+ void doSetPen(const QPen &lvalue, QPen *rvalue);
+ void doSetBrush(const QBrush &lvalue, QBrush *rvalue);
+
std::unique_ptr<QPainterPrivate> d_ptr;
friend class QWidget;
@@ -700,6 +707,21 @@ inline void QPainter::fillRect(const QRectF &r, QGradient::Preset p)
fillRect(r, QGradient(p));
}
+#if QT_GUI_INLINE_IMPL_SINCE(6, 11)
+
+void QPainter::setPen(const QPen &p)
+{
+ doSetPen(p, nullptr);
+}
+
+void QPainter::setBrush(const QBrush &b)
+{
+ doSetBrush(b, nullptr);
+}
+
+#endif // QT_GUI_INLINE_IMPL_SINCE(6, 11)
+
+
inline void QPainter::setBrushOrigin(int x, int y)
{
setBrushOrigin(QPoint(x, y));
diff --git a/src/gui/painting/qplatformbackingstore.cpp b/src/gui/painting/qplatformbackingstore.cpp
index 21e89d67fd2..2acc5ef7c52 100644
--- a/src/gui/painting/qplatformbackingstore.cpp
+++ b/src/gui/painting/qplatformbackingstore.cpp
@@ -213,14 +213,15 @@ QPlatformBackingStore::FlushResult QPlatformBackingStore::rhiFlush(QWindow *wind
const QRegion &region,
const QPoint &offset,
QPlatformTextureList *textures,
- bool translucentBackground)
+ bool translucentBackground,
+ qreal sourceTransformFactor)
{
auto &surfaceSupport = d_ptr->surfaceSupport[window->surfaceType()];
return surfaceSupport.compositor.flush(this,
surfaceSupport.rhiSupport.rhi(),
surfaceSupport.rhiSupport.swapChainForWindow(window),
window, sourceDevicePixelRatio, region, offset, textures,
- translucentBackground);
+ translucentBackground, sourceTransformFactor);
}
/*!
diff --git a/src/gui/painting/qplatformbackingstore.h b/src/gui/painting/qplatformbackingstore.h
index a6cb43b4e66..86035b98bea 100644
--- a/src/gui/painting/qplatformbackingstore.h
+++ b/src/gui/painting/qplatformbackingstore.h
@@ -151,7 +151,8 @@ public:
const QRegion &region,
const QPoint &offset,
QPlatformTextureList *textures,
- bool translucentBackground);
+ bool translucentBackground,
+ qreal sourceTransformFactor = 0);
virtual QImage toImage() const;
diff --git a/src/gui/painting/qrhibackingstore.cpp b/src/gui/painting/qrhibackingstore.cpp
index d59cc2d83c5..3d9932e5ee2 100644
--- a/src/gui/painting/qrhibackingstore.cpp
+++ b/src/gui/painting/qrhibackingstore.cpp
@@ -2,6 +2,7 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qrhibackingstore_p.h"
+#include "qpa/qplatformwindow.h"
#include <private/qimage_p.h>
QT_BEGIN_NAMESPACE
@@ -43,10 +44,22 @@ void QRhiBackingStore::flush(QWindow *flushedWindow, const QRegion &region, cons
createRhi(flushedWindow, rhiConfig);
}
+ // The backing store operates on behalf of its window(), even if we're
+ // flushing a child window, so pull the source DPR from the window().
+ const qreal sourceDevicePixelRatio = window()->devicePixelRatio();
+
+ // QBackingStore::flush will convert the region and offset from device independent
+ // pixels to native pixels before calling QPlatformBackingStore::flush, which means
+ // we can't pass on the window's DPR as the sourceTransformFactor, as that will include
+ // the Qt scale factor, which has already been applied. Instead we ask the platform
+ // window, which only reflect the remaining scale factor from the OS.
+ const qreal sourceTransformFactor = flushedWindow->handle()->devicePixelRatio();
+
static QPlatformTextureList emptyTextureList;
bool translucentBackground = m_image.hasAlphaChannel();
- rhiFlush(flushedWindow, flushedWindow->devicePixelRatio(),
- region, offset, &emptyTextureList, translucentBackground);
+ rhiFlush(flushedWindow, sourceDevicePixelRatio,
+ region, offset, &emptyTextureList, translucentBackground,
+ sourceTransformFactor);
}
QImage::Format QRhiBackingStore::format() const
diff --git a/src/gui/painting/qtransform.cpp b/src/gui/painting/qtransform.cpp
index 66f1cf2a985..148d40b8361 100644
--- a/src/gui/painting/qtransform.cpp
+++ b/src/gui/painting/qtransform.cpp
@@ -784,7 +784,7 @@ bool QTransform::operator==(const QTransform &o) const
*/
size_t qHash(const QTransform &key, size_t seed) noexcept
{
- QtPrivate::QHashCombine hash(seed);
+ QtPrivate::QHashCombineWithSeed hash(seed);
seed = hash(seed, key.m11());
seed = hash(seed, key.m12());
seed = hash(seed, key.m21());
diff --git a/src/gui/painting/shaders/REUSE.toml b/src/gui/painting/shaders/REUSE.toml
index ee4e083dc8f..938a9764b6b 100644
--- a/src/gui/painting/shaders/REUSE.toml
+++ b/src/gui/painting/shaders/REUSE.toml
@@ -3,5 +3,5 @@ version = 1
[[annotations]]
path = ["*"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
diff --git a/src/gui/rhi/qrhi.cpp b/src/gui/rhi/qrhi.cpp
index b9312f6b304..7a3d4974e53 100644
--- a/src/gui/rhi/qrhi.cpp
+++ b/src/gui/rhi/qrhi.cpp
@@ -6543,7 +6543,7 @@ bool operator!=(const QRhiShaderResourceBinding &a, const QRhiShaderResourceBind
size_t qHash(const QRhiShaderResourceBinding &b, size_t seed) noexcept
{
const QRhiShaderResourceBinding::Data *d = QRhiImplementation::shaderResourceBindingData(b);
- QtPrivate::QHashCombine hash(seed);
+ QtPrivate::QHashCombineWithSeed hash(seed);
seed = hash(seed, d->binding);
seed = hash(seed, d->stage);
seed = hash(seed, d->type);
diff --git a/src/gui/rhi/qshader.cpp b/src/gui/rhi/qshader.cpp
index 5e967c62e40..1234d01b6ec 100644
--- a/src/gui/rhi/qshader.cpp
+++ b/src/gui/rhi/qshader.cpp
@@ -812,7 +812,7 @@ bool operator==(const QShader &lhs, const QShader &rhs) noexcept
size_t qHash(const QShader &s, size_t seed) noexcept
{
if (s.d) {
- QtPrivate::QHashCombine hash(seed);
+ QtPrivate::QHashCombineWithSeed hash(seed);
seed = hash(seed, s.stage());
if (!s.d->shaders.isEmpty()) {
seed = hash(seed, s.d->shaders.firstKey());
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index 5d455219359..8380a8b7f68 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -1570,7 +1570,6 @@ bool QFontDatabase::isFixedPitch(const QString &family,
bool QFontDatabase::isBitmapScalable(const QString &family,
const QString &style)
{
- bool bitmapScalable = false;
QString familyName, foundryName;
parseFontName(family, foundryName, familyName);
@@ -1578,7 +1577,8 @@ bool QFontDatabase::isBitmapScalable(const QString &family,
QFontDatabasePrivate *d = QFontDatabasePrivate::ensureFontDatabase();
QtFontFamily *f = d->family(familyName);
- if (!f) return bitmapScalable;
+ if (!f)
+ return false;
QtFontStyle::Key styleKey(style);
for (int j = 0; j < f->count; j++) {
@@ -1589,13 +1589,11 @@ bool QFontDatabase::isBitmapScalable(const QString &family,
foundry->styles[k]->styleName == style ||
foundry->styles[k]->key == styleKey)
&& foundry->styles[k]->bitmapScalable && !foundry->styles[k]->smoothScalable) {
- bitmapScalable = true;
- goto end;
+ return true;
}
}
}
- end:
- return bitmapScalable;
+ return false;
}
@@ -1609,7 +1607,6 @@ bool QFontDatabase::isBitmapScalable(const QString &family,
*/
bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &style)
{
- bool smoothScalable = false;
QString familyName, foundryName;
parseFontName(family, foundryName, familyName);
@@ -1626,7 +1623,8 @@ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &sty
}
}
}
- if (!f) return smoothScalable;
+ if (!f)
+ return false;
const QtFontStyle::Key styleKey(style);
for (int j = 0; j < f->count; j++) {
@@ -1634,7 +1632,7 @@ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &sty
if (foundryName.isEmpty() || foundry->name.compare(foundryName, Qt::CaseInsensitive) == 0) {
for (int k = 0; k < foundry->count; k++) {
const QtFontStyle *fontStyle = foundry->styles[k];
- smoothScalable =
+ const bool smoothScalable =
fontStyle->smoothScalable
&& ((style.isEmpty()
|| fontStyle->styleName == style
@@ -1643,12 +1641,11 @@ bool QFontDatabase::isSmoothlyScalable(const QString &family, const QString &sty
&& style == styleStringHelper(fontStyle->key.weight,
QFont::Style(fontStyle->key.style))));
if (smoothScalable)
- goto end;
+ return true;
}
}
}
- end:
- return smoothScalable;
+ return false;
}
/*!
@@ -1679,7 +1676,6 @@ QList<int> QFontDatabase::pointSizes(const QString &family,
if (QGuiApplicationPrivate::platformIntegration()->fontDatabase()->fontsAlwaysScalable())
return standardSizes();
- bool smoothScalable = false;
QString familyName, foundryName;
parseFontName(family, foundryName, familyName);
@@ -1701,10 +1697,9 @@ QList<int> QFontDatabase::pointSizes(const QString &family,
QtFontStyle *style = foundry->style(styleKey, styleName);
if (!style) continue;
- if (style->smoothScalable) {
- smoothScalable = true;
- goto end;
- }
+ if (style->smoothScalable)
+ return standardSizes();
+
for (int l = 0; l < style->count; l++) {
const QtFontSize *size = style->pixelSizes + l;
@@ -1716,9 +1711,6 @@ QList<int> QFontDatabase::pointSizes(const QString &family,
}
}
}
- end:
- if (smoothScalable)
- return standardSizes();
std::sort(sizes.begin(), sizes.end());
return sizes;
@@ -1781,7 +1773,6 @@ QList<int> QFontDatabase::smoothSizes(const QString &family,
if (QGuiApplicationPrivate::platformIntegration()->fontDatabase()->fontsAlwaysScalable())
return standardSizes();
- bool smoothScalable = false;
QString familyName, foundryName;
parseFontName(family, foundryName, familyName);
@@ -1803,10 +1794,9 @@ QList<int> QFontDatabase::smoothSizes(const QString &family,
QtFontStyle *style = foundry->style(styleKey, styleName);
if (!style) continue;
- if (style->smoothScalable) {
- smoothScalable = true;
- goto end;
- }
+ if (style->smoothScalable)
+ return QFontDatabase::standardSizes();
+
for (int l = 0; l < style->count; l++) {
const QtFontSize *size = style->pixelSizes + l;
@@ -1818,9 +1808,6 @@ QList<int> QFontDatabase::smoothSizes(const QString &family,
}
}
}
- end:
- if (smoothScalable)
- return QFontDatabase::standardSizes();
std::sort(sizes.begin(), sizes.end());
return sizes;
diff --git a/src/gui/text/qfontdatabase_p.h b/src/gui/text/qfontdatabase_p.h
index 4cd6996aab8..27fb34aecdd 100644
--- a/src/gui/text/qfontdatabase_p.h
+++ b/src/gui/text/qfontdatabase_p.h
@@ -51,7 +51,7 @@ inline bool operator!=(const QtFontFallbacksCacheKey &lhs, const QtFontFallbacks
inline size_t qHash(const QtFontFallbacksCacheKey &key, size_t seed = 0) noexcept
{
- QtPrivate::QHashCombine hash(seed);
+ QtPrivate::QHashCombineWithSeed hash(seed);
seed = hash(seed, key.family);
seed = hash(seed, int(key.style));
seed = hash(seed, int(key.styleHint));
diff --git a/src/gui/util/qgridlayoutengine.cpp b/src/gui/util/qgridlayoutengine.cpp
index e8a6b56ae20..32fee3bcdf7 100644
--- a/src/gui/util/qgridlayoutengine.cpp
+++ b/src/gui/util/qgridlayoutengine.cpp
@@ -471,6 +471,7 @@ void QGridLayoutRowData::dump(int indent) const
qDebug("%*s Multi-cell entry <%d, %d> (stretch %d)", indent, "", it.key().first,
it.key().second, it.value().q_stretch);
it.value().q_box.dump(indent + 2);
+ ++it;
}
}
#endif
diff --git a/src/network/android/REUSE.toml b/src/network/android/REUSE.toml
index e46bfebe93c..8c759f3eee7 100644
--- a/src/network/android/REUSE.toml
+++ b/src/network/android/REUSE.toml
@@ -4,5 +4,5 @@ version = 1
path = ["jar/build.gradle", "jar/settings.gradle"]
precedence = "closest"
comment = "double check"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp
index 4c8b3ebf3f8..ca5fb50f086 100644
--- a/src/network/socket/qnativesocketengine.cpp
+++ b/src/network/socket/qnativesocketengine.cpp
@@ -429,11 +429,14 @@ bool QNativeSocketEngine::initialize(QAbstractSocket::SocketType socketType, QAb
if (socketType == QAbstractSocket::UdpSocket) {
// Set the broadcasting flag if it's a UDP socket.
- if (!setOption(BroadcastSocketOption, 1)) {
- d->setError(QAbstractSocket::UnsupportedSocketOperationError,
- QNativeSocketEnginePrivate::BroadcastingInitFailedErrorString);
- close();
- return false;
+ // IPv6 does not support broadcast — only set option for IPv4
+ if (protocol == QAbstractSocket::IPv4Protocol) {
+ if (!setOption(BroadcastSocketOption, 1)) {
+ d->setError(QAbstractSocket::UnsupportedSocketOperationError,
+ QNativeSocketEnginePrivate::BroadcastingInitFailedErrorString);
+ close();
+ return false;
+ }
}
// Set some extra flags that are interesting to us, but accept failure
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index 6949eec9560..b78d2829704 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -822,6 +822,12 @@ qint64 QNativeSocketEnginePrivate::nativePendingDatagramSize() const
recvResult = getsockopt(socketDescriptor, SOL_SOCKET, SO_NREAD, &value, &valuelen);
if (recvResult != -1)
recvResult = value;
+#elif defined(Q_OS_VXWORKS)
+ // VxWorks: use ioctl(FIONREAD) to query the number of bytes available
+ int available = 0;
+ int ioctlResult = ::ioctl(socketDescriptor, FIONREAD, &available);
+ if (ioctlResult != -1)
+ recvResult = available;
#else
// We need to grow the buffer to fit the entire datagram.
// We start at 1500 bytes (the MTU for Ethernet V2), which should catch
diff --git a/src/opengl/qopenglcompositorbackingstore.cpp b/src/opengl/qopenglcompositorbackingstore.cpp
index 20c86fb8adc..95dd1a562a6 100644
--- a/src/opengl/qopenglcompositorbackingstore.cpp
+++ b/src/opengl/qopenglcompositorbackingstore.cpp
@@ -163,7 +163,8 @@ QPlatformBackingStore::FlushResult QOpenGLCompositorBackingStore::rhiFlush(QWind
const QRegion &region,
const QPoint &offset,
QPlatformTextureList *textures,
- bool translucentBackground)
+ bool translucentBackground,
+ qreal sourceTransformFactor)
{
// QOpenGLWidget/QQuickWidget content provided as textures. The raster content goes on top.
@@ -171,6 +172,7 @@ QPlatformBackingStore::FlushResult QOpenGLCompositorBackingStore::rhiFlush(QWind
Q_UNUSED(offset);
Q_UNUSED(translucentBackground);
Q_UNUSED(sourceDevicePixelRatio);
+ Q_UNUSED(sourceTransformFactor);
m_rhi = rhi(window);
Q_ASSERT(m_rhi);
diff --git a/src/opengl/qopenglcompositorbackingstore_p.h b/src/opengl/qopenglcompositorbackingstore_p.h
index 4512e2d589e..b50629000cf 100644
--- a/src/opengl/qopenglcompositorbackingstore_p.h
+++ b/src/opengl/qopenglcompositorbackingstore_p.h
@@ -48,7 +48,8 @@ public:
const QRegion &region,
const QPoint &offset,
QPlatformTextureList *textures,
- bool translucentBackground) override;
+ bool translucentBackground,
+ qreal sourceTransformFactor = 0) override;
const QPlatformTextureList *textures() const { return m_textures; }
diff --git a/src/plugins/REUSE.toml b/src/plugins/REUSE.toml
index d017617236d..d58822731c1 100644
--- a/src/plugins/REUSE.toml
+++ b/src/plugins/REUSE.toml
@@ -6,19 +6,19 @@ path = ["**.json", "**.png", "**.svg", "**.xml",
"platforms/ios/module.modulemap",
"tracing/metadata_template.txt"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
[[annotations]]
path = ["platforms/wasm/**"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GPL-3.0-only"
[[annotations]]
path = ["**.qmake.conf", "networkinformation/android/jar/build.gradle",
"networkinformation/android/jar/settings.gradle"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "BSD-3-Clause"
diff --git a/src/plugins/imageformats/ico/qicohandler.cpp b/src/plugins/imageformats/ico/qicohandler.cpp
index b5113578dd2..03677107d7d 100644
--- a/src/plugins/imageformats/ico/qicohandler.cpp
+++ b/src/plugins/imageformats/ico/qicohandler.cpp
@@ -518,7 +518,7 @@ QImage ICOReader::iconAt(int index)
}
}
}
- img.setText(QLatin1String(icoOrigDepthKey), QString::number(iconEntry.wBitCount));
+ img.setText(QLatin1String(icoOrigDepthKey), QString::number(icoAttrib.nbits));
}
}
}
diff --git a/src/plugins/platforminputcontexts/ibus/REUSE.toml b/src/plugins/platforminputcontexts/ibus/REUSE.toml
index a16b04598f2..6423551b15d 100644
--- a/src/plugins/platforminputcontexts/ibus/REUSE.toml
+++ b/src/plugins/platforminputcontexts/ibus/REUSE.toml
@@ -4,5 +4,5 @@ version = 1
path = ["qibusinputcontextproxy.cpp", "qibusinputcontextproxy.h", "qibusproxy.cpp",
"qibusproxy.h", "qibusproxyportal.cpp", "qibusproxyportal.h"]
precedence = "override"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
diff --git a/src/plugins/platforms/CMakeLists.txt b/src/plugins/platforms/CMakeLists.txt
index f30c27c24be..498a0772bc9 100644
--- a/src/plugins/platforms/CMakeLists.txt
+++ b/src/plugins/platforms/CMakeLists.txt
@@ -4,10 +4,10 @@
if(ANDROID)
add_subdirectory(android)
endif()
-if(NOT ANDROID AND NOT WASM)
+if(NOT WASM)
add_subdirectory(minimal)
endif()
-if(QT_FEATURE_freetype AND NOT ANDROID AND NOT WASM)
+if(QT_FEATURE_freetype AND NOT WASM)
add_subdirectory(offscreen)
endif()
if(QT_FEATURE_xcb)
diff --git a/src/plugins/platforms/android/CMakeLists.txt b/src/plugins/platforms/android/CMakeLists.txt
index 0160e12c26c..0d2a048abde 100644
--- a/src/plugins/platforms/android/CMakeLists.txt
+++ b/src/plugins/platforms/android/CMakeLists.txt
@@ -51,7 +51,12 @@ qt_internal_add_plugin(QAndroidIntegrationPlugin
qandroidplatformdialoghelpers.cpp
# Conflicting JNI classes, and types
androidcontentfileengine.cpp
+ qandroidplatformforeignwindow.cpp
qandroidplatformintegration.cpp
+ qandroidplatformscreen.cpp
+ qandroidplatformservices.cpp
+ qandroidplatformwindow.cpp
+ qandroidsystemlocale.cpp
INCLUDE_DIRECTORIES
${CMAKE_CURRENT_SOURCE_DIR}
${QtBase_SOURCE_DIR}/src/3rdparty/android
diff --git a/src/plugins/platforms/android/androidjniaccessibility.cpp b/src/plugins/platforms/android/androidjniaccessibility.cpp
index 200c2f7a47b..b3ff0a4f06e 100644
--- a/src/plugins/platforms/android/androidjniaccessibility.cpp
+++ b/src/plugins/platforms/android/androidjniaccessibility.cpp
@@ -28,6 +28,7 @@ using namespace Qt::StringLiterals;
namespace QtAndroidAccessibility
{
+ static jmethodID m_setClassNameMethodID = 0;
static jmethodID m_addActionMethodID = 0;
static jmethodID m_setCheckableMethodID = 0;
static jmethodID m_setCheckedMethodID = 0;
@@ -421,6 +422,130 @@ namespace QtAndroidAccessibility
return jstr;
}
+ static QString classNameForRole(QAccessible::Role role, QAccessible::State state) {
+ switch (role) {
+ case QAccessible::Role::Button:
+ case QAccessible::Role::Link:
+ {
+ if (state.checkable)
+ // There is also a android.widget.Switch for which we have no match.
+ return QStringLiteral("android.widget.ToggleButton");
+ return QStringLiteral("android.widget.Button");
+ }
+ case QAccessible::Role::CheckBox:
+ // As of android/accessibility/utils/Role.java::getRole a CheckBox
+ // is NOT android.widget.CheckBox
+ return QStringLiteral("android.widget.CompoundButton");
+ case QAccessible::Role::Clock:
+ return QStringLiteral("android.widget.TextClock");
+ case QAccessible::Role::ComboBox:
+ return QStringLiteral("android.widget.Spinner");
+ case QAccessible::Role::Graphic:
+ // QQuickImage does not provide this role it inherits Client from QQuickItem
+ return QStringLiteral("android.widget.ImageView");
+ case QAccessible::Role::Grouping:
+ return QStringLiteral("android.view.ViewGroup");
+ case QAccessible::Role::List:
+ // As of android/accessibility/utils/Role.java::getRole a List
+ // is NOT android.widget.ListView
+ return QStringLiteral("android.widget.AbsListView");
+ case QAccessible::Role::MenuItem:
+ return QStringLiteral("android.view.MenuItem");
+ case QAccessible::Role::PopupMenu:
+ return QStringLiteral("android.widget.PopupMenu");
+ case QAccessible::Role::Separator:
+ return QStringLiteral("android.widget.Space");
+ case QAccessible::Role::ToolBar:
+ return QStringLiteral("android.view.Toolbar");
+ case QAccessible::Role::Heading: [[fallthrough]];
+ case QAccessible::Role::StaticText:
+ // Heading vs. regular Text is finally determined by AccessibilityNodeInfo.isHeading()
+ return QStringLiteral("android.widget.TextView");
+ case QAccessible::Role::EditableText:
+ return QStringLiteral("android.widget.EditText");
+ case QAccessible::Role::RadioButton:
+ return QStringLiteral("android.widget.RadioButton");
+ case QAccessible::Role::ProgressBar:
+ return QStringLiteral("android.widget.ProgressBar");
+ // Range information need to be filled to announce percentages
+ case QAccessible::Role::SpinBox:
+ return QStringLiteral("android.widget.NumberPicker");
+ case QAccessible::Role::WebDocument:
+ return QStringLiteral("android.webkit.WebView");
+ case QAccessible::Role::Dialog:
+ return QStringLiteral("android.app.AlertDialog");
+ case QAccessible::Role::PageTab:
+ return QStringLiteral("android.app.ActionBar.Tab");
+ case QAccessible::Role::PageTabList:
+ return QStringLiteral("android.widget.TabWidget");
+ case QAccessible::Role::ScrollBar: [[fallthrough]];
+ case QAccessible::Role::Slider:
+ return QStringLiteral("android.widget.SeekBar");
+ case QAccessible::Role::Table:
+ // #TODO Evaluate the usage of AccessibleNodeInfo.setCollectionItemInfo() to provide
+ // infos about colums, rows und items.
+ return QStringLiteral("android.widget.GridView");
+ case QAccessible::Role::Pane:
+ // #TODO QQuickScrollView, QQuickListView (see QTBUG-137806)
+ return QStringLiteral("android.view.ViewGroup");
+ case QAccessible::Role::AlertMessage:
+ case QAccessible::Role::Animation:
+ case QAccessible::Role::Application:
+ case QAccessible::Role::Assistant:
+ case QAccessible::Role::BlockQuote:
+ case QAccessible::Role::Border:
+ case QAccessible::Role::ButtonDropGrid:
+ case QAccessible::Role::ButtonDropDown:
+ case QAccessible::Role::ButtonMenu:
+ case QAccessible::Role::Canvas:
+ case QAccessible::Role::Caret:
+ case QAccessible::Role::Cell:
+ case QAccessible::Role::Chart:
+ case QAccessible::Role::Client:
+ case QAccessible::Role::ColorChooser:
+ case QAccessible::Role::Column:
+ case QAccessible::Role::ColumnHeader:
+ case QAccessible::Role::ComplementaryContent:
+ case QAccessible::Role::Cursor:
+ case QAccessible::Role::Desktop:
+ case QAccessible::Role::Dial:
+ case QAccessible::Role::Document:
+ case QAccessible::Role::Equation:
+ case QAccessible::Role::Footer:
+ case QAccessible::Role::Form:
+ case QAccessible::Role::Grip:
+ case QAccessible::Role::HelpBalloon:
+ case QAccessible::Role::HotkeyField:
+ case QAccessible::Role::Indicator:
+ case QAccessible::Role::LayeredPane:
+ case QAccessible::Role::ListItem:
+ case QAccessible::Role::MenuBar:
+ case QAccessible::Role::NoRole:
+ case QAccessible::Role::Note:
+ case QAccessible::Role::Notification:
+ case QAccessible::Role::Paragraph:
+ case QAccessible::Role::PropertyPage:
+ case QAccessible::Role::Row:
+ case QAccessible::Role::RowHeader:
+ case QAccessible::Role::Section:
+ case QAccessible::Role::Sound:
+ case QAccessible::Role::Splitter:
+ case QAccessible::Role::StatusBar:
+ case QAccessible::Role::Terminal:
+ case QAccessible::Role::TitleBar:
+ case QAccessible::Role::ToolTip:
+ case QAccessible::Role::Tree:
+ case QAccessible::Role::TreeItem:
+ case QAccessible::Role::UserRole:
+ case QAccessible::Role::Whitespace:
+ case QAccessible::Role::Window:
+ // If unsure, every visible or interactive element in Android
+ // inherits android.view.View and by many extends also TextView.
+ // Android itself does a similar thing e.g. in its Settings-App.
+ return QStringLiteral("android.view.TextView");
+ }
+ }
+
static QString descriptionForInterface(QAccessibleInterface *iface)
{
QString desc;
@@ -513,6 +638,10 @@ namespace QtAndroidAccessibility
return false;
}
+ const QString role = classNameForRole(info.role, info.state);
+ jstring jrole = env->NewString((jchar*)role.constData(), (jsize)role.size());
+ env->CallVoidMethod(node, m_setClassNameMethodID, jrole);
+
const bool hasClickableAction =
info.actions.contains(QAccessibleActionInterface::pressAction()) ||
info.actions.contains(QAccessibleActionInterface::toggleAction());
@@ -590,6 +719,7 @@ namespace QtAndroidAccessibility
}
jclass nodeInfoClass = env->FindClass("android/view/accessibility/AccessibilityNodeInfo");
+ GET_AND_CHECK_STATIC_METHOD(m_setClassNameMethodID, nodeInfoClass, "setClassName", "(Ljava/lang/CharSequence;)V");
GET_AND_CHECK_STATIC_METHOD(m_addActionMethodID, nodeInfoClass, "addAction", "(I)V");
GET_AND_CHECK_STATIC_METHOD(m_setCheckableMethodID, nodeInfoClass, "setCheckable", "(Z)V");
GET_AND_CHECK_STATIC_METHOD(m_setCheckedMethodID, nodeInfoClass, "setChecked", "(Z)V");
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.h b/src/plugins/platforms/cocoa/qcocoabackingstore.h
index 71b6015a54d..79aed15a1d0 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.h
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.h
@@ -44,7 +44,8 @@ public:
const QRegion &region,
const QPoint &offset,
QPlatformTextureList *textures,
- bool translucentBackground) override;
+ bool translucentBackground,
+ qreal sourceTransformFactor) override;
QImage toImage() const override;
QPlatformGraphicsBuffer *graphicsBuffer() const override;
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
index 78d23b01dea..186aeaac44d 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.mm
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
@@ -457,7 +457,8 @@ QPlatformBackingStore::FlushResult QCALayerBackingStore::rhiFlush(QWindow *windo
const QRegion &region,
const QPoint &offset,
QPlatformTextureList *textures,
- bool translucentBackground)
+ bool translucentBackground,
+ qreal sourceTransformFactor)
{
if (!m_buffers.back()) {
qCWarning(lcQpaBackingStore) << "Flush requested with no back buffer. Ignoring.";
@@ -466,7 +467,8 @@ QPlatformBackingStore::FlushResult QCALayerBackingStore::rhiFlush(QWindow *windo
finalizeBackBuffer();
- return QPlatformBackingStore::rhiFlush(window, sourceDevicePixelRatio, region, offset, textures, translucentBackground);
+ return QPlatformBackingStore::rhiFlush(window, sourceDevicePixelRatio,
+ region, offset, textures, translucentBackground, sourceTransformFactor);
}
QImage QCALayerBackingStore::toImage() const
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.h b/src/plugins/platforms/cocoa/qcocoaglcontext.h
index 36546879ae4..13139dd399d 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.h
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.h
@@ -43,6 +43,8 @@ public:
QFunctionPointer getProcAddress(const char *procName) override;
+ bool isSoftwareContext() const;
+
private:
static NSOpenGLPixelFormat *pixelFormatForSurfaceFormat(const QSurfaceFormat &format);
@@ -54,6 +56,7 @@ private:
QSurfaceFormat m_format;
QVarLengthArray<QMacNotificationObserver, 3> m_updateObservers;
QAtomicInt m_needsUpdate = false;
+ bool m_isSoftwareContext = false;
#ifndef QT_NO_DEBUG_STREAM
friend QDebug operator<<(QDebug debug, const QCocoaGLContext *screen);
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
index bfac716b633..2f0f513dfc1 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
@@ -289,6 +289,9 @@ void QCocoaGLContext::updateSurfaceFormat()
else
m_format.setSwapBehavior(QSurfaceFormat::SingleBuffer);
+ m_isSoftwareContext = (pixelFormatAttribute(NSOpenGLPFARendererID)
+ & kCGLRendererIDMatchingMask) == kCGLRendererGenericFloatID;
+
// ------------------- Query the context -------------------
auto glContextParameter = [&](NSOpenGLContextParameter parameter) {
@@ -512,6 +515,11 @@ bool QCocoaGLContext::isSharing() const
return m_shareContext != nil;
}
+bool QCocoaGLContext::isSoftwareContext() const
+{
+ return m_isSoftwareContext;
+}
+
NSOpenGLContext *QCocoaGLContext::nativeContext() const
{
return m_context;
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm
index 8c6dcfd4f60..4c5975af34a 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.mm
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm
@@ -232,6 +232,24 @@ bool QCocoaIntegration::hasCapability(QPlatformIntegration::Capability cap) cons
// layer-backed.
return false;
case OpenGL:
+ if (QOperatingSystemVersion::current() > QOperatingSystemVersion::MacOSSonoma) {
+ // Tahoe has issues with software-backed GL, crashing in common operations
+ static bool isSoftwareContext = []{
+ QOpenGLContext context;
+ context.create();
+ auto *cocoaContext = static_cast<QCocoaGLContext*>(context.handle());
+ if (cocoaContext->isSoftwareContext()) {
+ qWarning() << "Detected software OpenGL backend,"
+ << "which is known to be broken on"
+ << qUtf8Printable(QSysInfo::prettyProductName());
+ return true;
+ } else {
+ return false;
+ }
+ }();
+ return !isSoftwareContext;
+ }
+ Q_FALLTHROUGH();
case BufferQueueingOpenGL:
#endif
case ThreadedPixmaps:
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice.cpp
index 9f19e649f85..59265daa127 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmdevice.cpp
@@ -10,6 +10,7 @@
#include <private/qeglfskmsintegration_p.h>
#include <QtCore/QLoggingCategory>
+#include <QtCore/qtimer.h>
#include <QtCore/private/qcore_unix_p.h>
#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
diff --git a/src/plugins/platforms/ios/qiosapplicationdelegate.mm b/src/plugins/platforms/ios/qiosapplicationdelegate.mm
index 088d48fc9ff..990409f2d17 100644
--- a/src/plugins/platforms/ios/qiosapplicationdelegate.mm
+++ b/src/plugins/platforms/ios/qiosapplicationdelegate.mm
@@ -16,19 +16,28 @@
#include <QtCore/QtCore>
@interface QIOSWindowSceneDelegate : NSObject<UIWindowSceneDelegate>
+@property (nullable, nonatomic, strong) UIWindow *window;
@end
@implementation QIOSApplicationDelegate
- (UISceneConfiguration *)application:(UIApplication *)application
- configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession
+ configurationForConnectingSceneSession:(UISceneSession *)session
options:(UISceneConnectionOptions *)options
{
- qCDebug(lcQpaWindowScene) << "Configuring scene for" << connectingSceneSession
- << "with options" << options;
+ qCDebug(lcQpaWindowScene) << "Configuring scene for" << session << "with options" << options;
+
+ auto *sceneConfig = session.configuration;
+
+ if ([sceneConfig.role hasPrefix:@"CPTemplateApplication"]) {
+ qCDebug(lcQpaWindowScene) << "Not touching CarPlay scene with role" << sceneConfig.role
+ << "and existing delegate class" << sceneConfig.delegateClass;
+ // FIXME: Consider ignoring any scene with an existing sceneClass, delegateClass, or
+ // storyboard. But for visionOS the default delegate is SwiftUI.AppSceneDelegate.
+ } else {
+ sceneConfig.delegateClass = QIOSWindowSceneDelegate.class;
+ }
- auto *sceneConfig = connectingSceneSession.configuration;
- sceneConfig.delegateClass = QIOSWindowSceneDelegate.class;
return sceneConfig;
}
@@ -40,27 +49,53 @@
{
qCDebug(lcQpaWindowScene) << "Connecting" << scene << "to" << session;
- Q_ASSERT([scene isKindOfClass:UIWindowScene.class]);
+ // Handle URL contexts, even if we return early
+ const auto handleUrlContexts = qScopeGuard([&]{
+ if (connectionOptions.URLContexts.count > 0)
+ [self scene:scene openURLContexts:connectionOptions.URLContexts];
+ });
+
+#if defined(Q_OS_VISIONOS)
+ // CPImmersiveScene is a UIWindowScene, most likely so it can handle its internal
+ // CPSceneLayerEventWindow and UITextEffectsWindow, but we don't want a QUIWindow
+ // for these scenes, so bail out early.
+ if ([scene.session.role isEqualToString:@"CPSceneSessionRoleImmersiveSpaceApplication"]) {
+ qCDebug(lcQpaWindowScene) << "Skipping UIWindow creation for immersive scene";
+ return;
+ }
+#endif
+
+ if (![scene isKindOfClass:UIWindowScene.class]) {
+ qCWarning(lcQpaWindowScene) << "Unexpectedly encountered non-window scene";
+ return;
+ }
+
UIWindowScene *windowScene = static_cast<UIWindowScene*>(scene);
QUIWindow *window = [[QUIWindow alloc] initWithWindowScene:windowScene];
+ window.rootViewController = [[[QIOSViewController alloc] initWithWindow:window] autorelease];
- QIOSScreen *screen = [&]{
- for (auto *screen : qGuiApp->screens()) {
- auto *platformScreen = static_cast<QIOSScreen*>(screen->handle());
-#if !defined(Q_OS_VISIONOS)
- if (platformScreen->uiScreen() == windowScene.screen)
-#endif
- return platformScreen;
- }
- Q_UNREACHABLE();
- }();
+ self.window = [window autorelease];
+}
- window.rootViewController = [[[QIOSViewController alloc]
- initWithWindow:window andScreen:screen] autorelease];
+- (void)windowScene:(UIWindowScene *)windowScene
+ didUpdateCoordinateSpace:(id<UICoordinateSpace>)previousCoordinateSpace
+ interfaceOrientation:(UIInterfaceOrientation)previousInterfaceOrientation
+ traitCollection:(UITraitCollection *)previousTraitCollection
+{
+ qCDebug(lcQpaWindowScene) << "Scene" << windowScene << "did update properties";
+ if (!self.window)
+ return;
- if (connectionOptions.URLContexts.count > 0)
- [self scene:scene openURLContexts:connectionOptions.URLContexts];
+ Q_ASSERT([self.window isKindOfClass:QUIWindow.class]);
+ auto *viewController = static_cast<QIOSViewController*>(self.window.rootViewController);
+ [viewController updatePlatformScreen];
+}
+
+- (void)sceneDidDisconnect:(UIScene *)scene
+{
+ qCDebug(lcQpaWindowScene) << "Disconnecting" << scene;
+ self.window = nil;
}
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts
diff --git a/src/plugins/platforms/ios/qiosglobal.mm b/src/plugins/platforms/ios/qiosglobal.mm
index 9ab490b2970..89a343061ee 100644
--- a/src/plugins/platforms/ios/qiosglobal.mm
+++ b/src/plugins/platforms/ios/qiosglobal.mm
@@ -13,7 +13,7 @@
QT_BEGIN_NAMESPACE
Q_LOGGING_CATEGORY(lcQpaApplication, "qt.qpa.application");
-Q_LOGGING_CATEGORY(lcQpaInputMethods, "qt.qpa.input.methods");
+Q_LOGGING_CATEGORY(lcQpaInputMethods, "qt.qpa.input.methods", QtCriticalMsg);
Q_LOGGING_CATEGORY(lcQpaWindow, "qt.qpa.window");
Q_LOGGING_CATEGORY(lcQpaWindowScene, "qt.qpa.window.scene");
diff --git a/src/plugins/platforms/ios/qiosinputcontext.mm b/src/plugins/platforms/ios/qiosinputcontext.mm
index 5716ad041e0..8544c497d43 100644
--- a/src/plugins/platforms/ios/qiosinputcontext.mm
+++ b/src/plugins/platforms/ios/qiosinputcontext.mm
@@ -371,7 +371,8 @@ void QIOSInputContext::updateKeyboardState(NSNotification *notification)
// with input-accessory-views. The reason for using frameEnd here (the future state),
// instead of the current state reflected in frameBegin, is that QInputMethod::isVisible()
// is documented to reflect the future state in the case of animated transitions.
- m_keyboardState.keyboardVisible = CGRectIntersectsRect(frameEnd, [UIScreen mainScreen].bounds);
+ m_keyboardState.keyboardVisible = !CGRectIsEmpty(UIScreen.mainScreen.bounds) &&
+ !CGRectIsEmpty(frameEnd) && CGRectIntersectsRect(frameEnd, UIScreen.mainScreen.bounds);
// Used for auto-scroller, and will be used for animation-signal in the future
m_keyboardState.keyboardEndRect = frameEnd;
@@ -639,8 +640,10 @@ void QIOSInputContext::update(Qt::InputMethodQueries updatedProperties)
// focus object. We try to detect code paths that fail this assertion and smooth
// over the situation by doing a manual update of the focus object.
if (qApp->focusObject() != m_imeState.focusObject && updatedProperties != Qt::ImQueryAll) {
- qWarning() << "stale focus object" << static_cast<void *>(m_imeState.focusObject)
- << ", doing manual update";
+ qCWarning(lcQpaInputMethods).verbosity(0) << "Updating input context" << updatedProperties
+ << "with last reported focus object" << m_imeState.focusObject
+ << "but qGuiApp reports" << qApp->focusObject()
+ << "which means someone failed to call QPlatformInputContext::setFocusObject()";
setFocusObject(qApp->focusObject());
return;
}
diff --git a/src/plugins/platforms/ios/qiosviewcontroller.h b/src/plugins/platforms/ios/qiosviewcontroller.h
index 1f8da41ba4f..b5ce88d6a33 100644
--- a/src/plugins/platforms/ios/qiosviewcontroller.h
+++ b/src/plugins/platforms/ios/qiosviewcontroller.h
@@ -12,10 +12,12 @@ QT_END_NAMESPACE
@interface QIOSViewController : UIViewController
-- (instancetype)initWithWindow:(UIWindow*)window andScreen:(QT_PREPEND_NAMESPACE(QIOSScreen) *)screen;
-- (void)updateProperties;
+- (instancetype)initWithWindow:(UIWindow*)window;
+- (void)updateStatusBarProperties;
- (NSArray*)keyCommands;
- (void)handleShortcut:(UIKeyCommand*)keyCommand;
+- (void)updatePlatformScreen;
+
#ifndef Q_OS_TVOS
// UIViewController
diff --git a/src/plugins/platforms/ios/qiosviewcontroller.mm b/src/plugins/platforms/ios/qiosviewcontroller.mm
index 36ce785e031..169f8ae1754 100644
--- a/src/plugins/platforms/ios/qiosviewcontroller.mm
+++ b/src/plugins/platforms/ios/qiosviewcontroller.mm
@@ -231,11 +231,12 @@
@synthesize preferredStatusBarStyle;
#endif
-- (instancetype)initWithWindow:(UIWindow*)window andScreen:(QT_PREPEND_NAMESPACE(QIOSScreen) *)screen
+- (instancetype)initWithWindow:(UIWindow*)window
{
if (self = [self init]) {
self.window = window;
- self.platformScreen = screen;
+ self.platformScreen = nil;
+ [self updatePlatformScreen];
self.changingOrientation = NO;
#ifndef Q_OS_TVOS
@@ -246,7 +247,7 @@
#endif
m_focusWindowChangeConnection = QObject::connect(qApp, &QGuiApplication::focusWindowChanged, [self]() {
- [self updateProperties];
+ [self updateStatusBarProperties];
});
QIOSApplicationState *applicationState = &QIOSIntegration::instance()->applicationState;
@@ -314,6 +315,54 @@
// -------------------------------------------------------------------------
+- (void)updatePlatformScreen
+{
+ auto *windowScene = self.window.windowScene;
+
+ QIOSScreen *newPlatformScreen = [&]{
+ for (auto *screen : qGuiApp->screens()) {
+ auto *platformScreen = static_cast<QIOSScreen*>(screen->handle());
+#if !defined(Q_OS_VISIONOS)
+ if (platformScreen->uiScreen() == windowScene.screen)
+#endif
+ return platformScreen;
+ }
+ Q_UNREACHABLE();
+ }();
+
+ if (newPlatformScreen != self.platformScreen) {
+ QIOSScreen *oldPlatformScreen = self.platformScreen;
+ self.platformScreen = newPlatformScreen;
+
+ qCDebug(lcQpaWindow) << "View controller" << self << "moved from"
+ << oldPlatformScreen << "to" << newPlatformScreen;
+
+ QScreen *newScreen = newPlatformScreen ? newPlatformScreen->screen() : nullptr;
+
+ const bool isPrimaryScene = !qt_apple_sharedApplication().supportsMultipleScenes
+ && windowScene.session.role == UIWindowSceneSessionRoleApplication;
+
+ if (isPrimaryScene) {
+ // When we only have a single application-role scene we treat the
+ // active screen as the primary one, so that windows shown on the
+ // primary screen end up in our view controller.
+ QWindowSystemInterface::handlePrimaryScreenChanged(newPlatformScreen);
+ }
+
+ for (auto *window : qGuiApp->topLevelWindows()) {
+ // Move window to new screen if it was on the old screen,
+ // or if we're setting up the primary scene, in which case
+ // we want to adopt all existing windows to this screen.
+ if ((window->screen()->handle() == oldPlatformScreen)
+ || (isPrimaryScene && !oldPlatformScreen)) {
+ QWindowSystemInterface::handleWindowScreenChanged(window, newScreen);
+ }
+ }
+ }
+}
+
+// -------------------------------------------------------------------------
+
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration
{
self.changingOrientation = YES;
@@ -390,7 +439,7 @@
// -------------------------------------------------------------------------
-- (void)updateProperties
+- (void)updateStatusBarProperties
{
if (!isQtApplication())
return;
diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm
index 3e2b6b0102a..af1fbb0abaf 100644
--- a/src/plugins/platforms/ios/qioswindow.mm
+++ b/src/plugins/platforms/ios/qioswindow.mm
@@ -243,7 +243,7 @@ void QIOSWindow::setWindowState(Qt::WindowStates state)
qt_window_private(window())->windowState = state;
if (window()->isTopLevel() && window()->isVisible() && window()->isActive())
- [m_view.qtViewController updateProperties];
+ [m_view.qtViewController updateStatusBarProperties];
if (state & Qt::WindowMinimized) {
applyGeometry(QRect());
diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm
index 9b17eef07b0..86b6ce07518 100644
--- a/src/plugins/platforms/ios/quiview.mm
+++ b/src/plugins/platforms/ios/quiview.mm
@@ -786,6 +786,9 @@ inline ulong getTimeStamp(UIEvent *event)
#if QT_CONFIG(tabletevent)
- (void)handleHover:(UIHoverGestureRecognizer *)recognizer
{
+ if (!self.platformWindow)
+ return;
+
ulong timeStamp = [[NSProcessInfo processInfo] systemUptime] * 1000;
CGFloat zOffset = 0;
diff --git a/src/plugins/platforms/wayland/qwaylandcursor.cpp b/src/plugins/platforms/wayland/qwaylandcursor.cpp
index 4967f9d46f4..a9cff626224 100644
--- a/src/plugins/platforms/wayland/qwaylandcursor.cpp
+++ b/src/plugins/platforms/wayland/qwaylandcursor.cpp
@@ -331,7 +331,7 @@ void QWaylandCursor::changeCursor(QCursor *cursor, QWindow *window)
device->setCursor(cursor, bitmapBuffer, qCeil(waylandWindow->devicePixelRatio()));
}
- mDisplay->flushRequests();
+ wl_display_flush(mDisplay->wl_display());
}
}
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp
index 38b3bdadd35..a407cde2a7c 100644
--- a/src/plugins/platforms/windows/qwindowscontext.cpp
+++ b/src/plugins/platforms/windows/qwindowscontext.cpp
@@ -1156,9 +1156,13 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
case QtWindows::MoveEvent:
platformWindow->handleMoved();
return true;
- case QtWindows::ResizeEvent:
+ case QtWindows::ResizeEvent: {
+ QWindow *window = platformWindow->window();
platformWindow->handleResized(static_cast<int>(wParam), lParam);
+ if (window->flags().testFlags(Qt::ExpandedClientAreaHint))
+ platformWindow->updateCustomTitlebar();
return true;
+ }
case QtWindows::QuerySizeHints:
platformWindow->getSizeHints(reinterpret_cast<MINMAXINFO *>(lParam));
return true;// maybe available on some SDKs revisit WM_NCCALCSIZE
@@ -1174,8 +1178,12 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
return platformWindow->handleNonClientActivate(result);
case QtWindows::GeometryChangingEvent:
return platformWindow->handleGeometryChanging(&msg);
- case QtWindows::ExposeEvent:
+ case QtWindows::ExposeEvent: {
+ QWindow *window = platformWindow->window();
+ if (window->flags().testFlags(Qt::ExpandedClientAreaHint))
+ platformWindow->updateCustomTitlebar();
return platformWindow->handleWmPaint(hwnd, message, wParam, lParam, result);
+ }
case QtWindows::NonClientMouseEvent:
if (!platformWindow->frameStrutEventsEnabled())
break;
@@ -1219,6 +1227,7 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
case QtWindows::FocusInEvent: // see QWindowsWindow::requestActivateWindow().
if (platformWindow->window()->flags() & Qt::WindowDoesNotAcceptFocus)
return false;
+ [[fallthrough]];
case QtWindows::FocusOutEvent:
handleFocusEvent(et, platformWindow);
return true;
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index 25c15861ba1..0f66193f47d 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -262,6 +262,11 @@ bool QWindowsIntegration::hasCapability(QPlatformIntegration::Capability cap) co
return true;
#ifndef QT_NO_OPENGL
case OpenGL:
+#if !QT_CONFIG(run_opengl_tests)
+ // Workaround for build configs on WoA that don't have OpenGL installed
+ // FIXME: Detect at runtime
+ return false;
+#endif
return true;
case ThreadedOpenGL:
if (const QWindowsStaticOpenGLContext *glContext = QWindowsIntegration::staticOpenGLContext())
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index 81a3f1d37b7..731673b61db 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -284,40 +284,6 @@ static inline RECT RECTfromQRect(const QRect &rect)
return result;
}
-static LRESULT WINAPI WndProcTitleBar(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
- HWND parentHwnd = reinterpret_cast<HWND>(GetWindowLongPtr(hwnd, GWL_HWNDPARENT));
- QWindowsWindow* platformWindow = QWindowsContext::instance()->findPlatformWindow(parentHwnd);
-
- switch (message) {
- case WM_SHOWWINDOW:
- ShowWindow(hwnd,SW_HIDE);
- if ((BOOL)wParam == TRUE)
- platformWindow->transitionAnimatedCustomTitleBar();
- return 0;
- case WM_SIZE: {
- if (platformWindow)
- platformWindow->updateCustomTitlebar();
- break;
- }
- case WM_NCHITTEST:
- return HTTRANSPARENT;
- case WM_TIMER:
- ShowWindow(hwnd, SW_SHOWNOACTIVATE);
- platformWindow->updateCustomTitlebar();
- break;
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- BeginPaint(hwnd, &ps);
- EndPaint(hwnd, &ps);
- return 0;
- }
- }
- return DefWindowProc(hwnd, message, wParam, lParam);
-}
-
-
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug d, const RECT &r)
{
@@ -917,7 +883,7 @@ QWindowsWindowData
const auto appinst = reinterpret_cast<HINSTANCE>(GetModuleHandle(nullptr));
const QString windowClassName = QWindowsContext::instance()->registerWindowClass(w);
- const QString windowTitlebarName = QWindowsContext::instance()->registerWindowClass(QStringLiteral("_q_titlebar"), WndProcTitleBar, CS_VREDRAW|CS_HREDRAW, nullptr, false);
+ const QString windowTitlebarName = QWindowsContext::instance()->registerWindowClass(QStringLiteral("_q_titlebar"), DefWindowProc, CS_VREDRAW|CS_HREDRAW, nullptr, false);
const QScreen *screen{};
const QRect rect = QPlatformWindow::initialGeometry(w, data.geometry,
@@ -970,15 +936,13 @@ QWindowsWindowData
context->frameWidth, context->frameHeight,
parentHandle, nullptr, appinst, nullptr);
- if (w->flags().testFlags(Qt::ExpandedClientAreaHint)) {
- const UINT dpi = ::GetDpiForWindow(result.hwnd);
- const int titleBarHeight = getTitleBarHeight_sys(dpi);
- result.hwndTitlebar = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT,
- classTitleBarNameUtf16, classTitleBarNameUtf16,
- WS_POPUP, 0, 0,
- context->frameWidth, titleBarHeight,
- result.hwnd, nullptr, appinst, nullptr);
- }
+ const UINT dpi = ::GetDpiForWindow(result.hwnd);
+ const int titleBarHeight = getTitleBarHeight_sys(dpi);
+ result.hwndTitlebar = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE,
+ classTitleBarNameUtf16, classTitleBarNameUtf16,
+ 0, 0, 0,
+ context->frameWidth, titleBarHeight,
+ nullptr, nullptr, appinst, nullptr);
qCDebug(lcQpaWindow).nospace()
<< "CreateWindowEx: returns " << w << ' ' << result.hwnd << " obtained geometry: "
@@ -1056,6 +1020,9 @@ void WindowCreationData::initialize(const QWindow *w, HWND hwnd, bool frameChang
if (flags & Qt::ExpandedClientAreaHint) { // Gives us the rounded corners looks and the frame shadow
MARGINS margins = { -1, -1, -1, -1 };
DwmExtendFrameIntoClientArea(hwnd, &margins);
+ } else {
+ MARGINS margins = { 0, 0, 0, 0 };
+ DwmExtendFrameIntoClientArea(hwnd, &margins);
}
} else { // child.
SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, swpFlags);
@@ -1191,19 +1158,26 @@ QMargins QWindowsGeometryHint::frame(const QWindow *w, const QRect &geometry,
bool QWindowsGeometryHint::handleCalculateSize(const QWindow *window, const QMargins &customMargins, const MSG &msg, LRESULT *result)
{
+ // Prevent adding any border for frameless window
+ if (msg.wParam && window->flags() & Qt::FramelessWindowHint) {
+ *result = 0;
+ return true;
+ }
+ const QWindowsWindow *platformWindow = QWindowsWindow::windowsWindowOf(window);
+ // In case the platformwindow was not yet created, use the initial windowflags provided by the user.
+ const bool clientAreaExpanded = platformWindow != nullptr ? platformWindow->isClientAreaExpanded() : window->flags() & Qt::ExpandedClientAreaHint;
// Return 0 to remove the window's border
- const bool clientAreaExpanded = window->flags() & Qt::ExpandedClientAreaHint;
if (msg.wParam && clientAreaExpanded) {
// Prevent content from being cutoff by border for maximized, but not fullscreened windows.
- if (IsZoomed(msg.hwnd) && window->visibility() != QWindow::FullScreen) {
- auto *ncp = reinterpret_cast<NCCALCSIZE_PARAMS *>(msg.lParam);
- RECT *clientArea = &ncp->rgrc[0];
- const int border = getResizeBorderThickness(QWindowsWindow::windowsWindowOf(window)->savedDpi());
+ const bool maximized = IsZoomed(msg.hwnd) && window->visibility() != QWindow::FullScreen;
+ auto *ncp = reinterpret_cast<NCCALCSIZE_PARAMS *>(msg.lParam);
+ RECT *clientArea = &ncp->rgrc[0];
+ const int border = getResizeBorderThickness(96);
+ if (maximized)
clientArea->top += border;
- clientArea->bottom -= border;
- clientArea->left += border;
- clientArea->right -= border;
- }
+ clientArea->bottom -= border;
+ clientArea->left += border;
+ clientArea->right -= border;
*result = 0;
return true;
}
@@ -1623,6 +1597,12 @@ QWindowsWindow::QWindowsWindow(QWindow *aWindow, const QWindowsWindowData &data)
#endif
{
QWindowsContext::instance()->addWindow(m_data.hwnd, this);
+
+ if (aWindow->flags().testFlags(Qt::ExpandedClientAreaHint)) {
+ SetParent(m_data.hwndTitlebar, m_data.hwnd);
+ ShowWindow(m_data.hwndTitlebar, SW_SHOW);
+ }
+
const Qt::WindowType type = aWindow->type();
if (type == Qt::Desktop)
return; // No further handling for Qt::Desktop
@@ -1847,21 +1827,6 @@ QWindow *QWindowsWindow::topLevelOf(QWindow *w)
return w;
}
-// Checks whether the Window is tiled with Aero snap
-bool QWindowsWindow::isWindowArranged(HWND hwnd)
-{
- typedef BOOL(WINAPI* PIsWindowArranged)(HWND);
- static PIsWindowArranged pIsWindowArranged = nullptr;
- static bool resolved = false;
- if (!resolved) {
- resolved = true;
- pIsWindowArranged = (PIsWindowArranged)QSystemLibrary::resolve(QLatin1String("user32.dll"), "IsWindowArranged");
- }
- if (pIsWindowArranged == nullptr)
- return false;
- return pIsWindowArranged(hwnd);
-}
-
QWindowsWindowData
QWindowsWindowData::create(const QWindow *w,
const QWindowsWindowData &parameters,
@@ -1903,13 +1868,6 @@ void QWindowsWindow::setVisible(bool visible)
fireExpose(QRegion());
}
}
- if (m_data.hwndTitlebar) {
- if (visible) {
- SetWindowPos(m_data.hwndTitlebar, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
- } else {
- ShowWindow(m_data.hwndTitlebar, SW_HIDE);
- }
- }
}
bool QWindowsWindow::isVisible() const
@@ -2050,10 +2008,6 @@ void QWindowsWindow::show_sys() const
setFlag(WithinMaximize); // QTBUG-8361
ShowWindow(m_data.hwnd, sm);
- if (m_data.flags.testFlag(Qt::ExpandedClientAreaHint)) {
- ShowWindow(m_data.hwndTitlebar, sm);
- SetActiveWindow(m_data.hwnd);
- }
clearFlag(WithinMaximize);
@@ -2245,7 +2199,7 @@ QRect QWindowsWindow::normalGeometry() const
QMargins QWindowsWindow::safeAreaMargins() const
{
if (m_data.flags.testFlags(Qt::ExpandedClientAreaHint)) {
- const int titleBarHeight = getTitleBarHeight_sys(savedDpi());
+ const int titleBarHeight = getTitleBarHeight_sys(96);
return QMargins(0, titleBarHeight, 0, 0);
}
@@ -2457,15 +2411,9 @@ void QWindowsWindow::handleGeometryChange()
clearFlag(SynchronousGeometryChangeEvent);
qCDebug(lcQpaEvents) << __FUNCTION__ << this << window() << m_data.geometry;
- if (m_data.hwndTitlebar) {
- bool arranged = QWindowsWindow::isWindowArranged(m_data.hwnd);
- if (arranged || (m_windowWasArranged && !arranged))
- transitionAnimatedCustomTitleBar();
-
+ if (m_data.flags & Qt::ExpandedClientAreaHint) {
const int titleBarHeight = getTitleBarHeight_sys(savedDpi());
- MoveWindow(m_data.hwndTitlebar, m_data.geometry.x(), m_data.geometry.y(),
- m_data.geometry.width(), titleBarHeight, true);
- m_windowWasArranged = arranged;
+ MoveWindow(m_data.hwndTitlebar, 0, 0, m_data.geometry.width(), titleBarHeight, true);
}
}
@@ -2627,6 +2575,16 @@ QWindowsWindowData QWindowsWindow::setWindowFlags_sys(Qt::WindowFlags wt,
creationData.applyWindowFlags(m_data.hwnd);
creationData.initialize(window(), m_data.hwnd, true, m_opacity);
+ if (creationData.flags.testFlag(Qt::ExpandedClientAreaHint)) {
+ SetParent(m_data.hwndTitlebar, m_data.hwnd);
+ ShowWindow(m_data.hwndTitlebar, SW_SHOW);
+ } else {
+ if (IsWindowVisible(m_data.hwndTitlebar)) {
+ SetParent(m_data.hwndTitlebar, HWND_MESSAGE);
+ ShowWindow(m_data.hwndTitlebar, SW_HIDE);
+ }
+ }
+
QWindowsWindowData result = m_data;
result.flags = creationData.flags;
result.embedded = creationData.embedded;
@@ -2645,7 +2603,7 @@ void QWindowsWindow::handleWindowStateChange(Qt::WindowStates state)
handleHidden();
QWindowSystemInterface::flushWindowSystemEvents(QEventLoop::ExcludeUserInputEvents); // Tell QQuickWindow to stop rendering now.
} else {
- transitionAnimatedCustomTitleBar();
+ updateCustomTitlebar();
if (state & Qt::WindowMaximized) {
WINDOWPLACEMENT windowPlacement{};
windowPlacement.length = sizeof(WINDOWPLACEMENT);
@@ -2743,20 +2701,6 @@ void QWindowsWindow::correctWindowPlacement(WINDOWPLACEMENT &windowPlacement)
}
}
-void QWindowsWindow::transitionAnimatedCustomTitleBar()
-{
- if (!m_data.hwndTitlebar)
- return;
- const QWinRegistryKey registry(HKEY_CURRENT_USER, LR"(Control Panel\Desktop\WindowMetrics)");
- if (registry.isValid() && registry.value(LR"(MinAnimate)") == 1) {
- ShowWindow(m_data.hwndTitlebar, SW_HIDE);
- SetTimer(m_data.hwndTitlebar, 1, 200, nullptr);
- } else {
- ShowWindow(m_data.hwndTitlebar, SW_SHOWNOACTIVATE);
- updateCustomTitlebar();
- }
-}
-
void QWindowsWindow::updateRestoreGeometry()
{
m_data.restoreGeometry = normalFrameGeometry(m_data.hwnd);
@@ -3078,7 +3022,8 @@ void QWindowsWindow::calculateFullFrameMargins()
const auto systemMargins = testFlag(DisableNonClientScaling)
? QWindowsGeometryHint::frameOnPrimaryScreen(window(), m_data.hwnd)
: frameMargins_sys();
- const QMargins actualMargins = systemMargins + customMargins();
+ const int extendedClientAreaBorder = window()->flags().testFlag(Qt::ExpandedClientAreaHint) ? qRound(QHighDpiScaling::factor(window())) * 2 : 0;
+ const QMargins actualMargins = systemMargins + customMargins() - extendedClientAreaBorder;
const int yDiff = (windowRect.bottom - windowRect.top) - (clientRect.bottom - clientRect.top);
const bool typicalFrame = (actualMargins.left() == actualMargins.right())
@@ -3517,19 +3462,6 @@ bool QWindowsWindow::handleNonClientActivate(LRESULT *result) const
return false;
}
-static void _q_drawCustomTitleBarButton(QPainter& p, const QRectF& r)
-{
- QPainterPath path(QPointF(r.x(), r.y()));
- QRectF rightCorner(r.x() + r.width() - 2.0, r.y() + 4.0, 2, 2);
- QRectF leftCorner(r.x(), r.y() + 4, 2, 2);
- path.lineTo(r.x() + r.width() - 5.0f, r.y());
- path.arcTo(rightCorner, 90, -90);
- path.lineTo(r.x() + r.width(), r.y() + r.height() - 1);
- path.lineTo(r.x(), r.y() + r.height() - 1);
- path.closeSubpath();
- p.drawPath(path);
-}
-
void QWindowsWindow::updateCustomTitlebar()
{
HWND hwnd = m_data.hwndTitlebar;
@@ -3545,7 +3477,7 @@ void QWindowsWindow::updateCustomTitlebar()
POINT localPos;
GetCursorPos(&localPos);
- MapWindowPoints(HWND_DESKTOP, hwnd, &localPos, 1);
+ MapWindowPoints(HWND_DESKTOP, m_data.hwnd, &localPos, 1);
const bool isDarkmode = QWindowsIntegration::instance()->darkModeHandling().testFlags(QWindowsApplication::DarkModeWindowFrames) &&
qApp->styleHints()->colorScheme() == Qt::ColorScheme::Dark;
@@ -3567,25 +3499,9 @@ void QWindowsWindow::updateCustomTitlebar()
p.setPen(Qt::NoPen);
if (!wnd->flags().testFlags(Qt::NoTitleBarBackgroundHint)) {
QRect titleRect;
- titleRect.setX(2);
titleRect.setWidth(windowWidth);
titleRect.setHeight(titleBarHeight);
-
- if (isWindows11orAbove) {
- QPainterPath path(QPointF(titleRect.x() + 4.0f, titleRect.y()));
- QRectF rightCorner(titleRect.x() + titleRect.width() - 4.0, titleRect.y() + 4.0, 2, 2);
- QRectF leftCorner(titleRect.x(), titleRect.y() + 4, 2, 2);
- path.lineTo(titleRect.x() + titleRect.width() - 7.0f, titleRect.y());
- path.arcTo(rightCorner, 90, -90);
- path.lineTo(titleRect.x() + titleRect.width() - 2.0, titleRect.y() + titleRect.height() - 1);
- path.lineTo(titleRect.x(), titleRect.y() + titleRect.height() - 1);
- path.lineTo(titleRect.x(), titleRect.y() + 4.0f);
- path.arcTo(leftCorner, -90, -90);
- path.closeSubpath();
- p.drawPath(path);
- } else {
- p.drawRect(titleRect);
- }
+ p.drawRect(titleRect);
}
if (wnd->flags().testFlags(Qt::WindowTitleHint | Qt::CustomizeWindowHint) || !wnd->flags().testFlag(Qt::CustomizeWindowHint)) {
@@ -3631,15 +3547,12 @@ void QWindowsWindow::updateCustomTitlebar()
QRectF rect;
rect.setY(1);
rect.setX(windowWidth - titleButtonWidth * buttons);
- rect.setWidth(titleButtonWidth - 1);
+ rect.setWidth(titleButtonWidth);
rect.setHeight(titleBarHeight);
if (localPos.x > (windowWidth - buttons * titleButtonWidth) &&
localPos.x < (windowWidth - (buttons - 1) * titleButtonWidth) &&
localPos.y > rect.y() && localPos.y < rect.y() + rect.height()) {
- if (isWindows11orAbove && buttons == 1)
- _q_drawCustomTitleBarButton(p, rect);
- else
- p.drawRect(rect);
+ p.drawRect(rect);
const QPen closeButtonHoveredPen = QPen(QColor(0xFF, 0xFF, 0xFD, 0xFF));
p.setPen(closeButtonHoveredPen);
} else {
@@ -3655,15 +3568,12 @@ void QWindowsWindow::updateCustomTitlebar()
QRectF rect;
rect.setY(1);
rect.setX(windowWidth - titleButtonWidth * buttons);
- rect.setWidth(titleButtonWidth - 1);
+ rect.setWidth(titleButtonWidth);
rect.setHeight(titleBarHeight);
if (localPos.x > (windowWidth - buttons * titleButtonWidth) &&
localPos.x < (windowWidth - (buttons - 1) * titleButtonWidth) &&
localPos.y > rect.y() && localPos.y < rect.y() + rect.height()) {
- if (isWindows11orAbove && buttons == 1)
- _q_drawCustomTitleBarButton(p, rect);
- else
- p.drawRect(rect);
+ p.drawRect(rect);
}
p.setPen(textPen);
p.drawText(rect,QStringLiteral("\uE922"), QTextOption(Qt::AlignVCenter | Qt::AlignHCenter));
@@ -3676,15 +3586,12 @@ void QWindowsWindow::updateCustomTitlebar()
QRectF rect;
rect.setY(1);
rect.setX(windowWidth - titleButtonWidth * buttons);
- rect.setWidth(titleButtonWidth - 1);
+ rect.setWidth(titleButtonWidth);
rect.setHeight(titleBarHeight);
if (localPos.x > (windowWidth - buttons * titleButtonWidth) &&
localPos.x < (windowWidth - (buttons - 1) * titleButtonWidth) &&
localPos.y > rect.y() && localPos.y < rect.y() + rect.height()) {
- if (isWindows11orAbove && buttons == 1)
- _q_drawCustomTitleBarButton(p, rect);
- else
- p.drawRect(rect);
+ p.drawRect(rect);
}
p.setPen(textPen);
p.drawText(rect,QStringLiteral("\uE921"), QTextOption(Qt::AlignVCenter | Qt::AlignHCenter));
@@ -3702,7 +3609,7 @@ void QWindowsWindow::updateCustomTitlebar()
BLENDFUNCTION blend = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA};
- POINT ptLocation = { windowRect.left, windowRect.top };
+ POINT ptLocation = { 0, 0 };
SIZE szWnd = { windowWidth, titleBarHeight };
POINT ptSrc = { 0, 0 };
UpdateLayeredWindow(hwnd, hdc, &ptLocation, &szWnd, memdc, &ptSrc, 0, &blend, ULW_ALPHA);
diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h
index b67bd2850b3..a0e150aeb01 100644
--- a/src/plugins/platforms/windows/qwindowswindow.h
+++ b/src/plugins/platforms/windows/qwindowswindow.h
@@ -307,7 +307,6 @@ public:
static QWindow *topLevelOf(QWindow *w);
static inline void *userDataOf(HWND hwnd);
static inline void setUserDataOf(HWND hwnd, void *ud);
- static bool isWindowArranged(HWND hwnd);
static bool hasNoNativeFrame(HWND hwnd, Qt::WindowFlags flags);
static bool setWindowLayered(HWND hwnd, Qt::WindowFlags flags, bool hasAlpha, qreal opacity);
@@ -359,12 +358,10 @@ public:
int savedDpi() const { return m_savedDpi; }
qreal dpiRelativeScale(const UINT dpi) const;
- bool isFrameless() const { return m_data.flags.testFlag(Qt::FramelessWindowHint); }
+ bool isClientAreaExpanded() const { return m_data.flags.testFlag(Qt::ExpandedClientAreaHint); }
void requestUpdate() override;
- void transitionAnimatedCustomTitleBar();
-
private:
inline void show_sys() const;
inline QWindowsWindowData setWindowFlags_sys(Qt::WindowFlags wt, unsigned flags = 0) const;
diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.cpp b/src/plugins/platforms/xcb/qxcbbackingstore.cpp
index 8353fac6a92..fda47944d9d 100644
--- a/src/plugins/platforms/xcb/qxcbbackingstore.cpp
+++ b/src/plugins/platforms/xcb/qxcbbackingstore.cpp
@@ -870,7 +870,8 @@ QPlatformBackingStore::FlushResult QXcbBackingStore::rhiFlush(QWindow *window,
const QRegion &region,
const QPoint &offset,
QPlatformTextureList *textures,
- bool translucentBackground)
+ bool translucentBackground,
+ qreal sourceTransformFactor)
{
if (!m_image || m_image->size().isEmpty())
return FlushFailed;
@@ -878,7 +879,7 @@ QPlatformBackingStore::FlushResult QXcbBackingStore::rhiFlush(QWindow *window,
m_image->flushScrolledRegion(true);
auto result = QPlatformBackingStore::rhiFlush(window, sourceDevicePixelRatio, region, offset,
- textures, translucentBackground);
+ textures, translucentBackground, sourceTransformFactor);
if (result != FlushSuccess)
return result;
QXcbWindow *platformWindow = static_cast<QXcbWindow *>(window->handle());
diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.h b/src/plugins/platforms/xcb/qxcbbackingstore.h
index 674640780eb..5cda9e1ab79 100644
--- a/src/plugins/platforms/xcb/qxcbbackingstore.h
+++ b/src/plugins/platforms/xcb/qxcbbackingstore.h
@@ -27,7 +27,8 @@ public:
const QRegion &region,
const QPoint &offset,
QPlatformTextureList *textures,
- bool translucentBackground) override;
+ bool translucentBackground,
+ qreal sourceTransformFactor) override;
QImage toImage() const override;
QPlatformGraphicsBuffer *graphicsBuffer() const override;
diff --git a/src/plugins/styles/modernwindows/qwindows11style.cpp b/src/plugins/styles/modernwindows/qwindows11style.cpp
index 3f40dea5eb9..62269a21de1 100644
--- a/src/plugins/styles/modernwindows/qwindows11style.cpp
+++ b/src/plugins/styles/modernwindows/qwindows11style.cpp
@@ -183,30 +183,24 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
QObject *styleObject = option->styleObject; // Can be widget or qquickitem
QRectF thumbRect = proxy()->subControlRect(CC_Slider, option, SC_SliderHandle, widget);
- auto center = thumbRect.center();
const qreal outerRadius = qMin(8.0, (slider->orientation == Qt::Horizontal ? thumbRect.height() / 2.0 : thumbRect.width() / 2.0) - 1);
-
- thumbRect.setWidth(outerRadius);
- thumbRect.setHeight(outerRadius);
- thumbRect.moveCenter(center);
- QPointF cursorPos = widget ? widget->mapFromGlobal(QCursor::pos()) : QPointF();
- bool isInsideHandle = thumbRect.contains(cursorPos);
+ bool isInsideHandle = option->activeSubControls == SC_SliderHandle;
bool oldIsInsideHandle = styleObject->property("_q_insidehandle").toBool();
- int oldState = styleObject->property("_q_stylestate").toInt();
- int oldActiveControls = styleObject->property("_q_stylecontrols").toInt();
+ State oldState = State(styleObject->property("_q_stylestate").toInt());
+ SubControls oldActiveControls = SubControls(styleObject->property("_q_stylecontrols").toInt());
QRectF oldRect = styleObject->property("_q_stylerect").toRect();
styleObject->setProperty("_q_insidehandle", isInsideHandle);
- styleObject->setProperty("_q_stylestate", int(option->state));
+ styleObject->setProperty("_q_stylestate", int(state));
styleObject->setProperty("_q_stylecontrols", int(option->activeSubControls));
styleObject->setProperty("_q_stylerect", option->rect);
if (option->styleObject->property("_q_end_radius").isNull())
option->styleObject->setProperty("_q_end_radius", outerRadius * 0.43);
bool doTransition = (((state & State_Sunken) != (oldState & State_Sunken)
- || ((oldIsInsideHandle) != (isInsideHandle))
- || oldActiveControls != int(option->activeSubControls))
+ || (oldIsInsideHandle != isInsideHandle)
+ || (oldActiveControls != option->activeSubControls))
&& state & State_Enabled);
if (oldRect != option->rect) {
@@ -242,11 +236,11 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
QCachedPainter cp(painter, QLatin1StringView("win11_spinbox") % HexString<uint8_t>(colorSchemeIndex),
sb, sb->rect.size());
if (cp.needsPainting()) {
- const auto frameRect = option->rect.marginsRemoved(QMargins(1, 1, 1, 1));
+ const auto frameRect = QRectF(option->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
drawRoundedRect(cp.painter(), frameRect, Qt::NoPen, option->palette.brush(QPalette::Base));
if (sb->frame && (sub & SC_SpinBoxFrame))
- drawLineEditFrame(cp.painter(), option);
+ drawLineEditFrame(cp.painter(), frameRect, option);
const bool isMouseOver = state & State_MouseOver;
const bool hasFocus = state & State_HasFocus;
@@ -374,31 +368,29 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
}
}
if (sub & SC_SliderHandle) {
- if (const auto *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
- const QRectF rect = proxy()->subControlRect(CC_Slider, option, SC_SliderHandle, widget);
- const QPointF center = rect.center();
+ const QRectF rect = proxy()->subControlRect(CC_Slider, option, SC_SliderHandle, widget);
+ const QPointF center = rect.center();
- const QNumberStyleAnimation* animation = qobject_cast<QNumberStyleAnimation*>(d->animation(option->styleObject));
+ const QNumberStyleAnimation* animation = qobject_cast<QNumberStyleAnimation*>(d->animation(option->styleObject));
- if (animation != nullptr)
- option->styleObject->setProperty("_q_inner_radius", animation->currentValue());
- else
- option->styleObject->setProperty("_q_inner_radius", option->styleObject->property("_q_end_radius"));
-
- const qreal outerRadius = qMin(8.0,(slider->orientation == Qt::Horizontal ? rect.height() / 2.0 : rect.width() / 2.0) - 1);
- const float innerRadius = option->styleObject->property("_q_inner_radius").toFloat();
- painter->setRenderHint(QPainter::Antialiasing, true);
- painter->setPen(Qt::NoPen);
- painter->setBrush(WINUI3Colors[colorSchemeIndex][controlFillSolid]);
- painter->drawEllipse(center, outerRadius, outerRadius);
- painter->setBrush(option->palette.accent());
- painter->drawEllipse(center, innerRadius, innerRadius);
-
- painter->setPen(WINUI3Colors[colorSchemeIndex][controlStrokeSecondary]);
- painter->setBrush(Qt::NoBrush);
- painter->drawEllipse(center, outerRadius + 0.5, outerRadius + 0.5);
- painter->drawEllipse(center, innerRadius + 0.5, innerRadius + 0.5);
- }
+ float innerRadius = 0;
+ if (animation != nullptr)
+ innerRadius = animation->currentValue();
+ else
+ innerRadius = option->styleObject->property("_q_end_radius").toFloat();
+ option->styleObject->setProperty("_q_inner_radius", innerRadius);
+ const qreal outerRadius = qMin(8.0,(slider->orientation == Qt::Horizontal ? rect.height() / 2.0 : rect.width() / 2.0) - 1);
+
+ painter->setPen(Qt::NoPen);
+ painter->setBrush(winUI3Color(controlFillSolid));
+ painter->drawEllipse(center, outerRadius, outerRadius);
+ painter->setBrush(option->palette.accent());
+ painter->drawEllipse(center, innerRadius, innerRadius);
+
+ painter->setPen(winUI3Color(controlStrokeSecondary));
+ painter->setBrush(Qt::NoBrush);
+ painter->drawEllipse(center, outerRadius + 0.5, outerRadius + 0.5);
+ painter->drawEllipse(center, innerRadius + 0.5, innerRadius + 0.5);
}
if (slider->state & State_HasFocus) {
QStyleOptionFocusRect fropt;
@@ -412,11 +404,11 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
#if QT_CONFIG(combobox)
case CC_ComboBox:
if (const QStyleOptionComboBox *combobox = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
- const auto frameRect = option->rect.marginsRemoved(QMargins(1, 1, 1, 1));
+ const auto frameRect = QRectF(option->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
drawRoundedRect(painter, frameRect, Qt::NoPen, option->palette.brush(QPalette::Base));
if (combobox->frame)
- drawLineEditFrame(painter, option);
+ drawLineEditFrame(painter, frameRect, option);
const bool isMouseOver = state & State_MouseOver;
const bool hasFocus = state & State_HasFocus;
@@ -668,7 +660,7 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
t->setStartValue(styleObject->property("_q_inner_radius").toFloat());
t->setEndValue(7.0f);
if (option->state & State_Sunken)
- t->setEndValue(2.0f);
+ t->setEndValue(4.0f);
else if (option->state & State_MouseOver && !(option->state & State_On))
t->setEndValue(7.0f);
else if (option->state & State_MouseOver && (option->state & State_On))
@@ -709,27 +701,19 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
switch (element) {
case PE_PanelTipLabel: {
- QRectF tipRect = option->rect.marginsRemoved(QMargins(1,1,1,1));
- painter->setPen(Qt::NoPen);
- painter->setBrush(option->palette.toolTipBase());
- painter->drawRoundedRect(tipRect, secondLevelRoundingRadius, secondLevelRoundingRadius);
-
- painter->setPen(highContrastTheme == true ? option->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorLight]);
- painter->setBrush(Qt::NoBrush);
- painter->drawRoundedRect(tipRect.marginsAdded(QMarginsF(0.5,0.5,0.5,0.5)), secondLevelRoundingRadius, secondLevelRoundingRadius);
+ const auto rect = QRectF(option->rect).marginsRemoved(QMarginsF(0.5, 0.5, 0.5, 0.5));
+ const auto pen = highContrastTheme ? option->palette.buttonText().color()
+ : winUI3Color(frameColorLight);
+ drawRoundedRect(painter, rect, pen, option->palette.toolTipBase());
break;
}
case PE_FrameTabWidget:
#if QT_CONFIG(tabwidget)
if (const QStyleOptionTabWidgetFrame *frame = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(option)) {
- QRectF frameRect = frame->rect.marginsRemoved(QMargins(0,0,0,0));
- painter->setPen(Qt::NoPen);
- painter->setBrush(frame->palette.base());
- painter->drawRoundedRect(frameRect, secondLevelRoundingRadius, secondLevelRoundingRadius);
-
- painter->setPen(highContrastTheme == true ? frame->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorLight]);
- painter->setBrush(Qt::NoBrush);
- painter->drawRoundedRect(frameRect.marginsRemoved(QMarginsF(0.5,0.5,0.5,0.5)), secondLevelRoundingRadius, secondLevelRoundingRadius);
+ const auto rect = QRectF(option->rect).marginsRemoved(QMarginsF(0.5, 0.5, 0.5, 0.5));
+ const auto pen = highContrastTheme ? frame->palette.buttonText().color()
+ : winUI3Color(frameColorLight);
+ drawRoundedRect(painter, rect, pen, frame->palette.base());
}
#endif // QT_CONFIG(tabwidget)
break;
@@ -763,40 +747,41 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
}
}
break;
- case PE_IndicatorCheckBox:
- {
+ case PE_IndicatorCheckBox: {
const bool isRtl = option->direction == Qt::RightToLeft;
- QNumberStyleAnimation* animation = qobject_cast<QNumberStyleAnimation*>(d->animation(option->styleObject));
- QFontMetrics fm(d->assetFont);
+ const bool isOn = option->state & State_On;
+ const bool isPartial = option->state & State_NoChange;
QRectF rect = isRtl ? option->rect.adjusted(0, 0, -2, 0) : option->rect.adjusted(2, 0, 0, 0);
- QPointF center = QPointF(rect.x() + rect.width() / 2, rect.y() + rect.height() / 2);
+ const QPointF center = rect.center();
rect.setWidth(15);
rect.setHeight(15);
rect.moveCenter(center);
- float clipWidth = animation != nullptr ? animation->currentValue() : 1.0f;
- QRectF clipRect = fm.boundingRect(QStringLiteral(u"\uE73E"));
- clipRect.moveCenter(center);
- clipRect.setLeft(rect.x() + (rect.width() - clipRect.width()) / 2.0);
- clipRect.setWidth(clipWidth * clipRect.width());
-
- painter->setPen(Qt::NoPen);
- painter->setBrush(buttonFillBrush(option));
- painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius, Qt::AbsoluteSize);
-
- painter->setPen(highContrastTheme == true ? option->palette.buttonText().color()
- : WINUI3Colors[colorSchemeIndex][frameColorStrong]);
- painter->setBrush(Qt::NoBrush);
- painter->drawRoundedRect(rect, secondLevelRoundingRadius + 0.5, secondLevelRoundingRadius + 0.5, Qt::AbsoluteSize);
+ QPen borderPen(Qt::NoPen);
+ if (!isOn && !isPartial) {
+ borderPen = highContrastTheme ? option->palette.buttonText().color()
+ : winUI3Color(frameColorStrong);
+ }
+ drawRoundedRect(painter, rect, borderPen, buttonFillBrush(option));
- painter->setFont(d->assetFont);
- painter->setPen(option->palette.highlightedText().color());
- painter->setBrush(option->palette.highlightedText());
- if (option->state & State_On)
+ if (isOn) {
+ painter->setFont(d->assetFont);
+ painter->setPen(option->palette.color(QPalette::Window));
+ QNumberStyleAnimation *animation = qobject_cast<QNumberStyleAnimation *>(
+ d->animation(option->styleObject));
+ QFontMetrics fm(d->assetFont);
+ float clipWidth = animation != nullptr ? animation->currentValue() : 1.0f;
+ QRectF clipRect = fm.boundingRect(QStringLiteral(u"\uE73E"));
+ clipRect.moveCenter(center);
+ clipRect.setLeft(rect.x() + (rect.width() - clipRect.width()) / 2.0);
+ clipRect.setWidth(clipWidth * clipRect.width());
painter->drawText(clipRect, Qt::AlignVCenter | Qt::AlignLeft, QStringLiteral(u"\uE73E"));
- else if (option->state & State_NoChange)
- painter->drawText(rect, Qt::AlignVCenter | Qt::AlignHCenter, QStringLiteral(u"\uE73C"));
+ } else if (isPartial) {
+ painter->setFont(d->assetFont);
+ painter->setPen(option->palette.color(QPalette::Window));
+ painter->drawText(rect, Qt::AlignCenter, QStringLiteral(u"\uE73C"));
+ }
}
break;
case PE_IndicatorBranch: {
@@ -814,9 +799,9 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
}
}
break;
- case PE_IndicatorRadioButton:
- {
+ case PE_IndicatorRadioButton: {
const bool isRtl = option->direction == Qt::RightToLeft;
+ const bool isOn = option->state & State_On;
qreal innerRadius = option->state & State_On ? 4.0f :7.0f;
if (option->styleObject) {
if (option->styleObject->property("_q_end_radius").isNull())
@@ -826,34 +811,26 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
option->styleObject->setProperty("_q_inner_radius", innerRadius);
}
- QPainterPath path;
QRectF rect = isRtl ? option->rect.adjusted(0, 0, -2, 0) : option->rect.adjusted(2, 0, 0, 0);
- QPointF center = QPoint(rect.x() + rect.width() / 2, rect.y() + rect.height() / 2);
- rect.setWidth(15);
- rect.setHeight(15);
- rect.moveCenter(center);
- QRectF innerRect = rect;
- innerRect.setWidth(8);
- innerRect.setHeight(8);
- innerRect.moveCenter(center);
-
- painter->setPen(Qt::NoPen);
- painter->setBrush(option->palette.accent());
- path.addEllipse(center,7,7);
- path.addEllipse(center,innerRadius,innerRadius);
- painter->drawPath(path);
-
- painter->setPen(WINUI3Colors[colorSchemeIndex][frameColorStrong]);
- painter->setBrush(Qt::NoBrush);
- painter->drawEllipse(center, 7.5, 7.5);
- painter->drawEllipse(center,innerRadius + 0.5, innerRadius + 0.5);
+ const QPointF center = rect.center();
- painter->setPen(Qt::NoPen);
- if (option->state & State_MouseOver && option->state & State_Enabled)
- painter->setBrush(option->palette.window().color().darker(107));
- else
- painter->setBrush(option->palette.window());
- painter->drawEllipse(center,innerRadius, innerRadius);
+ if (isOn) {
+ painter->setPen(Qt::NoPen);
+ painter->setBrush(buttonFillBrush(option));
+ QPainterPath path;
+ path.addEllipse(center, 7.5, 7.5);
+ path.addEllipse(center, innerRadius, innerRadius);
+ painter->drawPath(path);
+ QColor fillColor = option->palette.window().color();
+ if (option->state & State_MouseOver && option->state & State_Enabled)
+ fillColor = fillColor.darker(107);
+ painter->setBrush(fillColor);
+ painter->drawEllipse(center, innerRadius, innerRadius);
+ } else {
+ painter->setPen(winUI3Color(frameColorStrong));
+ painter->setBrush(buttonFillBrush(option));
+ painter->drawEllipse(center, 7.5, 7.5);
+ }
}
break;
case PE_PanelButtonTool:
@@ -910,7 +887,7 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
}
case PE_PanelLineEdit:
if (const auto *panel = qstyleoption_cast<const QStyleOptionFrame *>(option)) {
- const auto frameRect = option->rect.marginsRemoved(QMargins(1, 1, 1, 1));
+ const auto frameRect = QRectF(option->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
drawRoundedRect(painter, frameRect, Qt::NoPen, option->palette.brush(QPalette::Base));
if (panel->lineWidth > 0)
@@ -922,12 +899,14 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
drawRoundedRect(painter, frameRect, Qt::NoPen, winUI3Color(subtleHighlightColor));
}
break;
- case PE_FrameLineEdit:
- drawLineEditFrame(painter, option);
+ case PE_FrameLineEdit: {
+ const auto frameRect = QRectF(option->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
+ drawLineEditFrame(painter, frameRect, option);
break;
+ }
case PE_Frame: {
if (const auto *frame = qstyleoption_cast<const QStyleOptionFrame *>(option)) {
- const auto rect = option->rect.marginsRemoved(QMargins(1, 1, 1, 1));
+ const auto rect = QRectF(option->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
if (qobject_cast<const QComboBoxPrivateContainer *>(widget)) {
QPen pen;
if (highContrastTheme)
@@ -941,7 +920,7 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
if (frame->frameShape == QFrame::NoFrame)
break;
- drawLineEditFrame(painter, option, qobject_cast<const QTextEdit *>(widget) != nullptr);
+ drawLineEditFrame(painter, rect, option, qobject_cast<const QTextEdit *>(widget) != nullptr);
}
break;
}
@@ -1662,128 +1641,118 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
}
case CE_ItemViewItem: {
if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) {
- if (qobject_cast<const QAbstractItemView *>(widget)) {
- QRect checkRect = proxy()->subElementRect(SE_ItemViewItemCheckIndicator, vopt, widget);
- QRect iconRect = proxy()->subElementRect(SE_ItemViewItemDecoration, vopt, widget);
- QRect textRect = proxy()->subElementRect(SE_ItemViewItemText, vopt, widget);
+ QRect checkRect = proxy()->subElementRect(SE_ItemViewItemCheckIndicator, vopt, widget);
+ QRect iconRect = proxy()->subElementRect(SE_ItemViewItemDecoration, vopt, widget);
+ QRect textRect = proxy()->subElementRect(SE_ItemViewItemText, vopt, widget);
- // draw the background
- proxy()->drawPrimitive(PE_PanelItemViewItem, option, painter, widget);
+ // draw the background
+ proxy()->drawPrimitive(PE_PanelItemViewItem, option, painter, widget);
- const QRect &rect = vopt->rect;
- const bool isRtl = option->direction == Qt::RightToLeft;
- bool onlyOne = vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne ||
- vopt->viewItemPosition == QStyleOptionViewItem::Invalid;
- bool isFirst = vopt->viewItemPosition == QStyleOptionViewItem::Beginning;
- bool isLast = vopt->viewItemPosition == QStyleOptionViewItem::End;
+ const QRect &rect = vopt->rect;
+ const bool isRtl = option->direction == Qt::RightToLeft;
+ bool onlyOne = vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne ||
+ vopt->viewItemPosition == QStyleOptionViewItem::Invalid;
+ bool isFirst = vopt->viewItemPosition == QStyleOptionViewItem::Beginning;
+ bool isLast = vopt->viewItemPosition == QStyleOptionViewItem::End;
- // the tree decoration already painted the left side of the rounded rect
- if (vopt->features.testFlag(QStyleOptionViewItem::IsDecoratedRootColumn) &&
- vopt->showDecorationSelected) {
- isFirst = false;
- if (onlyOne) {
- onlyOne = false;
- isLast = true;
- }
+ // the tree decoration already painted the left side of the rounded rect
+ if (vopt->features.testFlag(QStyleOptionViewItem::IsDecoratedRootColumn) &&
+ vopt->showDecorationSelected) {
+ isFirst = false;
+ if (onlyOne) {
+ onlyOne = false;
+ isLast = true;
}
+ }
- if (isRtl) {
- if (isFirst) {
- isFirst = false;
- isLast = true;
- } else if (isLast) {
- isFirst = true;
- isLast = false;
- }
+ if (isRtl) {
+ if (isFirst) {
+ isFirst = false;
+ isLast = true;
+ } else if (isLast) {
+ isFirst = true;
+ isLast = false;
}
- const bool highlightCurrent = vopt->state.testAnyFlags(State_Selected | State_MouseOver);
- if (highlightCurrent) {
- const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget);
- if (highContrastTheme)
- painter->setBrush(vopt->palette.highlight());
- else
- painter->setBrush(view->alternatingRowColors() ? vopt->palette.highlight() : WINUI3Colors[colorSchemeIndex][subtleHighlightColor]);
- QWidget *editorWidget = view ? view->indexWidget(view->currentIndex()) : nullptr;
- if (editorWidget) {
- QPalette pal = editorWidget->palette();
- QColor editorBgColor = vopt->backgroundBrush == Qt::NoBrush ? vopt->palette.color(widget->backgroundRole()) : vopt->backgroundBrush.color();
- editorBgColor.setAlpha(255);
- pal.setColor(editorWidget->backgroundRole(), editorBgColor);
- editorWidget->setPalette(pal);
- }
+ }
+ const bool highlightCurrent = vopt->state.testAnyFlags(State_Selected | State_MouseOver);
+ if (highlightCurrent) {
+ if (highContrastTheme) {
+ painter->setBrush(vopt->palette.highlight());
} else {
- painter->setBrush(vopt->backgroundBrush);
+ const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget);
+ painter->setBrush(view && view->alternatingRowColors()
+ ? vopt->palette.highlight()
+ : winUI3Color(subtleHighlightColor));
}
- painter->setPen(Qt::NoPen);
+ } else {
+ painter->setBrush(vopt->backgroundBrush);
+ }
+ painter->setPen(Qt::NoPen);
- if (onlyOne) {
- painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, 2, 2)),
- secondLevelRoundingRadius, secondLevelRoundingRadius);
- } else if (isFirst) {
- painter->save();
- painter->setClipRect(rect);
- painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, -secondLevelRoundingRadius, 2)),
- secondLevelRoundingRadius, secondLevelRoundingRadius);
- painter->restore();
- } else if (isLast) {
- painter->save();
- painter->setClipRect(rect);
- painter->drawRoundedRect(rect.marginsRemoved(QMargins(-secondLevelRoundingRadius, 2, 2, 2)),
- secondLevelRoundingRadius, secondLevelRoundingRadius);
- painter->restore();
- } else {
- painter->drawRect(rect.marginsRemoved(QMargins(0, 2, 0, 2)));
- }
+ if (onlyOne) {
+ painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, 2, 2)),
+ secondLevelRoundingRadius, secondLevelRoundingRadius);
+ } else if (isFirst) {
+ painter->save();
+ painter->setClipRect(rect);
+ painter->drawRoundedRect(rect.marginsRemoved(QMargins(2, 2, -secondLevelRoundingRadius, 2)),
+ secondLevelRoundingRadius, secondLevelRoundingRadius);
+ painter->restore();
+ } else if (isLast) {
+ painter->save();
+ painter->setClipRect(rect);
+ painter->drawRoundedRect(rect.marginsRemoved(QMargins(-secondLevelRoundingRadius, 2, 2, 2)),
+ secondLevelRoundingRadius, secondLevelRoundingRadius);
+ painter->restore();
+ } else {
+ painter->drawRect(rect.marginsRemoved(QMargins(0, 2, 0, 2)));
+ }
- // draw the check mark
- if (vopt->features & QStyleOptionViewItem::HasCheckIndicator) {
- QStyleOptionViewItem option(*vopt);
- option.rect = checkRect;
- option.state = option.state & ~QStyle::State_HasFocus;
+ // draw the check mark
+ if (vopt->features & QStyleOptionViewItem::HasCheckIndicator) {
+ QStyleOptionViewItem option(*vopt);
+ option.rect = checkRect;
+ option.state = option.state & ~QStyle::State_HasFocus;
- switch (vopt->checkState) {
- case Qt::Unchecked:
- option.state |= QStyle::State_Off;
- break;
- case Qt::PartiallyChecked:
- option.state |= QStyle::State_NoChange;
- break;
- case Qt::Checked:
- option.state |= QStyle::State_On;
- break;
- }
- proxy()->drawPrimitive(QStyle::PE_IndicatorItemViewItemCheck, &option, painter, widget);
+ switch (vopt->checkState) {
+ case Qt::Unchecked:
+ option.state |= QStyle::State_Off;
+ break;
+ case Qt::PartiallyChecked:
+ option.state |= QStyle::State_NoChange;
+ break;
+ case Qt::Checked:
+ option.state |= QStyle::State_On;
+ break;
}
+ proxy()->drawPrimitive(QStyle::PE_IndicatorItemViewItemCheck, &option, painter, widget);
+ }
- // draw the icon
- QIcon::Mode mode = QIcon::Normal;
- if (!(vopt->state & QStyle::State_Enabled))
- mode = QIcon::Disabled;
- else if (vopt->state & QStyle::State_Selected)
- mode = QIcon::Selected;
- QIcon::State state = vopt->state & QStyle::State_Open ? QIcon::On : QIcon::Off;
- vopt->icon.paint(painter, iconRect, vopt->decorationAlignment, mode, state);
-
- painter->setPen(highlightCurrent && highContrastTheme ? vopt->palette.base().color()
- : vopt->palette.text().color());
- d->viewItemDrawText(painter, vopt, textRect);
-
- // paint a vertical marker for QListView
- if (vopt->state & State_Selected) {
- if (const QListView *lv = qobject_cast<const QListView *>(widget);
- lv && lv->viewMode() != QListView::IconMode && !highContrastTheme) {
- painter->setPen(vopt->palette.accent().color());
- const auto xPos = isRtl ? rect.right() - 1 : rect.left();
- const QLineF lines[2] = {
- QLineF(xPos, rect.y() + 2, xPos, rect.y() + rect.height() - 2),
- QLineF(xPos + 1, rect.y() + 2, xPos + 1, rect.y() + rect.height() - 2),
- };
- painter->drawLines(lines, 2);
- }
+ // draw the icon
+ QIcon::Mode mode = QIcon::Normal;
+ if (!(vopt->state & QStyle::State_Enabled))
+ mode = QIcon::Disabled;
+ else if (vopt->state & QStyle::State_Selected)
+ mode = QIcon::Selected;
+ QIcon::State state = vopt->state & QStyle::State_Open ? QIcon::On : QIcon::Off;
+ vopt->icon.paint(painter, iconRect, vopt->decorationAlignment, mode, state);
+
+ painter->setPen(highlightCurrent && highContrastTheme ? vopt->palette.base().color()
+ : vopt->palette.text().color());
+ d->viewItemDrawText(painter, vopt, textRect);
+
+ // paint a vertical marker for QListView
+ if (vopt->state & State_Selected) {
+ if (const QListView *lv = qobject_cast<const QListView *>(widget);
+ lv && lv->viewMode() != QListView::IconMode && !highContrastTheme) {
+ painter->setPen(vopt->palette.accent().color());
+ const auto xPos = isRtl ? rect.right() - 1 : rect.left();
+ const QLineF lines[2] = {
+ QLineF(xPos, rect.y() + 2, xPos, rect.y() + rect.height() - 2),
+ QLineF(xPos + 1, rect.y() + 2, xPos + 1, rect.y() + rect.height() - 2),
+ };
+ painter->drawLines(lines, 2);
}
- } else {
- QRect textRect = proxy()->subElementRect(SE_ItemViewItemText, vopt, widget);
- d->viewItemDrawText(painter, vopt, textRect);
}
}
break;
@@ -2217,8 +2186,9 @@ void QWindows11Style::polish(QWidget* widget)
pal.setColor(scrollarea->viewport()->backgroundRole(), Qt::transparent);
scrollarea->viewport()->setPalette(pal);
scrollarea->viewport()->setProperty("_q_original_background_palette", originalPalette);
- if (qobject_cast<QTableView *>(widget))
- widget->setAttribute(Qt::WA_Hover, true);
+ // QTreeView & QListView are already set in the base windowsvista style
+ if (auto table = qobject_cast<QTableView *>(widget))
+ table->viewport()->setAttribute(Qt::WA_Hover, true);
}
}
@@ -2254,10 +2224,11 @@ static void populateLightSystemBasePalette(QPalette &result)
static QString oldStyleSheet;
const bool styleSheetChanged = oldStyleSheet != qApp->styleSheet();
- const QColor textColor = QColor(0x00,0x00,0x00,0xE4);
- const QColor textDisabled = QColor(0x00,0x00,0x00,0x5C);
- const QColor btnFace = QColor(0xFF,0xFF,0xFF,0xB3);
- const QColor alternateBase = QColor(0x00,0x00,0x00,0x09);
+ constexpr QColor textColor = QColor(0x00,0x00,0x00,0xE4);
+ constexpr QColor textDisabled = QColor(0x00, 0x00, 0x00, 0x5C);
+ constexpr QColor btnFace = QColor(0xFF, 0xFF, 0xFF, 0xB3);
+ constexpr QColor base = QColor(0xFF, 0xFF, 0xFF, 0xFF);
+ constexpr QColor alternateBase = QColor(0x00, 0x00, 0x00, 0x09);
const QColor btnHighlight = result.accent().color();
const QColor btnColor = result.button().color();
@@ -2269,7 +2240,7 @@ static void populateLightSystemBasePalette(QPalette &result)
SET_IF_UNRESOLVED(QPalette::Active, QPalette::Mid, btnColor.darker(150));
SET_IF_UNRESOLVED(QPalette::Active, QPalette::Text, textColor);
SET_IF_UNRESOLVED(QPalette::Active, QPalette::BrightText, btnHighlight);
- SET_IF_UNRESOLVED(QPalette::Active, QPalette::Base, btnFace);
+ SET_IF_UNRESOLVED(QPalette::Active, QPalette::Base, base);
SET_IF_UNRESOLVED(QPalette::Active, QPalette::Window, QColor(0xF3,0xF3,0xF3,0xFF));
SET_IF_UNRESOLVED(QPalette::Active, QPalette::ButtonText, textColor);
SET_IF_UNRESOLVED(QPalette::Active, QPalette::Midlight, btnColor.lighter(125));
@@ -2286,7 +2257,7 @@ static void populateLightSystemBasePalette(QPalette &result)
SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Mid, btnColor.darker(150));
SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Text, textColor);
SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::BrightText, btnHighlight);
- SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Base, btnFace);
+ SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Base, base);
SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Window, QColor(0xF3,0xF3,0xF3,0xFF));
SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::ButtonText, textColor);
SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Midlight, btnColor.lighter(125));
@@ -2307,7 +2278,7 @@ static void populateDarkSystemBasePalette(QPalette &result)
static QString oldStyleSheet;
const bool styleSheetChanged = oldStyleSheet != qApp->styleSheet();
- const QColor alternateBase = QColor(0xFF,0xFF,0xFF,0x0F);
+ constexpr QColor alternateBase = QColor(0xFF, 0xFF, 0xFF, 0x0F);
SET_IF_UNRESOLVED(QPalette::Active, QPalette::AlternateBase, alternateBase);
@@ -2361,7 +2332,7 @@ QBrush QWindows11Style::buttonFillBrush(const QStyleOption *option)
if (!isOn && option->state & QStyle::State_AutoRaise)
return Qt::NoBrush;
if (option->state & QStyle::State_MouseOver)
- brush.setColor(isOn ? brush.color().lighter(107) : brush.color().darker(107));
+ brush.setColor(isOn ? brush.color().lighter(115) : brush.color().darker(107));
return brush;
}
@@ -2381,9 +2352,8 @@ QColor QWindows11Style::buttonLabelColor(const QStyleOption *option, int colorSc
: option->palette.buttonText().color();
}
-void QWindows11Style::drawLineEditFrame(QPainter *p, const QStyleOption *o, bool isEditable) const
+void QWindows11Style::drawLineEditFrame(QPainter *p, const QRectF &rect, const QStyleOption *o, bool isEditable) const
{
- const auto rect = QRectF(o->rect).marginsRemoved(QMarginsF(1.5, 1.5, 1.5, 1.5));
const bool isHovered = o->state & State_MouseOver;
const auto frameCol = highContrastTheme
? o->palette.color(isHovered ? QPalette::Accent
diff --git a/src/plugins/styles/modernwindows/qwindows11style_p.h b/src/plugins/styles/modernwindows/qwindows11style_p.h
index 51514737259..eccedc5bf67 100644
--- a/src/plugins/styles/modernwindows/qwindows11style_p.h
+++ b/src/plugins/styles/modernwindows/qwindows11style_p.h
@@ -75,7 +75,7 @@ protected:
private:
static inline QBrush buttonFillBrush(const QStyleOption *option);
static inline QColor buttonLabelColor(const QStyleOption *option, int colorSchemeIndex);
- void drawLineEditFrame(QPainter *p, const QStyleOption *o, bool isEditable = true) const;
+ void drawLineEditFrame(QPainter *p, const QRectF &rect, const QStyleOption *o, bool isEditable = true) const;
inline QColor winUI3Color(enum WINUI3Color col) const;
private:
diff --git a/src/plugins/styles/modernwindows/qwindowsvistastyle.cpp b/src/plugins/styles/modernwindows/qwindowsvistastyle.cpp
index 0301b770a1e..52a98b0f9bb 100644
--- a/src/plugins/styles/modernwindows/qwindowsvistastyle.cpp
+++ b/src/plugins/styles/modernwindows/qwindowsvistastyle.cpp
@@ -2301,6 +2301,14 @@ int QWindowsVistaStyle::styleHint(StyleHint hint, const QStyleOption *option, co
ret = 1;
break;
+ case SH_ComboBox_ListMouseTracking_Current:
+ ret = 0;
+ break;
+
+ case SH_ComboBox_ListMouseTracking_Active:
+ ret = 1;
+ break;
+
default:
ret = QWindowsStyle::styleHint(hint, option, widget, returnData);
break;
diff --git a/src/printsupport/REUSE.toml b/src/printsupport/REUSE.toml
index 8b6274a751a..e9c18925d17 100644
--- a/src/printsupport/REUSE.toml
+++ b/src/printsupport/REUSE.toml
@@ -3,23 +3,23 @@ version = 1
[[annotations]]
path = ["dialogs/*.ui", "widgets/*.ui", "dialogs/images/*.png"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
[[annotations]]
path = ["doc/**"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"
[[annotations]]
path = ["**.json"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "BSD-3-Clause"
[[annotations]]
path = ["doc/snippets/**"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause"
diff --git a/src/testlib/3rdparty/valgrind/qt_attribution.json b/src/testlib/3rdparty/valgrind/qt_attribution.json
index 3146fd82c57..262bc8380b4 100644
--- a/src/testlib/3rdparty/valgrind/qt_attribution.json
+++ b/src/testlib/3rdparty/valgrind/qt_attribution.json
@@ -11,7 +11,7 @@
"Description": "An instrumentation framework for building dynamic analysis tools.",
"Homepage": "http://valgrind.org/",
- "Version": "3.24.0",
+ "Version": "3.25.1",
"PURL": "pkg:generic/valgrind@$<VERSION>?download_url=https://valgrind.org/",
"License": "BSD 4-clause \"Original\" or \"Old\" License",
"LicenseId": "BSD-4-Clause",
diff --git a/src/testlib/3rdparty/valgrind/valgrind_p.h b/src/testlib/3rdparty/valgrind/valgrind_p.h
index 77ca3ad8692..ab49937ccd4 100644
--- a/src/testlib/3rdparty/valgrind/valgrind_p.h
+++ b/src/testlib/3rdparty/valgrind/valgrind_p.h
@@ -89,7 +89,7 @@
|| (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6))
*/
#define __VALGRIND_MAJOR__ 3
-#define __VALGRIND_MINOR__ 24
+#define __VALGRIND_MINOR__ 25
#include <stdarg.h>
@@ -126,6 +126,7 @@
#undef PLAT_mips32_linux
#undef PLAT_mips64_linux
#undef PLAT_nanomips_linux
+#undef PLAT_riscv64_linux
#undef PLAT_x86_solaris
#undef PLAT_amd64_solaris
@@ -172,6 +173,8 @@
# define PLAT_mips32_linux 1
#elif defined(__linux__) && defined(__nanomips__)
# define PLAT_nanomips_linux 1
+#elif defined(__linux__) && defined(__riscv) && (__riscv_xlen == 64)
+# define PLAT_riscv64_linux 1
#elif defined(__sun) && defined(__i386__)
# define PLAT_x86_solaris 1
#elif defined(__sun) && defined(__x86_64__)
@@ -1129,6 +1132,87 @@ typedef
} while (0)
#endif
+
+/* ----------------------- riscv64-linux ------------------------ */
+
+#if defined(PLAT_riscv64_linux)
+
+typedef
+ struct {
+ unsigned long int nraddr; /* where's the code? */
+ }
+ OrigFn;
+
+#define __SPECIAL_INSTRUCTION_PREAMBLE \
+ ".option push\n\t" \
+ ".option norvc\n\t" \
+ "srli zero, zero, 3\n\t" \
+ "srli zero, zero, 13\n\t" \
+ "srli zero, zero, 51\n\t" \
+ "srli zero, zero, 61\n\t"
+
+#define __SPECIAL_INSTRUCTION_POSTAMBLE \
+ ".option pop\n\t" \
+
+#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
+ _zzq_default, _zzq_request, \
+ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
+ \
+ __extension__ \
+ ({volatile unsigned long int _zzq_args[6]; \
+ volatile unsigned long int _zzq_result; \
+ _zzq_args[0] = (unsigned long int)(_zzq_request); \
+ _zzq_args[1] = (unsigned long int)(_zzq_arg1); \
+ _zzq_args[2] = (unsigned long int)(_zzq_arg2); \
+ _zzq_args[3] = (unsigned long int)(_zzq_arg3); \
+ _zzq_args[4] = (unsigned long int)(_zzq_arg4); \
+ _zzq_args[5] = (unsigned long int)(_zzq_arg5); \
+ __asm__ volatile("mv a3, %1\n\t" /*default*/ \
+ "mv a4, %2\n\t" /*ptr*/ \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* a3 = client_request ( a4 ) */ \
+ "or a0, a0, a0\n\t" \
+ __SPECIAL_INSTRUCTION_POSTAMBLE \
+ "mv %0, a3" /*result*/ \
+ : "=r" (_zzq_result) \
+ : "r" ((unsigned long int)(_zzq_default)), \
+ "r" (&_zzq_args[0]) \
+ : "memory", "a3", "a4"); \
+ _zzq_result; \
+ })
+
+#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
+ { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
+ unsigned long int __addr; \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ /* a3 = guest_NRADDR */ \
+ "or a1, a1, a1\n\t" \
+ __SPECIAL_INSTRUCTION_POSTAMBLE \
+ "mv %0, a3" \
+ : "=r" (__addr) \
+ : \
+ : "memory", "a3" \
+ ); \
+ _zzq_orig->nraddr = __addr; \
+ }
+
+#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ __SPECIAL_INSTRUCTION_PREAMBLE \
+ /* branch-and-link-to-noredir t0 */ \
+ "or a2, a2, a2\n\t" \
+ __SPECIAL_INSTRUCTION_POSTAMBLE
+
+#define VALGRIND_VEX_INJECT_IR() \
+ do { \
+ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
+ "or a3, a3, a3\n\t" \
+ __SPECIAL_INSTRUCTION_POSTAMBLE \
+ : : : "memory" \
+ ); \
+ } while (0)
+
+#endif /* PLAT_riscv64_linux */
+
/* Insert assembly code for other platforms here... */
#endif /* NVALGRIND */
@@ -6606,6 +6690,456 @@ typedef
#endif /* PLAT_mips64_linux */
+/* ----------------------- riscv64-linux ----------------------- */
+
+#if defined(PLAT_riscv64_linux)
+
+/* These regs are trashed by the hidden call. */
+#define __CALLER_SAVED_REGS \
+ "ra", \
+ "t0", "t1", "t2", "t3", "t4", "t5", "t6", \
+ "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", \
+ "ft0", "ft1", "ft2", "ft3", "ft4", "ft5", "ft6", "ft7", \
+ "ft8", "ft9", "ft10", "ft11", \
+ "fa0", "fa1", "fa2", "fa3", "fa4", "fa5", "fa6", "fa7"
+
+/* s11 is callee-saved, so we can use it to save and restore sp around
+ the hidden call. */
+#define VALGRIND_ALIGN_STACK \
+ "mv s11, sp\n\t" \
+ "andi sp, sp, 0xfffffffffffffff0\n\t"
+#define VALGRIND_RESTORE_STACK \
+ "mv sp, s11\n\t"
+
+/* These CALL_FN_ macros assume that on riscv64-linux,
+ sizeof(unsigned long) == 8. */
+
+#define CALL_FN_W_v(lval, orig) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[1]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_W(lval, orig, arg1) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[2]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ld a0, 8(%1) \n\t" \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[3]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ld a0, 8(%1) \n\t" \
+ "ld a1, 16(%1) \n\t" \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[4]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ld a0, 8(%1) \n\t" \
+ "ld a1, 16(%1) \n\t" \
+ "ld a2, 24(%1) \n\t" \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0\n" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[5]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ld a0, 8(%1) \n\t" \
+ "ld a1, 16(%1) \n\t" \
+ "ld a2, 24(%1) \n\t" \
+ "ld a3, 32(%1) \n\t" \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[6]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ld a0, 8(%1) \n\t" \
+ "ld a1, 16(%1) \n\t" \
+ "ld a2, 24(%1) \n\t" \
+ "ld a3, 32(%1) \n\t" \
+ "ld a4, 40(%1) \n\t" \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[7]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ld a0, 8(%1) \n\t" \
+ "ld a1, 16(%1) \n\t" \
+ "ld a2, 24(%1) \n\t" \
+ "ld a3, 32(%1) \n\t" \
+ "ld a4, 40(%1) \n\t" \
+ "ld a5, 48(%1) \n\t" \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[8]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ld a0, 8(%1) \n\t" \
+ "ld a1, 16(%1) \n\t" \
+ "ld a2, 24(%1) \n\t" \
+ "ld a3, 32(%1) \n\t" \
+ "ld a4, 40(%1) \n\t" \
+ "ld a5, 48(%1) \n\t" \
+ "ld a6, 56(%1) \n\t" \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[9]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "ld a0, 8(%1) \n\t" \
+ "ld a1, 16(%1) \n\t" \
+ "ld a2, 24(%1) \n\t" \
+ "ld a3, 32(%1) \n\t" \
+ "ld a4, 40(%1) \n\t" \
+ "ld a5, 48(%1) \n\t" \
+ "ld a6, 56(%1) \n\t" \
+ "ld a7, 64(%1) \n\t" \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[10]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "addi sp, sp, -16 \n\t" \
+ "ld a0, 8(%1) \n\t" \
+ "ld a1, 16(%1) \n\t" \
+ "ld a2, 24(%1) \n\t" \
+ "ld a3, 32(%1) \n\t" \
+ "ld a4, 40(%1) \n\t" \
+ "ld a5, 48(%1) \n\t" \
+ "ld a6, 56(%1) \n\t" \
+ "ld a7, 64(%1) \n\t" \
+ "ld t0, 72(%1) \n\t" \
+ "sd t0, 0(sp) \n\t" \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[11]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "addi sp, sp, -16 \n\t" \
+ "ld a0, 8(%1) \n\t" \
+ "ld a1, 16(%1) \n\t" \
+ "ld a2, 24(%1) \n\t" \
+ "ld a3, 32(%1) \n\t" \
+ "ld a4, 40(%1) \n\t" \
+ "ld a5, 48(%1) \n\t" \
+ "ld a6, 56(%1) \n\t" \
+ "ld a7, 64(%1) \n\t" \
+ "ld t0, 72(%1) \n\t" \
+ "sd t0, 0(sp) \n\t" \
+ "ld t0, 80(%1) \n\t" \
+ "sd t0, 8(sp) \n\t" \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10,arg11) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[12]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ _argvec[11] = (unsigned long)(arg11); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "addi sp, sp, -32 \n\t" \
+ "ld a0, 8(%1) \n\t" \
+ "ld a1, 16(%1) \n\t" \
+ "ld a2, 24(%1) \n\t" \
+ "ld a3, 32(%1) \n\t" \
+ "ld a4, 40(%1) \n\t" \
+ "ld a5, 48(%1) \n\t" \
+ "ld a6, 56(%1) \n\t" \
+ "ld a7, 64(%1) \n\t" \
+ "ld t0, 72(%1) \n\t" \
+ "sd t0, 0(sp) \n\t" \
+ "ld t0, 80(%1) \n\t" \
+ "sd t0, 8(sp) \n\t" \
+ "ld t0, 88(%1) \n\t" \
+ "sd t0, 16(sp) \n\t" \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
+ arg7,arg8,arg9,arg10,arg11, \
+ arg12) \
+ do { \
+ volatile OrigFn _orig = (orig); \
+ volatile unsigned long _argvec[13]; \
+ volatile unsigned long _res; \
+ _argvec[0] = (unsigned long)_orig.nraddr; \
+ _argvec[1] = (unsigned long)(arg1); \
+ _argvec[2] = (unsigned long)(arg2); \
+ _argvec[3] = (unsigned long)(arg3); \
+ _argvec[4] = (unsigned long)(arg4); \
+ _argvec[5] = (unsigned long)(arg5); \
+ _argvec[6] = (unsigned long)(arg6); \
+ _argvec[7] = (unsigned long)(arg7); \
+ _argvec[8] = (unsigned long)(arg8); \
+ _argvec[9] = (unsigned long)(arg9); \
+ _argvec[10] = (unsigned long)(arg10); \
+ _argvec[11] = (unsigned long)(arg11); \
+ _argvec[12] = (unsigned long)(arg12); \
+ __asm__ volatile( \
+ VALGRIND_ALIGN_STACK \
+ "addi sp, sp, -32 \n\t" \
+ "ld a0, 8(%1) \n\t" \
+ "ld a1, 16(%1) \n\t" \
+ "ld a2, 24(%1) \n\t" \
+ "ld a3, 32(%1) \n\t" \
+ "ld a4, 40(%1) \n\t" \
+ "ld a5, 48(%1) \n\t" \
+ "ld a6, 56(%1) \n\t" \
+ "ld a7, 64(%1) \n\t" \
+ "ld t0, 72(%1) \n\t" \
+ "sd t0, 0(sp) \n\t" \
+ "ld t0, 80(%1) \n\t" \
+ "sd t0, 8(sp) \n\t" \
+ "ld t0, 88(%1) \n\t" \
+ "sd t0, 16(sp) \n\t" \
+ "ld t0, 96(%1) \n\t" \
+ "sd t0, 24(sp) \n\t" \
+ "ld t0, 0(%1) \n\t" /* target->t0 */ \
+ VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_T0 \
+ VALGRIND_RESTORE_STACK \
+ "mv %0, a0" \
+ : /*out*/ "=r" (_res) \
+ : /*in*/ "0" (&_argvec[0]) \
+ : /*trash*/ "memory", __CALLER_SAVED_REGS, "s11" \
+ ); \
+ lval = (__typeof__(lval)) _res; \
+ } while (0)
+
+#endif /* PLAT_riscv64_linux */
+
/* ------------------------------------------------------------------ */
/* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */
/* */
@@ -7162,6 +7696,7 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...)
#undef PLAT_mips32_linux
#undef PLAT_mips64_linux
#undef PLAT_nanomips_linux
+#undef PLAT_riscv64_linux
#undef PLAT_x86_solaris
#undef PLAT_amd64_solaris
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index f4aa45be73e..53cc849e23c 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -1176,10 +1176,10 @@ class WatchDog : public QThread
public:
WatchDog()
+ : expecting{ThreadStart}
{
setObjectName("QtTest Watchdog"_L1);
auto locker = qt_unique_lock(mutex);
- expecting.store(ThreadStart, std::memory_order_relaxed);
start();
waitFor(locker, ThreadStart);
}
diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp
index f41242f357d..29cafe9aea4 100644
--- a/src/testlib/qtestlog.cpp
+++ b/src/testlib/qtestlog.cpp
@@ -77,14 +77,14 @@ namespace {
class LoggerRegistry
{
using LoggersContainer = std::vector<std::shared_ptr<QAbstractTestLogger>>;
- using SharedLoggersContainer = std::shared_ptr<LoggersContainer>;
+ using SharedLoggersContainer = std::shared_ptr<const LoggersContainer>;
public:
void addLogger(std::unique_ptr<QAbstractTestLogger> logger)
{
// read/update/clone
const SharedLoggersContainer currentLoggers = load();
- SharedLoggersContainer newLoggers = currentLoggers
+ auto newLoggers = currentLoggers
? std::make_shared<LoggersContainer>(*currentLoggers)
: std::make_shared<LoggersContainer>();
newLoggers->emplace_back(std::move(logger));
@@ -115,20 +115,20 @@ public:
private:
#ifdef __cpp_lib_atomic_shared_ptr
- SharedLoggersContainer load() const { return loggers.load(std::memory_order_relaxed); }
+ SharedLoggersContainer load() const { return loggers.load(std::memory_order_acquire); }
void store(SharedLoggersContainer newLoggers)
{
- loggers.store(std::move(newLoggers), std::memory_order_relaxed);
+ loggers.store(std::move(newLoggers), std::memory_order_release);
}
- std::atomic<SharedLoggersContainer> loggers;
+ std::atomic<SharedLoggersContainer> loggers = nullptr;
#else
SharedLoggersContainer load() const
{
- return std::atomic_load_explicit(&loggers, std::memory_order_relaxed);
+ return std::atomic_load_explicit(&loggers, std::memory_order_acquire);
}
void store(SharedLoggersContainer newLoggers)
{
- std::atomic_store_explicit(&loggers, std::move(newLoggers), std::memory_order_relaxed);
+ std::atomic_store_explicit(&loggers, std::move(newLoggers), std::memory_order_release);
}
SharedLoggersContainer loggers;
#endif
diff --git a/src/tools/androiddeployqt/main.cpp b/src/tools/androiddeployqt/main.cpp
index e93c3038fca..a27c52f5a99 100644
--- a/src/tools/androiddeployqt/main.cpp
+++ b/src/tools/androiddeployqt/main.cpp
@@ -1475,10 +1475,23 @@ bool readInputFile(Options *options)
for (const QJsonValue &value : permissions) {
if (value.isObject()) {
QJsonObject permissionObj = value.toObject();
- QString name = permissionObj.value("name"_L1).toString();
+ QString name;
QString extras;
- if (permissionObj.contains("extras"_L1))
- extras = permissionObj.value("extras"_L1).toString().trimmed();
+ for (auto it = permissionObj.begin(); it != permissionObj.end(); ++it) {
+ if (it.key() == "name"_L1) {
+ name = it.value().toString();
+ } else {
+ extras.append(" android:"_L1)
+ .append(it.key())
+ .append("=\""_L1)
+ .append(it.value().toString())
+ .append("\""_L1);
+ }
+ }
+ if (name.isEmpty()) {
+ fprintf(stderr, "Missing permission 'name' in permission specification");
+ return false;
+ }
options->applicationPermissions.insert(name, extras);
}
}
@@ -1580,8 +1593,11 @@ bool copyAndroidTemplate(const Options &options)
if (options.verbose)
fprintf(stdout, "Copying Android package template.\n");
- if (!copyGradleTemplate(options))
- return false;
+ if (!options.auxMode) {
+ // Gradle is not configured and is not running in aux mode
+ if (!copyGradleTemplate(options))
+ return false;
+ }
if (!copyAndroidTemplate(options, "/src/android/templates"_L1))
return false;
diff --git a/src/tools/androidtestrunner/main.cpp b/src/tools/androidtestrunner/main.cpp
index eb4c84fbd75..564a332c091 100644
--- a/src/tools/androidtestrunner/main.cpp
+++ b/src/tools/androidtestrunner/main.cpp
@@ -40,6 +40,7 @@ struct Options
QString buildPath;
QString manifestPath;
QString adbCommand{"adb"_L1};
+ QString bundletoolPath;
QString serial;
QString makeCommand;
QString package;
@@ -48,7 +49,7 @@ struct Options
QString stdoutFileName;
QHash<QString, QString> outFiles;
QStringList amStarttestArgs;
- QString apkPath;
+ QString packagePath;
QString ndkStackPath;
QList<QStringList> preTestRunAdbCommands;
bool showLogcatOutput = false;
@@ -114,6 +115,24 @@ static bool execAdbCommand(const QStringList &args, QByteArray *output = nullptr
return execCommand(g_options.adbCommand, argsWithSerial, output, verbose);
}
+static bool execBundletoolCommand(const QStringList &args, QByteArray *output = nullptr,
+ bool verbose = true)
+{
+ QString java("java"_L1);
+ QStringList argsFull = QStringList() << "-jar"_L1 << g_options.bundletoolPath << args;
+ return execCommand(java, argsFull, output, verbose);
+}
+
+static void setPackagePath(const QString &path)
+{
+ if (!g_options.packagePath.isEmpty()) {
+ qCritical("Both --aab and --apk options provided. This is not supported.");
+ g_options.helpRequested = true;
+ return;
+ }
+ g_options.packagePath = path;
+}
+
static bool execCommand(const QString &command, QByteArray *output = nullptr, bool verbose = true)
{
auto args = QProcess::splitCommand(command);
@@ -133,6 +152,11 @@ static bool parseOptions()
g_options.helpRequested = true;
else
g_options.adbCommand = arguments.at(++i);
+ } else if (argument.compare("--bundletool"_L1, Qt::CaseInsensitive) == 0) {
+ if (i + 1 == arguments.size())
+ g_options.helpRequested = true;
+ else
+ g_options.bundletoolPath = arguments.at(++i);
} else if (argument.compare("--path"_L1, Qt::CaseInsensitive) == 0) {
if (i + 1 == arguments.size())
g_options.helpRequested = true;
@@ -152,7 +176,12 @@ static bool parseOptions()
if (i + 1 == arguments.size())
g_options.helpRequested = true;
else
- g_options.apkPath = arguments.at(++i);
+ setPackagePath(arguments.at(++i));
+ } else if (argument.compare("--aab"_L1, Qt::CaseInsensitive) == 0) {
+ if (i + 1 == arguments.size())
+ g_options.helpRequested = true;
+ else
+ setPackagePath(arguments.at(++i));
} else if (argument.compare("--activity"_L1, Qt::CaseInsensitive) == 0) {
if (i + 1 == arguments.size())
g_options.helpRequested = true;
@@ -200,7 +229,7 @@ static bool parseOptions()
for (;i < arguments.size(); ++i)
g_options.testArgsList << arguments.at(i);
- if (g_options.helpRequested || g_options.buildPath.isEmpty() || g_options.apkPath.isEmpty())
+ if (g_options.helpRequested || g_options.buildPath.isEmpty() || g_options.packagePath.isEmpty())
return false;
g_options.serial = qEnvironmentVariable("ANDROID_SERIAL");
@@ -222,52 +251,57 @@ static bool parseOptions()
static void printHelp()
{
- qWarning( "Syntax: %s <options> -- [TESTARGS] \n"
- "\n"
- " Runs a Qt for Android test on an emulator or a device. Specify a device\n"
- " using the environment variables ANDROID_SERIAL or ANDROID_DEVICE_SERIAL.\n"
- " Returns the number of failed tests, -1 on test runner deployment related\n"
- " failures or zero on success."
- "\n"
- " Mandatory arguments:\n"
- " --path <path>: The path where androiddeployqt builds the android package.\n"
- "\n"
- " --make <make cmd>: make command to create an APK, for example:\n"
- " \"cmake --build <build-dir> --target <target>_make_apk\".\n"
- "\n"
- " --apk <apk path>: The test apk path. The apk has to exist already, if it\n"
- " does not exist the make command must be provided for building the apk.\n"
- "\n"
- " Optional arguments:\n"
- " --adb <adb cmd>: The Android ADB command. If missing the one from\n"
- " $PATH will be used.\n"
- "\n"
- " --activity <acitvity>: The Activity to run. If missing the first\n"
- " activity from AndroidManifest.qml file will be used.\n"
- "\n"
- " --timeout <seconds>: Timeout to run the test. Default is 10 minutes.\n"
- "\n"
- " --skip-install-root: Do not append INSTALL_ROOT=... to the make command.\n"
- "\n"
- " --show-logcat: Print Logcat output to stdout. If an ANR occurs during\n"
- " the test run, logs from the system_server process are included.\n"
- " This argument is implied if a test crashes.\n"
- "\n"
- " --ndk-stack: Path to ndk-stack tool that symbolizes crash stacktraces.\n"
- " By default, ANDROID_NDK_ROOT env var is used to deduce the tool path.\n"
- "\n"
- " -- Arguments that will be passed to the test application.\n"
- "\n"
- " --verbose: Prints out information during processing.\n"
- "\n"
- " --pre-test-adb-command <command>: call the adb <command> after\n"
- " installation and before the test run.\n"
- "\n"
- " --manifest <path>: Custom path to the AndroidManifest.xml.\n"
- "\n"
- " --help: Displays this information.\n",
- qPrintable(QCoreApplication::arguments().at(0))
- );
+ qWarning("Syntax: %s <options> -- [TESTARGS] \n"
+ "\n"
+ " Runs a Qt for Android test on an emulator or a device. Specify a device\n"
+ " using the environment variables ANDROID_SERIAL or ANDROID_DEVICE_SERIAL.\n"
+ " Returns the number of failed tests, -1 on test runner deployment related\n"
+ " failures or zero on success."
+ "\n"
+ " Mandatory arguments:\n"
+ " --path <path>: The path where androiddeployqt builds the android package.\n"
+ "\n"
+ " --make <make cmd>: make command to create an APK, for example:\n"
+ " \"cmake --build <build-dir> --target <target>_make_apk\".\n"
+ "\n"
+ " --apk <apk path>: The test apk path. The apk has to exist already, if it\n"
+ " does not exist the make command must be provided for building the apk.\n"
+ "\n"
+ " --aab <aab path>: The test aab path. The aab has to exist already, if it\n"
+ " does not exist the make command must be provided for building the aab.\n"
+ "\n"
+ " Optional arguments:\n"
+ " --adb <adb cmd>: The Android ADB command. If missing the one from\n"
+ " $PATH will be used.\n"
+ "\n"
+ " --activity <acitvity>: The Activity to run. If missing the first\n"
+ " activity from AndroidManifest.qml file will be used.\n"
+ "\n"
+ " --timeout <seconds>: Timeout to run the test. Default is 10 minutes.\n"
+ "\n"
+ " --skip-install-root: Do not append INSTALL_ROOT=... to the make command.\n"
+ "\n"
+ " --show-logcat: Print Logcat output to stdout. If an ANR occurs during\n"
+ " the test run, logs from the system_server process are included.\n"
+ " This argument is implied if a test crashes.\n"
+ "\n"
+ " --ndk-stack: Path to ndk-stack tool that symbolizes crash stacktraces.\n"
+ " By default, ANDROID_NDK_ROOT env var is used to deduce the tool path.\n"
+ "\n"
+ " -- Arguments that will be passed to the test application.\n"
+ "\n"
+ " --verbose: Prints out information during processing.\n"
+ "\n"
+ " --pre-test-adb-command <command>: call the adb <command> after\n"
+ " installation and before the test run.\n"
+ "\n"
+ " --manifest <path>: Custom path to the AndroidManifest.xml.\n"
+ "\n"
+ " --bundletool <bundletool path>: The path to Android bundletool.\n"
+ " See https://developer.android.com/tools/bundletool for details.\n"
+ "\n"
+ " --help: Displays this information.\n",
+ qPrintable(QCoreApplication::arguments().at(0)));
}
static QString packageNameFromAndroidManifest(const QString &androidManifestPath)
@@ -850,10 +884,10 @@ int main(int argc, char *argv[])
return EXIT_ERROR;
}
- if (!QFile::exists(g_options.apkPath)) {
+ if (!QFile::exists(g_options.packagePath)) {
qCritical("No apk \"%s\" found after running the make command. "
"Check the provided path and the make command.",
- qPrintable(g_options.apkPath));
+ qPrintable(g_options.packagePath));
return EXIT_ERROR;
}
@@ -886,11 +920,22 @@ int main(int argc, char *argv[])
// do not install or run packages while another test is running
testRunnerLock.acquire();
- const QStringList installArgs = { "install"_L1, "-r"_L1, "-g"_L1, g_options.apkPath };
- g_testInfo.isPackageInstalled.store(execAdbCommand(installArgs, nullptr));
- if (!g_testInfo.isPackageInstalled)
- return EXIT_ERROR;
+ if (g_options.packagePath.endsWith(".apk"_L1)) {
+ const QStringList installArgs = { "install"_L1, "-r"_L1, "-g"_L1, g_options.packagePath };
+ g_testInfo.isPackageInstalled.store(execAdbCommand(installArgs, nullptr));
+ if (!g_testInfo.isPackageInstalled)
+ return EXIT_ERROR;
+ } else if (g_options.packagePath.endsWith(".aab"_L1)) {
+ QFileInfo aab(g_options.packagePath);
+ const auto apksFilePath = aab.absoluteDir().absoluteFilePath(aab.baseName() + ".apks"_L1);
+ if (!execBundletoolCommand({ "build-apks"_L1, "--bundle"_L1, g_options.packagePath,
+ "--output"_L1, apksFilePath, "--local-testing"_L1,
+ "--overwrite"_L1 }))
+ return EXIT_ERROR;
+ if (!execBundletoolCommand({ "install-apks"_L1, "--apks"_L1, apksFilePath }))
+ return EXIT_ERROR;
+ }
// Call additional adb command if set after installation and before starting the test
for (const auto &command : g_options.preTestRunAdbCommands) {
QByteArray output;
diff --git a/src/tools/uic/ui4.cpp b/src/tools/uic/ui4.cpp
index b6a8f4eb4bf..e26d0260682 100644
--- a/src/tools/uic/ui4.cpp
+++ b/src/tools/uic/ui4.cpp
@@ -54,6 +54,10 @@ void DomUI::read(QXmlStreamReader &reader)
setAttributeIdbasedtr(attribute.value() == u"true"_s);
continue;
}
+ if (name == u"label"_s) {
+ setAttributeLabel(attribute.value().toString());
+ continue;
+ }
if (name == u"connectslotsbyname"_s) {
setAttributeConnectslotsbyname(attribute.value() == u"true"_s);
continue;
@@ -192,6 +196,9 @@ void DomUI::write(QXmlStreamWriter &writer, const QString &tagName) const
if (hasAttributeIdbasedtr())
writer.writeAttribute(u"idbasedtr"_s, (attributeIdbasedtr() ? u"true"_s : u"false"_s));
+ if (hasAttributeLabel())
+ writer.writeAttribute(u"label"_s, attributeLabel());
+
if (hasAttributeConnectslotsbyname())
writer.writeAttribute(u"connectslotsbyname"_s, (attributeConnectslotsbyname() ? u"true"_s : u"false"_s));
diff --git a/src/tools/uic/ui4.h b/src/tools/uic/ui4.h
index 333f7f4e6ad..a46a42c6b73 100644
--- a/src/tools/uic/ui4.h
+++ b/src/tools/uic/ui4.h
@@ -143,6 +143,11 @@ public:
inline void setAttributeIdbasedtr(bool a) { m_attr_idbasedtr = a; m_has_attr_idbasedtr = true; }
inline void clearAttributeIdbasedtr() { m_has_attr_idbasedtr = false; }
+ inline bool hasAttributeLabel() const { return m_has_attr_label; }
+ inline QString attributeLabel() const { return m_attr_label; }
+ inline void setAttributeLabel(const QString &a) { m_attr_label = a; m_has_attr_label = true; }
+ inline void clearAttributeLabel() { m_attr_label.clear(); }
+
inline bool hasAttributeConnectslotsbyname() const { return m_has_attr_connectslotsbyname; }
inline bool attributeConnectslotsbyname() const { return m_attr_connectslotsbyname; }
inline void setAttributeConnectslotsbyname(bool a) { m_attr_connectslotsbyname = a; m_has_attr_connectslotsbyname = true; }
@@ -264,6 +269,9 @@ private:
bool m_attr_idbasedtr = false;
bool m_has_attr_idbasedtr = false;
+ QString m_attr_label;
+ bool m_has_attr_label = false;
+
bool m_attr_connectslotsbyname = false;
bool m_has_attr_connectslotsbyname = false;
diff --git a/src/widgets/REUSE.toml b/src/widgets/REUSE.toml
index 98653c588bb..0bfd718750e 100644
--- a/src/widgets/REUSE.toml
+++ b/src/widgets/REUSE.toml
@@ -3,24 +3,24 @@ version = 1
[[annotations]]
path = ["styles/images/*.png", "dialogs/images/*.png", "styles/images/*.svg"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"
[[annotations]]
path = ["doc/**"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"
[[annotations]]
path = ["doc/snippets/**"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause"
[[annotations]]
path = ["doc/snippets/common-table-model/README"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"
diff --git a/src/widgets/accessible/simplewidgets.cpp b/src/widgets/accessible/simplewidgets.cpp
index 39da1538376..190c7b624f6 100644
--- a/src/widgets/accessible/simplewidgets.cpp
+++ b/src/widgets/accessible/simplewidgets.cpp
@@ -289,19 +289,32 @@ QToolButton *QAccessibleToolButton::toolButton() const
bool QAccessibleToolButton::isSplitButton() const
{
#if QT_CONFIG(menu)
- return toolButton()->menu() && toolButton()->popupMode() == QToolButton::MenuButtonPopup;
+ return menu() && toolButton()->popupMode() == QToolButton::MenuButtonPopup;
#else
return false;
#endif
}
+#if QT_CONFIG(menu)
+QMenu *QAccessibleToolButton::menu() const
+{
+ if (QMenu *menu = toolButton()->menu())
+ return menu;
+
+ if (QAction *defaultAction = toolButton()->defaultAction())
+ return defaultAction->menu();
+
+ return nullptr;
+}
+#endif
+
QAccessible::State QAccessibleToolButton::state() const
{
QAccessible::State st = QAccessibleButton::state();
if (toolButton()->autoRaise())
st.hotTracked = true;
#if QT_CONFIG(menu)
- if (toolButton()->menu())
+ if (menu())
st.hasPopup = true;
#endif
return st;
@@ -315,9 +328,8 @@ int QAccessibleToolButton::childCount() const
QAccessible::Role QAccessibleToolButton::role() const
{
#if QT_CONFIG(menu)
- QAbstractButton *ab = button();
- QToolButton *tb = qobject_cast<QToolButton*>(ab);
- if (!tb->menu())
+ QToolButton *tb = toolButton();
+ if (!menu())
return tb->isCheckable() ? QAccessible::CheckBox : QAccessible::PushButton;
else if (tb->popupMode() == QToolButton::DelayedPopup)
return QAccessible::ButtonDropDown;
@@ -329,10 +341,8 @@ QAccessible::Role QAccessibleToolButton::role() const
QAccessibleInterface *QAccessibleToolButton::child(int index) const
{
#if QT_CONFIG(menu)
- if (index == 0 && toolButton()->menu())
- {
- return QAccessible::queryAccessibleInterface(toolButton()->menu());
- }
+ if (index == 0 && menu())
+ return QAccessible::queryAccessibleInterface(menu());
#else
Q_UNUSED(index);
#endif
diff --git a/src/widgets/accessible/simplewidgets_p.h b/src/widgets/accessible/simplewidgets_p.h
index 02c23f8cba7..356ef9101b2 100644
--- a/src/widgets/accessible/simplewidgets_p.h
+++ b/src/widgets/accessible/simplewidgets_p.h
@@ -27,6 +27,7 @@ class QAbstractButton;
class QLineEdit;
class QToolButton;
class QGroupBox;
+class QMenu;
class QMessageBox;
class QProgressBar;
@@ -71,6 +72,9 @@ protected:
QToolButton *toolButton() const;
bool isSplitButton() const;
+#if QT_CONFIG(menu)
+ QMenu *menu() const;
+#endif
};
#endif // QT_CONFIG(toolbutton)
diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp
index b2fa08e406f..06912d41582 100644
--- a/src/widgets/itemviews/qheaderview.cpp
+++ b/src/widgets/itemviews/qheaderview.cpp
@@ -3671,10 +3671,8 @@ void QHeaderViewPrivate::resizeSections(QHeaderView::ResizeMode globalMode, bool
executePostedLayout();
- if (noSectionMemoryUsage() &&
- (hasAutoResizeSections() || (useGlobalMode && globalResizeMode != QHeaderView::Fixed))) {
+ if (noSectionMemoryUsage() && (hasAutoResizeSections() || globalMode != QHeaderView::Fixed))
setHeaderMode(HeaderMode::FlexibleWithSectionMemoryUsage);
- }
if (sectionCount() == 0 )
return;
diff --git a/src/widgets/kernel/qtestsupport_widgets.cpp b/src/widgets/kernel/qtestsupport_widgets.cpp
index 5a7200e58aa..ce40ba8c6dd 100644
--- a/src/widgets/kernel/qtestsupport_widgets.cpp
+++ b/src/widgets/kernel/qtestsupport_widgets.cpp
@@ -31,6 +31,17 @@ static bool qWaitForWidgetWindow(QWidget *w, Predicate predicate, QDeadlineTimer
/*!
\since 5.0
+ \overload
+
+ The \a timeout is in milliseconds.
+*/
+bool QTest::qWaitForWindowActive(QWidget *widget, int timeout)
+{
+ return qWaitForWindowActive(widget, QDeadlineTimer{timeout, Qt::TimerType::PreciseTimer});
+}
+
+/*!
+ \since 6.10
Returns \c true if \a widget is active within \a timeout milliseconds. Otherwise returns \c false.
@@ -45,7 +56,7 @@ static bool qWaitForWidgetWindow(QWidget *w, Predicate predicate, QDeadlineTimer
\sa qWaitForWindowExposed(), QWidget::isActiveWindow()
*/
-Q_WIDGETS_EXPORT bool QTest::qWaitForWindowActive(QWidget *widget, int timeout)
+bool QTest::qWaitForWindowActive(QWidget *widget, QDeadlineTimer timeout)
{
if (Q_UNLIKELY(!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation))) {
qWarning() << "qWaitForWindowActive was called on a platform that doesn't support window"
@@ -57,9 +68,19 @@ Q_WIDGETS_EXPORT bool QTest::qWaitForWindowActive(QWidget *widget, int timeout)
}
return qWaitForWidgetWindow(widget,
[&](QWindow *window) { return window->isActive(); },
- QDeadlineTimer{timeout, Qt::TimerType::PreciseTimer});
+ timeout);
}
+/*!
+ \since 6.10
+ \overload
+
+ This function uses the default timeout of 5 seconds.
+*/
+bool QTest::qWaitForWindowActive(QWidget *widget)
+{
+ return qWaitForWindowActive(widget, Internal::defaultTryTimeout);
+}
/*!
\since 6.7
@@ -86,7 +107,30 @@ Q_WIDGETS_EXPORT bool QTest::qWaitForWindowFocused(QWidget *widget, QDeadlineTim
}
/*!
+ \since 6.10
+ \overload
+
+ This function uses the default timeout of 5 seconds.
+*/
+bool QTest::qWaitForWindowFocused(QWidget *widget)
+{
+ return qWaitForWindowFocused(widget, Internal::defaultTryTimeout);
+}
+
+/*!
\since 5.0
+ \overload
+
+ The \a timeout is in milliseconds.
+*/
+bool QTest::qWaitForWindowExposed(QWidget *widget, int timeout)
+{
+ return qWaitForWindowExposed(widget, std::chrono::milliseconds(timeout));
+}
+
+
+/*!
+ \since 6.10
Returns \c true if \a widget is exposed within \a timeout milliseconds. Otherwise returns \c false.
@@ -99,11 +143,22 @@ Q_WIDGETS_EXPORT bool QTest::qWaitForWindowFocused(QWidget *widget, QDeadlineTim
\sa qWaitForWindowActive(), QWidget::isVisible(), QWindow::isExposed()
*/
-Q_WIDGETS_EXPORT bool QTest::qWaitForWindowExposed(QWidget *widget, int timeout)
+bool QTest::qWaitForWindowExposed(QWidget *widget, QDeadlineTimer timeout)
{
return qWaitForWidgetWindow(widget,
[&](QWindow *window) { return window->isExposed(); },
- QDeadlineTimer{timeout, Qt::TimerType::PreciseTimer});
+ timeout);
+}
+
+/*!
+ \since 6.10
+ \overload
+
+ This function uses the default timeout of 5 seconds.
+*/
+bool QTest::qWaitForWindowExposed(QWidget *widget)
+{
+ return qWaitForWindowExposed(widget, Internal::defaultTryTimeout);
}
namespace QTest {
diff --git a/src/widgets/kernel/qtestsupport_widgets.h b/src/widgets/kernel/qtestsupport_widgets.h
index b49e68db651..4b5e5ff7772 100644
--- a/src/widgets/kernel/qtestsupport_widgets.h
+++ b/src/widgets/kernel/qtestsupport_widgets.h
@@ -14,9 +14,16 @@ class QWidget;
namespace QTest {
-[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowActive(QWidget *widget, int timeout = 5000);
-[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowFocused(QWidget *widget, QDeadlineTimer timeout = std::chrono::seconds{5});
-[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowExposed(QWidget *widget, int timeout = 5000);
+[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowActive(QWidget *widget, int timeout);
+[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowActive(QWidget *widget, QDeadlineTimer timeout);
+[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowActive(QWidget *widget);
+
+[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowFocused(QWidget *widget, QDeadlineTimer timeout);
+[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowFocused(QWidget *widget);
+
+[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowExposed(QWidget *widget, int timeout);
+[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowExposed(QWidget *widget, QDeadlineTimer timeout);
+[[nodiscard]] Q_WIDGETS_EXPORT bool qWaitForWindowExposed(QWidget *widget);
class Q_WIDGETS_EXPORT QTouchEventWidgetSequence : public QTouchEventSequence
{
diff --git a/src/widgets/kernel/qwidgetsvariant.cpp b/src/widgets/kernel/qwidgetsvariant.cpp
index 17a19aa780d..c843927d366 100644
--- a/src/widgets/kernel/qwidgetsvariant.cpp
+++ b/src/widgets/kernel/qwidgetsvariant.cpp
@@ -11,18 +11,16 @@
QT_BEGIN_NAMESPACE
namespace {
-
-// NOLINTNEXTLINE(cppcoreguidelines-virtual-class-destructor): this is not a base class
-static constexpr struct : QMetaTypeModuleHelper
+struct QVariantWidgetsHelper : QMetaTypeModuleHelper
{
- const QtPrivate::QMetaTypeInterface *interfaceForType(int type) const override {
+ static const QtPrivate::QMetaTypeInterface *interfaceForType(int type)
+ {
switch (type) {
QT_FOR_EACH_STATIC_WIDGETS_CLASS(QT_METATYPE_CONVERT_ID_TO_TYPE)
default: return nullptr;
}
}
-} qVariantWidgetsHelper;
-
+};
#undef QT_IMPL_METATYPEINTERFACE_WIDGETS_TYPES
@@ -30,7 +28,9 @@ static constexpr struct : QMetaTypeModuleHelper
void qRegisterWidgetsVariant()
{
- qMetaTypeWidgetsHelper = &qVariantWidgetsHelper;
+ qMetaTypeWidgetsHelper = QMetaTypeModuleHelper{
+ &QVariantWidgetsHelper::interfaceForType,
+ };
}
Q_CONSTRUCTOR_FUNCTION(qRegisterWidgetsVariant)
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index 4cf2934a2dc..b85446121bd 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -622,7 +622,21 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
}
}
QApplicationPrivate::replayMousePress = false;
+#ifndef QT_NO_CONTEXTMENU
+ } else if (event->type() == QGuiApplicationPrivate::contextMenuEventType()
+ && event->button() == Qt::RightButton) {
+ QWidget *receiver = activePopupWidget;
+ if (qt_button_down)
+ receiver = qt_button_down;
+ else if (popupChild)
+ receiver = popupChild;
+ const QPoint localPos = receiver->mapFromGlobal(event->globalPosition().toPoint());
+ QContextMenuEvent e(QContextMenuEvent::Mouse, localPos, event->globalPosition().toPoint(), event->modifiers());
+ QApplication::forwardEvent(receiver, &e, event);
+ }
+#else
}
+#endif
if (releaseAfter) {
qt_button_down = nullptr;
diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp
index b5972411534..60ec043d094 100644
--- a/src/widgets/styles/qcommonstyle.cpp
+++ b/src/widgets/styles/qcommonstyle.cpp
@@ -5434,7 +5434,8 @@ int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget
case SH_Menu_AllowActiveAndDisabled:
case SH_Menu_SpaceActivatesItem:
case SH_ScrollView_FrameOnlyAroundContents:
- case SH_ComboBox_ListMouseTracking:
+ case SH_ComboBox_ListMouseTracking_Current:
+ case SH_ComboBox_ListMouseTracking_Active:
case SH_Menu_MouseTracking:
case SH_MenuBar_MouseTracking:
case SH_ItemView_ChangeHighlightOnFocus:
diff --git a/src/widgets/styles/qfusionstyle.cpp b/src/widgets/styles/qfusionstyle.cpp
index e9cc250c517..c341a025115 100644
--- a/src/widgets/styles/qfusionstyle.cpp
+++ b/src/widgets/styles/qfusionstyle.cpp
@@ -591,7 +591,7 @@ void QFusionStyle::drawPrimitive(PrimitiveElement elem,
if (option->state & State_HasFocus && option->state & State_KeyboardFocusChange)
painter->setPen(highlightedOutline);
else
- painter->setPen(colorScheme() == Qt::ColorScheme::Dark ? outline.lighter(150)
+ painter->setPen(colorScheme() == Qt::ColorScheme::Dark ? outline.lighter(240)
: outline.lighter(110));
painter->drawRect(rect);
diff --git a/src/widgets/styles/qfusionstyle_p_p.h b/src/widgets/styles/qfusionstyle_p_p.h
index 67abdd74dc8..62641609d59 100644
--- a/src/widgets/styles/qfusionstyle_p_p.h
+++ b/src/widgets/styles/qfusionstyle_p_p.h
@@ -70,10 +70,7 @@ public:
}
if (pal.window().style() == Qt::TexturePattern)
return QColor(0, 0, 0, 160);
- if (colorScheme() == Qt::ColorScheme::Dark)
- return pal.window().color().lighter(140);
- else
- return pal.window().color().darker(140);
+ return pal.window().color().darker(140);
}
QColor highlightedOutline(const QPalette &pal) const {
diff --git a/src/widgets/styles/qstyle.cpp b/src/widgets/styles/qstyle.cpp
index 6bb0728cfd4..e72e645e69c 100644
--- a/src/widgets/styles/qstyle.cpp
+++ b/src/widgets/styles/qstyle.cpp
@@ -1736,8 +1736,16 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
by pressing Alt, followed by using the arrow keys to select
the desired item.
- \value SH_ComboBox_ListMouseTracking Mouse tracking in combobox
- drop-down lists.
+ \value SH_ComboBox_ListMouseTracking_Current Mouse tracking in
+ combobox drop-down lists, the item under the cursor is made
+ the current item (QStyle::State_Selected).
+
+ \value SH_ComboBox_ListMouseTracking same as
+ SH_ComboBox_ListMouseTracking_Current
+
+ \value SH_ComboBox_ListMouseTracking_Active Mouse tracking in
+ combobox drop-down lists, the item under the cursor is not
+ made the current item, only active (QStyle::State_MouseOver).
\value SH_Menu_MouseTracking Mouse tracking in popup menus.
diff --git a/src/widgets/styles/qstyle.h b/src/widgets/styles/qstyle.h
index db09eedc70d..d6bccf9f698 100644
--- a/src/widgets/styles/qstyle.h
+++ b/src/widgets/styles/qstyle.h
@@ -602,6 +602,7 @@ public:
SH_ScrollView_FrameOnlyAroundContents,
SH_MenuBar_AltKeyNavigation,
SH_ComboBox_ListMouseTracking,
+ SH_ComboBox_ListMouseTracking_Current = SH_ComboBox_ListMouseTracking,
SH_Menu_MouseTracking,
SH_MenuBar_MouseTracking,
SH_ItemView_ChangeHighlightOnFocus,
@@ -704,6 +705,7 @@ public:
SH_TabBar_AllowWheelScrolling,
SH_Table_AlwaysDrawLeftTopGridLines,
SH_SpinBox_SelectOnStep,
+ SH_ComboBox_ListMouseTracking_Active,
// Add new style hint values here
SH_CustomBase = 0xf0000000
diff --git a/src/widgets/styles/qwindowsstyle.cpp b/src/widgets/styles/qwindowsstyle.cpp
index 907628f224e..d6daa681798 100644
--- a/src/widgets/styles/qwindowsstyle.cpp
+++ b/src/widgets/styles/qwindowsstyle.cpp
@@ -461,7 +461,7 @@ int QWindowsStyle::styleHint(StyleHint hint, const QStyleOption *opt, const QWid
case SH_MenuBar_AltKeyNavigation:
case SH_MenuBar_MouseTracking:
case SH_Menu_MouseTracking:
- case SH_ComboBox_ListMouseTracking:
+ case SH_ComboBox_ListMouseTracking_Current:
case SH_Slider_StopMouseOverSlider:
case SH_MainWindow_SpaceBelowMenuBar:
ret = 1;
diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp
index fbec606ae4a..aa58ac8d75d 100644
--- a/src/widgets/widgets/qcombobox.cpp
+++ b/src/widgets/widgets/qcombobox.cpp
@@ -640,8 +640,10 @@ void QComboBoxPrivateContainer::setItemView(QAbstractItemView *itemView)
if (usePopup)
view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
#endif
- if (combo->style()->styleHint(QStyle::SH_ComboBox_ListMouseTracking, &opt, combo) ||
- usePopup) {
+ if (usePopup ||
+ combo->style()->styleHint(QStyle::SH_ComboBox_ListMouseTracking_Current, &opt, combo) ||
+ combo->style()->styleHint(QStyle::SH_ComboBox_ListMouseTracking_Active, &opt, combo)
+ ) {
view->setMouseTracking(true);
}
view->setSelectionMode(QAbstractItemView::SingleSelection);
@@ -775,10 +777,12 @@ bool QComboBoxPrivateContainer::eventFilter(QObject *o, QEvent *e)
QPoint vector = widget->mapToGlobal(m->position().toPoint()) - initialClickPosition;
if (vector.manhattanLength() > 9 && blockMouseReleaseTimer.isActive())
blockMouseReleaseTimer.stop();
- QModelIndex indexUnderMouse = view->indexAt(m->position().toPoint());
- if (indexUnderMouse.isValid()
- && !QComboBoxDelegate::isSeparator(indexUnderMouse)) {
- view->setCurrentIndex(indexUnderMouse);
+ if (combo->style()->styleHint(QStyle::SH_ComboBox_ListMouseTracking_Current, nullptr, combo)) {
+ QModelIndex indexUnderMouse = view->indexAt(m->position().toPoint());
+ if (indexUnderMouse.isValid()
+ && !QComboBoxDelegate::isSeparator(indexUnderMouse)) {
+ view->setCurrentIndex(indexUnderMouse);
+ }
}
}
break;
diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp
index f5d92094f54..c1ce675d75a 100644
--- a/src/widgets/widgets/qdockarealayout.cpp
+++ b/src/widgets/widgets/qdockarealayout.cpp
@@ -3327,7 +3327,8 @@ int QDockAreaLayout::separatorMove(const QList<int> &separator, const QPoint &or
{
int delta = 0;
const auto dockPosition = static_cast<QInternal::DockPosition>(separator.last());
- const bool isHorizontal = dockPosition == QInternal::LeftDock || dockPosition == QInternal::TopDock;
+ const bool isHorizontal =
+ dockPosition == QInternal::LeftDock || dockPosition == QInternal::RightDock;
const bool isLeftOrTop = dockPosition == QInternal::LeftDock || dockPosition == QInternal::TopDock;
const bool separatorIsWithinDock = separator.size() > 1;
diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp
index 87c33932a8d..a1a4cfc2ce0 100644
--- a/src/widgets/widgets/qmainwindowlayout.cpp
+++ b/src/widgets/widgets/qmainwindowlayout.cpp
@@ -2673,8 +2673,10 @@ void QMainWindowLayout::animationFinished(QWidget *widget)
parentWidget()->update(layoutState.dockAreaLayout.separatorRegion());
#if QT_CONFIG(tabbar)
const auto usedTabBarsCopy = usedTabBars; // list potentially modified by animations
- for (QTabBar *tab_bar : usedTabBarsCopy)
- tab_bar->show();
+ for (QTabBar *tab_bar : usedTabBarsCopy) {
+ if (usedTabBars.contains(tab_bar)) // Showing a tab bar can cause another to be deleted.
+ tab_bar->show();
+ }
#endif // QT_CONFIG(tabbar)
#endif // QT_CONFIG(dockwidget)
}
diff --git a/src/widgets/widgets/qscrollbar.cpp b/src/widgets/widgets/qscrollbar.cpp
index 431faf9e24d..92ccfe7db9d 100644
--- a/src/widgets/widgets/qscrollbar.cpp
+++ b/src/widgets/widgets/qscrollbar.cpp
@@ -126,8 +126,8 @@ using namespace Qt::StringLiterals;
ScrollBar inherits a comprehensive set of signals from QAbstractSlider:
\list
\li \l{QAbstractSlider::valueChanged()}{valueChanged()} is emitted when the
- scroll bar's value has changed. The tracking() determines whether this
- signal is emitted during user interaction.
+ scroll bar's value has changed. The \l{QAbstractSlider::}{tracking} property
+ determines whether this signal is emitted during user interaction.
\li \l{QAbstractSlider::rangeChanged()}{rangeChanged()} is emitted when the
scroll bar's range of values has changed.
\li \l{QAbstractSlider::sliderPressed()}{sliderPressed()} is emitted when
@@ -382,7 +382,7 @@ QMenu *QScrollBar::createStandardContextMenu(QPoint position)
{
#if QT_CONFIG(menu)
const bool horiz = HORIZONTAL;
- QMenu *menu = new QMenu();
+ QMenu *menu = new QMenu(this);
menu->setObjectName("qt_scrollbar_menu"_L1);
if (window() && window()->windowHandle()) {
diff --git a/src/widgets/widgets/qtoolbararealayout.cpp b/src/widgets/widgets/qtoolbararealayout.cpp
index 54c21b60387..0d7227eb038 100644
--- a/src/widgets/widgets/qtoolbararealayout.cpp
+++ b/src/widgets/widgets/qtoolbararealayout.cpp
@@ -564,19 +564,19 @@ int QToolBarAreaLayoutInfo::distance(const QPoint &pos) const
{
switch (dockPos) {
case QInternal::LeftDock:
- if (pos.y() < rect.bottom())
+ if (pos.y() > 0 && pos.y() < rect.bottom())
return pos.x() - rect.right();
break;
case QInternal::RightDock:
- if (pos.y() < rect.bottom())
+ if (pos.y() > 0 && pos.y() < rect.bottom())
return rect.left() - pos.x();
break;
case QInternal::TopDock:
- if (pos.x() < rect.right())
+ if (pos.x() > 0 && pos.x() < rect.right())
return pos.y() - rect.bottom();
break;
case QInternal::BottomDock:
- if (pos.x() < rect.right())
+ if (pos.x() > 0 && pos.x() < rect.right())
return rect.top() - pos.y();
break;
diff --git a/tests/auto/cmake/CMakeLists.txt b/tests/auto/cmake/CMakeLists.txt
index 7c4f33cddb6..f4789d115a6 100644
--- a/tests/auto/cmake/CMakeLists.txt
+++ b/tests/auto/cmake/CMakeLists.txt
@@ -70,7 +70,7 @@ enable_testing()
# doesn't seem to be the case.
# Until this is figured out, disable the tests when cross-compiling to Linux.
if(UNIX AND NOT APPLE AND NOT WIN32 AND CMAKE_CROSSCOMPILING AND NOT QT_ENABLE_CMAKE_BOOT2QT_TESTS
- AND NOT QT_BUILD_MINIMAL_ANDROID_MULTI_ABI_TESTS)
+ AND NOT QT_BUILD_MINIMAL_ANDROID_MULTI_ABI_TESTS AND NOT ANDROID)
message(STATUS "Running CMake tests is disabled when cross-compiling to Linux / Boot2Qt.")
return()
endif()
@@ -83,6 +83,12 @@ if(WIN32 AND CMAKE_CROSSCOMPILING)
return()
endif()
+if(TARGET Qt6::Core)
+ # Tests are built as part of the qtbase build tree.
+ # Setup paths so that the Qt packages are found, similar to examples.
+ qt_internal_set_up_build_dir_package_paths()
+endif()
+
set(required_packages Core Network Xml Sql Test TestInternalsPrivate)
set(optional_packages DBus Gui Widgets PrintSupport OpenGL Concurrent)
@@ -117,53 +123,73 @@ endif()
include("${_Qt6CTestMacros}")
-# Test only multi-abi specific functionality when QT_BUILD_MINIMAL_ANDROID_MULTI_ABI_TESTS is ON.
-# Qt::Gui is the prerequisite for all Android tests.
-if(QT_BUILD_MINIMAL_ANDROID_MULTI_ABI_TESTS AND NOT NO_GUI)
- unset(multi_abi_vars)
- foreach(abi IN LISTS QT_ANDROID_ABIS)
- list(APPEND multi_abi_vars "-DQT_PATH_ANDROID_ABI_${abi}=${QT_PATH_ANDROID_ABI_${abi}}")
- endforeach()
- if(QT_ANDROID_BUILD_ALL_ABIS)
- list(APPEND multi_abi_vars "-DQT_ANDROID_BUILD_ALL_ABIS=${QT_ANDROID_BUILD_ALL_ABIS}")
+
+if(ANDROID)
+ # Qt::Gui is the prerequisite for all Android tests.
+ if(NO_GUI)
+ return()
endif()
- list(APPEND multi_abi_vars "-DQT_HOST_PATH=${QT_HOST_PATH}")
+ set(common_android_vars "-DQT_HOST_PATH=${QT_HOST_PATH}")
- set(multi_abi_forward_vars
- TEST_SINGLE_VALUE_ARG
- TEST_SPACES_VALUE_ARG
- TEST_LIST_VALUE_ARG
- TEST_ESCAPING_VALUE_ARG
+ _qt_internal_test_expect_pass(test_android_signing
+ BUILD_OPTIONS "${common_android_vars}"
+ BINARY ${CMAKE_CTEST_COMMAND}
+ BINARY_ARGS -V
)
- string(REPLACE ";" "[[;]]" multi_abi_forward_vars "${multi_abi_forward_vars}")
-
- set(single_value "TestValue")
- set(list_value "TestValue[[;]]TestValue2[[;]]TestValue3")
- set(escaping_value "TestValue\\\\[[;]]TestValue2\\\\[[;]]TestValue3")
- set(spaces_value "TestValue TestValue2 TestValue3")
- _qt_internal_test_expect_pass(test_android_multi_abi_forward_vars
- BUILD_OPTIONS
- ${multi_abi_vars}
- "-DQT_ANDROID_MULTI_ABI_FORWARD_VARS=${multi_abi_forward_vars}"
- "-DTEST_SINGLE_VALUE_ARG=${single_value}"
- "-DTEST_LIST_VALUE_ARG=${list_value}"
- "-DTEST_ESCAPING_VALUE_ARG=${escaping_value}"
- "-DTEST_SPACES_VALUE_ARG=${spaces_value}"
+ set_property(TEST test_android_signing APPEND PROPERTY ENVIRONMENT
+ "QT_ANDROID_KEYSTORE_PATH=${CMAKE_CURRENT_BINARY_DIR}/test_android_signing/qttest.jks"
+ "QT_ANDROID_KEYSTORE_ALIAS=qttest"
+ "QT_ANDROID_KEYSTORE_STORE_PASS=qttest"
+ "QT_ANDROID_KEYSTORE_KEY_PASS=qttest"
)
- #Run test_android_aar only if the host is Unix and zipinfo is available
- find_program(ZIPINFO_EXECUTABLE zipinfo)
- if(CMAKE_HOST_UNIX AND ZIPINFO_EXECUTABLE)
- _qt_internal_test_expect_pass(test_android_aar
+ # Test only multi-abi specific functionality when QT_BUILD_MINIMAL_ANDROID_MULTI_ABI_TESTS is
+ # ON.
+ if(QT_BUILD_MINIMAL_ANDROID_MULTI_ABI_TESTS)
+ set(multi_abi_vars "${common_android_vars}")
+ foreach(abi IN LISTS QT_ANDROID_ABIS)
+ list(APPEND multi_abi_vars "-DQT_PATH_ANDROID_ABI_${abi}=${QT_PATH_ANDROID_ABI_${abi}}")
+ endforeach()
+ if(QT_ANDROID_BUILD_ALL_ABIS)
+ list(APPEND multi_abi_vars "-DQT_ANDROID_BUILD_ALL_ABIS=${QT_ANDROID_BUILD_ALL_ABIS}")
+ endif()
+
+ set(multi_abi_forward_vars
+ TEST_SINGLE_VALUE_ARG
+ TEST_SPACES_VALUE_ARG
+ TEST_LIST_VALUE_ARG
+ TEST_ESCAPING_VALUE_ARG
+ )
+ string(REPLACE ";" "[[;]]" multi_abi_forward_vars "${multi_abi_forward_vars}")
+
+ set(single_value "TestValue")
+ set(list_value "TestValue[[;]]TestValue2[[;]]TestValue3")
+ set(escaping_value "TestValue\\\\[[;]]TestValue2\\\\[[;]]TestValue3")
+ set(spaces_value "TestValue TestValue2 TestValue3")
+ _qt_internal_test_expect_pass(test_android_multi_abi_forward_vars
BUILD_OPTIONS
${multi_abi_vars}
- --build-target verify_aar
+ "-DQT_ANDROID_MULTI_ABI_FORWARD_VARS=${multi_abi_forward_vars}"
+ "-DTEST_SINGLE_VALUE_ARG=${single_value}"
+ "-DTEST_LIST_VALUE_ARG=${list_value}"
+ "-DTEST_ESCAPING_VALUE_ARG=${escaping_value}"
+ "-DTEST_SPACES_VALUE_ARG=${spaces_value}"
)
- else()
- message(WARNING
- "Skipping test_android_aar CMake build test because \
- the host is not Unix or zipinfo is not found")
+
+ #Run test_android_aar only if the host is Unix and zipinfo is available
+ find_program(ZIPINFO_EXECUTABLE zipinfo)
+ if(CMAKE_HOST_UNIX AND ZIPINFO_EXECUTABLE)
+ _qt_internal_test_expect_pass(test_android_aar
+ BUILD_OPTIONS
+ ${multi_abi_vars}
+ --build-target verify_aar
+ )
+ else()
+ message(WARNING
+ "Skipping test_android_aar CMake build test because \
+ the host is not Unix or zipinfo is not found")
+ endif()
endif()
return()
diff --git a/tests/auto/cmake/test_android_signing/CMakeLists.txt b/tests/auto/cmake/test_android_signing/CMakeLists.txt
new file mode 100644
index 00000000000..b2d67676a69
--- /dev/null
+++ b/tests/auto/cmake/test_android_signing/CMakeLists.txt
@@ -0,0 +1,53 @@
+# Copyright (C) 2025 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.20)
+
+project(test_android_signing)
+
+enable_testing()
+
+find_program(keytool NAMES keytool)
+
+if(NOT keytool)
+ message("Skipping test_android_signing: keytool not found.")
+ return()
+endif()
+
+if("$ENV{QT_ANDROID_KEYSTORE_PATH}" STREQUAL ""
+ OR "$ENV{QT_ANDROID_KEYSTORE_STORE_PASS}" STREQUAL ""
+ OR "$ENV{QT_ANDROID_KEYSTORE_ALIAS}" STREQUAL ""
+ OR "$ENV{QT_ANDROID_KEYSTORE_KEY_PASS}" STREQUAL "")
+ message(FATAL_ERROR "Environment variables QT_ANDROID_KEYSTORE_PATH,"
+ " QT_ANDROID_KEYSTORE_STORE_PASS, QT_ANDROID_KEYSTORE_ALIAS, and"
+ " QT_ANDROID_KEYSTORE_KEY_PASS must be set to run this test.")
+endif()
+
+find_package(Qt6 COMPONENTS Core Gui REQUIRED)
+
+set(QT_ANDROID_SIGN_AAB ON)
+set(QT_ANDROID_SIGN_APK ON)
+
+execute_process(COMMAND ${keytool}
+ -genkey -alias "$ENV{QT_ANDROID_KEYSTORE_ALIAS}" -keyalg RSA
+ -keystore "$ENV{QT_ANDROID_KEYSTORE_PATH}"
+ -noprompt
+ -dname "CN=qttest, OU=ID, O=Qt, L=Qt, S=Test, C=DE"
+ -storepass "$ENV{QT_ANDROID_KEYSTORE_STORE_PASS}"
+ -keypass "$ENV{QT_ANDROID_KEYSTORE_KEY_PASS}"
+ RESULT_VARIABLE keytool_result
+)
+
+
+qt6_add_executable(test_android_signing main.cpp)
+
+target_link_libraries(test_android_signing PRIVATE
+ Qt6::Core
+ Qt6::Gui
+)
+
+add_test(NAME test_android_signing_verify_signature
+ COMMAND "${CMAKE_COMMAND}" "-DKEYTOOL_PATH=${keytool}"
+ "-DAPK_FILE=${CMAKE_CURRENT_BINARY_DIR}/android-build/test_android_signing.apk"
+ -P "${CMAKE_CURRENT_SOURCE_DIR}/verify_signature.cmake"
+)
diff --git a/tests/auto/cmake/test_android_signing/main.cpp b/tests/auto/cmake/test_android_signing/main.cpp
new file mode 100644
index 00000000000..2112a0de739
--- /dev/null
+++ b/tests/auto/cmake/test_android_signing/main.cpp
@@ -0,0 +1,4 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+int main(int, char *[]) { return 0; }
diff --git a/tests/auto/cmake/test_android_signing/verify_signature.cmake b/tests/auto/cmake/test_android_signing/verify_signature.cmake
new file mode 100644
index 00000000000..d4405a30201
--- /dev/null
+++ b/tests/auto/cmake/test_android_signing/verify_signature.cmake
@@ -0,0 +1,25 @@
+# Copyright (C) 2025 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+if(NOT KEYTOOL_PATH)
+ message(FATAL_ERROR "KEYTOOL_PATH is missing.")
+endif()
+
+if(NOT APK_FILE)
+ message(FATAL_ERROR "APK_FILE is missing.")
+endif()
+
+execute_process(
+ COMMAND ${KEYTOOL_PATH} -printcert -jarfile ${APK_FILE}
+ RESULT_VARIABLE keytool_result
+ OUTPUT_VARIABLE keytool_output
+ ERROR_VARIABLE keytool_error
+)
+
+if(NOT keytool_result EQUAL 0)
+ message(FATAL_ERROR "Keytool command failed with error: ${keytool_error}")
+endif()
+
+if(NOT keytool_output MATCHES ".+Certificate #1:.+")
+ message(FATAL_ERROR "APK is not signed.")
+endif()
diff --git a/tests/auto/corelib/io/qdir/tst_qdir.cpp b/tests/auto/corelib/io/qdir/tst_qdir.cpp
index 1e423f21bec..0ea2be1b147 100644
--- a/tests/auto/corelib/io/qdir/tst_qdir.cpp
+++ b/tests/auto/corelib/io/qdir/tst_qdir.cpp
@@ -430,7 +430,7 @@ void tst_QDir::mkdirRmdir()
void tst_QDir::mkdirOnSymlink()
{
-#if !defined(Q_OS_UNIX) || defined(Q_NO_SYMLINKS) || defined(Q_OS_INTEGRITY) || defined(Q_OS_WASM)
+#if !defined(Q_OS_UNIX) || defined(Q_NO_SYMLINKS) || defined(Q_OS_INTEGRITY)
QSKIP("Test only valid on an OS that supports symlinks");
#else
// Create the structure:
@@ -477,9 +477,6 @@ void tst_QDir::mkdirOnSymlink()
#if defined(Q_OS_QNX)
QSKIP("Fails on QNX QTBUG-98561");
#endif
-#if defined (Q_OS_WASM)
- QEXPECT_FAIL("", "fails on wasm, see bug: QTBUG-127766", Continue);
-#endif
QVERIFY2(fi.exists() && fi.isDir(), msgDoesNotExist(path).constData());
#endif
}
diff --git a/tests/auto/corelib/io/qfile/tst_qfile.cpp b/tests/auto/corelib/io/qfile/tst_qfile.cpp
index 781f64a31ab..66c3db2e2f0 100644
--- a/tests/auto/corelib/io/qfile/tst_qfile.cpp
+++ b/tests/auto/corelib/io/qfile/tst_qfile.cpp
@@ -228,6 +228,7 @@ private slots:
void getCharFF();
void remove_and_exists();
void removeOpenFile();
+ void removedFileDoesntExist();
void fullDisk();
void writeLargeDataBlock_data();
void writeLargeDataBlock();
@@ -2526,6 +2527,37 @@ void tst_QFile::removeOpenFile()
}
}
+void tst_QFile::removedFileDoesntExist()
+{
+#ifdef Q_OS_WIN
+ QSKIP("Not relevant for Windows - can't remove still-open files");
+#endif
+ QFile::remove("remove_unclosed.txt");
+ QFile f("remove_unclosed.txt");
+ QVERIFY(!f.exists());
+ bool opened = f.open(QIODevice::ReadWrite | QIODevice::Unbuffered);
+ QVERIFY(opened);
+ f.write("blah blah blah");
+
+ QVERIFY(f.exists());
+
+ // delete by path, not using f.remove() (that's tested above)
+ QVERIFY(QFile::remove(f.fileName()));
+ QVERIFY(!QFile::exists(f.fileName()));
+ QVERIFY(!f.exists());
+
+#ifdef Q_OS_LINUX
+ QString procPath = u"/proc/self/fd/"_s;
+ if (QFile::exists(procPath)) {
+ // reopen the deleted file
+ procPath += QString::number(f.handle());
+ QFile f2(procPath);
+ QVERIFY(f2.open(QIODevice::ReadOnly));
+ QVERIFY(!f2.exists());
+ }
+#endif
+}
+
void tst_QFile::fullDisk()
{
QFile file("/dev/full");
diff --git a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
index 761f0552eec..e2190477441 100644
--- a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
+++ b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
@@ -141,6 +141,7 @@ private slots:
void exists_data();
void exists();
+ void deletedFileLinuxProcExists();
void absolutePath_data();
void absolutePath();
@@ -615,6 +616,34 @@ void tst_QFileInfo::exists()
QVERIFY(!exists);
}
+void tst_QFileInfo::deletedFileLinuxProcExists()
+{
+#ifdef Q_OS_LINUX
+ static const char msg[] = "Hello, World\n";
+ QFileInfo fi("/proc/self/fd/");
+ if (!fi.isDir())
+ QSKIP("/proc appears not to be mounted");
+
+ QFile f("removed_file.txt");
+ QVERIFY(f.open(QIODevice::ReadWrite | QIODevice::Unbuffered));
+ f.write(msg, strlen(msg));
+
+ fi.setFile(fi.filePath() + QString::number(f.handle()));
+ QVERIFY(fi.exists());
+ QCOMPARE(fi.size(), strlen(msg));
+
+ QFile::remove("removed_file.txt");
+ fi.refresh();
+ QVERIFY(fi.exists());
+
+ fi.refresh();
+ QCOMPARE(fi.size(), strlen(msg)); // this stats, so may change flags
+ QVERIFY(fi.exists());
+#else
+ QSKIP("Linux-only test");
+#endif
+}
+
void tst_QFileInfo::absolutePath_data()
{
QTest::addColumn<QString>("file");
diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp
index 282c7f2e360..71389abc976 100644
--- a/tests/auto/corelib/io/qurl/tst_qurl.cpp
+++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp
@@ -513,6 +513,7 @@ void tst_QUrl::comparison2()
QCOMPARE(url1.toString(), url2.toString());
QCOMPARE(url1, url2);
QCOMPARE(qHash(url1), qHash(url2));
+ QCOMPARE(qHash(url1, 1), qHash(url2, 1));
} else if (ordering < 0) {
QCOMPARE_LT(url1.toString(), url2.toString());
QCOMPARE_NE(url1, url2);
@@ -1387,12 +1388,14 @@ void tst_QUrl::toString_constructed()
QUrl parsed(asString);
QCOMPARE(url, parsed);
QCOMPARE(qHash(url), qHash(parsed));
+ QCOMPARE(qHash(url, 1), qHash(parsed, 1));
}
// clear it and ensure no memory of the previous state remains
url.setUrl(QString());
QCOMPARE(url, QUrl());
QCOMPARE(qHash(url), qHash(QUrl()));
+ QCOMPARE(qHash(url, 1), qHash(QUrl(), 1));
}
void tst_QUrl::toDisplayString_PreferLocalFile_data()
@@ -4265,6 +4268,7 @@ void tst_QUrl::setComponents()
QUrl recreated(toString);
QCOMPARE(copy, recreated);
QCOMPARE(qHash(copy), qHash(recreated));
+ QCOMPARE(qHash(copy, 1), qHash(recreated, 1));
} else {
QVERIFY(copy.toString().isEmpty());
}
diff --git a/tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp b/tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp
index 5a49d9cf024..878fd173675 100644
--- a/tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp
+++ b/tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp
@@ -286,6 +286,7 @@ private slots:
void ranges();
void json();
void ownership();
+ void overrideRoleNames();
void dimensions_data() { createTestData(); }
void dimensions();
@@ -1008,6 +1009,45 @@ void tst_QRangeModel::ownership()
}
}
+void tst_QRangeModel::overrideRoleNames()
+{
+ // verify that an overridden roleNames() gets called consistently
+ class RoleModel : public QRangeModel
+ {
+ public:
+ RoleModel() : QRangeModel(QList<SingleColumn<Object *>>{
+ new Object,
+ new Object,
+ new Object,
+ }) {
+ }
+
+ QHash<int, QByteArray> roleNames() const override
+ {
+ return {
+ {Qt::UserRole, "string"},
+ {Qt::UserRole + 1, "number"}
+ };
+ }
+ };
+
+ RoleModel model;
+ const QList<int> expectedKeys = {Qt::UserRole, Qt::UserRole + 1};
+ QCOMPARE(model.roleNames().size(), expectedKeys.size());
+
+ const QModelIndex index = model.index(0, 0);
+ QVERIFY(model.setData(index, "string value", Qt::UserRole));
+ QVERIFY(model.setData(index, 42, Qt::UserRole + 1));
+ QVERIFY(!model.setData(index, "display"));
+
+ const auto itemData = model.itemData(index);
+ QCOMPARE(itemData.keys(), expectedKeys);
+ QCOMPARE(itemData.value(Qt::UserRole), "string value");
+ QCOMPARE(itemData.value(Qt::UserRole + 1), 42);
+
+ QVERIFY(model.setItemData(model.index(1, 0), itemData));
+}
+
void tst_QRangeModel::dimensions()
{
QFETCH(Factory, factory);
diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
index b1e2e8164af..a5f23014b94 100644
--- a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
+++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
@@ -708,6 +708,24 @@ void tst_QMetaObjectBuilder::property()
prop2.setEnumOrFlag(false); \
prop2.setConstant(false); \
prop2.setFinal(false); \
+ prop2.setBindable(false); \
+ prop2.setRequired(false); \
+ } while (0)
+#define SET_ALL_FLAGS() \
+ do { \
+ prop2.setReadable(true); \
+ prop2.setWritable(true); \
+ prop2.setResettable(true); \
+ prop2.setDesignable(true); \
+ prop2.setScriptable(true); \
+ prop2.setStored(true); \
+ prop2.setUser(true); \
+ prop2.setStdCppSet(true); \
+ prop2.setEnumOrFlag(true); \
+ prop2.setConstant(true); \
+ prop2.setFinal(true); \
+ prop2.setBindable(true); \
+ prop2.setRequired(true); \
} while (0)
#define COUNT_FLAGS() \
((prop2.isReadable() ? 1 : 0) + \
@@ -720,15 +738,19 @@ void tst_QMetaObjectBuilder::property()
(prop2.hasStdCppSet() ? 1 : 0) + \
(prop2.isEnumOrFlag() ? 1 : 0) + \
(prop2.isConstant() ? 1 : 0) + \
- (prop2.isFinal() ? 1 : 0))
+ (prop2.isFinal() ? 1 : 0) + \
+ (prop2.isBindable() ? 1 : 0) + \
+ (prop2.isRequired() ? 1 : 0))
#define CHECK_FLAG(setFunc,isFunc) \
do { \
+ ++flagCounter; \
CLEAR_FLAGS(); \
QCOMPARE(COUNT_FLAGS(), 0); \
prop2.setFunc(true); \
QVERIFY(prop2.isFunc()); \
QCOMPARE(COUNT_FLAGS(), 1); \
} while (0)
+ int flagCounter = 0;
CHECK_FLAG(setReadable, isReadable);
CHECK_FLAG(setWritable, isWritable);
CHECK_FLAG(setResettable, isResettable);
@@ -739,7 +761,11 @@ void tst_QMetaObjectBuilder::property()
CHECK_FLAG(setStdCppSet, hasStdCppSet);
CHECK_FLAG(setEnumOrFlag, isEnumOrFlag);
CHECK_FLAG(setConstant, isConstant);
+ CHECK_FLAG(setBindable, isBindable);
CHECK_FLAG(setFinal, isFinal);
+ CHECK_FLAG(setRequired, isRequired);
+ SET_ALL_FLAGS();
+ QCOMPARE(COUNT_FLAGS(), flagCounter);
// Check that nothing else changed.
QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::Properties));
diff --git a/tests/auto/corelib/kernel/qpointer/tst_qpointer.cpp b/tests/auto/corelib/kernel/qpointer/tst_qpointer.cpp
index f66bea72828..d53d0d1713d 100644
--- a/tests/auto/corelib/kernel/qpointer/tst_qpointer.cpp
+++ b/tests/auto/corelib/kernel/qpointer/tst_qpointer.cpp
@@ -16,6 +16,23 @@
using namespace std::chrono_literals;
+class Interface
+{
+public:
+ virtual ~Interface() = default;
+ virtual void meep() const = 0;
+};
+
+class ObjectImplementingInterface : public QObject, public Interface
+{
+ Q_OBJECT
+public:
+ using QObject::QObject;
+
+public Q_SLOTS:
+ void meep() const override {}
+};
+
class tst_QPointer : public QObject
{
Q_OBJECT
@@ -31,6 +48,7 @@ private slots:
void assignment_operators();
void compareCompiles();
void equality_operators();
+ void equality_operators_interface();
void swap();
void isNull();
void dereference_operators();
@@ -218,6 +236,7 @@ void tst_QPointer::compareCompiles()
QTestPrivate::testEqualityOperatorsCompile<QPointer<QObject>, QWidget*>();
QTestPrivate::testEqualityOperatorsCompile<QPointer<QObject>, QPointer<QWidget>>();
QTestPrivate::testEqualityOperatorsCompile<QPointer<QObject>, std::nullptr_t>();
+ QTestPrivate::testEqualityOperatorsCompile<QPointer<ObjectImplementingInterface>, Interface*>();
}
void tst_QPointer::equality_operators()
@@ -259,6 +278,25 @@ void tst_QPointer::equality_operators()
#endif
}
+void tst_QPointer::equality_operators_interface()
+{
+ QObject reaper;
+ QPointer<ObjectImplementingInterface> p(new ObjectImplementingInterface(&reaper));
+ Interface *i = p.get();
+
+ ObjectImplementingInterface otherP;
+ Interface *otherI = &otherP;
+
+ // things that are equal
+ QT_TEST_EQUALITY_OPS(p, p, true);
+ QT_TEST_EQUALITY_OPS(p, i, true);
+
+ // things that are not equal
+ QT_TEST_EQUALITY_OPS(p, nullptr, false);
+ QT_TEST_EQUALITY_OPS(p, &otherP, false);
+ QT_TEST_EQUALITY_OPS(p, otherI, false);
+}
+
void tst_QPointer::swap()
{
QPointer<QObject> c1, c2;
diff --git a/tests/auto/corelib/platform/CMakeLists.txt b/tests/auto/corelib/platform/CMakeLists.txt
index 3a66ec2eae6..9810947e3c6 100644
--- a/tests/auto/corelib/platform/CMakeLists.txt
+++ b/tests/auto/corelib/platform/CMakeLists.txt
@@ -5,7 +5,9 @@ if(ANDROID)
add_subdirectory(android)
add_subdirectory(android_appless)
add_subdirectory(androiditemmodel)
- add_subdirectory(android_legacy_packaging)
+ if(NOT QT_USE_ANDROID_MODERN_BUNDLE)
+ add_subdirectory(android_legacy_packaging)
+ endif()
endif()
if(WIN32)
add_subdirectory(windows)
diff --git a/tests/auto/corelib/platform/android_legacy_packaging/testdata/build.gradle b/tests/auto/corelib/platform/android_legacy_packaging/testdata/build.gradle
index cbdd833e2ae..1d796d9b6b9 100644
--- a/tests/auto/corelib/platform/android_legacy_packaging/testdata/build.gradle
+++ b/tests/auto/corelib/platform/android_legacy_packaging/testdata/build.gradle
@@ -70,8 +70,8 @@ android {
abortOnError = false
}
- // Do not compress Qt binary resources file
aaptOptions {
+ // Do not compress Qt binary resources file
noCompress 'rcc'
}
diff --git a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp
index 35eda3ad709..bfc6074689b 100644
--- a/tests/auto/corelib/text/qlocale/tst_qlocale.cpp
+++ b/tests/auto/corelib/text/qlocale/tst_qlocale.cpp
@@ -445,14 +445,16 @@ void tst_QLocale::defaulted_ctor()
TEST_CTOR(English, UnitedStates, QLocale::English, QLocale::UnitedStates);
TEST_CTOR(English, France, QLocale::English, QLocale::France);
TEST_CTOR(English, UnitedKingdom, QLocale::English, QLocale::UnitedKingdom);
+ // Used in tests below to check we pick the likely-best substitute consistently:
+ TEST_CTOR(Arabic, UnitedStates, QLocale::Arabic, QLocale::Egypt);
TEST_CTOR(French, France, QLocale::French, QLocale::France);
TEST_CTOR(C, France, QLocale::C, QLocale::AnyTerritory);
TEST_CTOR(Spanish, LatinAmerica, QLocale::Spanish,
QLocale::LatinAmerica);
- QLocale::setDefault(QLocale(QLocale::English, QLocale::France));
- CHECK_DEFAULT(QLocale::English, QLocale::France);
+ QLocale::setDefault(QLocale(QLocale::Arabic, QLocale::UnitedStates));
+ CHECK_DEFAULT(QLocale::Arabic, QLocale::Egypt);
TEST_CTOR(French, France, QLocale::French, QLocale::France);
TEST_CTOR(English, UnitedKingdom, QLocale::English, QLocale::UnitedKingdom);
@@ -460,7 +462,7 @@ void tst_QLocale::defaulted_ctor()
TEST_CTOR(French, France, QLocale::French, QLocale::France);
TEST_CTOR(C, AnyTerritory, QLocale::C, QLocale::AnyTerritory);
TEST_CTOR(C, France, QLocale::C, QLocale::AnyTerritory);
- TEST_CTOR(Aymara, AnyTerritory, QLocale::English, QLocale::France);
+ TEST_CTOR(Aymara, AnyTerritory, QLocale::Arabic, QLocale::Egypt);
QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedKingdom));
CHECK_DEFAULT(QLocale::English, QLocale::UnitedKingdom);
@@ -481,6 +483,7 @@ void tst_QLocale::defaulted_ctor()
TEST_CTOR(English, UnitedStates, QLocale::English, QLocale::UnitedStates);
TEST_CTOR(English, France, QLocale::English, QLocale::France);
TEST_CTOR(English, UnitedKingdom, QLocale::English, QLocale::UnitedKingdom);
+ TEST_CTOR(Arabic, UnitedStates, QLocale::Arabic, QLocale::Egypt);
TEST_CTOR(French, France, QLocale::French, QLocale::France);
TEST_CTOR(C, AnyTerritory, QLocale::C, QLocale::AnyTerritory);
@@ -496,6 +499,7 @@ void tst_QLocale::defaulted_ctor()
TEST_CTOR(English, UnitedStates, QLocale::English, QLocale::UnitedStates);
TEST_CTOR(English, France, QLocale::English, QLocale::France);
TEST_CTOR(English, UnitedKingdom, QLocale::English, QLocale::UnitedKingdom);
+ TEST_CTOR(Arabic, UnitedStates, QLocale::Arabic, QLocale::Egypt);
TEST_CTOR(French, France, QLocale::French, QLocale::France);
TEST_CTOR(C, AnyTerritory, QLocale::C, QLocale::AnyTerritory);
@@ -2466,7 +2470,8 @@ void tst_QLocale::formatTimeZone()
// Time definitely in Standard Time
const QStringList knownCETus = {
u"GMT+1"_s, // ICU
- u"CET"_s // Standard abbreviation
+ u"CET"_s, // Standard abbreviation
+ u"UTC+0100"_s, // used by Emscripten
};
const QString cet = enUS.toString(QDate(2013, 1, 1).startOfDay(), u"t");
QVERIFY2(knownCETus.contains(cet), cet.isEmpty() ? "[empty]" : qPrintable(cet));
@@ -2474,7 +2479,8 @@ void tst_QLocale::formatTimeZone()
// Time definitely in Daylight Time
const QStringList knownCESTus = {
u"GMT+2"_s, // ICU
- u"CEST"_s // Standard abbreviation
+ u"CEST"_s, // Standard abbreviation
+ u"UTC+0200"_s, // used by Emscripten
};
const QString cest = enUS.toString(QDate(2013, 6, 1).startOfDay(), u"t");
QVERIFY2(knownCESTus.contains(cest), cest.isEmpty() ? "[empty]" : qPrintable(cest));
diff --git a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp
index 5804aeeb1e5..87d48d56e6b 100644
--- a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp
+++ b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp
@@ -73,22 +73,22 @@ void tst_QArrayData::referenceCounting()
// Reference counting initialized to 1 (owned)
QArrayData array = { Q_BASIC_ATOMIC_INITIALIZER(1), {}, 0 };
- QCOMPARE(array.ref_.loadRelaxed(), 1);
+ QCOMPARE(array.m_ref.loadRelaxed(), 1);
QVERIFY(array.ref());
- QCOMPARE(array.ref_.loadRelaxed(), 2);
+ QCOMPARE(array.m_ref.loadRelaxed(), 2);
QVERIFY(array.deref());
- QCOMPARE(array.ref_.loadRelaxed(), 1);
+ QCOMPARE(array.m_ref.loadRelaxed(), 1);
QVERIFY(array.ref());
- QCOMPARE(array.ref_.loadRelaxed(), 2);
+ QCOMPARE(array.m_ref.loadRelaxed(), 2);
QVERIFY(array.deref());
- QCOMPARE(array.ref_.loadRelaxed(), 1);
+ QCOMPARE(array.m_ref.loadRelaxed(), 1);
QVERIFY(!array.deref());
- QCOMPARE(array.ref_.loadRelaxed(), 0);
+ QCOMPARE(array.m_ref.loadRelaxed(), 0);
// Now would be a good time to free/release allocated data
}
diff --git a/tests/auto/corelib/tools/qatomicscopedvaluerollback/tst_qatomicscopedvaluerollback.cpp b/tests/auto/corelib/tools/qatomicscopedvaluerollback/tst_qatomicscopedvaluerollback.cpp
index 89bd1d7ff61..b53362b43e9 100644
--- a/tests/auto/corelib/tools/qatomicscopedvaluerollback/tst_qatomicscopedvaluerollback.cpp
+++ b/tests/auto/corelib/tools/qatomicscopedvaluerollback/tst_qatomicscopedvaluerollback.cpp
@@ -5,6 +5,10 @@
#include <QTest>
+#include <chrono>
+
+using namespace std::chrono_literals;
+
class tst_QAtomicScopedValueRollback : public QObject
{
Q_OBJECT
@@ -15,6 +19,7 @@ private Q_SLOTS:
void rollbackToPreviousCommit();
void exceptions();
void earlyExitScope();
+ void mixedTypes();
private:
void earlyExitScope_helper(int exitpoint, std::atomic<int> &member);
};
@@ -132,6 +137,90 @@ void tst_QAtomicScopedValueRollback::earlyExitScope()
}
}
+template <typename T>
+struct Wrap {
+#if __cpp_deduction_guides < 201907L // no CTAD for aggregates
+ Q_IMPLICIT Wrap(T &t) : t{t} {}
+ Q_IMPLICIT Wrap(T &&t) : t{std::move(t)} {}
+#endif
+ T t;
+ Q_IMPLICIT operator T() const { return t; }
+};
+
+void tst_QAtomicScopedValueRollback::mixedTypes()
+{
+ const auto relaxed = std::memory_order_relaxed;
+ {
+ std::atomic a{10'000ms};
+ {
+ QAtomicScopedValueRollback rb(a, 5s);
+ QCOMPARE(a.load(relaxed), 5s);
+ }
+ QCOMPARE(a.load(relaxed), 10s);
+ {
+ QAtomicScopedValueRollback rb(a, 5s, relaxed);
+ QCOMPARE(a.load(relaxed), 5s);
+ }
+ QCOMPARE(a.load(relaxed), 10s);
+ }
+ {
+ QBasicAtomicInteger a{10'000};
+ {
+ QAtomicScopedValueRollback rb(a, Wrap{5'000});
+ QCOMPARE(a.loadRelaxed(), 5'000);
+ }
+ QCOMPARE(a.loadRelaxed(), 10'000);
+ {
+ QAtomicScopedValueRollback rb(a, Wrap{5'000}, relaxed);
+ QCOMPARE(a.loadRelaxed(), 5'000);
+ }
+ QCOMPARE(a.loadRelaxed(), 10'000);
+ }
+ {
+ QAtomicInteger a{10'000};
+ {
+ QAtomicScopedValueRollback rb(a, Wrap{5'000});
+ QCOMPARE(a.loadRelaxed(), 5'000);
+ }
+ QCOMPARE(a.loadRelaxed(), 10'000);
+ {
+ QAtomicScopedValueRollback rb(a, Wrap{5'000}, relaxed);
+ QCOMPARE(a.loadRelaxed(), 5'000);
+ }
+ QCOMPARE(a.loadRelaxed(), 10'000);
+ }
+ {
+ int i = 10'000;
+ int j = 5'000;
+ QBasicAtomicPointer a{&i};
+ {
+ QAtomicScopedValueRollback rb(a, Wrap{&j});
+ QCOMPARE(a.loadRelaxed(), &j);
+ }
+ QCOMPARE(a.loadRelaxed(), &i);
+ {
+ QAtomicScopedValueRollback rb(a, Wrap{&j}, relaxed);
+ QCOMPARE(a.loadRelaxed(), &j);
+ }
+ QCOMPARE(a.loadRelaxed(), &i);
+ }
+ {
+ int i = 10'000;
+ int j = 5'000;
+ QAtomicPointer a{&i};
+ {
+ QAtomicScopedValueRollback rb(a, Wrap{&j});
+ QCOMPARE(a.loadRelaxed(), &j);
+ }
+ QCOMPARE(a.loadRelaxed(), &i);
+ {
+ QAtomicScopedValueRollback rb(a, Wrap{&j}, relaxed);
+ QCOMPARE(a.loadRelaxed(), &j);
+ }
+ QCOMPARE(a.loadRelaxed(), &i);
+ }
+}
+
static void operator*=(std::atomic<int> &lhs, int rhs)
{
int expected = lhs.load();
diff --git a/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp b/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
index 36cf8ac8fd8..18fe43fbcea 100644
--- a/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
+++ b/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
@@ -35,6 +35,8 @@ private slots:
void write();
void icoMask_data();
void icoMask();
+ void origBitDepth_data();
+ void origBitDepth();
private:
QString m_IconPath;
@@ -354,6 +356,40 @@ void tst_QIcoImageFormat::icoMask()
QCOMPARE(inImage, outImage);
}
+void tst_QIcoImageFormat::origBitDepth_data()
+{
+ QTest::addColumn<QString>("file");
+ QTest::addColumn<QList<int>>("origBitDepths");
+
+ QTest::newRow("35FLOPPY") << "35FLOPPY.ICO" << QList<int>{4};
+ QTest::newRow("abcardWindow") << "abcardWindow.ico" << QList<int>{8};
+ QTest::newRow("AddPerf") << "AddPerfMon.ico" << QList<int>{4};
+ QTest::newRow("App") << "App.ico" << QList<int>{4};
+ QTest::newRow("Obj_N2_Internal_Mem") << "Obj_N2_Internal_Mem.ico" << QList<int>{4, 8, 32};
+ QTest::newRow("Qt") << "Qt.ico" << QList<int>{32};
+ QTest::newRow("semitransparent") << "semitransparent.ico" << QList<int>{4};
+ QTest::newRow("Status_Play") << "Status_Play.ico" << QList<int>{4, 8, 32};
+ QTest::newRow("TIMER01") << "TIMER01.ICO" << QList<int>{4};
+ QTest::newRow("trolltechlogo_tiny") << "trolltechlogo_tiny.ico" << QList<int>{8};
+ QTest::newRow("WORLD") << "WORLD.ico" << QList<int>{8, 4, 4};
+ QTest::newRow("yellow") << "yellow.cur" << QList<int>{32};
+}
+
+void tst_QIcoImageFormat::origBitDepth()
+{
+ QFETCH(QString, file);
+ QFETCH(QList<int>, origBitDepths);
+
+ QImage image;
+ QImageReader reader(m_IconPath + QLatin1String("/valid/") + file);
+
+ for (int depth : origBitDepths) {
+ reader.read(&image);
+ QCOMPARE(image.text("_q_icoOrigDepth").toInt(), depth);
+ reader.jumpToNextImage();
+ }
+}
+
QTEST_MAIN(tst_QIcoImageFormat)
#include "tst_qicoimageformat.moc"
diff --git a/tests/auto/gui/kernel/qopenglwindow/tst_qopenglwindow.cpp b/tests/auto/gui/kernel/qopenglwindow/tst_qopenglwindow.cpp
index 6019261f792..06a1ffb2960 100644
--- a/tests/auto/gui/kernel/qopenglwindow/tst_qopenglwindow.cpp
+++ b/tests/auto/gui/kernel/qopenglwindow/tst_qopenglwindow.cpp
@@ -26,9 +26,6 @@ private slots:
void tst_QOpenGLWindow::initTestCase()
{
-#if !QT_CONFIG(run_opengl_tests)
- QSKIP("Skip test as run-opengl-tests feature is off.");
-#endif
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL))
QSKIP("OpenGL is not supported on this platform.");
}
diff --git a/tests/auto/gui/kernel/qwindow/BLACKLIST b/tests/auto/gui/kernel/qwindow/BLACKLIST
index a92d89c6123..4f994fb3059 100644
--- a/tests/auto/gui/kernel/qwindow/BLACKLIST
+++ b/tests/auto/gui/kernel/qwindow/BLACKLIST
@@ -25,6 +25,5 @@ android
windows-10
windows-11
android
-rhel
[windowExposedAfterReparent]
xcb ubuntu-24.04 # QTBUG-129023
diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
index 39051276371..66bb0fa84d8 100644
--- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
+++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
@@ -11,6 +11,7 @@
#include <QtGui/QPainter>
#include <QTest>
+#include <QtTest/private/qtesthelpers_p.h>
#include <QSignalSpy>
#include <QEvent>
#include <QStyleHints>
@@ -1237,6 +1238,7 @@ void tst_QWindow::testInputEvents()
window.setGeometry(QRect(m_availableTopLeft + QPoint(80, 80), m_testWindowSize));
window.showNormal();
QTRY_VERIFY(window.isActive());
+ QVERIFY(QTestPrivate::ensurePositionTopLeft(&window));
QTest::keyClick(&window, Qt::Key_A, Qt::NoModifier);
QCoreApplication::processEvents();
@@ -3264,12 +3266,14 @@ void tst_QWindow::windowExposedAfterReparent()
QVERIFY(QTest::qWaitForWindowExposed(&parent));
QVERIFY(QTest::qWaitForWindowExposed(&child));
+ // Close the child before reparenting it to ensure it is correctly converted
+ // to a toplevel window by the window manager.
+ child.close();
child.setParent(nullptr);
- QCoreApplication::processEvents();
+ child.show();
QVERIFY(QTest::qWaitForWindowExposed(&child));
child.setParent(&parent);
- QCoreApplication::processEvents();
QVERIFY(QTest::qWaitForWindowExposed(&child));
}
diff --git a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp
index bd4a230b78a..d4dc6544a0e 100644
--- a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp
+++ b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp
@@ -894,6 +894,13 @@ void tst_QQuaternion::fromAxes()
QQuaternion result = QQuaternion::fromAxisAndAngle(QVector3D(x1, y1, z1), angle);
+ {
+ const auto axes = result.toAxes();
+ QVERIFY(myFuzzyCompare(axes.x, xAxis));
+ QVERIFY(myFuzzyCompare(axes.y, yAxis));
+ QVERIFY(myFuzzyCompare(axes.z, zAxis));
+ }
+
QVector3D axes[3];
result.getAxes(&axes[0], &axes[1], &axes[2]);
QVERIFY(myFuzzyCompare(axes[0], xAxis));
@@ -985,8 +992,7 @@ void tst_QQuaternion::fromDirection_data()
// othonormal up and dir
for (QQuaternion q : orientations) {
- QVector3D xAxis, yAxis, zAxis;
- q.getAxes(&xAxis, &yAxis, &zAxis);
+ const auto [xAxis, yAxis, zAxis] = q.toAxes();
QTest::addRow("ortho dirs: (%.1f,%.1f,%.1f), (%.1f,%.1f,%.1f), (%.1f,%.1f,%.1f)",
xAxis.x(), xAxis.y(), xAxis.z(),
@@ -1007,8 +1013,7 @@ void tst_QQuaternion::fromDirection_data()
// invalid up
for (QQuaternion q : orientations) {
- QVector3D xAxis, yAxis, zAxis;
- q.getAxes(&xAxis, &yAxis, &zAxis);
+ const auto [xAxis, yAxis, zAxis] = q.toAxes();
QTest::addRow("bad dirs: (%.1f,%.1f,%.1f), (%.1f,%.1f,%.1f), (%.1f,%.1f,%.1f)",
xAxis.x(), xAxis.y(), xAxis.z(),
@@ -1029,16 +1034,14 @@ void tst_QQuaternion::fromDirection()
QQuaternion result = QQuaternion::fromDirection(direction, up);
QVERIFY(myFuzzyCompare(result, result.normalized()));
- QVector3D xAxis, yAxis, zAxis;
- result.getAxes(&xAxis, &yAxis, &zAxis);
-
- QVERIFY(myFuzzyCompare(zAxis, expectedZ));
+ const auto axes = result.toAxes();
+ QVERIFY(myFuzzyCompare(axes.z, expectedZ));
const QVector3D expectedX = QVector3D::crossProduct(expectedY, expectedZ);
if (!qFuzzyIsNull(expectedX.lengthSquared())) {
- QVERIFY(myFuzzyCompare(xAxis, expectedX));
- QVERIFY(myFuzzyCompare(yAxis, expectedY));
+ QVERIFY(myFuzzyCompare(axes.x, expectedX));
+ QVERIFY(myFuzzyCompare(axes.y, expectedY));
}
}
diff --git a/tests/auto/gui/qopengl/tst_qopengl.cpp b/tests/auto/gui/qopengl/tst_qopengl.cpp
index b9b4c3aa11c..36ff1d1f2e9 100644
--- a/tests/auto/gui/qopengl/tst_qopengl.cpp
+++ b/tests/auto/gui/qopengl/tst_qopengl.cpp
@@ -185,9 +185,6 @@ static QSurface *createSurface(int surfaceClass)
void tst_QOpenGL::initTestCase()
{
-#if !QT_CONFIG(run_opengl_tests)
- QSKIP("Skip test as run-opengl-tests feature is off.");
-#endif
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL))
QSKIP("OpenGL is not supported on this platform.");
}
diff --git a/tests/auto/gui/qopenglconfig/tst_qopenglconfig.cpp b/tests/auto/gui/qopenglconfig/tst_qopenglconfig.cpp
index f597dac53d7..423f9419daf 100644
--- a/tests/auto/gui/qopenglconfig/tst_qopenglconfig.cpp
+++ b/tests/auto/gui/qopenglconfig/tst_qopenglconfig.cpp
@@ -139,9 +139,6 @@ static void dumpConfiguration(QTextStream &str)
void tst_QOpenGlConfig::initTestCase()
{
-#if !QT_CONFIG(run_opengl_tests)
- QSKIP("Skip test as run-opengl-tests feature is off.");
-#endif
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL))
QSKIP("OpenGL is not supported on this platform.");
}
diff --git a/tests/auto/gui/text/qfont/BLACKLIST b/tests/auto/gui/text/qfont/BLACKLIST
index 2d2440255ae..3f63b678bb5 100644
--- a/tests/auto/gui/text/qfont/BLACKLIST
+++ b/tests/auto/gui/text/qfont/BLACKLIST
@@ -1,12 +1,9 @@
[defaultFamily:cursive]
centos
b2qt
-rhel
[defaultFamily:fantasy]
centos
b2qt
-rhel
-
# QTBUG-130738
[familyNameWithCommaQuote:weird]
vxworks
diff --git a/tests/auto/network/kernel/qnetworkinterface/BLACKLIST b/tests/auto/network/kernel/qnetworkinterface/BLACKLIST
deleted file mode 100644
index e9f4678e8ef..00000000000
--- a/tests/auto/network/kernel/qnetworkinterface/BLACKLIST
+++ /dev/null
@@ -1,5 +0,0 @@
-# QTBUG-130070
-[localAddress:enet0-fe80::8f41:f072:e573:3caa%enet0]
-vxworks
-[localAddress:localhost-ipv6]
-vxworks
diff --git a/tests/auto/other/android/CMakeLists.txt b/tests/auto/other/android/CMakeLists.txt
index bcbf5b657d7..0eb2d00b46a 100644
--- a/tests/auto/other/android/CMakeLists.txt
+++ b/tests/auto/other/android/CMakeLists.txt
@@ -2,3 +2,11 @@
# SPDX-License-Identifier: BSD-3-Clause
add_subdirectory(deployment_settings)
+add_subdirectory(permissions)
+
+if(QT_USE_TARGET_ANDROID_BUILD_DIR)
+ add_subdirectory(package_source_dir)
+ if(QT_USE_ANDROID_MODERN_BUNDLE)
+ add_subdirectory(dynamic_feature)
+ endif()
+endif()
diff --git a/tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp b/tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp
index 1687ed9de92..571570e370f 100644
--- a/tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp
+++ b/tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp
@@ -83,10 +83,11 @@ void tst_android_deployment_settings::DeploymentSettings_data()
<< "org.qtproject.android_deployment_settings_test";
QTest::newRow("android-app-name") << "android-app-name"
<< "Android Deployment Settings Test";
- QTest::newRow("permissions") << "permissions"
- << "[{\"name\":\"PERMISSION_WITH_ATTRIBUTES\","
- "\"extras\":\"android:minSdkVersion='32' android:maxSdkVersion='34' \"},"
- "{\"name\":\"PERMISSION_WITHOUT_ATTRIBUTES\"}]";
+ QTest::newRow("permissions")
+ << "permissions"
+ << "[{\"maxSdkVersion\":\"34\",\"minSdkVersion\":\"32\",\"name\":\"PERMISSION_WITH_"
+ "ATTRIBUTES\"},{\"name\":\"PERMISSION_WITHOUT_ATTRIBUTES\"},{\"name\":\"android."
+ "permission.INTERNET\"},{\"name\":\"android.permission.WRITE_EXTERNAL_STORAGE\"}]";
}
void tst_android_deployment_settings::DeploymentSettings()
diff --git a/tests/auto/other/android/dynamic_feature/CMakeLists.txt b/tests/auto/other/android/dynamic_feature/CMakeLists.txt
new file mode 100644
index 00000000000..b12c2af4dc7
--- /dev/null
+++ b/tests/auto/other/android/dynamic_feature/CMakeLists.txt
@@ -0,0 +1,33 @@
+# Copyright (C) 2025 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.16)
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_android_dynamic_feature LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+add_subdirectory(feature)
+
+qt_internal_add_test(tst_android_dynamic_feature
+ SOURCES
+ tst_android_dynamic_feature.cpp
+ storeloader/storeloader.h
+ storeloader/storeloader.cpp
+ INCLUDE_DIRECTORIES
+ storeloader
+ LIBRARIES
+ Qt6::Test
+ Qt6::Gui
+ Qt6::CorePrivate
+)
+
+set_property(TARGET tst_android_dynamic_feature PROPERTY
+ QT_ANDROID_PACKAGE_NAME "org.qtproject.example.android_dynamic_feature")
+set_property(TARGET tst_android_dynamic_feature APPEND PROPERTY
+ _qt_android_gradle_java_source_dirs "${CMAKE_CURRENT_SOURCE_DIR}/storeloader/java")
+
+qt6_add_android_dynamic_features(tst_android_dynamic_feature FEATURE_TARGETS
+ tst_android_dynamic_feature_resources)
diff --git a/tests/auto/other/android/dynamic_feature/feature/CMakeLists.txt b/tests/auto/other/android/dynamic_feature/feature/CMakeLists.txt
new file mode 100644
index 00000000000..bfe29cc0f5e
--- /dev/null
+++ b/tests/auto/other/android/dynamic_feature/feature/CMakeLists.txt
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 3.16)
+
+qt6_add_library(tst_android_dynamic_feature_resources SHARED)
+qt6_add_resources(tst_android_dynamic_feature_resources "dynamic_resources"
+ PREFIX "/dynamic_resources"
+ FILES "qtlogo.png")
+
+target_link_libraries(tst_android_dynamic_feature_resources PRIVATE Qt6::Core)
diff --git a/tests/auto/other/android/dynamic_feature/feature/qtlogo.png b/tests/auto/other/android/dynamic_feature/feature/qtlogo.png
new file mode 100644
index 00000000000..b63f1384b11
--- /dev/null
+++ b/tests/auto/other/android/dynamic_feature/feature/qtlogo.png
Binary files differ
diff --git a/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoader.java b/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoader.java
new file mode 100644
index 00000000000..5a72351c802
--- /dev/null
+++ b/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoader.java
@@ -0,0 +1,175 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+package org.qtproject.example.android_dynamic_feature;
+
+import com.google.android.play.core.splitcompat.SplitCompat;
+import com.google.android.play.core.splitinstall.SplitInstallManager;
+import com.google.android.play.core.splitinstall.SplitInstallManagerFactory;
+import com.google.android.play.core.splitinstall.SplitInstallRequest;
+import com.google.android.play.core.splitinstall.SplitInstallHelper;
+import com.google.android.play.core.splitinstall.testing.FakeSplitInstallManagerFactory;
+import android.content.pm.PackageManager.NameNotFoundException;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.io.File;
+import android.util.Log;
+import android.content.Context;
+import android.os.Build;
+
+/**
+ * Android implementation of store loader.
+ */
+public class StoreLoader implements StoreLoaderListenerCallback
+{
+ private static final String TAG = "StoreLoader";
+ private final SplitInstallManager m_splitInstallManager;
+ private HashMap<String, StoreLoaderListener> m_listeners =
+ new HashMap();
+ private Context m_context;
+ private String m_moduleName;
+
+ public static native void stateChangedNative(String callId, int state);
+ public static native void errorOccurredNative(String callId, int errorCode,
+ String errorMessage);
+ public static native void userConfirmationRequestedNative(String callId, int errorCode,
+ String errorMessage);
+ public static native void downloadProgressChangedNative(String callId, long bytes, long total);
+ public static native void finishedNative(String callId);
+
+ public StoreLoader(Context context) {
+ m_context = context;
+
+ SplitCompat.install(context);
+
+ m_splitInstallManager = SplitInstallManagerFactory.create(context);
+ if (m_splitInstallManager == null)
+ Log.e(TAG,"Constructor: Did not get splitInstallManager");
+ }
+
+ /**
+ * Loads Feature Delivery module from a play store.
+ */
+ public void installModuleFromStore(String moduleName, String callId) {
+ Log.d(TAG, "installModuleFromStore: " + moduleName + " " + callId);
+ m_moduleName = moduleName;
+
+ registerListener(callId);
+
+ SplitInstallRequest request =
+ SplitInstallRequest.newBuilder().addModule(m_moduleName).build();
+ if (request == null)
+ Log.e(TAG, "Null request");
+
+ if (m_splitInstallManager == null)
+ Log.e(TAG, "Null m_splitInstallManager");
+
+ m_splitInstallManager.startInstall(request)
+ .addOnSuccessListener(sessionId -> {
+ Log.d(TAG, "Install start call succesfull");
+ StoreLoaderListener listener = m_listeners.get(callId);
+ if (listener != null) {
+ if (!listener.isCancelled())
+ listener.setSessionId(sessionId);
+ else
+ m_splitInstallManager.cancelInstall(sessionId);
+ } else {
+ Log.d(TAG, "Listener for callId '" + callId + "' is not found");
+ }
+ });
+ }
+
+ public void onStateChanged(String callId, int state) {
+ stateChangedNative(callId, state);
+ if (state == StoreLoaderListenerCallback.LOADED ||
+ state == StoreLoaderListenerCallback.CANCELED) {
+ finished(callId);
+ }
+ }
+
+ public void onErrorOccurred(String callId, int errorCode, String errorMessage) {
+ onStateChanged(callId, ERROR);
+
+ Log.e(TAG, "Error occurred " + errorCode + " " + errorMessage);
+ errorOccurredNative(callId, errorCode, errorMessage);
+ finished(callId);
+ }
+
+ public void onUserConfirmationRequested(String callId, int errorCode, String errorMessage) {
+ Log.d(TAG, "Requires user confirmation " + errorCode);
+ userConfirmationRequestedNative(callId, errorCode, errorMessage);
+ }
+
+ public void onDownloadProgressChanged(String callId, long bytes, long total) {
+ Log.d(TAG, "Downloading " + bytes + "/" + total);
+ downloadProgressChangedNative(callId, bytes, total);
+ }
+
+ public void onLoadLibrary(String callId) {
+ Log.d(TAG, "Load library for the module " + m_moduleName);
+
+ stateChangedNative(callId, StoreLoaderListenerCallback.LOADING);
+ // update context.
+ try {
+ m_context = m_context.createPackageContext(m_context.getPackageName(), 0);
+ } catch (NameNotFoundException ignored) {
+ Log.e(TAG, "Could not get package name");
+ }
+ // install splitcompat for new context.
+ SplitCompat.install(m_context);
+ // try to load new library
+ boolean isLoaded = false;
+ for (String abi : Build.SUPPORTED_ABIS) {
+ String fullLibraryName = m_moduleName + "_" + abi;
+ try {
+ System.loadLibrary(fullLibraryName);
+ isLoaded = true;
+ break;
+ } catch (Exception e) {
+ Log.d(TAG, "Exception occurred when loading the library " + fullLibraryName + ":" +
+ e.getClass().getCanonicalName());
+ }
+ }
+
+ if (isLoaded)
+ onStateChanged(callId, StoreLoaderListenerCallback.LOADED);
+ else
+ onErrorOccurred(callId, -1, "Error loading library. Check logcat for details.");
+
+ }
+
+ public void cancelInstall(String callId) {
+ StoreLoaderListener listener = m_listeners.get(callId);
+ if (listener == null) {
+ Log.e(TAG, "The listener for callId " + callId + " is not found");
+ return;
+ }
+
+ if (listener.getSessionId() < 0)
+ listener.postponeCancel();
+ else
+ m_splitInstallManager.cancelInstall(listener.getSessionId());
+ }
+
+ private void finished(String callId) {
+ unregisterListener(callId);
+ finishedNative(callId);
+ }
+
+ private void registerListener(String callId) {
+ Log.d(TAG, "registerListener");
+ StoreLoaderListener listener = new StoreLoaderListener(this, callId);
+ if (listener != null) {
+ m_listeners.put(callId, listener);
+ m_splitInstallManager.registerListener(listener);
+ }
+ }
+
+ private void unregisterListener(String callId) {
+ Log.d(TAG, "unregisterListener");
+ StoreLoaderListener listener = m_listeners.remove(callId);
+ if (listener != null)
+ m_splitInstallManager.unregisterListener(listener);
+ }
+}
diff --git a/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListener.java b/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListener.java
new file mode 100644
index 00000000000..3e83a0fa7f9
--- /dev/null
+++ b/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListener.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+package org.qtproject.example.android_dynamic_feature;
+
+import com.google.android.play.core.splitinstall.SplitInstallStateUpdatedListener;
+import com.google.android.play.core.splitinstall.SplitInstallSessionState;
+import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus;
+
+import android.util.Log;
+
+public class StoreLoaderListener implements SplitInstallStateUpdatedListener {
+
+ private final StoreLoaderListenerCallback m_callback;
+ private final String m_callId;
+ private int m_installSessionId = -1;
+ private static final String TAG = "StoreLoaderListener";
+ private int m_currentStatus = SplitInstallSessionStatus.UNKNOWN;
+ private boolean m_postponeCancel = false;
+
+ public StoreLoaderListener(StoreLoaderListenerCallback callback, String callId) {
+ m_callback = callback;
+ m_callId = callId;
+ }
+
+ public void setSessionId(int sessionId) { m_installSessionId = sessionId; }
+ public int getSessionId() { return m_installSessionId; }
+
+ public void postponeCancel() { m_postponeCancel = true; }
+ public boolean isCancelled() { return m_postponeCancel; }
+
+ @Override
+ public void onStateUpdate(SplitInstallSessionState state) {
+ Log.d(TAG,
+ "onStateUpdate, status: " + state.status() + " session id: " + state.sessionId());
+ if (state.sessionId() != m_installSessionId) {
+ // Not mine
+ return;
+ }
+
+ switch (state.status()) {
+ case SplitInstallSessionStatus.DOWNLOADING:
+ Log.d(TAG,
+ "SplitInstallSessionState: DOWNLOADING " + state.bytesDownloaded() + "/"
+ + state.totalBytesToDownload());
+ if (m_currentStatus != SplitInstallSessionStatus.DOWNLOADING)
+ m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.DOWNLOADING);
+
+ m_callback.onDownloadProgressChanged(m_callId, state.bytesDownloaded(),
+ state.totalBytesToDownload());
+ break;
+ case SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION:
+ Log.d(TAG, "SplitInstallSessionState: REQUIRES_USER_CONFIRMATION");
+ m_callback.onStateChanged(m_callId,
+ StoreLoaderListenerCallback.REQUIRES_USER_CONFIRMATION);
+
+ m_callback.onUserConfirmationRequested(m_callId, state.errorCode(), "" /*noop for now*/);
+ break;
+ case SplitInstallSessionStatus.INSTALLED:
+ Log.d(TAG, "SplitInstallSessionState: INSTALLED");
+ m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.INSTALLED);
+ m_callback.onLoadLibrary(m_callId);
+ break;
+ case SplitInstallSessionStatus.INSTALLING:
+ Log.d(TAG, "SplitInstallSessionState: INSTALLING");
+ m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.INSTALLING);
+ break;
+ case SplitInstallSessionStatus.FAILED:
+ Log.d(TAG,
+ "SplitInstallSessionState: FAILED with error code: " + state.errorCode());
+ m_callback.onErrorOccurred(m_callId, state.errorCode(), "" /*noop for now*/);
+ break;
+ case SplitInstallSessionStatus.PENDING:
+ Log.d(TAG, "SplitInstallSessionState: PENDING");
+ m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.PENDING);
+ break;
+ case SplitInstallSessionStatus.DOWNLOADED:
+ Log.d(TAG, "SplitInstallSessionState: DOWNLOADED");
+ m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.DOWNLOADED);
+ break;
+ case SplitInstallSessionStatus.CANCELED:
+ Log.d(TAG, "SplitInstallSessionState: CANCELED");
+ m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.CANCELED);
+ break;
+ case SplitInstallSessionStatus.CANCELING:
+ Log.d(TAG, "SplitInstallSessionState: CANCELING");
+ m_callback.onStateChanged(m_callId, StoreLoaderListenerCallback.CANCELING);
+ break;
+ }
+ m_currentStatus = state.status();
+ }
+}
diff --git a/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListenerCallback.java b/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListenerCallback.java
new file mode 100644
index 00000000000..99c7327e328
--- /dev/null
+++ b/tests/auto/other/android/dynamic_feature/storeloader/java/src/main/java/org/qtproject/example/android_dynamic_feature/StoreLoaderListenerCallback.java
@@ -0,0 +1,26 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+package org.qtproject.example.android_dynamic_feature;
+
+public interface StoreLoaderListenerCallback {
+ public static final int UNKNOWN = 0; // Unused but native part has and uses one.
+ public static final int INITIALIZED = 1;
+ public static final int PENDING = 2;
+ public static final int DOWNLOADING = 3;
+ public static final int DOWNLOADED = 4;
+ public static final int REQUIRES_USER_CONFIRMATION = 5;
+ public static final int CANCELING = 6;
+ public static final int CANCELED = 7;
+ public static final int INSTALLING = 8;
+ public static final int INSTALLED = 9;
+ public static final int LOADING = 10;
+ public static final int LOADED = 11;
+ public static final int ERROR = 12;
+
+ public void onStateChanged(String callId, int state);
+ public void onErrorOccurred(String callId, int errorCode, String errorMessage);
+ public void onUserConfirmationRequested(String callId, int errorCode, String errorMessage);
+ public void onDownloadProgressChanged(String callId, long bytes, long total);
+ public void onLoadLibrary(String callId);
+}
diff --git a/tests/auto/other/android/dynamic_feature/storeloader/storeloader.cpp b/tests/auto/other/android/dynamic_feature/storeloader/storeloader.cpp
new file mode 100644
index 00000000000..7abce59b79e
--- /dev/null
+++ b/tests/auto/other/android/dynamic_feature/storeloader/storeloader.cpp
@@ -0,0 +1,227 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+#include "storeloader.h"
+
+#include <QtCore/private/qobject_p.h>
+#include <QtCore/qcoreapplication.h>
+#include <QtCore/qhash.h>
+#include <QtCore/qjniobject.h>
+#include <QtCore/qlogging.h>
+#include <QtCore/qmutex.h>
+#include <QtCore/quuid.h>
+
+#include <jni.h>
+
+Q_DECLARE_JNI_CLASS(StoreLoader,
+ "org/qtproject/example/android_dynamic_feature/StoreLoader");
+
+class StoreLoaderHandlerPrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(StoreLoaderHandler)
+public:
+ void setState(StoreLoader::State state)
+ {
+ if (m_state == state)
+ return;
+ Q_Q(StoreLoaderHandler);
+ m_state = state;
+ q->stateChanged(m_state);
+ }
+
+ const QString &callId() const & noexcept { return m_callId; }
+
+private:
+ StoreLoader::State m_state = StoreLoader::State::Unknown;
+ QString m_callId = QUuid::createUuid().toString();
+};
+
+namespace QtPrivate {
+QString asString(const jstring &s)
+{
+ return QJniObject(s).toString();
+}
+} // namespace QtPrivate
+
+namespace {
+
+class StoreLoaderImpl
+{
+public:
+ StoreLoaderImpl();
+ bool registerNatives() const;
+
+ void addHandler(StoreLoaderHandler *handler);
+ StoreLoaderHandler *findHandler(const jstring &callId);
+ void removeHandler(const jstring &callId);
+
+ QtJniTypes::StoreLoader loader = nullptr;
+
+private:
+ QHash<QString, QPointer<StoreLoaderHandler>> m_handlers;
+ QMutex m_lock;
+};
+
+Q_GLOBAL_STATIC(StoreLoaderImpl, loaderInstance)
+
+void stateChangedNative(JNIEnv *, jobject, jstring callId, int state)
+{
+ qDebug("State changed %s.", qPrintable(callId));
+
+ if (auto *handler = loaderInstance->findHandler(callId))
+ emit handler->stateChanged(static_cast<StoreLoader::State>(state));
+}
+
+void errorOccurredNative(JNIEnv *, jobject, jstring callId, int errorCode, jstring errorMessage)
+{
+ qDebug("Error occurred %s %d %s.", qPrintable(callId), errorCode, qPrintable(errorMessage));
+ auto *handler = loaderInstance->findHandler(callId);
+ if (!handler)
+ return;
+
+ emit handler->errorOccured(errorCode, QJniObject(errorMessage).toString());
+}
+
+void userConfirmationRequestedNative(JNIEnv *, jobject, jstring callId, int errorCode,
+ jstring errorMessage)
+{
+ qDebug("User confirmation requested %s %d %s.", qPrintable(callId), errorCode,
+ qPrintable(errorMessage));
+ auto *handler = loaderInstance->findHandler(callId);
+ if (!handler)
+ return;
+
+ emit handler->confirmationRequest(errorCode, QJniObject(errorMessage).toString());
+}
+
+void downloadProgressChangedNative(JNIEnv *, jobject, jstring callId, long bytes, long total)
+{
+ qDebug("Download progress changed %ld/%ld.", bytes, total);
+ auto *handler = loaderInstance->findHandler(callId);
+ if (!handler)
+ return;
+
+ emit handler->downloadProgress(bytes, total);
+}
+
+void finishedNative(JNIEnv *, jobject, jstring callId)
+{
+ auto *handler = loaderInstance->findHandler(callId);
+ if (!handler)
+ return;
+
+ emit handler->finished();
+}
+
+} // namespace
+
+Q_DECLARE_JNI_NATIVE_METHOD(stateChangedNative)
+Q_DECLARE_JNI_NATIVE_METHOD(errorOccurredNative)
+Q_DECLARE_JNI_NATIVE_METHOD(userConfirmationRequestedNative)
+Q_DECLARE_JNI_NATIVE_METHOD(downloadProgressChangedNative)
+Q_DECLARE_JNI_NATIVE_METHOD(finishedNative)
+
+StoreLoaderImpl::StoreLoaderImpl()
+{
+ loader = QJniObject::construct<QtJniTypes::StoreLoader, QtJniTypes::Context>(
+ QNativeInterface::QAndroidApplication::context());
+}
+
+bool StoreLoaderImpl::registerNatives() const
+{
+ static bool result = [] {
+ return QtJniTypes::StoreLoader::registerNativeMethods({
+ Q_JNI_NATIVE_METHOD(stateChangedNative),
+ Q_JNI_NATIVE_METHOD(errorOccurredNative),
+ Q_JNI_NATIVE_METHOD(userConfirmationRequestedNative),
+ Q_JNI_NATIVE_METHOD(downloadProgressChangedNative),
+ Q_JNI_NATIVE_METHOD(finishedNative),
+ });
+ }();
+
+ if (!result)
+ qCritical("Unable to register native methods.");
+
+ return result;
+}
+
+void StoreLoaderImpl::addHandler(StoreLoaderHandler *handler)
+{
+ Q_ASSERT(handler);
+
+ QMutexLocker lock(&m_lock);
+ const auto &callId = handler->callId();
+ Q_ASSERT_X(m_handlers.constFind(callId) != m_handlers.constEnd(), "StoreLoaderImpl::addHandler",
+ qPrintable(QString("Handler with callId %1 already exists.").arg(callId)));
+
+ m_handlers[callId] = QPointer(handler);
+}
+
+
+StoreLoaderHandler *StoreLoaderImpl::findHandler(const jstring &callId)
+{
+ QMutexLocker lock(&m_lock);
+ const auto it = m_handlers.constFind(QJniObject(callId).toString());
+ if (it == m_handlers.constEnd()) {
+ qCritical("The handler for the call %s was not found.", qPrintable(callId));
+ return nullptr;
+ }
+
+ if (it.value().isNull()) {
+ qCritical("The handler for the call %s expired.", qPrintable(callId));
+ m_handlers.erase(it);
+ }
+
+ return it.value().get();
+}
+
+void StoreLoaderImpl::removeHandler(const jstring &callId)
+{
+ QMutexLocker lock(&m_lock);
+ m_handlers.remove(QJniObject(callId).toString());
+}
+
+std::unique_ptr<StoreLoaderHandler>
+StoreLoader::loadModule(const QString &moduleName)
+{
+ if (moduleName.isEmpty())
+ return {};
+
+ if (!loaderInstance->registerNatives())
+ return {};
+
+ if (!loaderInstance->loader.isValid()) {
+ qCritical("StoreLoader not constructed");
+ return {};
+ }
+
+ auto handlerPtr = std::make_unique<StoreLoaderHandler>(
+ nullptr, StoreLoaderHandler::PrivateConstructor{});
+ loaderInstance->addHandler(handlerPtr.get());
+
+ const auto &callId = handlerPtr->callId();
+ qDebug("Loading module %s, callId: %s.", qPrintable(moduleName), qPrintable(callId));
+
+ loaderInstance->loader.callMethod<void>("installModuleFromStore", moduleName, callId);
+ return handlerPtr;
+}
+
+StoreLoaderHandler::StoreLoaderHandler(QObject *parent, PrivateConstructor)
+ : QObject(*new StoreLoaderHandlerPrivate(), parent)
+{
+}
+
+StoreLoaderHandler::~StoreLoaderHandler() = default;
+
+const QString &StoreLoaderHandler::callId() const & noexcept
+{
+ Q_D(const StoreLoaderHandler);
+ return d->callId();
+}
+
+void StoreLoaderHandler::cancel()
+{
+ Q_D(StoreLoaderHandler);
+ loaderInstance->loader.callMethod<void>("cancelInstall", d->callId());
+}
+
+#include "moc_storeloader.cpp"
diff --git a/tests/auto/other/android/dynamic_feature/storeloader/storeloader.h b/tests/auto/other/android/dynamic_feature/storeloader/storeloader.h
new file mode 100644
index 00000000000..be4e103207e
--- /dev/null
+++ b/tests/auto/other/android/dynamic_feature/storeloader/storeloader.h
@@ -0,0 +1,65 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef STORELOADER_H
+#define STORELOADER_H
+
+#include <QtCore/qtconfigmacros.h>
+#include <QtCore/qobject.h>
+
+#include <memory>
+
+class StoreLoaderHandler;
+
+namespace StoreLoader {
+ Q_NAMESPACE
+enum class State {
+ Unknown,
+ Initialized,
+ Pending,
+ Downloading,
+ Downloaded,
+ RequiresUserConfirmation,
+ Canceling,
+ Canceled,
+ Installing,
+ Installed,
+ Loading,
+ Loaded,
+ Error,
+};
+Q_ENUM_NS(State)
+
+std::unique_ptr<StoreLoaderHandler> loadModule(const QString &moduleName);
+}; // namespace StoreLoader
+
+class StoreLoaderHandlerPrivate;
+
+class StoreLoaderHandler : public QObject
+{
+ Q_OBJECT
+ QT_DEFINE_TAG_STRUCT(PrivateConstructor);
+
+public:
+ explicit StoreLoaderHandler(QObject *parent, PrivateConstructor);
+ ~StoreLoaderHandler() override;
+
+ const QString &callId() const & noexcept;
+
+ void cancel();
+signals:
+ void stateChanged(StoreLoader::State state);
+ void downloadProgress(qsizetype bytes, qsizetype total);
+ void errorOccured(int errorCode, const QString &errorString);
+ void confirmationRequest(int errorCode, const QString &errorString);
+ void finished();
+
+private:
+ Q_DISABLE_COPY_MOVE(StoreLoaderHandler)
+ Q_DECLARE_PRIVATE(StoreLoaderHandler)
+
+ friend std::unique_ptr<StoreLoaderHandler>
+ StoreLoader::loadModule(const QString &);
+};
+
+#endif // STORELOADER_H
diff --git a/tests/auto/other/android/dynamic_feature/tst_android_dynamic_feature.cpp b/tests/auto/other/android/dynamic_feature/tst_android_dynamic_feature.cpp
new file mode 100644
index 00000000000..739a645c5d5
--- /dev/null
+++ b/tests/auto/other/android/dynamic_feature/tst_android_dynamic_feature.cpp
@@ -0,0 +1,37 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <storeloader.h>
+
+#include <QtTest/QTest>
+#include <QtTest/QSignalSpy>
+
+#include <QtCore/QVariant>
+
+using namespace Qt::Literals::StringLiterals;
+
+class QtDynamicFeatureTest : public QObject
+{
+ Q_OBJECT
+public:
+ QtDynamicFeatureTest(){}
+
+private Q_SLOTS:
+ void loadResourcesFeature();
+};
+
+void QtDynamicFeatureTest::loadResourcesFeature()
+{
+ QVERIFY(!QFile::exists(":/dynamic_resources/qtlogo.png"));
+
+ auto handler = StoreLoader::loadModule("tst_android_dynamic_feature_resources"_L1);
+
+ QSignalSpy spy(handler.get(), &StoreLoaderHandler::finished);
+
+ QVERIFY(spy.wait(20000));
+ QVERIFY(QFile::exists(":/dynamic_resources/qtlogo.png"));
+}
+
+QTEST_MAIN(QtDynamicFeatureTest)
+
+#include "tst_android_dynamic_feature.moc"
diff --git a/tests/auto/other/android/package_source_dir/CMakeLists.txt b/tests/auto/other/android/package_source_dir/CMakeLists.txt
new file mode 100644
index 00000000000..360aa50d87d
--- /dev/null
+++ b/tests/auto/other/android/package_source_dir/CMakeLists.txt
@@ -0,0 +1,54 @@
+# Copyright (C) 2025 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_android_package_source_dir LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+# Package name is generated and written to AndroidManifest.xml
+qt_internal_add_test(tst_package_source_dir_not_defined
+ SOURCES
+ tst_android_package_source_dir.cpp
+ DEFINES
+ EXPECTED_APP_NAME="tst_package_source_dir_not_defined"
+)
+
+# Package name from user-provided AndroidManifest.xml
+qt_internal_add_test(tst_package_source_dir_custom_android_manifest
+ SOURCES
+ tst_android_package_source_dir.cpp
+ DEFINES
+ EXPECTED_APP_NAME="tst_package_source_dir_custom_android_manifest_my"
+)
+
+if(QT_USE_ANDROID_MODERN_BUNDLE)
+ set_target_properties(tst_package_source_dir_custom_android_manifest
+ PROPERTIES
+ QT_ANDROID_PACKAGE_SOURCE_DIR
+ "${CMAKE_CURRENT_SOURCE_DIR}/custom_android_manifest_bundle"
+ )
+else()
+ set_target_properties(tst_package_source_dir_custom_android_manifest
+ PROPERTIES
+ QT_ANDROID_PACKAGE_SOURCE_DIR
+ "${CMAKE_CURRENT_SOURCE_DIR}/custom_android_manifest"
+ )
+endif()
+
+if(QT_USE_ANDROID_MODERN_BUNDLE)
+ # Partial gradle template is only supported by QT_USE_ANDROID_MODERN_BUNDLE
+ #
+ # Package name from user-provided gradle.build.in
+ qt_internal_add_test(tst_package_source_dir_partial_template
+ SOURCES
+ tst_android_package_source_dir.cpp
+ DEFINES
+ EXPECTED_APP_NAME="tst_package_source_dir_partial_template_my"
+ )
+ set_target_properties(tst_package_source_dir_partial_template
+ PROPERTIES
+ QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/partial_template"
+ )
+endif()
diff --git a/tests/auto/other/android/package_source_dir/custom_android_manifest/AndroidManifest.xml b/tests/auto/other/android/package_source_dir/custom_android_manifest/AndroidManifest.xml
new file mode 100644
index 00000000000..4f53295e979
--- /dev/null
+++ b/tests/auto/other/android/package_source_dir/custom_android_manifest/AndroidManifest.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.qtproject.example.tst_package_source_dir_custom_android_manifest"
+ android:installLocation="auto"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <supports-screens
+ android:anyDensity="true"
+ android:largeScreens="true"
+ android:normalScreens="true"
+ android:smallScreens="true" />
+ <application
+ android:name="org.qtproject.qt.android.bindings.QtApplication"
+ android:hardwareAccelerated="true"
+ android:label="tst_package_source_dir_custom_android_manifest_my"
+ android:requestLegacyExternalStorage="true"
+ android:allowBackup="true"
+ android:fullBackupOnly="false">
+ <activity
+ android:name="org.qtproject.qt.android.bindings.QtActivity"
+ android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density"
+ android:launchMode="singleTop"
+ android:screenOrientation="unspecified"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+
+ <meta-data
+ android:name="android.app.lib_name"
+ android:value="tst_package_source_dir_custom_android_manifest" />
+
+ <meta-data
+ android:name="android.app.arguments"
+ android:value="" />
+ </activity>
+
+ <provider
+ android:name="androidx.core.content.FileProvider"
+ android:authorities="${applicationId}.qtprovider"
+ android:exported="false"
+ android:grantUriPermissions="true">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/qtprovider_paths"/>
+ </provider>
+ </application>
+</manifest>
diff --git a/tests/auto/other/android/package_source_dir/custom_android_manifest_bundle/app/AndroidManifest.xml b/tests/auto/other/android/package_source_dir/custom_android_manifest_bundle/app/AndroidManifest.xml
new file mode 100644
index 00000000000..4f53295e979
--- /dev/null
+++ b/tests/auto/other/android/package_source_dir/custom_android_manifest_bundle/app/AndroidManifest.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.qtproject.example.tst_package_source_dir_custom_android_manifest"
+ android:installLocation="auto"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <supports-screens
+ android:anyDensity="true"
+ android:largeScreens="true"
+ android:normalScreens="true"
+ android:smallScreens="true" />
+ <application
+ android:name="org.qtproject.qt.android.bindings.QtApplication"
+ android:hardwareAccelerated="true"
+ android:label="tst_package_source_dir_custom_android_manifest_my"
+ android:requestLegacyExternalStorage="true"
+ android:allowBackup="true"
+ android:fullBackupOnly="false">
+ <activity
+ android:name="org.qtproject.qt.android.bindings.QtActivity"
+ android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density"
+ android:launchMode="singleTop"
+ android:screenOrientation="unspecified"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+
+ <meta-data
+ android:name="android.app.lib_name"
+ android:value="tst_package_source_dir_custom_android_manifest" />
+
+ <meta-data
+ android:name="android.app.arguments"
+ android:value="" />
+ </activity>
+
+ <provider
+ android:name="androidx.core.content.FileProvider"
+ android:authorities="${applicationId}.qtprovider"
+ android:exported="false"
+ android:grantUriPermissions="true">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/qtprovider_paths"/>
+ </provider>
+ </application>
+</manifest>
diff --git a/tests/auto/other/android/package_source_dir/partial_template/app/AndroidManifest.xml b/tests/auto/other/android/package_source_dir/partial_template/app/AndroidManifest.xml
new file mode 100644
index 00000000000..838d239e5f4
--- /dev/null
+++ b/tests/auto/other/android/package_source_dir/partial_template/app/AndroidManifest.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.qtproject.example.tst_package_source_dir_partial_template"
+ android:installLocation="auto"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <supports-screens
+ android:anyDensity="true"
+ android:largeScreens="true"
+ android:normalScreens="true"
+ android:smallScreens="true" />
+ <application
+ android:name="org.qtproject.qt.android.bindings.QtApplication"
+ android:hardwareAccelerated="true"
+ android:label="${appName}"
+ android:requestLegacyExternalStorage="true"
+ android:allowBackup="true"
+ android:fullBackupOnly="false">
+ <activity
+ android:name="org.qtproject.qt.android.bindings.QtActivity"
+ android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density"
+ android:launchMode="singleTop"
+ android:screenOrientation="unspecified"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+
+ <meta-data
+ android:name="android.app.lib_name"
+ android:value="tst_package_source_dir_partial_template" />
+
+ <meta-data
+ android:name="android.app.arguments"
+ android:value="" />
+ </activity>
+
+ <provider
+ android:name="androidx.core.content.FileProvider"
+ android:authorities="${applicationId}.qtprovider"
+ android:exported="false"
+ android:grantUriPermissions="true">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/qtprovider_paths"/>
+ </provider>
+ </application>
+</manifest>
diff --git a/tests/auto/other/android/package_source_dir/partial_template/app/build.gradle.in b/tests/auto/other/android/package_source_dir/partial_template/app/build.gradle.in
new file mode 100644
index 00000000000..538f1ca6217
--- /dev/null
+++ b/tests/auto/other/android/package_source_dir/partial_template/app/build.gradle.in
@@ -0,0 +1,54 @@
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:8.6.0'
+ }
+}
+
+apply plugin: '@GRADLE_PLUGIN_TYPE@'
+
+dependencies {
+ @GRADLE_DEPENDENCIES@
+}
+
+android {
+ namespace '@PACKAGE_NAME@'
+ compileSdkVersion '@ANDROID_COMPILE_SDK_VERSION@'
+ buildToolsVersion '@ANDROID_BUILD_TOOLS_VERSION@'
+ ndkVersion '@ANDROID_NDK_REVISION@'
+
+ defaultConfig {
+ @DEFAULT_CONFIG_VALUES@
+ manifestPlaceholders = [ appName:"tst_package_source_dir_partial_template_my" ]
+ }
+
+ sourceSets {
+ main {
+@SOURCE_SETS@
+ }
+ }
+
+ tasks.withType(JavaCompile) {
+ options.incremental = true
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+
+ aaptOptions {
+ // Do not compress Qt binary resources file
+ noCompress 'rcc'
+ }
+
+ @ANDROID_DEPLOYMENT_EXTRAS@
+}
diff --git a/tests/auto/other/android/package_source_dir/tst_android_package_source_dir.cpp b/tests/auto/other/android/package_source_dir/tst_android_package_source_dir.cpp
new file mode 100644
index 00000000000..d74d388371f
--- /dev/null
+++ b/tests/auto/other/android/package_source_dir/tst_android_package_source_dir.cpp
@@ -0,0 +1,47 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QCoreApplication>
+#include <QJniObject>
+#include <QTest>
+#include <QDebug>
+
+using namespace QNativeInterface;
+
+Q_DECLARE_JNI_CLASS(ApplicationInfo, "android/content/pm/ApplicationInfo")
+Q_DECLARE_JNI_CLASS(PackageManager, "android/content/pm/PackageManager")
+Q_DECLARE_JNI_CLASS(CharSequence, "java/lang/CharSequence")
+
+class tst_android_package_source_dir : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void applicationName();
+
+private:
+};
+
+void tst_android_package_source_dir::applicationName()
+{
+ QJniObject appCtx = QAndroidApplication::context();
+ QVERIFY(appCtx.isValid());
+
+ const auto appInfo = appCtx.callMethod<QtJniTypes::ApplicationInfo>("getApplicationInfo");
+ QVERIFY(appInfo.isValid());
+
+ const auto packageManager = appCtx.callMethod<QtJniTypes::PackageManager>("getPackageManager");
+ QVERIFY(packageManager.isValid());
+
+ const auto appNameLabel =
+ appInfo.callMethod<QtJniTypes::CharSequence>("loadLabel", packageManager);
+ QVERIFY(appNameLabel.isValid());
+
+ const auto appName = appNameLabel.callMethod<jstring>("toString").toString();
+
+ QCOMPARE_EQ(appName, QString::fromLatin1(EXPECTED_APP_NAME));
+}
+
+QTEST_MAIN(tst_android_package_source_dir);
+
+#include "tst_android_package_source_dir.moc"
diff --git a/tests/auto/other/android/permissions/CMakeLists.txt b/tests/auto/other/android/permissions/CMakeLists.txt
new file mode 100644
index 00000000000..0424c674e1b
--- /dev/null
+++ b/tests/auto/other/android/permissions/CMakeLists.txt
@@ -0,0 +1,23 @@
+# Copyright (C) 2025 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_android_permissions LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_android_permissions
+ SOURCES
+ tst_android_permissions.cpp
+)
+
+qt_add_android_permission(tst_android_permissions
+ NAME android.permission.ACCESS_COARSE_LOCATION
+)
+
+qt_add_android_permission(tst_android_permissions
+ NAME android.permission.ACCESS_FINE_LOCATION
+ ATTRIBUTES
+ maxSdkVersion 31
+)
diff --git a/tests/auto/other/android/permissions/tst_android_permissions.cpp b/tests/auto/other/android/permissions/tst_android_permissions.cpp
new file mode 100644
index 00000000000..5d7a255d3ac
--- /dev/null
+++ b/tests/auto/other/android/permissions/tst_android_permissions.cpp
@@ -0,0 +1,80 @@
+// Copyright (C) 2025 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QCoreApplication>
+#include <QJniObject>
+#include <QSet>
+#include <QString>
+#include <QTest>
+
+constexpr int GET_PERMISSIONS(0x00001000);
+
+using namespace QNativeInterface;
+using namespace Qt::StringLiterals;
+
+Q_DECLARE_JNI_CLASS(PackageManager, "android/content/pm/PackageManager")
+Q_DECLARE_JNI_CLASS(PackageInfo, "android/content/pm/PackageInfo")
+
+class tst_android_permissions : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void initTestCase();
+ void checkExpectedDefaults();
+ void checkNonExisting();
+ void checkNonDefaultPermissions();
+
+private:
+ QJniArray<QString> m_requestedPermissions;
+};
+
+void tst_android_permissions::initTestCase()
+{
+ QJniObject appCtx = QAndroidApplication::context();
+ QVERIFY(appCtx.isValid());
+
+ const auto packageName = appCtx.callMethod<QString>("getPackageName");
+ const auto packageManager = appCtx.callMethod<QtJniTypes::PackageManager>("getPackageManager");
+ QVERIFY(packageManager.isValid());
+
+ const auto packageInfo = QJniObject(packageManager.callMethod<QtJniTypes::PackageInfo>(
+ "getPackageInfo", packageName, jint(GET_PERMISSIONS)));
+ QVERIFY(packageInfo.isValid());
+
+ m_requestedPermissions = packageInfo.getField<QJniArray<QString>>("requestedPermissions");
+ QVERIFY(m_requestedPermissions.isValid());
+}
+
+void tst_android_permissions::checkExpectedDefaults()
+{
+ QSet<QString> expectedDefaults{ { "android.permission.INTERNET"_L1 },
+ { "android.permission.WRITE_EXTERNAL_STORAGE"_L1 },
+ { "android.permission.READ_EXTERNAL_STORAGE"_L1 } };
+
+ for (const auto &permission : m_requestedPermissions)
+ expectedDefaults.remove(permission);
+
+ QVERIFY(expectedDefaults.empty());
+}
+
+void tst_android_permissions::checkNonExisting()
+{
+ for (const auto &permission : m_requestedPermissions)
+ QCOMPARE_NE(permission, "android.permission.BLUETOOTH_SCAN");
+}
+
+void tst_android_permissions::checkNonDefaultPermissions()
+{
+ bool hasNonDefaultPermissions = false;
+ for (const auto &permission : m_requestedPermissions) {
+ if (permission == "android.permission.ACCESS_COARSE_LOCATION")
+ hasNonDefaultPermissions = true;
+ }
+
+ QVERIFY(hasNonDefaultPermissions);
+}
+
+QTEST_MAIN(tst_android_permissions);
+
+#include "tst_android_permissions.moc"
diff --git a/tests/auto/testlib/selftests/CMakeLists.txt b/tests/auto/testlib/selftests/CMakeLists.txt
index bd2d42ec7cb..9d013e6f757 100644
--- a/tests/auto/testlib/selftests/CMakeLists.txt
+++ b/tests/auto/testlib/selftests/CMakeLists.txt
@@ -51,7 +51,6 @@ qt_internal_apply_testlib_coverage_options(tst_selftests)
set(subprograms
assert
badxml
- benchlibcallgrind
benchlibcounting
benchlibeventcounter
benchliboptions
@@ -112,6 +111,14 @@ set(subprograms
watchdog
)
+if(NOT QT_FEATURE_sanitize_address)
+ list(APPEND subprograms
+ # valgrind and asan are incompatible:
+ # "ASan runtime does not come first in initial library list;"
+ benchlibcallgrind
+ )
+endif()
+
if(FEATURE_cxx20)
list(APPEND subprograms
threewaycompare
diff --git a/tests/auto/testlib/selftests/expected_threewaycompare.junitxml b/tests/auto/testlib/selftests/expected_threewaycompare.junitxml
index e10872ef1ba..37551ecd23d 100644
--- a/tests/auto/testlib/selftests/expected_threewaycompare.junitxml
+++ b/tests/auto/testlib/selftests/expected_threewaycompare.junitxml
@@ -25,8 +25,8 @@
</testcase>
<testcase name="compareFloats(Qt::partial_ordering::equivalent)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@">
<failure type="fail" message="The result of operator&lt;=&gt;() is not what was expected">
- <![CDATA[ Left (lhs): 1
- Right (rhs): 1
+ <![CDATA[ Left (lhs): 1 (0x1p+0)
+ Right (rhs): 1 (0x1p+0)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): Qt::partial_ordering::less]]>
</failure>
@@ -34,24 +34,24 @@
<testcase name="compareFloats(Qt::partial_ordering::less)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"/>
<testcase name="compareFloats(Qt::partial_ordering::greater)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@">
<failure type="fail" message="The result of operator&lt;=&gt;() is not what was expected">
- <![CDATA[ Left (lhs): 1.1
- Right (rhs): 1
+ <![CDATA[ Left (lhs): 1.1 (0x1.19999ap+0)
+ Right (rhs): 1 (0x1p+0)
Actual (lhs <=> rhs) : std::partial_ordering::greater
Expected (expectedOrder): Qt::partial_ordering::less]]>
</failure>
</testcase>
<testcase name="compareDoubles(Qt::partial_ordering::equivalent)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@">
<failure type="fail" message="The result of operator&lt;=&gt;() is not what was expected">
- <![CDATA[ Left (lhs): 0
- Right (rhs): 0
+ <![CDATA[ Left (lhs): 0 (0x0p+0)
+ Right (rhs): 0 (0x0p+0)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): Qt::partial_ordering::greater]]>
</failure>
</testcase>
<testcase name="compareDoubles(Qt::partial_ordering::less)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@">
<failure type="fail" message="The result of operator&lt;=&gt;() is not what was expected">
- <![CDATA[ Left (lhs): 0
- Right (rhs): 0.1
+ <![CDATA[ Left (lhs): 0 (0x0p+0)
+ Right (rhs): 0.1 (0x1.999999999999ap-4)
Actual (lhs <=> rhs) : std::partial_ordering::less
Expected (expectedOrder): Qt::partial_ordering::greater]]>
</failure>
@@ -161,16 +161,16 @@
</testcase>
<testcase name="stdCompareFloats(std::partial_ordering::equivalent)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@">
<failure type="fail" message="The result of operator&lt;=&gt;() is not what was expected">
- <![CDATA[ Left (lhs): 2
- Right (rhs): 2
+ <![CDATA[ Left (lhs): 2 (0x1p+1)
+ Right (rhs): 2 (0x1p+1)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): std::partial_ordering::less]]>
</failure>
</testcase>
<testcase name="stdCompareFloats(std::partial_ordering::less)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@">
<failure type="fail" message="The result of operator&lt;=&gt;() is not what was expected">
- <![CDATA[ Left (lhs): 2
- Right (rhs): 1.1
+ <![CDATA[ Left (lhs): 2 (0x1p+1)
+ Right (rhs): 1.1 (0x1.19999ap+0)
Actual (lhs <=> rhs) : std::partial_ordering::greater
Expected (expectedOrder): std::partial_ordering::less]]>
</failure>
@@ -178,16 +178,16 @@
<testcase name="stdCompareFloats(std::partial_ordering::greater)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@"/>
<testcase name="stdCompareDoubles(std::partial_ordering::equivalent)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@">
<failure type="fail" message="The result of operator&lt;=&gt;() is not what was expected">
- <![CDATA[ Left (lhs): 0.15
- Right (rhs): 0.15
+ <![CDATA[ Left (lhs): 0.15 (0x1.3333333333333p-3)
+ Right (rhs): 0.15 (0x1.3333333333333p-3)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): std::partial_ordering::greater]]>
</failure>
</testcase>
<testcase name="stdCompareDoubles(std::partial_ordering::less)" classname="tst_ThreeWayCompare" time="@TEST_DURATION@">
<failure type="fail" message="The result of operator&lt;=&gt;() is not what was expected">
- <![CDATA[ Left (lhs): 0.15
- Right (rhs): 0.25
+ <![CDATA[ Left (lhs): 0.15 (0x1.3333333333333p-3)
+ Right (rhs): 0.25 (0x1p-2)
Actual (lhs <=> rhs) : std::partial_ordering::less
Expected (expectedOrder): std::partial_ordering::greater]]>
</failure>
@@ -288,8 +288,8 @@
</testcase>
<testcase name="checkWeakComparison" classname="tst_ThreeWayCompare" time="@TEST_DURATION@">
<failure type="fail" message="The result of operator&lt;=&gt;() is not what was expected">
- <![CDATA[ Left (june) : 2012/06/20 14:33:02.500[CEST]
- Right (juneLater): 2012/06/20 14:33:02.501[CEST]
+ <![CDATA[ Left (june) : 2012/06/20 14:33:02.500[UTC]
+ Right (juneLater): 2012/06/20 14:33:02.501[UTC]
Actual (june <=> juneLater) : std::weak_ordering::less
Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater]]>
</failure>
diff --git a/tests/auto/testlib/selftests/expected_threewaycompare.lightxml b/tests/auto/testlib/selftests/expected_threewaycompare.lightxml
index 75679c5e374..082255a2c41 100644
--- a/tests/auto/testlib/selftests/expected_threewaycompare.lightxml
+++ b/tests/auto/testlib/selftests/expected_threewaycompare.lightxml
@@ -33,8 +33,8 @@
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[Qt::partial_ordering::equivalent]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 1
- Right (rhs): 1
+ Left (lhs): 1 (0x1p+0)
+ Right (rhs): 1 (0x1p+0)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): Qt::partial_ordering::less]]></Description>
</Incident>
@@ -44,8 +44,8 @@
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[Qt::partial_ordering::greater]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 1.1
- Right (rhs): 1
+ Left (lhs): 1.1 (0x1.19999ap+0)
+ Right (rhs): 1 (0x1p+0)
Actual (lhs <=> rhs) : std::partial_ordering::greater
Expected (expectedOrder): Qt::partial_ordering::less]]></Description>
</Incident>
@@ -55,16 +55,16 @@
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[Qt::partial_ordering::equivalent]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 0
- Right (rhs): 0
+ Left (lhs): 0 (0x0p+0)
+ Right (rhs): 0 (0x0p+0)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): Qt::partial_ordering::greater]]></Description>
</Incident>
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[Qt::partial_ordering::less]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 0
- Right (rhs): 0.1
+ Left (lhs): 0 (0x0p+0)
+ Right (rhs): 0.1 (0x1.999999999999ap-4)
Actual (lhs <=> rhs) : std::partial_ordering::less
Expected (expectedOrder): Qt::partial_ordering::greater]]></Description>
</Incident>
@@ -209,16 +209,16 @@
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[std::partial_ordering::equivalent]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 2
- Right (rhs): 2
+ Left (lhs): 2 (0x1p+1)
+ Right (rhs): 2 (0x1p+1)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): std::partial_ordering::less]]></Description>
</Incident>
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[std::partial_ordering::less]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 2
- Right (rhs): 1.1
+ Left (lhs): 2 (0x1p+1)
+ Right (rhs): 1.1 (0x1.19999ap+0)
Actual (lhs <=> rhs) : std::partial_ordering::greater
Expected (expectedOrder): std::partial_ordering::less]]></Description>
</Incident>
@@ -231,16 +231,16 @@
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[std::partial_ordering::equivalent]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 0.15
- Right (rhs): 0.15
+ Left (lhs): 0.15 (0x1.3333333333333p-3)
+ Right (rhs): 0.15 (0x1.3333333333333p-3)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): std::partial_ordering::greater]]></Description>
</Incident>
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[std::partial_ordering::less]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 0.15
- Right (rhs): 0.25
+ Left (lhs): 0.15 (0x1.3333333333333p-3)
+ Right (rhs): 0.25 (0x1p-2)
Actual (lhs <=> rhs) : std::partial_ordering::less
Expected (expectedOrder): std::partial_ordering::greater]]></Description>
</Incident>
@@ -372,8 +372,8 @@
<TestFunction name="checkWeakComparison">
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (june) : 2012/06/20 14:33:02.500[CEST]
- Right (juneLater): 2012/06/20 14:33:02.501[CEST]
+ Left (june) : 2012/06/20 14:33:02.500[UTC]
+ Right (juneLater): 2012/06/20 14:33:02.501[UTC]
Actual (june <=> juneLater) : std::weak_ordering::less
Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater]]></Description>
</Incident>
diff --git a/tests/auto/testlib/selftests/expected_threewaycompare.tap b/tests/auto/testlib/selftests/expected_threewaycompare.tap
index daeae42c06f..5d464e0e648 100644
--- a/tests/auto/testlib/selftests/expected_threewaycompare.tap
+++ b/tests/auto/testlib/selftests/expected_threewaycompare.tap
@@ -27,8 +27,8 @@ not ok 4 - compareInts(Qt::strong_ordering::greater)
not ok 5 - compareFloats(Qt::partial_ordering::equivalent)
---
# The result of operator<=>() is not what was expected
- Left (lhs): 1
- Right (rhs): 1
+ Left (lhs): 1 (0x1p+0)
+ Right (rhs): 1 (0x1p+0)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): Qt::partial_ordering::less
at: tst_ThreeWayCompare::compareFloats() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0)
@@ -39,8 +39,8 @@ ok 6 - compareFloats(Qt::partial_ordering::less)
not ok 7 - compareFloats(Qt::partial_ordering::greater)
---
# The result of operator<=>() is not what was expected
- Left (lhs): 1.1
- Right (rhs): 1
+ Left (lhs): 1.1 (0x1.19999ap+0)
+ Right (rhs): 1 (0x1p+0)
Actual (lhs <=> rhs) : std::partial_ordering::greater
Expected (expectedOrder): Qt::partial_ordering::less
at: tst_ThreeWayCompare::compareFloats() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0)
@@ -50,8 +50,8 @@ not ok 7 - compareFloats(Qt::partial_ordering::greater)
not ok 8 - compareDoubles(Qt::partial_ordering::equivalent)
---
# The result of operator<=>() is not what was expected
- Left (lhs): 0
- Right (rhs): 0
+ Left (lhs): 0 (0x0p+0)
+ Right (rhs): 0 (0x0p+0)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): Qt::partial_ordering::greater
at: tst_ThreeWayCompare::compareDoubles() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0)
@@ -61,8 +61,8 @@ not ok 8 - compareDoubles(Qt::partial_ordering::equivalent)
not ok 9 - compareDoubles(Qt::partial_ordering::less)
---
# The result of operator<=>() is not what was expected
- Left (lhs): 0
- Right (rhs): 0.1
+ Left (lhs): 0 (0x0p+0)
+ Right (rhs): 0.1 (0x1.999999999999ap-4)
Actual (lhs <=> rhs) : std::partial_ordering::less
Expected (expectedOrder): Qt::partial_ordering::greater
at: tst_ThreeWayCompare::compareDoubles() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0)
@@ -211,8 +211,8 @@ not ok 28 - stdCompareInts(std::strong_ordering::greater)
not ok 29 - stdCompareFloats(std::partial_ordering::equivalent)
---
# The result of operator<=>() is not what was expected
- Left (lhs): 2
- Right (rhs): 2
+ Left (lhs): 2 (0x1p+1)
+ Right (rhs): 2 (0x1p+1)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): std::partial_ordering::less
at: tst_ThreeWayCompare::stdCompareFloats() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0)
@@ -222,8 +222,8 @@ not ok 29 - stdCompareFloats(std::partial_ordering::equivalent)
not ok 30 - stdCompareFloats(std::partial_ordering::less)
---
# The result of operator<=>() is not what was expected
- Left (lhs): 2
- Right (rhs): 1.1
+ Left (lhs): 2 (0x1p+1)
+ Right (rhs): 1.1 (0x1.19999ap+0)
Actual (lhs <=> rhs) : std::partial_ordering::greater
Expected (expectedOrder): std::partial_ordering::less
at: tst_ThreeWayCompare::stdCompareFloats() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0)
@@ -234,8 +234,8 @@ ok 31 - stdCompareFloats(std::partial_ordering::greater)
not ok 32 - stdCompareDoubles(std::partial_ordering::equivalent)
---
# The result of operator<=>() is not what was expected
- Left (lhs): 0.15
- Right (rhs): 0.15
+ Left (lhs): 0.15 (0x1.3333333333333p-3)
+ Right (rhs): 0.15 (0x1.3333333333333p-3)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): std::partial_ordering::greater
at: tst_ThreeWayCompare::stdCompareDoubles() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0)
@@ -245,8 +245,8 @@ not ok 32 - stdCompareDoubles(std::partial_ordering::equivalent)
not ok 33 - stdCompareDoubles(std::partial_ordering::less)
---
# The result of operator<=>() is not what was expected
- Left (lhs): 0.15
- Right (rhs): 0.25
+ Left (lhs): 0.15 (0x1.3333333333333p-3)
+ Right (rhs): 0.25 (0x1p-2)
Actual (lhs <=> rhs) : std::partial_ordering::less
Expected (expectedOrder): std::partial_ordering::greater
at: tst_ThreeWayCompare::stdCompareDoubles() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0)
@@ -383,8 +383,8 @@ not ok 50 - checkComparisonForTemporaryObjects()
not ok 51 - checkWeakComparison()
---
# The result of operator<=>() is not what was expected
- Left (june) : 2012/06/20 14:33:02.500[CEST]
- Right (juneLater): 2012/06/20 14:33:02.501[CEST]
+ Left (june) : 2012/06/20 14:33:02.500[UTC]
+ Right (juneLater): 2012/06/20 14:33:02.501[UTC]
Actual (june <=> juneLater) : std::weak_ordering::less
Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater
at: tst_ThreeWayCompare::checkWeakComparison() (qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp:0)
diff --git a/tests/auto/testlib/selftests/expected_threewaycompare.teamcity b/tests/auto/testlib/selftests/expected_threewaycompare.teamcity
index 2eed5bdb422..6b92880418e 100644
--- a/tests/auto/testlib/selftests/expected_threewaycompare.teamcity
+++ b/tests/auto/testlib/selftests/expected_threewaycompare.teamcity
@@ -10,18 +10,18 @@
##teamcity[testFailed name='compareInts(Qt::strong_ordering::greater)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 2|n Right (rhs): 1|n Actual (lhs <=> rhs) : std::strong_ordering::greater|n Expected (expectedOrder): Qt::strong_ordering::equal' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='compareInts(Qt::strong_ordering::greater)' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='compareFloats(Qt::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare']
-##teamcity[testFailed name='compareFloats(Qt::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 1|n Right (rhs): 1|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): Qt::partial_ordering::less' flowId='tst_ThreeWayCompare']
+##teamcity[testFailed name='compareFloats(Qt::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 1 (0x1p+0)|n Right (rhs): 1 (0x1p+0)|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): Qt::partial_ordering::less' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='compareFloats(Qt::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='compareFloats(Qt::partial_ordering::less)' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='compareFloats(Qt::partial_ordering::less)' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='compareFloats(Qt::partial_ordering::greater)' flowId='tst_ThreeWayCompare']
-##teamcity[testFailed name='compareFloats(Qt::partial_ordering::greater)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 1.1|n Right (rhs): 1|n Actual (lhs <=> rhs) : std::partial_ordering::greater|n Expected (expectedOrder): Qt::partial_ordering::less' flowId='tst_ThreeWayCompare']
+##teamcity[testFailed name='compareFloats(Qt::partial_ordering::greater)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 1.1 (0x1.19999ap+0)|n Right (rhs): 1 (0x1p+0)|n Actual (lhs <=> rhs) : std::partial_ordering::greater|n Expected (expectedOrder): Qt::partial_ordering::less' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='compareFloats(Qt::partial_ordering::greater)' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='compareDoubles(Qt::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare']
-##teamcity[testFailed name='compareDoubles(Qt::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0|n Right (rhs): 0|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): Qt::partial_ordering::greater' flowId='tst_ThreeWayCompare']
+##teamcity[testFailed name='compareDoubles(Qt::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0 (0x0p+0)|n Right (rhs): 0 (0x0p+0)|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): Qt::partial_ordering::greater' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='compareDoubles(Qt::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='compareDoubles(Qt::partial_ordering::less)' flowId='tst_ThreeWayCompare']
-##teamcity[testFailed name='compareDoubles(Qt::partial_ordering::less)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0|n Right (rhs): 0.1|n Actual (lhs <=> rhs) : std::partial_ordering::less|n Expected (expectedOrder): Qt::partial_ordering::greater' flowId='tst_ThreeWayCompare']
+##teamcity[testFailed name='compareDoubles(Qt::partial_ordering::less)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0 (0x0p+0)|n Right (rhs): 0.1 (0x1.999999999999ap-4)|n Actual (lhs <=> rhs) : std::partial_ordering::less|n Expected (expectedOrder): Qt::partial_ordering::greater' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='compareDoubles(Qt::partial_ordering::less)' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='compareDoubles(Qt::partial_ordering::greater)' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='compareDoubles(Qt::partial_ordering::greater)' flowId='tst_ThreeWayCompare']
@@ -74,18 +74,18 @@
##teamcity[testFailed name='stdCompareInts(std::strong_ordering::greater)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): -2|n Right (rhs): 1|n Actual (lhs <=> rhs) : std::strong_ordering::less|n Expected (expectedOrder): std::strong_ordering::equal' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='stdCompareInts(std::strong_ordering::greater)' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='stdCompareFloats(std::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare']
-##teamcity[testFailed name='stdCompareFloats(std::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 2|n Right (rhs): 2|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): std::partial_ordering::less' flowId='tst_ThreeWayCompare']
+##teamcity[testFailed name='stdCompareFloats(std::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 2 (0x1p+1)|n Right (rhs): 2 (0x1p+1)|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): std::partial_ordering::less' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='stdCompareFloats(std::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='stdCompareFloats(std::partial_ordering::less)' flowId='tst_ThreeWayCompare']
-##teamcity[testFailed name='stdCompareFloats(std::partial_ordering::less)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 2|n Right (rhs): 1.1|n Actual (lhs <=> rhs) : std::partial_ordering::greater|n Expected (expectedOrder): std::partial_ordering::less' flowId='tst_ThreeWayCompare']
+##teamcity[testFailed name='stdCompareFloats(std::partial_ordering::less)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 2 (0x1p+1)|n Right (rhs): 1.1 (0x1.19999ap+0)|n Actual (lhs <=> rhs) : std::partial_ordering::greater|n Expected (expectedOrder): std::partial_ordering::less' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='stdCompareFloats(std::partial_ordering::less)' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='stdCompareFloats(std::partial_ordering::greater)' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='stdCompareFloats(std::partial_ordering::greater)' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='stdCompareDoubles(std::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare']
-##teamcity[testFailed name='stdCompareDoubles(std::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0.15|n Right (rhs): 0.15|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): std::partial_ordering::greater' flowId='tst_ThreeWayCompare']
+##teamcity[testFailed name='stdCompareDoubles(std::partial_ordering::equivalent)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0.15 (0x1.3333333333333p-3)|n Right (rhs): 0.15 (0x1.3333333333333p-3)|n Actual (lhs <=> rhs) : std::partial_ordering::equivalent|n Expected (expectedOrder): std::partial_ordering::greater' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='stdCompareDoubles(std::partial_ordering::equivalent)' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='stdCompareDoubles(std::partial_ordering::less)' flowId='tst_ThreeWayCompare']
-##teamcity[testFailed name='stdCompareDoubles(std::partial_ordering::less)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0.15|n Right (rhs): 0.25|n Actual (lhs <=> rhs) : std::partial_ordering::less|n Expected (expectedOrder): std::partial_ordering::greater' flowId='tst_ThreeWayCompare']
+##teamcity[testFailed name='stdCompareDoubles(std::partial_ordering::less)' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (lhs): 0.15 (0x1.3333333333333p-3)|n Right (rhs): 0.25 (0x1p-2)|n Actual (lhs <=> rhs) : std::partial_ordering::less|n Expected (expectedOrder): std::partial_ordering::greater' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='stdCompareDoubles(std::partial_ordering::less)' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='stdCompareDoubles(std::partial_ordering::greater)' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='stdCompareDoubles(std::partial_ordering::greater)' flowId='tst_ThreeWayCompare']
@@ -133,7 +133,7 @@
##teamcity[testFailed name='checkComparisonForTemporaryObjects()' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (getClassForValue(0).getValuePointer()): MyClass(2) on memory address with index 0|n Right (getClassForValue(1).getValuePointer()): MyClass(1) on memory address with index 1|n Actual (getClassForValue(0).getValuePointer() <=> getClassForValue(1).getValuePointer()): std::strong_ordering::less|n Expected (std::strong_ordering::equal) : std::strong_ordering::equal' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='checkComparisonForTemporaryObjects()' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='checkWeakComparison()' flowId='tst_ThreeWayCompare']
-##teamcity[testFailed name='checkWeakComparison()' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (june) : 2012/06/20 14:33:02.500|[CEST|]|n Right (juneLater): 2012/06/20 14:33:02.501|[CEST|]|n Actual (june <=> juneLater) : std::weak_ordering::less|n Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater' flowId='tst_ThreeWayCompare']
+##teamcity[testFailed name='checkWeakComparison()' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)|]' details='The result of operator<=>() is not what was expected|n Left (june) : 2012/06/20 14:33:02.500|[UTC|]|n Right (juneLater): 2012/06/20 14:33:02.501|[UTC|]|n Actual (june <=> juneLater) : std::weak_ordering::less|n Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='checkWeakComparison()' flowId='tst_ThreeWayCompare']
##teamcity[testStarted name='cleanupTestCase()' flowId='tst_ThreeWayCompare']
##teamcity[testFinished name='cleanupTestCase()' flowId='tst_ThreeWayCompare']
diff --git a/tests/auto/testlib/selftests/expected_threewaycompare.txt b/tests/auto/testlib/selftests/expected_threewaycompare.txt
index 896cec72819..45496e4420c 100644
--- a/tests/auto/testlib/selftests/expected_threewaycompare.txt
+++ b/tests/auto/testlib/selftests/expected_threewaycompare.txt
@@ -15,27 +15,27 @@ FAIL! : tst_ThreeWayCompare::compareInts(Qt::strong_ordering::greater) The resu
Expected (expectedOrder): Qt::strong_ordering::equal
Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)]
FAIL! : tst_ThreeWayCompare::compareFloats(Qt::partial_ordering::equivalent) The result of operator<=>() is not what was expected
- Left (lhs): 1
- Right (rhs): 1
+ Left (lhs): 1 (0x1p+0)
+ Right (rhs): 1 (0x1p+0)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): Qt::partial_ordering::less
Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)]
PASS : tst_ThreeWayCompare::compareFloats(Qt::partial_ordering::less)
FAIL! : tst_ThreeWayCompare::compareFloats(Qt::partial_ordering::greater) The result of operator<=>() is not what was expected
- Left (lhs): 1.1
- Right (rhs): 1
+ Left (lhs): 1.1 (0x1.19999ap+0)
+ Right (rhs): 1 (0x1p+0)
Actual (lhs <=> rhs) : std::partial_ordering::greater
Expected (expectedOrder): Qt::partial_ordering::less
Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)]
FAIL! : tst_ThreeWayCompare::compareDoubles(Qt::partial_ordering::equivalent) The result of operator<=>() is not what was expected
- Left (lhs): 0
- Right (rhs): 0
+ Left (lhs): 0 (0x0p+0)
+ Right (rhs): 0 (0x0p+0)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): Qt::partial_ordering::greater
Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)]
FAIL! : tst_ThreeWayCompare::compareDoubles(Qt::partial_ordering::less) The result of operator<=>() is not what was expected
- Left (lhs): 0
- Right (rhs): 0.1
+ Left (lhs): 0 (0x0p+0)
+ Right (rhs): 0.1 (0x1.999999999999ap-4)
Actual (lhs <=> rhs) : std::partial_ordering::less
Expected (expectedOrder): Qt::partial_ordering::greater
Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)]
@@ -119,27 +119,27 @@ FAIL! : tst_ThreeWayCompare::stdCompareInts(std::strong_ordering::greater) The
Expected (expectedOrder): std::strong_ordering::equal
Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)]
FAIL! : tst_ThreeWayCompare::stdCompareFloats(std::partial_ordering::equivalent) The result of operator<=>() is not what was expected
- Left (lhs): 2
- Right (rhs): 2
+ Left (lhs): 2 (0x1p+1)
+ Right (rhs): 2 (0x1p+1)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): std::partial_ordering::less
Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)]
FAIL! : tst_ThreeWayCompare::stdCompareFloats(std::partial_ordering::less) The result of operator<=>() is not what was expected
- Left (lhs): 2
- Right (rhs): 1.1
+ Left (lhs): 2 (0x1p+1)
+ Right (rhs): 1.1 (0x1.19999ap+0)
Actual (lhs <=> rhs) : std::partial_ordering::greater
Expected (expectedOrder): std::partial_ordering::less
Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)]
PASS : tst_ThreeWayCompare::stdCompareFloats(std::partial_ordering::greater)
FAIL! : tst_ThreeWayCompare::stdCompareDoubles(std::partial_ordering::equivalent) The result of operator<=>() is not what was expected
- Left (lhs): 0.15
- Right (rhs): 0.15
+ Left (lhs): 0.15 (0x1.3333333333333p-3)
+ Right (rhs): 0.15 (0x1.3333333333333p-3)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): std::partial_ordering::greater
Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)]
FAIL! : tst_ThreeWayCompare::stdCompareDoubles(std::partial_ordering::less) The result of operator<=>() is not what was expected
- Left (lhs): 0.15
- Right (rhs): 0.25
+ Left (lhs): 0.15 (0x1.3333333333333p-3)
+ Right (rhs): 0.25 (0x1p-2)
Actual (lhs <=> rhs) : std::partial_ordering::less
Expected (expectedOrder): std::partial_ordering::greater
Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)]
@@ -216,8 +216,8 @@ FAIL! : tst_ThreeWayCompare::checkComparisonForTemporaryObjects() The result of
Expected (std::strong_ordering::equal) : std::strong_ordering::equal
Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)]
FAIL! : tst_ThreeWayCompare::checkWeakComparison() The result of operator<=>() is not what was expected
- Left (june) : 2012/06/20 14:33:02.500[CEST]
- Right (juneLater): 2012/06/20 14:33:02.501[CEST]
+ Left (june) : 2012/06/20 14:33:02.500[UTC]
+ Right (juneLater): 2012/06/20 14:33:02.501[UTC]
Actual (june <=> juneLater) : std::weak_ordering::less
Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater
Loc: [qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp(0)]
diff --git a/tests/auto/testlib/selftests/expected_threewaycompare.xml b/tests/auto/testlib/selftests/expected_threewaycompare.xml
index 5e8f1f93bac..a3f4d38ee5a 100644
--- a/tests/auto/testlib/selftests/expected_threewaycompare.xml
+++ b/tests/auto/testlib/selftests/expected_threewaycompare.xml
@@ -35,8 +35,8 @@
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[Qt::partial_ordering::equivalent]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 1
- Right (rhs): 1
+ Left (lhs): 1 (0x1p+0)
+ Right (rhs): 1 (0x1p+0)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): Qt::partial_ordering::less]]></Description>
</Incident>
@@ -46,8 +46,8 @@
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[Qt::partial_ordering::greater]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 1.1
- Right (rhs): 1
+ Left (lhs): 1.1 (0x1.19999ap+0)
+ Right (rhs): 1 (0x1p+0)
Actual (lhs <=> rhs) : std::partial_ordering::greater
Expected (expectedOrder): Qt::partial_ordering::less]]></Description>
</Incident>
@@ -57,16 +57,16 @@
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[Qt::partial_ordering::equivalent]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 0
- Right (rhs): 0
+ Left (lhs): 0 (0x0p+0)
+ Right (rhs): 0 (0x0p+0)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): Qt::partial_ordering::greater]]></Description>
</Incident>
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[Qt::partial_ordering::less]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 0
- Right (rhs): 0.1
+ Left (lhs): 0 (0x0p+0)
+ Right (rhs): 0.1 (0x1.999999999999ap-4)
Actual (lhs <=> rhs) : std::partial_ordering::less
Expected (expectedOrder): Qt::partial_ordering::greater]]></Description>
</Incident>
@@ -211,16 +211,16 @@
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[std::partial_ordering::equivalent]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 2
- Right (rhs): 2
+ Left (lhs): 2 (0x1p+1)
+ Right (rhs): 2 (0x1p+1)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): std::partial_ordering::less]]></Description>
</Incident>
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[std::partial_ordering::less]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 2
- Right (rhs): 1.1
+ Left (lhs): 2 (0x1p+1)
+ Right (rhs): 1.1 (0x1.19999ap+0)
Actual (lhs <=> rhs) : std::partial_ordering::greater
Expected (expectedOrder): std::partial_ordering::less]]></Description>
</Incident>
@@ -233,16 +233,16 @@
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[std::partial_ordering::equivalent]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 0.15
- Right (rhs): 0.15
+ Left (lhs): 0.15 (0x1.3333333333333p-3)
+ Right (rhs): 0.15 (0x1.3333333333333p-3)
Actual (lhs <=> rhs) : std::partial_ordering::equivalent
Expected (expectedOrder): std::partial_ordering::greater]]></Description>
</Incident>
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<DataTag><![CDATA[std::partial_ordering::less]]></DataTag>
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (lhs): 0.15
- Right (rhs): 0.25
+ Left (lhs): 0.15 (0x1.3333333333333p-3)
+ Right (rhs): 0.25 (0x1p-2)
Actual (lhs <=> rhs) : std::partial_ordering::less
Expected (expectedOrder): std::partial_ordering::greater]]></Description>
</Incident>
@@ -374,8 +374,8 @@
<TestFunction name="checkWeakComparison">
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp" line="0">
<Description><![CDATA[The result of operator<=>() is not what was expected
- Left (june) : 2012/06/20 14:33:02.500[CEST]
- Right (juneLater): 2012/06/20 14:33:02.501[CEST]
+ Left (june) : 2012/06/20 14:33:02.500[UTC]
+ Right (juneLater): 2012/06/20 14:33:02.501[UTC]
Actual (june <=> juneLater) : std::weak_ordering::less
Expected (Qt::weak_ordering::greater): Qt::weak_ordering::greater]]></Description>
</Incident>
diff --git a/tests/auto/testlib/selftests/mouse/tst_mouse.cpp b/tests/auto/testlib/selftests/mouse/tst_mouse.cpp
index 4af55adde91..ae8fa54dcea 100644
--- a/tests/auto/testlib/selftests/mouse/tst_mouse.cpp
+++ b/tests/auto/testlib/selftests/mouse/tst_mouse.cpp
@@ -2,6 +2,7 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QTest>
+#include <QtTest/private/qtesthelpers_p.h>
#include <QtGui/QWindow>
#include <QtGui/QCursor>
#include <QtGui/private/qguiapplication_p.h>
@@ -256,8 +257,9 @@ void tst_Mouse::doubleClick()
{
MouseWindow w;
w.show();
- w.setGeometry(100, 100, 200, 200);
+ w.resize(200, 200);
QVERIFY(QTest::qWaitForWindowActive(&w));
+ QVERIFY(QTestPrivate::ensurePositionTopLeft(&w));
// click
QPoint point(10, 10);
diff --git a/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp b/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp
index bcc544d33a1..4a290f9f2fb 100644
--- a/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp
+++ b/tests/auto/testlib/selftests/threewaycompare/tst_threewaycompare.cpp
@@ -231,7 +231,7 @@ void tst_ThreeWayCompare::checkWeakComparison()
QCOMPARE_3WAY(example_left, example_right, std::weak_ordering::less);
- QDateTime june(QDate(2012, 6, 20), QTime(14, 33, 2, 500));
+ QDateTime june(QDate(2012, 6, 20), QTime(14, 33, 2, 500), QTimeZone::UTC);
QDateTime juneLater = june.addMSecs(1);
QCOMPARE_3WAY(june, juneLater, Qt::weak_ordering::greater);
#endif
diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp
index ab88dd78111..217122100a0 100644
--- a/tests/auto/tools/moc/tst_moc.cpp
+++ b/tests/auto/tools/moc/tst_moc.cpp
@@ -7,7 +7,7 @@
https://developercommunity.visualstudio.com/t/Regression:-c-compilation-failure-in-c/10926790
*/
#include <QtCore/qcompilerdetection.h>
-#if defined(Q_CC_MSVC_ONLY) && (_MSC_FULL_VER >= 194435209) && (_MSC_FULL_VER < 194500000)
+#if defined(Q_CC_MSVC_ONLY) && (_MSC_FULL_VER >= 194435208) && (_MSC_FULL_VER < 194500000)
# define MSVC_ENUM_BUG
#endif
diff --git a/tests/auto/tools/qmake/testdata/invalid-info-plist/Info.plist b/tests/auto/tools/qmake/testdata/invalid-info-plist/Info.plist
new file mode 100644
index 00000000000..5468597e2b4
--- /dev/null
+++ b/tests/auto/tools/qmake/testdata/invalid-info-plist/Info.plist
@@ -0,0 +1 @@
+<invalid>
diff --git a/tests/auto/tools/qmake/testdata/invalid-info-plist/invalid-info-plist.pro b/tests/auto/tools/qmake/testdata/invalid-info-plist/invalid-info-plist.pro
new file mode 100644
index 00000000000..0230f9c6736
--- /dev/null
+++ b/tests/auto/tools/qmake/testdata/invalid-info-plist/invalid-info-plist.pro
@@ -0,0 +1,2 @@
+SOURCES += main.cpp
+QMAKE_INFO_PLIST = Info.plist
diff --git a/tests/auto/tools/qmake/testdata/invalid-info-plist/main.cpp b/tests/auto/tools/qmake/testdata/invalid-info-plist/main.cpp
new file mode 100644
index 00000000000..905869dfa38
--- /dev/null
+++ b/tests/auto/tools/qmake/testdata/invalid-info-plist/main.cpp
@@ -0,0 +1,4 @@
+int main()
+{
+ return 0;
+}
diff --git a/tests/auto/tools/qmake/testdata/windows_resources/REUSE.toml b/tests/auto/tools/qmake/testdata/windows_resources/REUSE.toml
index 8d05566c678..65bfc74258c 100644
--- a/tests/auto/tools/qmake/testdata/windows_resources/REUSE.toml
+++ b/tests/auto/tools/qmake/testdata/windows_resources/REUSE.toml
@@ -3,5 +3,5 @@ version = 1
[[annotations]]
path = ["version.inc"]
precedence = "override"
-SPDX-FileCopyrightText = "Copyright (C) 2019 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GPL-3.0-only"
diff --git a/tests/auto/tools/qmake/tst_qmake.cpp b/tests/auto/tools/qmake/tst_qmake.cpp
index 278cf4ad232..080f0abbdaa 100644
--- a/tests/auto/tools/qmake/tst_qmake.cpp
+++ b/tests/auto/tools/qmake/tst_qmake.cpp
@@ -47,6 +47,7 @@ private slots:
void rawString();
#if defined(Q_OS_DARWIN)
void bundle_spaces();
+ void invalid_info_plist();
#elif defined(Q_OS_WIN)
void windowsResources();
#endif
@@ -534,6 +535,23 @@ void tst_qmake::bundle_spaces()
QVERIFY( test_compiler.removeMakefile(workDir) );
}
+void tst_qmake::invalid_info_plist()
+{
+ QString workDir = base_path + "/testdata/invalid-info-plist";
+
+ // We set up alternate arguments here, to make sure we're testing Mac
+ // Bundles. We need to actually run make to check whether the failing
+ // plutil invocation breaks the build.
+
+ test_compiler.setArguments(QStringList(),
+ QStringList() << "-spec" << "macx-clang");
+
+ QVERIFY( test_compiler.qmake(workDir, "invalid-info-plist") );
+
+ // Make fails: plutil fails to parse the Info.plist file
+ QVERIFY( test_compiler.make(workDir, QString(), true) );
+}
+
#elif defined(Q_OS_WIN) // defined(Q_OS_DARWIN)
void tst_qmake::windowsResources()
diff --git a/tests/auto/tools/uic/baseline/REUSE.toml b/tests/auto/tools/uic/baseline/REUSE.toml
index 30f460c00b0..c147a71dca5 100644
--- a/tests/auto/tools/uic/baseline/REUSE.toml
+++ b/tests/auto/tools/uic/baseline/REUSE.toml
@@ -3,5 +3,5 @@ version = 1
[[annotations]]
path = ["Widget.ui"]
precedence = "override"
-SPDX-FileCopyrightText = "Copyright (C) 2016 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GPL-3.0-only"
diff --git a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout/BLACKLIST b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout/BLACKLIST
index aca3147b2d6..fde971443d4 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout/BLACKLIST
+++ b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout/BLACKLIST
@@ -1,3 +1,2 @@
[layoutDirection]
ubuntu-22.04
-ubuntu-24.04
diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
index 3e5ff5ce640..df19ea1568e 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
@@ -657,9 +657,6 @@ void tst_QGraphicsView::viewport()
#if QT_CONFIG(opengl)
void tst_QGraphicsView::openGLViewport()
{
-#if !QT_CONFIG(run_opengl_tests)
- QSKIP("Skip test as run-opengl-tests feature is off.");
-#endif
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL))
QSKIP("QOpenGL is not supported on this platform.");
if (isPlatformEGLFS())
diff --git a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
index 03be7aa0fe9..b651668cabd 100644
--- a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
+++ b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
@@ -213,6 +213,7 @@ private slots:
void storeRestoreLowMemoryMode();
void setSectionResizeModeWithSectionWillTakeMemory();
void setModelWithAutoSizeWillSwitchToMemoryMode();
+ void tableViewResizeSectionsWillSwitchToMemoryMode();
void setDefaultSectionSizeRespectsColumnWidth();
@@ -3559,12 +3560,17 @@ struct TableViewWithBasicModel : public QTableView
emptyState = verticalHeader()->saveState();
setModel(&m);
header = verticalHeader();
+ horizontal_header = horizontalHeader();
}
bool hasLowMemoryUsage() const {
return emptyState.size() == header->saveState().size();
}
+ bool horizontalLowMememorUsage() const {
+ return emptyState.size() == horizontal_header->saveState().size();
+ }
+
bool hasHigherMemoryUsage() const {
const int delta = 1000;
return header->saveState().size() > delta + emptyState.size();
@@ -3572,6 +3578,7 @@ struct TableViewWithBasicModel : public QTableView
BasicModel m;
QHeaderView *header;
+ QHeaderView *horizontal_header;
QByteArray emptyState;
};
@@ -3770,6 +3777,15 @@ void tst_QHeaderView::setModelWithAutoSizeWillSwitchToMemoryMode()
QCOMPARE_GT(nonEmptyState.size(), emptyState.size() + delta);
}
+void tst_QHeaderView::tableViewResizeSectionsWillSwitchToMemoryMode()
+{
+ TableViewWithBasicModel tv;
+ QVERIFY(tv.horizontalLowMememorUsage());
+ tv.horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
+ tv.resizeColumnsToContents();
+ QVERIFY(!tv.horizontalLowMememorUsage());
+}
+
void tst_QHeaderView::setDefaultSectionSizeRespectsColumnWidth()
{
QTreeWidget tree;
diff --git a/tests/auto/widgets/kernel/qapplication/BLACKLIST b/tests/auto/widgets/kernel/qapplication/BLACKLIST
deleted file mode 100644
index c68c7d6b149..00000000000
--- a/tests/auto/widgets/kernel/qapplication/BLACKLIST
+++ /dev/null
@@ -1,3 +0,0 @@
-[touchEventPropagation]
-# QTBUG-66745
-opensuse-leap
diff --git a/tests/auto/widgets/kernel/qwidgetrepaintmanager/tst_qwidgetrepaintmanager.cpp b/tests/auto/widgets/kernel/qwidgetrepaintmanager/tst_qwidgetrepaintmanager.cpp
index c460eb1db8c..f418d5ead14 100644
--- a/tests/auto/widgets/kernel/qwidgetrepaintmanager/tst_qwidgetrepaintmanager.cpp
+++ b/tests/auto/widgets/kernel/qwidgetrepaintmanager/tst_qwidgetrepaintmanager.cpp
@@ -655,121 +655,122 @@ void tst_QWidgetRepaintManager::evaluateRhi()
#if QT_CONFIG(opengl)
-#if QT_CONFIG(run_opengl_tests)
- {
- // Non-native child RHI widget enables RHI for top level regular widget
- QWidget topLevel;
- RhiWidget rhiWidget(QPlatformBackingStoreRhiConfig::OpenGL, &topLevel);
- topLevel.show();
- QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
- QCOMPARE(topLevel.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
- QVERIFY(QWidgetPrivate::get(&topLevel)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&topLevel)->rhi());
- // Only the native widget that actually flushes will report usesRhiFlush
- QVERIFY(!QWidgetPrivate::get(&rhiWidget)->usesRhiFlush);
- // But it should have an RHI it can use
- QVERIFY(QWidgetPrivate::get(&rhiWidget)->rhi());
- }
-
- {
- // Native child RHI widget does not enable RHI for top level
- QWidget topLevel;
- RhiWidget nativeRhiWidget(QPlatformBackingStoreRhiConfig::OpenGL, &topLevel);
- nativeRhiWidget.setAttribute(Qt::WA_NativeWindow);
- topLevel.show();
- QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
- QCOMPARE(nativeRhiWidget.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
- QVERIFY(QWidgetPrivate::get(&nativeRhiWidget)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&nativeRhiWidget)->rhi());
- QCOMPARE(topLevel.windowHandle()->surfaceType(), defaultSurfaceType);
- QVERIFY(!QWidgetPrivate::get(&topLevel)->usesRhiFlush);
-
- if (!usesRhiBackingStore)
- QVERIFY(!QWidgetPrivate::get(&topLevel)->rhi());
- }
-
- {
- // Non-native RHI child of native child enables RHI for native child,
- // but not top level.
- QWidget topLevel;
- QWidget nativeChild(&topLevel);
- nativeChild.setAttribute(Qt::WA_NativeWindow);
- RhiWidget rhiWidget(QPlatformBackingStoreRhiConfig::OpenGL, &nativeChild);
- topLevel.show();
- QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
-
- QCOMPARE(nativeChild.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
- QVERIFY(QWidgetPrivate::get(&nativeChild)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&nativeChild)->rhi());
- QVERIFY(!QWidgetPrivate::get(&rhiWidget)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&rhiWidget)->rhi());
- QCOMPARE(topLevel.windowHandle()->surfaceType(), defaultSurfaceType);
- QVERIFY(!QWidgetPrivate::get(&topLevel)->usesRhiFlush);
- if (!usesRhiBackingStore)
- QVERIFY(!QWidgetPrivate::get(&topLevel)->rhi());
- }
-
- {
- // Native child RHI widget does not prevent RHI for top level
- // if non-native RHI child widget is also present.
- QWidget topLevel;
- RhiWidget rhiWidget(QPlatformBackingStoreRhiConfig::OpenGL, &topLevel);
- RhiWidget nativeRhiWidget(QPlatformBackingStoreRhiConfig::OpenGL, &topLevel);
- nativeRhiWidget.setAttribute(Qt::WA_NativeWindow);
- topLevel.show();
- QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
+ if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL)) {
- QCOMPARE(nativeRhiWidget.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
- QVERIFY(QWidgetPrivate::get(&nativeRhiWidget)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&nativeRhiWidget)->rhi());
- QVERIFY(!QWidgetPrivate::get(&rhiWidget)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&rhiWidget)->rhi());
- QCOMPARE(topLevel.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
- QVERIFY(QWidgetPrivate::get(&topLevel)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&topLevel)->rhi());
- }
+ {
+ // Non-native child RHI widget enables RHI for top level regular widget
+ QWidget topLevel;
+ RhiWidget rhiWidget(QPlatformBackingStoreRhiConfig::OpenGL, &topLevel);
+ topLevel.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
+ QCOMPARE(topLevel.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
+ QVERIFY(QWidgetPrivate::get(&topLevel)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&topLevel)->rhi());
+ // Only the native widget that actually flushes will report usesRhiFlush
+ QVERIFY(!QWidgetPrivate::get(&rhiWidget)->usesRhiFlush);
+ // But it should have an RHI it can use
+ QVERIFY(QWidgetPrivate::get(&rhiWidget)->rhi());
+ }
- {
- // Reparenting into a window that already matches the required
- // surface type should still mark the parent as flushing with RHI.
- QWidget topLevel;
+ {
+ // Native child RHI widget does not enable RHI for top level
+ QWidget topLevel;
+ RhiWidget nativeRhiWidget(QPlatformBackingStoreRhiConfig::OpenGL, &topLevel);
+ nativeRhiWidget.setAttribute(Qt::WA_NativeWindow);
+ topLevel.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
+ QCOMPARE(nativeRhiWidget.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
+ QVERIFY(QWidgetPrivate::get(&nativeRhiWidget)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&nativeRhiWidget)->rhi());
+ QCOMPARE(topLevel.windowHandle()->surfaceType(), defaultSurfaceType);
+ QVERIFY(!QWidgetPrivate::get(&topLevel)->usesRhiFlush);
+
+ if (!usesRhiBackingStore)
+ QVERIFY(!QWidgetPrivate::get(&topLevel)->rhi());
+ }
- RhiWidget rhiWidget(QPlatformBackingStoreRhiConfig::Null);
- rhiWidget.show();
- QVERIFY(QTest::qWaitForWindowExposed(&rhiWidget));
- QVERIFY(QWidgetPrivate::get(&rhiWidget)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&rhiWidget)->rhi());
+ {
+ // Non-native RHI child of native child enables RHI for native child,
+ // but not top level.
+ QWidget topLevel;
+ QWidget nativeChild(&topLevel);
+ nativeChild.setAttribute(Qt::WA_NativeWindow);
+ RhiWidget rhiWidget(QPlatformBackingStoreRhiConfig::OpenGL, &nativeChild);
+ topLevel.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
+
+ QCOMPARE(nativeChild.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
+ QVERIFY(QWidgetPrivate::get(&nativeChild)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&nativeChild)->rhi());
+ QVERIFY(!QWidgetPrivate::get(&rhiWidget)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&rhiWidget)->rhi());
+ QCOMPARE(topLevel.windowHandle()->surfaceType(), defaultSurfaceType);
+ QVERIFY(!QWidgetPrivate::get(&topLevel)->usesRhiFlush);
+ if (!usesRhiBackingStore)
+ QVERIFY(!QWidgetPrivate::get(&topLevel)->rhi());
+ }
- topLevel.show();
- QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
- rhiWidget.setParent(&topLevel);
- QVERIFY(QWidgetPrivate::get(&topLevel)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&topLevel)->rhi());
- }
+ {
+ // Native child RHI widget does not prevent RHI for top level
+ // if non-native RHI child widget is also present.
+ QWidget topLevel;
+ RhiWidget rhiWidget(QPlatformBackingStoreRhiConfig::OpenGL, &topLevel);
+ RhiWidget nativeRhiWidget(QPlatformBackingStoreRhiConfig::OpenGL, &topLevel);
+ nativeRhiWidget.setAttribute(Qt::WA_NativeWindow);
+ topLevel.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
+
+ QCOMPARE(nativeRhiWidget.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
+ QVERIFY(QWidgetPrivate::get(&nativeRhiWidget)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&nativeRhiWidget)->rhi());
+ QVERIFY(!QWidgetPrivate::get(&rhiWidget)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&rhiWidget)->rhi());
+ QCOMPARE(topLevel.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
+ QVERIFY(QWidgetPrivate::get(&topLevel)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&topLevel)->rhi());
+ }
- {
- // Non-native RHI child of native child enables RHI for native child,
- // but does not prevent top level from flushing with RHI.
- QWidget topLevel;
- QWidget nativeChild(&topLevel);
- nativeChild.setAttribute(Qt::WA_NativeWindow);
- RhiWidget rhiGranchild(QPlatformBackingStoreRhiConfig::OpenGL, &nativeChild);
- RhiWidget rhiChild(QPlatformBackingStoreRhiConfig::OpenGL, &topLevel);
- topLevel.show();
- QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
+ {
+ // Reparenting into a window that already matches the required
+ // surface type should still mark the parent as flushing with RHI.
+ QWidget topLevel;
+
+ RhiWidget rhiWidget(QPlatformBackingStoreRhiConfig::Null);
+ rhiWidget.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&rhiWidget));
+ QVERIFY(QWidgetPrivate::get(&rhiWidget)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&rhiWidget)->rhi());
+
+ topLevel.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
+ rhiWidget.setParent(&topLevel);
+ QVERIFY(QWidgetPrivate::get(&topLevel)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&topLevel)->rhi());
+ }
- QCOMPARE(nativeChild.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
- QVERIFY(QWidgetPrivate::get(&nativeChild)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&nativeChild)->rhi());
- QVERIFY(!QWidgetPrivate::get(&rhiGranchild)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&rhiGranchild)->rhi());
- QCOMPARE(topLevel.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
- QVERIFY(QWidgetPrivate::get(&topLevel)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&topLevel)->rhi());
- QVERIFY(!QWidgetPrivate::get(&rhiChild)->usesRhiFlush);
- QVERIFY(QWidgetPrivate::get(&rhiChild)->rhi());
+ {
+ // Non-native RHI child of native child enables RHI for native child,
+ // but does not prevent top level from flushing with RHI.
+ QWidget topLevel;
+ QWidget nativeChild(&topLevel);
+ nativeChild.setAttribute(Qt::WA_NativeWindow);
+ RhiWidget rhiGranchild(QPlatformBackingStoreRhiConfig::OpenGL, &nativeChild);
+ RhiWidget rhiChild(QPlatformBackingStoreRhiConfig::OpenGL, &topLevel);
+ topLevel.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
+
+ QCOMPARE(nativeChild.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
+ QVERIFY(QWidgetPrivate::get(&nativeChild)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&nativeChild)->rhi());
+ QVERIFY(!QWidgetPrivate::get(&rhiGranchild)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&rhiGranchild)->rhi());
+ QCOMPARE(topLevel.windowHandle()->surfaceType(), QSurface::OpenGLSurface);
+ QVERIFY(QWidgetPrivate::get(&topLevel)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&topLevel)->rhi());
+ QVERIFY(!QWidgetPrivate::get(&rhiChild)->usesRhiFlush);
+ QVERIFY(QWidgetPrivate::get(&rhiChild)->rhi());
+ }
}
-#endif // QT_CONFIG(run_opengl_tests)
#if QT_CONFIG(metal)
QRhiMetalInitParams metalParams;
@@ -805,10 +806,6 @@ void tst_QWidgetRepaintManager::evaluateRhi()
void tst_QWidgetRepaintManager::rhiRecreateMaintainsWindowProperties()
{
-#if !QT_CONFIG(run_opengl_tests)
- QSKIP("Skip test as run-opengl-tests feature is off.");
-#endif
-
const auto *integration = QGuiApplicationPrivate::platformIntegration();
if (!integration->hasCapability(QPlatformIntegration::RhiBasedRendering))
QSKIP("Platform does not support RHI based rendering");
@@ -817,6 +814,9 @@ void tst_QWidgetRepaintManager::rhiRecreateMaintainsWindowProperties()
QSKIP("Platform does not support OpenGL RHI based rendering");
#endif
+ if (!integration->hasCapability(QPlatformIntegration::OpenGL))
+ QSKIP("OpenGL is not supported on this platform.");
+
// Reparenting Rhi widget into a window causes the window to be
// recreated, but after recreation the window properties such as
// window position must remain the same
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
index 1b3afa0a4dc..cbe554f997f 100644
--- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
+++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
@@ -8,10 +8,12 @@
#include <QPushButton>
#include <QMainWindow>
#include <QMenuBar>
+#include <QPlainTextEdit>
#include <QToolBar>
#include <QToolButton>
#include <QStatusBar>
#include <QListWidget>
+#include <QVBoxLayout>
#include <QWidgetAction>
#include <QScreen>
#include <QSpinBox>
@@ -96,6 +98,8 @@ private slots:
void QTBUG_89082_actionTipsHide();
void QTBUG8122_widgetActionCrashOnClose();
void widgetActionTriggerClosesMenu();
+ void widgetActionContextMenu();
+
void transientParent();
void QTBUG_10735_crashWithDialog();
@@ -1590,6 +1594,36 @@ void tst_QMenu::widgetActionTriggerClosesMenu()
QCOMPARE(actionTriggered, &widgetAction);
}
+void tst_QMenu::widgetActionContextMenu() // QTBUG-134757
+{
+ QPushButton openButton("open");
+ QMenu *menu = new QMenu(&openButton);
+ QVBoxLayout *layout = new QVBoxLayout;
+ QWidgetAction widgetAction(menu);
+ QWidget menuWidget(menu);
+ QPlainTextEdit edit;
+ openButton.setMenu(menu);
+ menuWidget.setLayout(layout);
+ widgetAction.setDefaultWidget(&menuWidget);
+ menu->addAction(&widgetAction);
+ layout->addWidget(&edit);
+
+ openButton.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&openButton));
+
+ // Click the QPushButton to open its menu
+ QTest::mouseClick(&openButton, Qt::LeftButton);
+ QVERIFY(QTest::qWaitForWindowExposed(&menuWidget));
+ QWindow *popupWindow = edit.window()->windowHandle();
+ QVERIFY(popupWindow);
+ QCOMPARE(QApplication::activePopupWidget(), menu);
+
+ // Right-click the QPlainTextEdit to open its context menu
+ QTest::mouseClick(popupWindow, Qt::RightButton);
+ QVERIFY(qobject_cast<QMenu *>(QApplication::activePopupWidget()));
+ QCOMPARE_NE(QApplication::activePopupWidget(), menu);
+}
+
void tst_QMenu::transientParent()
{
QMainWindow window;
diff --git a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp
index 609a0847862..f4baf6b1714 100644
--- a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp
+++ b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp
@@ -1233,12 +1233,41 @@ void tst_QMenuBar::taskQTBUG4965_escapeEaten()
}
#endif
+#ifdef Q_OS_LINUX
+class ResizeCounter : public QObject
+{
+public:
+ explicit ResizeCounter(QMenuBar *bar)
+ {
+ Q_ASSERT(bar);
+ bar->installEventFilter(this);
+ }
+
+ int resizeCount() const { return m_resizeCount; }
+
+protected:
+ bool eventFilter(QObject *o, QEvent *event) override
+ {
+ Q_UNUSED(o);
+ if (event->type() == QEvent::Resize)
+ ++m_resizeCount;
+ return false;
+ }
+
+private:
+ int m_resizeCount = 0;
+};
+#endif
+
void tst_QMenuBar::taskQTBUG11823_crashwithInvisibleActions()
{
if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive))
QSKIP("Wayland: This fails. Figure out why.");
QMenuBar menubar;
+#ifdef Q_OS_LINUX
+ ResizeCounter counter(&menubar);
+#endif
menubar.setNativeMenuBar(false); //we can't check the geometry of native menubars
QAction * m = menubar.addAction( "&m" );
@@ -1247,6 +1276,12 @@ void tst_QMenuBar::taskQTBUG11823_crashwithInvisibleActions()
centerOnScreen(&menubar);
menubar.show();
QVERIFY(QTest::qWaitForWindowActive(&menubar));
+
+#ifdef Q_OS_LINUX
+ if (QSysInfo::productType().contains("opensuse"))
+ QVERIFY(QTest::qWaitFor([&]{ return counter.resizeCount() == 2;}));
+#endif
+
menubar.setActiveAction(m);
QCOMPARE(menubar.activeAction(), m);
QTest::keyClick(static_cast<QWidget *>(0), Qt::Key_Right);
diff --git a/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp b/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp
index b2cdd6b72c2..c5df30dd7d1 100644
--- a/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp
+++ b/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp
@@ -63,12 +63,12 @@ private slots:
void tst_QOpenGLWidget::initTestCase()
{
-#if !QT_CONFIG(run_opengl_tests)
- QSKIP("Skip test as run-opengl-tests feature is off.");
-#endif
// See QOpenGLWidget constructor
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::RasterGLSurface))
QSKIP("QOpenGLWidget is not supported on this platform.");
+
+ if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL))
+ QSKIP("OpenGL is not supported on this platform.");
}
void tst_QOpenGLWidget::create()
diff --git a/tests/auto/widgets/widgets/qrhiwidget/tst_qrhiwidget.cpp b/tests/auto/widgets/widgets/qrhiwidget/tst_qrhiwidget.cpp
index da4fee72f65..457df2159b1 100644
--- a/tests/auto/widgets/widgets/qrhiwidget/tst_qrhiwidget.cpp
+++ b/tests/auto/widgets/widgets/qrhiwidget/tst_qrhiwidget.cpp
@@ -64,7 +64,7 @@ void tst_QRhiWidget::testData()
QTest::newRow("Null") << QRhiWidget::Api::Null;
#endif
-#if QT_CONFIG(opengl) && QT_CONFIG(run_opengl_tests)
+#if QT_CONFIG(opengl)
if (QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL))
QTest::newRow("OpenGL") << QRhiWidget::Api::OpenGL;
#endif
diff --git a/util/lexgen/REUSE.toml b/util/lexgen/REUSE.toml
index a5081d017ce..422b63a9d3d 100644
--- a/util/lexgen/REUSE.toml
+++ b/util/lexgen/REUSE.toml
@@ -4,11 +4,11 @@ version = 1
path = ["tests/testdata/**", "test.lexgen"]
comment = "test data"
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GPL-3.0-only"
[[annotations]]
path = ["lexgen.lexgen", "css3-simplified.lexgen"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0"
diff --git a/util/locale_database/cldr2qlocalexml.py b/util/locale_database/cldr2qlocalexml.py
index d4ba6960517..0aa04b64b05 100755
--- a/util/locale_database/cldr2qlocalexml.py
+++ b/util/locale_database/cldr2qlocalexml.py
@@ -83,7 +83,7 @@ def main(argv: list[str], out: TextIO, err: TextIO) -> int:
parser.error(f'Please use a .xml extension on your output file name, not {xml}')
else:
try:
- emit = open(xml, 'w')
+ emit = open(xml, 'w', encoding="utf-8")
except IOError as e:
parser.error(f'Failed to open "{xml}" to write output to it')
diff --git a/util/locale_database/localetools.py b/util/locale_database/localetools.py
index 10937df5485..818880d6efa 100644
--- a/util/locale_database/localetools.py
+++ b/util/locale_database/localetools.py
@@ -110,7 +110,7 @@ def AtomicRenameTemporaryFile(originalLocation: Path, *, prefix: str, dir: Path)
On success closes the temporary file and moves its content to the original
location. On error, removes temporary file, without disturbing the original.
"""
- tempFile = NamedTemporaryFile('w', prefix=prefix, dir=dir, delete=False)
+ tempFile = NamedTemporaryFile('w', prefix=prefix, dir=dir, delete=False, encoding='utf-8')
try:
yield tempFile
tempFile.close()
@@ -174,7 +174,7 @@ class Transcriber:
self.writer = resources.enter_context(
AtomicRenameTemporaryFile(self.path, prefix=self.path.name, dir=self.tempDir))
# Open the old file
- self.reader = resources.enter_context(open(self.path))
+ self.reader = resources.enter_context(open(self.path, encoding='utf-8'))
self.onEnter()
diff --git a/util/x86simdgen/REUSE.toml b/util/x86simdgen/REUSE.toml
index b9311d13368..3d41d1e40b4 100644
--- a/util/x86simdgen/REUSE.toml
+++ b/util/x86simdgen/REUSE.toml
@@ -10,11 +10,11 @@ SPDX-License-Identifier = "Apache-2.0"
[[annotations]]
path = ["Makefile"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "BSD-3-Clause"
[[annotations]]
path = ["README.md"]
precedence = "closest"
-SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
+SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd."
SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"