From 7b8d40666bfb0ea1052211518f0a50ebeff6f78c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 20 Mar 2022 21:38:52 +0100 Subject: [PATCH 1/5] Add wxART_QUIT icon to Tango art provider Gnome uses a variant of the "log out" icon for its standard "Exit" icon, so it should be fine for us to do it too, contrary to what the comment from back when Tango provider was added in c1d2466a79 (Add wxArtProvider using Tango icons., 2010-12-31) was saying. --- art/tango/application_exit.h | 542 +++++++++++++++++++++++++++++++++++ src/common/arttango.cpp | 7 +- 2 files changed, 546 insertions(+), 3 deletions(-) create mode 100644 art/tango/application_exit.h diff --git a/art/tango/application_exit.h b/art/tango/application_exit.h new file mode 100644 index 0000000000..f769261150 --- /dev/null +++ b/art/tango/application_exit.h @@ -0,0 +1,542 @@ +/* application_exit.svg - 8602 bytes */ +static const unsigned char application_exit_svg_data[] = { + + 0x3c, 0x73, 0x76, 0x67, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x32, 0x30, + 0x30, 0x30, 0x2f, 0x73, 0x76, 0x67, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x6c, + 0x69, 0x6e, 0x6b, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, + 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x78, 0x6c, 0x69, 0x6e, + 0x6b, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x34, 0x38, 0x22, 0x20, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x34, 0x38, 0x22, 0x3e, 0x3c, 0x64, 0x65, 0x66, 0x73, 0x3e, + 0x3c, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, + 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x75, + 0x73, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x6e, 0x55, 0x73, 0x65, 0x22, 0x20, 0x79, + 0x32, 0x3d, 0x22, 0x32, 0x37, 0x2e, 0x37, 0x35, 0x39, 0x22, 0x20, 0x78, 0x32, 0x3d, 0x22, 0x31, + 0x38, 0x2e, 0x30, 0x33, 0x31, 0x22, 0x20, 0x79, 0x31, 0x3d, 0x22, 0x31, 0x39, 0x2e, 0x38, 0x30, + 0x34, 0x22, 0x20, 0x78, 0x31, 0x3d, 0x22, 0x34, 0x36, 0x2e, 0x38, 0x34, 0x36, 0x22, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x6c, 0x22, 0x20, 0x78, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x23, 0x63, 0x22, 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3d, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, + 0x74, 0x65, 0x28, 0x2d, 0x31, 0x32, 0x2e, 0x30, 0x32, 0x29, 0x22, 0x2f, 0x3e, 0x3c, 0x6c, 0x69, + 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x69, 0x22, 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, + 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x62, 0x61, 0x62, + 0x64, 0x62, 0x36, 0x3b, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x3a, 0x31, 0x22, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x30, 0x22, 0x2f, 0x3e, + 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, + 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x62, 0x61, 0x62, 0x64, 0x62, 0x36, 0x3b, + 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x30, 0x22, 0x20, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x31, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, + 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x3e, 0x3c, 0x6c, 0x69, + 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x67, 0x22, 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x30, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x63, 0x65, 0x63, 0x65, 0x63, 0x65, 0x3b, 0x73, + 0x74, 0x6f, 0x70, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x22, 0x2f, 0x3e, + 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x31, 0x22, + 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x39, 0x65, 0x39, 0x65, 0x39, 0x65, 0x3b, 0x73, 0x74, 0x6f, 0x70, 0x2d, + 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, + 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x3e, 0x3c, 0x6c, 0x69, + 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x66, 0x22, 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x30, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, + 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x73, 0x74, 0x6f, 0x70, + 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x22, 0x2f, 0x3e, 0x3c, 0x73, 0x74, + 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x23, 0x66, 0x66, 0x66, 0x3b, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x3a, 0x30, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, + 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, + 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x65, 0x22, 0x3e, 0x3c, 0x73, + 0x74, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x35, 0x32, 0x35, 0x32, 0x35, 0x32, 0x3b, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x6f, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x22, 0x2f, 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x20, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x35, 0x32, + 0x35, 0x32, 0x35, 0x32, 0x3b, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x3a, 0x30, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, + 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, + 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x22, 0x3e, 0x3c, 0x73, + 0x74, 0x6f, 0x70, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x34, 0x65, 0x34, 0x65, 0x34, 0x65, 0x3b, 0x73, 0x74, + 0x6f, 0x70, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x22, 0x20, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x30, 0x22, 0x2f, 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x20, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x23, 0x36, 0x31, 0x36, 0x31, 0x36, 0x31, 0x3b, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x6f, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x30, 0x22, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x3d, 0x22, 0x31, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, + 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, + 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x22, 0x3e, 0x3c, 0x73, + 0x74, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x34, 0x65, 0x34, 0x65, 0x34, 0x65, 0x3b, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x6f, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x22, 0x2f, 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x20, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x61, 0x62, + 0x61, 0x62, 0x61, 0x62, 0x3b, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x3a, 0x31, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, + 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, + 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x22, 0x3e, 0x3c, 0x73, + 0x74, 0x6f, 0x70, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x73, 0x74, 0x6f, 0x70, 0x2d, + 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x22, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x3d, 0x22, 0x30, 0x22, 0x2f, 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, + 0x30, 0x30, 0x30, 0x3b, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x3a, 0x30, 0x22, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x31, 0x22, 0x2f, 0x3e, + 0x3c, 0x2f, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, + 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, + 0x20, 0x69, 0x64, 0x3d, 0x22, 0x61, 0x22, 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, + 0x23, 0x66, 0x66, 0x66, 0x3b, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x3a, 0x31, 0x22, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x30, 0x22, 0x2f, + 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, + 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x73, 0x74, + 0x6f, 0x70, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x30, 0x22, 0x20, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x31, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x6e, 0x65, + 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x65, + 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, + 0x22, 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, + 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x73, + 0x74, 0x6f, 0x70, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x22, 0x20, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x30, 0x22, 0x2f, 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, + 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x73, 0x74, 0x6f, 0x70, 0x2d, 0x6f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x3a, 0x30, 0x22, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3d, 0x22, + 0x31, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, + 0x69, 0x65, 0x6e, 0x74, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, + 0x69, 0x65, 0x6e, 0x74, 0x20, 0x78, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x23, 0x66, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x22, 0x20, 0x67, 0x72, 0x61, 0x64, + 0x69, 0x65, 0x6e, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x72, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x4f, 0x6e, 0x55, 0x73, 0x65, 0x22, 0x20, 0x78, 0x31, 0x3d, 0x22, 0x38, + 0x2e, 0x37, 0x36, 0x22, 0x20, 0x79, 0x31, 0x3d, 0x22, 0x31, 0x33, 0x2e, 0x36, 0x36, 0x33, 0x22, + 0x20, 0x78, 0x32, 0x3d, 0x22, 0x31, 0x39, 0x2e, 0x37, 0x35, 0x36, 0x22, 0x20, 0x79, 0x32, 0x3d, + 0x22, 0x34, 0x33, 0x2e, 0x34, 0x35, 0x22, 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3d, 0x22, 0x6d, 0x61, 0x74, 0x72, 0x69, + 0x78, 0x28, 0x2e, 0x39, 0x36, 0x38, 0x37, 0x32, 0x20, 0x30, 0x20, 0x30, 0x20, 0x2e, 0x39, 0x36, + 0x38, 0x39, 0x32, 0x20, 0x2e, 0x33, 0x36, 0x32, 0x20, 0x2e, 0x37, 0x33, 0x38, 0x29, 0x22, 0x2f, + 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, + 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x3d, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x2d, 0x31, + 0x33, 0x2e, 0x31, 0x33, 0x37, 0x29, 0x22, 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, + 0x55, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x4f, 0x6e, 0x55, 0x73, 0x65, 0x22, 0x20, 0x79, 0x32, 0x3d, 0x22, 0x32, 0x34, 0x2e, 0x37, 0x36, + 0x35, 0x22, 0x20, 0x78, 0x32, 0x3d, 0x22, 0x33, 0x34, 0x2e, 0x30, 0x30, 0x37, 0x22, 0x20, 0x79, + 0x31, 0x3d, 0x22, 0x31, 0x39, 0x2e, 0x31, 0x30, 0x38, 0x22, 0x20, 0x78, 0x31, 0x3d, 0x22, 0x33, + 0x31, 0x2e, 0x38, 0x35, 0x33, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6e, 0x22, 0x20, 0x78, 0x6c, + 0x69, 0x6e, 0x6b, 0x3a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x65, 0x22, 0x2f, 0x3e, 0x3c, + 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x67, + 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x75, 0x73, + 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x6e, 0x55, 0x73, 0x65, 0x22, 0x20, 0x79, 0x32, + 0x3d, 0x22, 0x31, 0x38, 0x2e, 0x30, 0x36, 0x34, 0x22, 0x20, 0x78, 0x32, 0x3d, 0x22, 0x33, 0x33, + 0x2e, 0x37, 0x31, 0x31, 0x22, 0x20, 0x79, 0x31, 0x3d, 0x22, 0x32, 0x31, 0x2e, 0x35, 0x31, 0x31, + 0x22, 0x20, 0x78, 0x31, 0x3d, 0x22, 0x33, 0x31, 0x2e, 0x30, 0x37, 0x39, 0x22, 0x20, 0x69, 0x64, + 0x3d, 0x22, 0x6f, 0x22, 0x20, 0x78, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x22, 0x23, 0x67, 0x22, 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3d, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, + 0x65, 0x28, 0x2d, 0x31, 0x32, 0x2e, 0x30, 0x32, 0x29, 0x22, 0x2f, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, + 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x78, 0x6c, 0x69, 0x6e, + 0x6b, 0x3a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x68, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, + 0x70, 0x22, 0x20, 0x78, 0x31, 0x3d, 0x22, 0x34, 0x30, 0x2e, 0x32, 0x35, 0x22, 0x20, 0x79, 0x31, + 0x3d, 0x22, 0x33, 0x31, 0x2e, 0x36, 0x32, 0x35, 0x22, 0x20, 0x78, 0x32, 0x3d, 0x22, 0x34, 0x30, + 0x2e, 0x32, 0x35, 0x22, 0x20, 0x79, 0x32, 0x3d, 0x22, 0x34, 0x33, 0x2e, 0x32, 0x35, 0x22, 0x20, + 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x75, + 0x73, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x6e, 0x55, 0x73, 0x65, 0x22, 0x20, 0x67, + 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x3d, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x2d, 0x31, 0x32, 0x2e, + 0x30, 0x32, 0x29, 0x22, 0x2f, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x47, 0x72, 0x61, + 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x78, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x23, 0x69, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6a, 0x22, 0x20, 0x78, 0x31, 0x3d, + 0x22, 0x31, 0x38, 0x2e, 0x37, 0x32, 0x39, 0x22, 0x20, 0x79, 0x31, 0x3d, 0x22, 0x34, 0x34, 0x22, + 0x20, 0x78, 0x32, 0x3d, 0x22, 0x31, 0x38, 0x2e, 0x37, 0x32, 0x39, 0x22, 0x20, 0x79, 0x32, 0x3d, + 0x22, 0x32, 0x39, 0x2e, 0x30, 0x36, 0x38, 0x22, 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, + 0x74, 0x55, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x4f, 0x6e, 0x55, 0x73, 0x65, 0x22, 0x2f, 0x3e, 0x3c, 0x72, 0x61, 0x64, 0x69, 0x61, 0x6c, + 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x78, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x62, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x71, 0x22, 0x20, + 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x75, + 0x73, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x6e, 0x55, 0x73, 0x65, 0x22, 0x20, 0x67, + 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x3d, 0x22, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x28, 0x31, 0x20, 0x30, 0x20, 0x30, 0x20, 0x2e, + 0x35, 0x33, 0x36, 0x37, 0x32, 0x20, 0x30, 0x20, 0x31, 0x36, 0x2e, 0x38, 0x37, 0x33, 0x29, 0x22, + 0x20, 0x63, 0x78, 0x3d, 0x22, 0x32, 0x34, 0x2e, 0x38, 0x33, 0x37, 0x22, 0x20, 0x63, 0x79, 0x3d, + 0x22, 0x33, 0x36, 0x2e, 0x34, 0x32, 0x31, 0x22, 0x20, 0x66, 0x78, 0x3d, 0x22, 0x32, 0x34, 0x2e, + 0x38, 0x33, 0x37, 0x22, 0x20, 0x66, 0x79, 0x3d, 0x22, 0x33, 0x36, 0x2e, 0x34, 0x32, 0x31, 0x22, + 0x20, 0x72, 0x3d, 0x22, 0x31, 0x35, 0x2e, 0x36, 0x34, 0x35, 0x22, 0x2f, 0x3e, 0x3c, 0x72, 0x61, + 0x64, 0x69, 0x61, 0x6c, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x78, 0x6c, 0x69, + 0x6e, 0x6b, 0x3a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x61, 0x22, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x72, 0x22, 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x55, 0x6e, 0x69, 0x74, + 0x73, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x6e, 0x55, 0x73, + 0x65, 0x22, 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x3d, 0x22, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x28, 0x31, 0x2e, 0x32, + 0x35, 0x33, 0x34, 0x34, 0x20, 0x30, 0x20, 0x30, 0x20, 0x2e, 0x39, 0x35, 0x33, 0x39, 0x20, 0x2d, + 0x31, 0x35, 0x2e, 0x34, 0x38, 0x20, 0x31, 0x31, 0x2e, 0x32, 0x37, 0x37, 0x29, 0x22, 0x20, 0x63, + 0x78, 0x3d, 0x22, 0x31, 0x39, 0x2e, 0x37, 0x30, 0x31, 0x22, 0x20, 0x63, 0x79, 0x3d, 0x22, 0x32, + 0x2e, 0x38, 0x39, 0x37, 0x22, 0x20, 0x66, 0x78, 0x3d, 0x22, 0x31, 0x39, 0x2e, 0x37, 0x30, 0x31, + 0x22, 0x20, 0x66, 0x79, 0x3d, 0x22, 0x32, 0x2e, 0x38, 0x39, 0x37, 0x22, 0x20, 0x72, 0x3d, 0x22, + 0x31, 0x37, 0x2e, 0x31, 0x37, 0x31, 0x22, 0x2f, 0x3e, 0x3c, 0x72, 0x61, 0x64, 0x69, 0x61, 0x6c, + 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, + 0x74, 0x55, 0x6e, 0x69, 0x74, 0x73, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x72, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x4f, 0x6e, 0x55, 0x73, 0x65, 0x22, 0x20, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x3d, 0x22, 0x6d, 0x61, 0x74, 0x72, 0x69, + 0x78, 0x28, 0x32, 0x2e, 0x35, 0x36, 0x35, 0x38, 0x32, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x2e, + 0x34, 0x30, 0x33, 0x32, 0x36, 0x20, 0x2d, 0x34, 0x39, 0x2e, 0x38, 0x30, 0x34, 0x20, 0x2d, 0x39, + 0x2e, 0x34, 0x38, 0x33, 0x29, 0x22, 0x20, 0x72, 0x3d, 0x22, 0x39, 0x2e, 0x37, 0x32, 0x33, 0x22, + 0x20, 0x66, 0x79, 0x3d, 0x22, 0x37, 0x2e, 0x31, 0x34, 0x22, 0x20, 0x66, 0x78, 0x3d, 0x22, 0x32, + 0x37, 0x2e, 0x38, 0x38, 0x34, 0x22, 0x20, 0x63, 0x79, 0x3d, 0x22, 0x37, 0x2e, 0x31, 0x34, 0x22, + 0x20, 0x63, 0x78, 0x3d, 0x22, 0x32, 0x37, 0x2e, 0x38, 0x38, 0x34, 0x22, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x6d, 0x22, 0x20, 0x78, 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x23, 0x64, 0x22, 0x2f, 0x3e, 0x3c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x78, 0x3d, 0x22, + 0x2d, 0x2e, 0x30, 0x36, 0x37, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x2e, + 0x31, 0x33, 0x34, 0x22, 0x20, 0x79, 0x3d, 0x22, 0x2d, 0x2e, 0x31, 0x32, 0x22, 0x20, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x31, 0x2e, 0x32, 0x33, 0x39, 0x22, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x6b, 0x22, 0x3e, 0x3c, 0x66, 0x65, 0x47, 0x61, 0x75, 0x73, 0x73, 0x69, 0x61, 0x6e, 0x42, + 0x6c, 0x75, 0x72, 0x20, 0x73, 0x74, 0x64, 0x44, 0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3d, 0x22, 0x2e, 0x37, 0x36, 0x39, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x3e, 0x3c, 0x2f, 0x64, 0x65, 0x66, 0x73, 0x3e, 0x3c, 0x72, 0x65, 0x63, 0x74, 0x20, 0x72, + 0x79, 0x3d, 0x22, 0x2e, 0x37, 0x30, 0x37, 0x22, 0x20, 0x72, 0x78, 0x3d, 0x22, 0x2e, 0x37, 0x30, + 0x37, 0x22, 0x20, 0x79, 0x3d, 0x22, 0x32, 0x2e, 0x35, 0x36, 0x39, 0x22, 0x20, 0x78, 0x3d, 0x22, + 0x31, 0x2e, 0x34, 0x38, 0x31, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x34, + 0x31, 0x2e, 0x39, 0x34, 0x32, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x31, + 0x2e, 0x39, 0x39, 0x36, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, + 0x30, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x23, 0x65, 0x65, 0x65, 0x65, 0x65, 0x63, 0x3b, 0x66, + 0x69, 0x6c, 0x6c, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x66, 0x69, + 0x6c, 0x6c, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x3a, 0x65, 0x76, 0x65, 0x6e, 0x6f, 0x64, 0x64, 0x3b, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x23, 0x35, 0x35, 0x35, 0x37, 0x35, 0x33, 0x3b, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x2e, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x34, 0x38, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, + 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3a, 0x62, 0x75, 0x74, 0x74, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x3a, 0x6d, 0x69, 0x74, 0x65, 0x72, + 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x6d, 0x69, 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x3a, 0x31, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, + 0x2d, 0x64, 0x61, 0x73, 0x68, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3a, 0x30, 0x3b, 0x73, 0x74, + 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x22, 0x2f, 0x3e, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, + 0x22, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x75, 0x72, 0x6c, 0x28, 0x23, + 0x6a, 0x29, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, + 0x31, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x3a, 0x65, 0x76, 0x65, 0x6e, + 0x6f, 0x64, 0x64, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x3b, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3a, 0x62, 0x75, + 0x74, 0x74, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x6f, + 0x69, 0x6e, 0x3a, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x6d, 0x69, + 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x65, 0x6e, + 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6d, 0x69, + 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x31, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, + 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x3a, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, + 0x77, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x31, + 0x2e, 0x39, 0x37, 0x39, 0x20, 0x31, 0x37, 0x2e, 0x32, 0x34, 0x31, 0x68, 0x33, 0x31, 0x56, 0x34, + 0x34, 0x68, 0x2d, 0x33, 0x31, 0x7a, 0x22, 0x2f, 0x3e, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x2e, 0x35, + 0x35, 0x34, 0x32, 0x38, 0x35, 0x36, 0x39, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x23, 0x30, 0x30, + 0x30, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, + 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x3a, 0x65, 0x76, 0x65, 0x6e, 0x6f, + 0x64, 0x64, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x70, 0x78, 0x3b, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3a, 0x62, + 0x75, 0x74, 0x74, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, + 0x6f, 0x69, 0x6e, 0x3a, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, + 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x3a, 0x75, 0x72, 0x6c, 0x28, 0x23, 0x6b, 0x29, 0x22, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x32, + 0x2e, 0x31, 0x30, 0x34, 0x20, 0x34, 0x33, 0x2e, 0x38, 0x37, 0x35, 0x20, 0x32, 0x33, 0x2e, 0x34, + 0x38, 0x20, 0x33, 0x35, 0x73, 0x33, 0x2e, 0x35, 0x31, 0x34, 0x2d, 0x32, 0x2e, 0x32, 0x32, 0x2e, + 0x32, 0x35, 0x2d, 0x33, 0x2e, 0x35, 0x63, 0x2d, 0x33, 0x2e, 0x34, 0x31, 0x35, 0x2d, 0x31, 0x2e, + 0x33, 0x34, 0x2d, 0x37, 0x20, 0x2e, 0x35, 0x2d, 0x37, 0x20, 0x2e, 0x35, 0x4c, 0x32, 0x2e, 0x31, + 0x30, 0x34, 0x20, 0x34, 0x33, 0x2e, 0x38, 0x37, 0x35, 0x7a, 0x22, 0x2f, 0x3e, 0x3c, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x6d, 0x32, 0x2e, 0x30, 0x31, 0x37, 0x20, 0x34, 0x33, 0x2e, + 0x39, 0x34, 0x35, 0x2d, 0x2e, 0x30, 0x33, 0x39, 0x2d, 0x34, 0x30, 0x2e, 0x38, 0x39, 0x20, 0x31, + 0x39, 0x2e, 0x39, 0x34, 0x32, 0x2e, 0x30, 0x34, 0x34, 0x2e, 0x30, 0x34, 0x35, 0x20, 0x32, 0x39, + 0x2e, 0x39, 0x32, 0x4c, 0x32, 0x2e, 0x30, 0x31, 0x37, 0x20, 0x34, 0x33, 0x2e, 0x39, 0x34, 0x34, + 0x7a, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x3a, 0x31, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x66, + 0x69, 0x6c, 0x6c, 0x3a, 0x75, 0x72, 0x6c, 0x28, 0x23, 0x6c, 0x29, 0x3b, 0x66, 0x69, 0x6c, 0x6c, + 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, + 0x72, 0x75, 0x6c, 0x65, 0x3a, 0x65, 0x76, 0x65, 0x6e, 0x6f, 0x64, 0x64, 0x3b, 0x73, 0x74, 0x72, + 0x6f, 0x6b, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, + 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3a, 0x62, 0x75, 0x74, 0x74, 0x3b, 0x73, 0x74, 0x72, 0x6f, + 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x3a, 0x6d, 0x69, 0x74, 0x65, + 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x6d, 0x69, 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x3a, 0x31, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3a, 0x30, 0x3b, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, + 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, + 0x3d, 0x22, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x2e, 0x34, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x34, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x66, + 0x69, 0x6c, 0x6c, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x6f, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x72, 0x75, 0x6c, + 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, + 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3a, 0x33, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, + 0x63, 0x61, 0x70, 0x3a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, + 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x3a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3b, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x6d, 0x69, 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, + 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, + 0x34, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, + 0x61, 0x73, 0x68, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3a, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, + 0x6b, 0x65, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x6f, 0x76, + 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x20, + 0x64, 0x3d, 0x22, 0x6d, 0x31, 0x2e, 0x39, 0x34, 0x39, 0x20, 0x34, 0x33, 0x2e, 0x39, 0x34, 0x35, + 0x20, 0x32, 0x30, 0x2e, 0x31, 0x34, 0x38, 0x2d, 0x31, 0x30, 0x2e, 0x38, 0x38, 0x33, 0x4c, 0x33, + 0x2e, 0x35, 0x33, 0x36, 0x20, 0x34, 0x31, 0x2e, 0x39, 0x39, 0x56, 0x33, 0x2e, 0x30, 0x31, 0x68, + 0x2d, 0x31, 0x2e, 0x35, 0x37, 0x6c, 0x2d, 0x2e, 0x30, 0x31, 0x37, 0x20, 0x34, 0x30, 0x2e, 0x39, + 0x33, 0x35, 0x7a, 0x22, 0x2f, 0x3e, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x3d, 0x22, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x75, 0x72, 0x6c, + 0x28, 0x23, 0x6d, 0x29, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x3a, 0x31, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x3a, 0x65, 0x76, + 0x65, 0x6e, 0x6f, 0x64, 0x64, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, + 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3a, + 0x62, 0x75, 0x74, 0x74, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, + 0x6a, 0x6f, 0x69, 0x6e, 0x3a, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x72, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, + 0x6d, 0x69, 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, + 0x65, 0x6e, 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, + 0x6d, 0x69, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x31, 0x30, 0x3b, 0x73, 0x74, + 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x6f, + 0x66, 0x66, 0x73, 0x65, 0x74, 0x3a, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6f, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3b, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, + 0x6c, 0x6f, 0x77, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x3d, 0x22, + 0x4d, 0x32, 0x2e, 0x30, 0x32, 0x34, 0x20, 0x34, 0x33, 0x2e, 0x37, 0x35, 0x37, 0x20, 0x31, 0x2e, + 0x39, 0x37, 0x39, 0x20, 0x33, 0x2e, 0x30, 0x35, 0x35, 0x48, 0x32, 0x31, 0x2e, 0x39, 0x32, 0x6c, + 0x2d, 0x2e, 0x31, 0x37, 0x39, 0x20, 0x33, 0x30, 0x2e, 0x36, 0x32, 0x36, 0x4c, 0x32, 0x2e, 0x30, + 0x32, 0x34, 0x20, 0x34, 0x33, 0x2e, 0x37, 0x35, 0x37, 0x7a, 0x22, 0x2f, 0x3e, 0x3c, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x6d, 0x31, 0x37, 0x2e, 0x36, 0x32, 0x32, 0x20, 0x31, 0x38, + 0x2e, 0x34, 0x35, 0x36, 0x20, 0x31, 0x2e, 0x39, 0x32, 0x33, 0x20, 0x32, 0x2e, 0x34, 0x35, 0x33, + 0x2d, 0x31, 0x2e, 0x34, 0x35, 0x39, 0x20, 0x34, 0x2e, 0x38, 0x31, 0x37, 0x73, 0x2e, 0x32, 0x36, + 0x35, 0x20, 0x31, 0x2e, 0x35, 0x30, 0x33, 0x20, 0x31, 0x2e, 0x30, 0x33, 0x39, 0x2e, 0x34, 0x38, + 0x36, 0x63, 0x2e, 0x37, 0x37, 0x33, 0x2d, 0x31, 0x2e, 0x30, 0x31, 0x36, 0x20, 0x32, 0x2e, 0x39, + 0x37, 0x32, 0x2d, 0x33, 0x2e, 0x35, 0x38, 0x32, 0x20, 0x32, 0x2e, 0x35, 0x38, 0x35, 0x2d, 0x35, + 0x2e, 0x34, 0x35, 0x38, 0x2d, 0x2e, 0x32, 0x38, 0x37, 0x2d, 0x31, 0x2e, 0x33, 0x39, 0x32, 0x2d, + 0x31, 0x2e, 0x30, 0x38, 0x33, 0x2d, 0x32, 0x2e, 0x30, 0x35, 0x35, 0x2d, 0x31, 0x2e, 0x30, 0x38, + 0x33, 0x2d, 0x32, 0x2e, 0x30, 0x35, 0x35, 0x6c, 0x2d, 0x33, 0x2e, 0x30, 0x30, 0x35, 0x2d, 0x2e, + 0x32, 0x34, 0x33, 0x7a, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, + 0x30, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x75, 0x72, 0x6c, 0x28, 0x23, 0x6e, 0x29, 0x3b, 0x66, + 0x69, 0x6c, 0x6c, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x66, 0x69, + 0x6c, 0x6c, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x3a, 0x65, 0x76, 0x65, 0x6e, 0x6f, 0x64, 0x64, 0x3b, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, + 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3a, 0x62, 0x75, 0x74, 0x74, 0x3b, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x3a, 0x6d, + 0x69, 0x74, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, + 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x6e, 0x6f, + 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x6d, 0x69, 0x64, 0x3a, 0x6e, 0x6f, + 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x64, 0x3a, 0x6e, 0x6f, + 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x31, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, + 0x61, 0x73, 0x68, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, + 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3a, + 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x3a, 0x31, 0x3b, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x64, 0x3d, + 0x22, 0x4d, 0x31, 0x39, 0x2e, 0x34, 0x35, 0x36, 0x20, 0x31, 0x37, 0x2e, 0x33, 0x35, 0x31, 0x73, + 0x32, 0x2e, 0x31, 0x36, 0x34, 0x20, 0x31, 0x2e, 0x30, 0x30, 0x32, 0x20, 0x32, 0x2e, 0x32, 0x33, + 0x32, 0x20, 0x31, 0x2e, 0x38, 0x37, 0x39, 0x63, 0x2e, 0x31, 0x30, 0x32, 0x20, 0x31, 0x2e, 0x33, + 0x30, 0x31, 0x2d, 0x34, 0x2e, 0x32, 0x34, 0x33, 0x20, 0x35, 0x2e, 0x34, 0x33, 0x35, 0x2d, 0x34, + 0x2e, 0x32, 0x34, 0x33, 0x20, 0x35, 0x2e, 0x34, 0x33, 0x35, 0x2d, 0x2e, 0x35, 0x30, 0x38, 0x2e, + 0x36, 0x32, 0x2d, 0x31, 0x2e, 0x33, 0x34, 0x37, 0x2e, 0x30, 0x36, 0x37, 0x2d, 0x2e, 0x38, 0x38, + 0x33, 0x2d, 0x2e, 0x35, 0x33, 0x20, 0x30, 0x20, 0x30, 0x20, 0x33, 0x2e, 0x34, 0x36, 0x36, 0x2d, + 0x34, 0x2e, 0x31, 0x31, 0x38, 0x20, 0x33, 0x2e, 0x32, 0x34, 0x38, 0x2d, 0x34, 0x2e, 0x34, 0x34, + 0x31, 0x2d, 0x2e, 0x32, 0x37, 0x34, 0x2d, 0x2e, 0x34, 0x30, 0x36, 0x2d, 0x31, 0x2e, 0x39, 0x36, + 0x37, 0x2d, 0x31, 0x2e, 0x30, 0x33, 0x39, 0x2d, 0x31, 0x2e, 0x39, 0x36, 0x37, 0x2d, 0x31, 0x2e, + 0x30, 0x33, 0x39, 0x2d, 0x31, 0x2e, 0x30, 0x31, 0x36, 0x2d, 0x2e, 0x37, 0x35, 0x31, 0x2e, 0x32, + 0x36, 0x38, 0x2d, 0x32, 0x2e, 0x33, 0x30, 0x35, 0x20, 0x31, 0x2e, 0x36, 0x31, 0x33, 0x2d, 0x31, + 0x2e, 0x33, 0x30, 0x34, 0x7a, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6f, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, + 0x30, 0x30, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x75, 0x72, 0x6c, 0x28, 0x23, 0x6f, 0x29, 0x3b, + 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x66, + 0x69, 0x6c, 0x6c, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x3a, 0x65, 0x76, 0x65, 0x6e, 0x6f, 0x64, 0x64, + 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, + 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x3b, 0x73, 0x74, 0x72, 0x6f, + 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3a, 0x62, 0x75, 0x74, 0x74, 0x3b, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x3a, + 0x6d, 0x69, 0x74, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x6d, 0x69, 0x64, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x64, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6d, 0x69, 0x74, 0x65, 0x72, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x31, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, + 0x64, 0x61, 0x73, 0x68, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x3a, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x3a, 0x31, 0x3b, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x75, 0x72, 0x6c, 0x28, 0x23, + 0x70, 0x29, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, + 0x31, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x3a, 0x65, 0x76, 0x65, 0x6e, + 0x6f, 0x64, 0x64, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x70, 0x78, + 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3a, + 0x62, 0x75, 0x74, 0x74, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, + 0x6a, 0x6f, 0x69, 0x6e, 0x3a, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x3a, 0x75, 0x72, 0x6c, 0x28, 0x23, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x36, 0x34, + 0x32, 0x31, 0x29, 0x3b, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x2e, 0x38, 0x37, 0x34, + 0x32, 0x38, 0x35, 0x37, 0x31, 0x22, 0x20, 0x64, 0x3d, 0x22, 0x6d, 0x32, 0x32, 0x2e, 0x32, 0x33, + 0x20, 0x33, 0x2e, 0x35, 0x2d, 0x2e, 0x35, 0x20, 0x32, 0x39, 0x2e, 0x37, 0x35, 0x2d, 0x31, 0x38, + 0x20, 0x39, 0x2e, 0x37, 0x35, 0x20, 0x32, 0x39, 0x2e, 0x32, 0x35, 0x2e, 0x32, 0x35, 0x2d, 0x2e, + 0x32, 0x35, 0x2d, 0x33, 0x39, 0x2e, 0x37, 0x35, 0x68, 0x2d, 0x31, 0x30, 0x2e, 0x35, 0x7a, 0x22, + 0x2f, 0x3e, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x3d, 0x22, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x28, 0x2d, 0x2e, 0x37, 0x37, 0x38, 0x34, + 0x39, 0x20, 0x30, 0x20, 0x30, 0x20, 0x2e, 0x37, 0x37, 0x38, 0x34, 0x39, 0x20, 0x35, 0x35, 0x2e, + 0x37, 0x38, 0x31, 0x20, 0x31, 0x2e, 0x35, 0x35, 0x29, 0x22, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x34, + 0x30, 0x2e, 0x34, 0x38, 0x32, 0x20, 0x33, 0x36, 0x2e, 0x34, 0x32, 0x31, 0x61, 0x31, 0x35, 0x2e, + 0x36, 0x34, 0x35, 0x20, 0x38, 0x2e, 0x33, 0x39, 0x37, 0x20, 0x30, 0x20, 0x31, 0x20, 0x31, 0x2d, + 0x33, 0x31, 0x2e, 0x32, 0x39, 0x20, 0x30, 0x20, 0x31, 0x35, 0x2e, 0x36, 0x34, 0x35, 0x20, 0x38, + 0x2e, 0x33, 0x39, 0x37, 0x20, 0x30, 0x20, 0x31, 0x20, 0x31, 0x20, 0x33, 0x31, 0x2e, 0x32, 0x39, + 0x20, 0x30, 0x7a, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6f, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x3a, 0x2e, 0x32, 0x39, 0x39, 0x34, 0x36, 0x35, 0x32, 0x32, 0x3b, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x75, 0x72, + 0x6c, 0x28, 0x23, 0x71, 0x29, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x3a, 0x65, + 0x76, 0x65, 0x6e, 0x6f, 0x64, 0x64, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x6e, 0x6f, + 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x31, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, + 0x3a, 0x62, 0x75, 0x74, 0x74, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, + 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x3a, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x72, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, + 0x2d, 0x6d, 0x69, 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, + 0x2d, 0x65, 0x6e, 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, + 0x2d, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x31, 0x30, 0x3b, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3a, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, + 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3b, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x6f, 0x76, 0x65, 0x72, + 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x2f, 0x3e, 0x3c, + 0x70, 0x61, 0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x31, 0x2e, 0x37, 0x33, 0x32, 0x20, 0x31, + 0x37, 0x2e, 0x35, 0x39, 0x34, 0x76, 0x31, 0x32, 0x2e, 0x37, 0x36, 0x31, 0x68, 0x37, 0x2e, 0x39, + 0x33, 0x32, 0x76, 0x35, 0x2e, 0x38, 0x32, 0x31, 0x6c, 0x31, 0x32, 0x2e, 0x32, 0x32, 0x34, 0x2d, + 0x31, 0x32, 0x2e, 0x32, 0x32, 0x33, 0x4c, 0x39, 0x2e, 0x35, 0x39, 0x20, 0x31, 0x31, 0x2e, 0x36, + 0x35, 0x36, 0x76, 0x35, 0x2e, 0x39, 0x34, 0x31, 0x6c, 0x2d, 0x37, 0x2e, 0x38, 0x36, 0x2d, 0x2e, + 0x30, 0x30, 0x33, 0x7a, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, + 0x30, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x23, 0x63, 0x30, 0x30, 0x3b, 0x66, 0x69, 0x6c, 0x6c, + 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, + 0x72, 0x75, 0x6c, 0x65, 0x3a, 0x65, 0x76, 0x65, 0x6e, 0x6f, 0x64, 0x64, 0x3b, 0x73, 0x74, 0x72, + 0x6f, 0x6b, 0x65, 0x3a, 0x23, 0x61, 0x34, 0x30, 0x30, 0x30, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, + 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3b, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x3a, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x6d, 0x69, 0x64, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x64, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6d, 0x69, 0x74, 0x65, 0x72, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x31, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, + 0x64, 0x61, 0x73, 0x68, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x3a, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x3a, 0x31, 0x3b, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x3d, 0x22, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x28, 0x2d, 0x31, 0x20, 0x30, 0x20, 0x30, + 0x20, 0x31, 0x20, 0x34, 0x38, 0x2e, 0x32, 0x30, 0x31, 0x20, 0x2d, 0x2e, 0x30, 0x34, 0x37, 0x29, + 0x22, 0x2f, 0x3e, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x39, 0x2e, 0x39, + 0x32, 0x34, 0x20, 0x31, 0x32, 0x2e, 0x34, 0x37, 0x38, 0x76, 0x35, 0x2e, 0x36, 0x33, 0x38, 0x68, + 0x2d, 0x37, 0x2e, 0x38, 0x35, 0x76, 0x36, 0x2e, 0x34, 0x31, 0x35, 0x63, 0x31, 0x30, 0x2e, 0x32, + 0x35, 0x39, 0x2d, 0x33, 0x2e, 0x38, 0x32, 0x37, 0x20, 0x39, 0x2e, 0x38, 0x38, 0x31, 0x20, 0x33, + 0x2e, 0x32, 0x34, 0x33, 0x20, 0x31, 0x39, 0x2e, 0x32, 0x32, 0x2d, 0x2e, 0x35, 0x38, 0x35, 0x4c, + 0x39, 0x2e, 0x39, 0x32, 0x34, 0x20, 0x31, 0x32, 0x2e, 0x34, 0x37, 0x38, 0x7a, 0x22, 0x20, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x2e, 0x35, + 0x30, 0x38, 0x30, 0x32, 0x31, 0x34, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, + 0x30, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x3a, 0x75, 0x72, 0x6c, 0x28, 0x23, 0x72, 0x29, 0x3b, 0x66, + 0x69, 0x6c, 0x6c, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x66, 0x69, + 0x6c, 0x6c, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x3a, 0x65, 0x76, 0x65, 0x6e, 0x6f, 0x64, 0x64, 0x3b, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, + 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, + 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3b, + 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x3a, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x6d, 0x69, 0x64, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x65, 0x6e, 0x64, 0x3a, 0x6e, + 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6d, 0x69, 0x74, 0x65, 0x72, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x31, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, + 0x64, 0x61, 0x73, 0x68, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x3a, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x3a, 0x31, 0x3b, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x3d, 0x22, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x28, 0x2d, 0x31, 0x20, 0x30, 0x20, 0x30, + 0x20, 0x31, 0x20, 0x34, 0x38, 0x2e, 0x32, 0x30, 0x31, 0x20, 0x2d, 0x2e, 0x30, 0x34, 0x37, 0x29, + 0x22, 0x2f, 0x3e, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, + 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x3a, 0x2e, 0x34, 0x38, 0x31, 0x32, 0x38, 0x33, 0x33, + 0x39, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x66, 0x69, 0x6c, + 0x6c, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x6f, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x66, 0x69, 0x6c, 0x6c, 0x2d, 0x72, 0x75, 0x6c, 0x65, 0x3a, + 0x65, 0x76, 0x65, 0x6e, 0x6f, 0x64, 0x64, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3a, 0x75, + 0x72, 0x6c, 0x28, 0x23, 0x73, 0x29, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3a, 0x31, 0x2e, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x32, 0x3b, 0x73, + 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3a, 0x62, 0x75, + 0x74, 0x74, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x6f, + 0x69, 0x6e, 0x3a, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x3a, + 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x6d, 0x69, + 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2d, 0x65, 0x6e, + 0x64, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6d, 0x69, + 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3a, 0x31, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, + 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, + 0x65, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x64, 0x61, 0x73, 0x68, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x3a, 0x30, 0x3b, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6f, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x3a, 0x31, 0x3b, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, + 0x77, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x32, + 0x2e, 0x36, 0x38, 0x33, 0x20, 0x31, 0x38, 0x2e, 0x35, 0x36, 0x36, 0x76, 0x31, 0x30, 0x2e, 0x37, + 0x39, 0x68, 0x37, 0x2e, 0x39, 0x30, 0x32, 0x76, 0x34, 0x2e, 0x31, 0x32, 0x35, 0x6c, 0x39, 0x2e, + 0x35, 0x34, 0x33, 0x2d, 0x39, 0x2e, 0x35, 0x34, 0x2d, 0x39, 0x2e, 0x36, 0x30, 0x36, 0x2d, 0x39, + 0x2e, 0x39, 0x34, 0x34, 0x76, 0x34, 0x2e, 0x35, 0x37, 0x32, 0x6c, 0x2d, 0x37, 0x2e, 0x38, 0x33, + 0x39, 0x2d, 0x2e, 0x30, 0x30, 0x33, 0x7a, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x3d, 0x22, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x28, 0x2d, 0x31, 0x20, 0x30, 0x20, + 0x30, 0x20, 0x31, 0x20, 0x34, 0x38, 0x2e, 0x32, 0x30, 0x31, 0x20, 0x2d, 0x2e, 0x30, 0x34, 0x37, + 0x29, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x73, 0x76, 0x67, 0x3e +}; diff --git a/src/common/arttango.cpp b/src/common/arttango.cpp index 8d4555c937..8cd77db770 100644 --- a/src/common/arttango.cpp +++ b/src/common/arttango.cpp @@ -35,6 +35,7 @@ // ---------------------------------------------------------------------------- // All files in art/tango in alphabetical order: +#include "../../art/tango/application_exit.h" #include "../../art/tango/application_x_executable.h" #include "../../art/tango/dialog_error.h" #include "../../art/tango/dialog_information.h" @@ -185,9 +186,9 @@ wxTangoArtProvider::CreateBitmapBundle(const wxArtID& id, { wxART_PLUS, BITMAP_DATA(list_add) }, { wxART_MINUS, BITMAP_DATA(list_remove) }, - // Surprisingly Tango doesn't seem to have neither wxART_CLOSE nor - // wxART_QUIT. We could use system-log-out for the latter but it - // doesn't seem quite right. + // Surprisingly Tango doesn't seem to have wxART_CLOSE. + + { wxART_QUIT, BITMAP_DATA(application_exit) }, { wxART_FIND, BITMAP_DATA(edit_find) }, { wxART_FIND_AND_REPLACE, BITMAP_DATA(edit_find_replace) }, From d9a48edc8148d452f384965e4cd8fd438b82b84d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 20 Mar 2022 21:54:33 +0100 Subject: [PATCH 2/5] Restore the old default size of Tango art provider bitmaps The default size of the bitmaps created from bitmap bundles returned by the Tango art provider for the client strings different from wxART_MENU and wxART_BUTTON was changed from 24x24 to 16x16 in 766fefeb34 (Use SVG instead of PNGs in tango art provider, 2022-01-27), see #22067, without any real need and perhaps even non intentionally at all. Restore the old default size to restore the old behaviour. See #22189. --- src/common/arttango.cpp | 8 ++++++-- tests/graphics/bmpbundle.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/common/arttango.cpp b/src/common/arttango.cpp index 8cd77db770..969597968c 100644 --- a/src/common/arttango.cpp +++ b/src/common/arttango.cpp @@ -209,8 +209,12 @@ wxTangoArtProvider::CreateBitmapBundle(const wxArtID& id, wxSize sizeDef = size != wxDefaultSize ? size : GetSizeHint(client); if (sizeDef == wxDefaultSize) { - // We really need some default size here. - sizeDef = wxSize(16, 16); + // We really need some default size here, so keep using the same + // sizes we used for PNG-based implementation we had before. + if ( client == wxART_MENU || client == wxART_BUTTON ) + sizeDef = wxSize(16, 16); + else + sizeDef = wxSize(24, 24); } return wxBitmapBundle::FromSVG(entry.data, entry.len, sizeDef); } diff --git a/tests/graphics/bmpbundle.cpp b/tests/graphics/bmpbundle.cpp index 25002b29ef..a703fe0bec 100644 --- a/tests/graphics/bmpbundle.cpp +++ b/tests/graphics/bmpbundle.cpp @@ -162,6 +162,30 @@ TEST_CASE("BitmapBundle::ArtProvider", "[bmpbundle][art]") b = wxArtProvider::GetBitmapBundle(wxART_INFORMATION, wxART_MENU, size); CHECK( b.IsOk() ); CHECK( b.GetDefaultSize() == size ); + +#if wxUSE_ARTPROVIDER_TANGO + // Tango art provider is supposed to use 16px for the default size of the + // menu and button images and 24px for all the other ones, but we need to + // choose the client kind for which the current platform doesn't define its + // own default/fallback size to be able to test for it, i.e. this is the + // client for which GetNativeSizeHint() of the native art provider returns + // wxDefaultSize. + const wxArtClient artClient = +#ifdef __WXMSW__ + wxART_TOOLBAR +#else + wxART_LIST +#endif + ; + + // We also need to use an image provided by Tango but not by the native art + // provider, but here we can at least avoid the platform checks by using an + // image not provided by any native providers. + b = wxArtProvider::GetBitmapBundle(wxART_REFRESH, artClient); + + CHECK( b.IsOk() ); + CHECK( b.GetDefaultSize() == wxSize(24, 24) ); +#endif // wxUSE_ARTPROVIDER_TANGO } // This test only makes sense for the ports that actually support scaled From cc02b3cece5981d484d8f09a6ba47acf7d6b2564 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 20 Mar 2022 22:10:20 +0100 Subject: [PATCH 3/5] Revert "Assure that all images in the generic wxImageList have the same scale factor" This reverts commit b6d305e4f24aaaa8ffac561d8d119176cb0e9707 because silently discarding images using a different scale factor is simply too user-unfriendly: this can silently break the existing code, i.e. it can still compile perfectly and not give any errors during run-time but not show any images neither. Also revert most of dc43d15cf7 (Add tests of storing HiDPI images in generic wxImageList (wxOSX, wxGTK3), 2021-04-05) as these tests don't pass any longer because the behaviour was intentionally changed. See #22189. --- include/wx/generic/imaglist.h | 2 - src/generic/imaglist.cpp | 34 ++--- tests/graphics/imagelist.cpp | 242 ++++++---------------------------- 3 files changed, 46 insertions(+), 232 deletions(-) diff --git a/include/wx/generic/imaglist.h b/include/wx/generic/imaglist.h index c2da30e487..8984ccfd3b 100644 --- a/include/wx/generic/imaglist.h +++ b/include/wx/generic/imaglist.h @@ -63,8 +63,6 @@ private: // Size of a single bitmap in the list. wxSize m_size; - // Images in the list should have the same scale factor. - double m_scaleFactor; wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxGenericImageList); }; diff --git a/src/generic/imaglist.cpp b/src/generic/imaglist.cpp index 961ad5120b..76c0a107bd 100644 --- a/src/generic/imaglist.cpp +++ b/src/generic/imaglist.cpp @@ -63,7 +63,6 @@ bool wxGenericImageList::Create( int width, int height, bool mask, int WXUNUSED( // Prevent from storing negative dimensions m_size = wxSize(wxMax(width, 0), wxMax(height, 0)); m_useMask = mask; - m_scaleFactor = 1.0; // Images must have proper size return m_size != wxSize(0, 0); @@ -71,7 +70,7 @@ bool wxGenericImageList::Create( int width, int height, bool mask, int WXUNUSED( namespace { -wxBitmap GetImageListBitmap(const wxBitmap& bitmap, bool useMask, const wxSize& imgSize, double scaleFactor) +wxBitmap GetImageListBitmap(const wxBitmap& bitmap, bool useMask, const wxSize& imgSize) { wxBitmap bmp(bitmap); if ( useMask ) @@ -86,7 +85,7 @@ wxBitmap GetImageListBitmap(const wxBitmap& bitmap, bool useMask, const wxSize& #if wxUSE_IMAGE wxImage img = bmp.ConvertToImage(); img.ClearAlpha(); - bmp = wxBitmap(img, -1, scaleFactor); + bmp = wxBitmap(img, -1, bmp.GetScaleFactor()); #endif // wxUSE_IMAGE } } @@ -98,7 +97,7 @@ wxBitmap GetImageListBitmap(const wxBitmap& bitmap, bool useMask, const wxSize& #if wxUSE_IMAGE wxImage img = bmp.ConvertToImage(); img.ConvertAlphaToMask(); - bmp = wxBitmap(img, -1, scaleFactor); + bmp = wxBitmap(img, -1, bmp.GetScaleFactor()); #endif // wxUSE_IMAGE } else @@ -124,7 +123,7 @@ wxBitmap GetImageListBitmap(const wxBitmap& bitmap, bool useMask, const wxSize& #if wxUSE_IMAGE wxImage img = bmp.ConvertToImage(); img.InitAlpha(); - bmp = wxBitmap(img, -1, scaleFactor); + bmp = wxBitmap(img, -1, bmp.GetScaleFactor()); #else bmp.SetMask(NULL); #endif // wxUSE_IMAGE @@ -149,6 +148,7 @@ wxBitmap GetImageListBitmap(const wxBitmap& bitmap, bool useMask, const wxSize& #if wxUSE_IMAGE wxImage img = bmp.ConvertToImage(); // We need image with new physical size + const double scaleFactor = bmp.GetScaleFactor(); wxImage imgResized = img.Size(scaleFactor * imgSize, wxPoint(0, 0), 0, 0, 0); bmpResized = wxBitmap(imgResized, -1, scaleFactor); #else @@ -166,18 +166,6 @@ int wxGenericImageList::Add( const wxBitmap &bitmap ) if ( m_size == wxSize(0, 0) ) return -1; - if ( m_images.empty() ) - { - // This is the first time Add() is called so we should save - // scale factor to check if further images will have the same scaling - m_scaleFactor = bitmap.GetScaleFactor(); - } - else if ( bitmap.GetScaleFactor() != m_scaleFactor ) - { - // All images in the list should have the same scale factor - return -1; - } - // We use the logical size here as image list images size is specified in // logical pixels, just as window coordinates and sizes are. const wxSize bitmapSize = bitmap.GetLogicalSize(); @@ -187,7 +175,7 @@ int wxGenericImageList::Add( const wxBitmap &bitmap ) // ImageList_Add() does. if ( bitmapSize.x == m_size.x ) { - m_images.push_back(GetImageListBitmap(bitmap, m_useMask, m_size, m_scaleFactor)); + m_images.push_back(GetImageListBitmap(bitmap, m_useMask, m_size)); } else if ( bitmapSize.x > m_size.x ) { @@ -195,7 +183,7 @@ int wxGenericImageList::Add( const wxBitmap &bitmap ) for (int subIndex = 0; subIndex < numImages; subIndex++) { wxRect rect(m_size.x * subIndex, 0, m_size.x, m_size.y); - m_images.push_back(GetImageListBitmap(bitmap.GetSubBitmap(rect), m_useMask, m_size, m_scaleFactor)); + m_images.push_back(GetImageListBitmap(bitmap.GetSubBitmap(rect), m_useMask, m_size)); } } else @@ -260,17 +248,11 @@ wxGenericImageList::Replace(int index, if ( !DoGetPtr(index) ) return false; - if ( bitmap.GetScaleFactor() != m_scaleFactor ) - { - // All images in the list should have the same scale factor - return false; - } - wxBitmap bmp(bitmap); if ( mask.IsOk() ) bmp.SetMask(new wxMask(mask)); - m_images[index] = GetImageListBitmap(bmp, m_useMask, m_size, m_scaleFactor); + m_images[index] = GetImageListBitmap(bmp, m_useMask, m_size); return true; } diff --git a/tests/graphics/imagelist.cpp b/tests/graphics/imagelist.cpp index cbf71a51ca..c657670160 100644 --- a/tests/graphics/imagelist.cpp +++ b/tests/graphics/imagelist.cpp @@ -751,224 +751,58 @@ TEST_CASE("ImageList:NegativeTests", "[imagelist][negative]") } } +// This test relies on logical pixels being different from physical ones. +#ifdef wxHAS_DPI_INDEPENDENT_PIXELS + TEST_CASE("ImageList:HiDPI", "[imagelist][hidpi]") { -#if defined(__WXMSW__) || ( defined(__WXGTK20__) && !defined(__WXGTK3__) ) + wxImage img1(8, 4); + img1.SetRGB(wxRect(0, 0, 8, 4), 0, 63, 127); + REQUIRE(img1.IsOk()); - WARN("Skipping HiDPI image tests known not to work in wxMSW and wxGTK2."); -#else - wxImage img(16, 8); - img.SetRGB(wxRect(0, 0, 16, 8), 255, 128, 64); - REQUIRE(img.IsOk()); + wxImage img2(16, 8); + img2.SetRGB(wxRect(0, 0, 16, 8), 255, 128, 64); + REQUIRE(img2.IsOk()); - wxBitmap bmp1x(img, -1, 1.0); + wxBitmap bmp1x(img1, -1, 1.0); REQUIRE(bmp1x.IsOk()); - CHECK(bmp1x.GetWidth() == 16); - CHECK(bmp1x.GetHeight() == 8); - CHECK(bmp1x.GetLogicalWidth() == 16); - CHECK(bmp1x.GetLogicalHeight() == 8); + CHECK(bmp1x.GetSize() == wxSize(8, 4)); + CHECK(bmp1x.GetLogicalSize() == wxSize(8, 4)); CHECK_FALSE(bmp1x.HasAlpha()); CHECK(bmp1x.GetMask() == NULL); - wxBitmap bmp2x(img, -1, 2.0); + wxBitmap bmp2x(img2, -1, 2.0); REQUIRE(bmp2x.IsOk()); - CHECK(bmp2x.GetWidth() == 16); - CHECK(bmp2x.GetHeight() == 8); - CHECK(bmp2x.GetLogicalWidth() == 8); - CHECK(bmp2x.GetLogicalHeight() == 4); + CHECK(bmp2x.GetSize() == wxSize(16, 8)); + CHECK(bmp2x.GetLogicalSize() == wxSize(8, 4)); CHECK_FALSE(bmp2x.HasAlpha()); CHECK(bmp2x.GetMask() == NULL); - SECTION("Add images 2x to the list 2x") - { - // Logical image size - wxImageList il(8, 4, false); + // Logical image size + wxImageList il(8, 4, false); - int idx = il.Add(bmp2x); - CHECK(idx == 0); - CHECK(il.GetImageCount() == 1); + int idx = il.Add(bmp2x); + REQUIRE(idx == 0); + REQUIRE(il.GetImageCount() == 1); - idx = il.Add(bmp1x); - CHECK(idx == -1); - CHECK(il.GetImageCount() == 1); + idx = il.Add(bmp1x); + REQUIRE(idx == 1); + REQUIRE(il.GetImageCount() == 2); - idx = il.Add(bmp2x); - CHECK(idx == 1); - CHECK(il.GetImageCount() == 2); + wxBitmap bmp = il.GetBitmap(0); + REQUIRE(bmp.IsOk() == true); + CHECK(bmp.GetScaleFactor() == 2.0); + CHECK(bmp.GetSize() == wxSize(16, 8)); + CHECK(bmp.GetLogicalSize() == wxSize(8, 4)); + CHECK_FALSE(bmp.HasAlpha()); + CHECK(bmp.GetMask() == NULL); - idx = il.Add(bmp1x); - CHECK(idx == -1); - CHECK(il.GetImageCount() == 2); - - wxBitmap bmp = il.GetBitmap(1); - CHECK(bmp.IsOk() == true); - CHECK(bmp.GetScaleFactor() == 2.0); - CHECK(bmp.GetLogicalWidth() == 8); - CHECK(bmp.GetLogicalHeight() == 4); - CHECK(bmp.GetWidth() == 16); - CHECK(bmp.GetHeight() == 8); - CHECK_FALSE(bmp.HasAlpha()); - CHECK(bmp.GetMask() == NULL); - } - - SECTION("Add images 2x to the list 1x") - { - // Logical image size - wxImageList il(16, 8, false); - - int idx = il.Add(bmp1x); - CHECK(idx == 0); - CHECK(il.GetImageCount() == 1); - - idx = il.Add(bmp2x); - CHECK(idx == -1); - CHECK(il.GetImageCount() == 1); - - idx = il.Add(bmp1x); - CHECK(idx == 1); - CHECK(il.GetImageCount() == 2); - - idx = il.Add(bmp2x); - CHECK(idx == -1); - CHECK(il.GetImageCount() == 2); - - wxBitmap bmp = il.GetBitmap(1); - CHECK(bmp.IsOk() == true); - CHECK(bmp.GetScaleFactor() == 1.0); - CHECK(bmp.GetLogicalWidth() == 16); - CHECK(bmp.GetLogicalHeight() == 8); - CHECK(bmp.GetWidth() == 16); - CHECK(bmp.GetHeight() == 8); - CHECK_FALSE(bmp.HasAlpha()); - CHECK(bmp.GetMask() == NULL); - } - - SECTION("Replaces images in the list 2x") - { - // Logical image size - wxImageList il(8, 4, false); - - int idx = il.Add(bmp2x); - CHECK(idx == 0); - CHECK(il.GetImageCount() == 1); - - idx = il.Add(bmp2x); - CHECK(idx == 1); - CHECK(il.GetImageCount() == 2); - - bool ok = il.Replace(1, bmp1x); - CHECK_FALSE(ok); - CHECK(il.GetImageCount() == 2); - - ok = il.Replace(0, bmp2x); - CHECK(ok == true); - CHECK(il.GetImageCount() == 2); - - wxBitmap bmp = il.GetBitmap(0); - CHECK(bmp.IsOk() == true); - CHECK(bmp.GetScaleFactor() == 2.0); - CHECK(bmp.GetLogicalWidth() == 8); - CHECK(bmp.GetLogicalHeight() == 4); - CHECK(bmp.GetWidth() == 16); - CHECK(bmp.GetHeight() == 8); - CHECK_FALSE(bmp.HasAlpha()); - CHECK(bmp.GetMask() == NULL); - } - - SECTION("Replaces images in the list 1x") - { - // Logical image size - wxImageList il(16, 8, false); - - int idx = il.Add(bmp1x); - CHECK(idx == 0); - CHECK(il.GetImageCount() == 1); - - idx = il.Add(bmp1x); - CHECK(idx == 1); - CHECK(il.GetImageCount() == 2); - - bool ok = il.Replace(1, bmp2x); - CHECK_FALSE(ok); - CHECK(il.GetImageCount() == 2); - - ok = il.Replace(0, bmp1x); - CHECK(ok == true); - CHECK(il.GetImageCount() == 2); - - wxBitmap bmp = il.GetBitmap(0); - CHECK(bmp.GetScaleFactor() == 1.0); - CHECK(bmp.GetLogicalWidth() == 16); - CHECK(bmp.GetLogicalHeight() == 8); - CHECK(bmp.GetWidth() == 16); - CHECK(bmp.GetHeight() == 8); - CHECK_FALSE(bmp.HasAlpha()); - CHECK(bmp.GetMask() == NULL); - } - - SECTION("Changes list 1x to 2x") - { - wxImage img2(32, 16); - img2.SetRGB(wxRect(0, 0, 32, 16), 255, 128, 64); - REQUIRE(img2.IsOk()); - - wxBitmap bmp2x2(img2, -1, 2.0); - REQUIRE(bmp2x2.IsOk()); - CHECK(bmp2x2.GetWidth() == 32); - CHECK(bmp2x2.GetHeight() == 16); - CHECK(bmp2x2.GetLogicalWidth() == 16); - CHECK(bmp2x2.GetLogicalHeight() == 8); - CHECK(bmp2x2.HasAlpha() == false); - CHECK(bmp2x2.GetMask() == NULL); - - // Logical image size - wxImageList il(16, 8, false); - - // Now it should be the list with 1x images - int idx = il.Add(bmp1x); - CHECK(idx == 0); - CHECK(il.GetImageCount() == 1); - - idx = il.Add(bmp1x); - CHECK(idx == 1); - CHECK(il.GetImageCount() == 2); - - idx = il.Add(bmp2x2); - CHECK(idx == -1); - CHECK(il.GetImageCount() == 2); - - wxBitmap bmp = il.GetBitmap(0); - CHECK(bmp.GetScaleFactor() == 1.0); - CHECK(bmp.GetLogicalWidth() == 16); - CHECK(bmp.GetLogicalHeight() == 8); - CHECK(bmp.GetWidth() == 16); - CHECK(bmp.GetHeight() == 8); - CHECK_FALSE(bmp.HasAlpha()); - CHECK(bmp.GetMask() == NULL); - - il.RemoveAll(); - - // Now it should be the list with 2x images (the same logical size 16x8) - idx = il.Add(bmp2x2); - CHECK(idx == 0); - CHECK(il.GetImageCount() == 1); - - idx = il.Add(bmp2x2); - CHECK(idx == 1); - CHECK(il.GetImageCount() == 2); - - idx = il.Add(bmp1x); - CHECK(idx == -1); - CHECK(il.GetImageCount() == 2); - - bmp = il.GetBitmap(0); - CHECK(bmp.GetScaleFactor() == 2.0); - CHECK(bmp.GetLogicalWidth() == 16); - CHECK(bmp.GetLogicalHeight() == 8); - CHECK(bmp.GetWidth() == 32); - CHECK(bmp.GetHeight() == 16); - CHECK_FALSE(bmp.HasAlpha()); - CHECK(bmp.GetMask() == NULL); - } -#endif // !__WXMSW__ + bmp = il.GetBitmap(1); + REQUIRE(bmp.IsOk() == true); + CHECK(bmp.GetScaleFactor() == 1.0); + CHECK(bmp.GetSize() == wxSize(8, 4)); + CHECK(bmp.GetLogicalSize() == wxSize(8, 4)); + CHECK_FALSE(bmp.HasAlpha()); + CHECK(bmp.GetMask() == NULL); } +#endif // wxHAS_DPI_INDEPENDENT_PIXELS From 1a8906206ed44c4c28b0b26fe5ded14b01a9f3cb Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 20 Mar 2022 22:33:03 +0100 Subject: [PATCH 4/5] Use appropriately sized bitmaps in wxOSX wxDataViewCtrl Select the bitmap of the required size from wxBitmapBundle instead of selecting the bitmap with the default size and then possibly rescaling it to get the bitmap of the needed size, resulting in fuzzy-looking bitmaps. Closes #22189. --- src/osx/cocoa/dataview.mm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/osx/cocoa/dataview.mm b/src/osx/cocoa/dataview.mm index 79396db546..095ff20a12 100644 --- a/src/osx/cocoa/dataview.mm +++ b/src/osx/cocoa/dataview.mm @@ -3215,7 +3215,8 @@ bool wxDataViewIconTextRenderer::MacRender() cell = (wxImageTextCell*) GetNativeData()->GetItemCell(); iconText << GetValue(); - [cell setImage:iconText.GetIcon().GetNSImage()]; + const wxDataViewCtrl* const dvc = GetOwner()->GetOwner(); + [cell setImage:iconText.GetBitmapBundle().GetBitmapFor(dvc).GetNSImage()]; [cell setStringValue:wxCFStringRef(iconText.GetText()).AsNSString()]; return true; } @@ -3324,11 +3325,12 @@ bool wxDataViewCheckIconTextRenderer::MacRender() const wxCFStringRef textString(checkIconText.GetText()); - const wxIcon& icon = checkIconText.GetIcon(); + const wxBitmapBundle& icon = checkIconText.GetBitmapBundle(); if ( icon.IsOk() ) { wxNSTextAttachmentCellWithBaseline* const attachmentCell = - [[wxNSTextAttachmentCellWithBaseline alloc] initImageCell: icon.GetNSImage()]; + [[wxNSTextAttachmentCellWithBaseline alloc] + initImageCell: icon.GetBitmapFor(GetOwner()->GetOwner()).GetNSImage()]; NSTextAttachment* const attachment = [NSTextAttachment new]; [attachment setAttachmentCell: attachmentCell]; From 83daf02f351fe568682c6ec27bef158d45b6cbb5 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 22 Mar 2022 01:20:10 +0100 Subject: [PATCH 5/5] Update wxImageList documentation to mention high DPI concerns First of all, document that this class is (informally) deprecated. Also document that the various sizes are expressed in logical pixels. --- interface/wx/imaglist.h | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/interface/wx/imaglist.h b/interface/wx/imaglist.h index 9d60830add..71cd5ad804 100644 --- a/interface/wx/imaglist.h +++ b/interface/wx/imaglist.h @@ -34,6 +34,10 @@ enum wxImageList is used principally in conjunction with wxTreeCtrl and wxListCtrl classes. + Use of this class is not recommended in the new code as it doesn't support + showing DPI-dependent bitmaps. Please use wxWithImages::SetImages() instead + of wxWithImages::SetImageList(). + @library{wxcore} @category{gdi} @@ -51,6 +55,8 @@ public: Constructor specifying the image size, whether image masks should be created, and the initial size of the list. + Note that the size is specified in logical pixels. + @param width Width of the images in the list. @param height @@ -68,19 +74,17 @@ public: /** Adds a new image or images using a bitmap and optional mask bitmap. + The logical size of the bitmap should be the same as the size specified + when constructing wxImageList. If the logical width of the bitmap is + greater than the image list width, bitmap is split into smaller images + of the required width. + @param bitmap Bitmap representing the opaque areas of the image. @param mask Monochrome mask bitmap, representing the transparent areas of the image. @return The new zero-based image index. - - @remarks The original bitmap or icon is not affected by the Add() - operation, and can be deleted afterwards. - If the bitmap is wider than the images in the list, then the - bitmap will automatically be split into smaller images, each - matching the dimensions of the image list. - This does not apply when adding icons. */ int Add(const wxBitmap& bitmap, const wxBitmap& mask = wxNullBitmap); @@ -88,37 +92,31 @@ public: /** Adds a new image or images using a bitmap and mask colour. + The logical size of the bitmap should be the same as the size specified + when constructing wxImageList. If the logical width of the bitmap is + greater than the image list width, bitmap is split into smaller images + of the required width. + @param bitmap Bitmap representing the opaque areas of the image. @param maskColour Colour indicating which parts of the image are transparent. @return The new zero-based image index. - - @remarks The original bitmap or icon is not affected by the Add() - operation, and can be deleted afterwards. - If the bitmap is wider than the images in the list, then the - bitmap will automatically be split into smaller images, each - matching the dimensions of the image list. - This does not apply when adding icons. */ int Add(const wxBitmap& bitmap, const wxColour& maskColour); /** Adds a new image using an icon. + The logical size of the icon should be the same as the size specified + when constructing wxImageList. + @param icon Icon to use as the image. @return The new zero-based image index. - @remarks The original bitmap or icon is not affected by the Add() - operation, and can be deleted afterwards. - If the bitmap is wider than the images in the list, then the - bitmap will automatically be split into smaller images, each - matching the dimensions of the image list. - This does not apply when adding icons. - @onlyfor{wxmsw,wxosx} */ int Add(const wxIcon& icon);