From a1a99a6206e0642794d477f7cf3104fd2b077407 Mon Sep 17 00:00:00 2001 From: Uriah Liggett Date: Sun, 17 May 2015 19:34:10 +0000 Subject: [PATCH] 1. Improved accuracy of normal vectors for the points in the point cloud. This improves the Poisson surface reconstruction in MeshLab or other program. 2. Improved laser detection when the background is not static. 3. Added meshing support for PLY files. The PLY files now contain the point cloud and the triangle mesh, eliminating the need for STL in most cases. 4. The test image now shows results from both lasers in the same image when the Preset is configured to scan with Both Lasers. 5. The test image now omits points that would be removed by the ground plane height and max object size parameters. 6. The scan Preview link has been changed to a button. 7. The name of the active preset is now displayed on the main page. 8. Fixed an issue where 5MP video mode would only use the center of the camera's view instead of the full field of view. --- contrib/license.txt.h | 3313 ---------------------- src/Calibrator.cpp | 5 +- src/Camera.cpp | 41 +- src/Camera.h | 3 + src/Facetizer.cpp | 273 ++ src/{NeutralFileWriter.h => Facetizer.h} | 41 +- src/HttpServer.cpp | 8 +- src/ImageProcessor.cpp | 228 +- src/ImageProcessor.h | 9 +- src/LaserResultsMerger.cpp | 16 +- src/LaserResultsMerger.h | 8 +- src/Main.cpp | 27 +- src/Main.h | 44 +- src/Makefile | 14 +- src/MmalStillCamera.cpp | 2 - src/MmalVideoCamera.cpp | 646 +---- src/MmalVideoCamera.h | 18 +- src/NeutralFileReader.cpp | 160 -- src/NeutralFileReader.h | 60 - src/NeutralFileWriter.cpp | 185 -- src/PlyWriter.cpp | 56 +- src/PlyWriter.h | 6 + src/Preset.cpp | 149 +- src/Progress.cpp | 1 + src/Scanner.cpp | 252 +- src/Scanner.h | 37 +- src/StlWriter.cpp | 293 +- src/StlWriter.h | 24 +- src/WebContent.cpp | 10 +- src/XyzWriter.cpp | 12 +- src/XyzWriter.h | 2 +- 31 files changed, 1105 insertions(+), 4838 deletions(-) delete mode 100644 contrib/license.txt.h create mode 100644 src/Facetizer.cpp rename src/{NeutralFileWriter.h => Facetizer.h} (56%) delete mode 100644 src/NeutralFileReader.cpp delete mode 100644 src/NeutralFileReader.h delete mode 100644 src/NeutralFileWriter.cpp diff --git a/contrib/license.txt.h b/contrib/license.txt.h deleted file mode 100644 index 3f56482..0000000 --- a/contrib/license.txt.h +++ /dev/null @@ -1,3313 +0,0 @@ -unsigned char licenses_txt[] = { - 0x3d, 0x3d, 0x3d, 0x20, 0x46, 0x72, 0x65, 0x65, 0x4c, 0x53, 0x53, 0x2c, - 0x20, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x68, 0x74, 0x74, 0x70, 0x64, 0x2c, - 0x20, 0x77, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x69, 0x20, 0x3d, 0x3d, - 0x3d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x45, 0x4e, 0x45, 0x52, - 0x41, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x4c, 0x49, - 0x43, 0x45, 0x4e, 0x53, 0x45, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x33, 0x2c, 0x20, 0x32, 0x39, 0x20, 0x4a, 0x75, 0x6e, 0x65, 0x20, - 0x32, 0x30, 0x30, 0x37, 0x0a, 0x0a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, - 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x30, - 0x37, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, - 0x61, 0x72, 0x65, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x3c, 0x68, 0x74, - 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x66, 0x73, 0x66, 0x2e, 0x6f, 0x72, 0x67, - 0x2f, 0x3e, 0x0a, 0x20, 0x45, 0x76, 0x65, 0x72, 0x79, 0x6f, 0x6e, 0x65, - 0x20, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, - 0x20, 0x76, 0x65, 0x72, 0x62, 0x61, 0x74, 0x69, 0x6d, 0x20, 0x63, 0x6f, - 0x70, 0x69, 0x65, 0x73, 0x0a, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x20, - 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x72, 0x65, - 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, - 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x66, 0x72, 0x65, - 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x6c, 0x65, 0x66, 0x74, 0x20, - 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x0a, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6b, 0x69, 0x6e, 0x64, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x0a, 0x0a, - 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x61, - 0x72, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x0a, - 0x74, 0x6f, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x61, 0x77, 0x61, 0x79, - 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, - 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2e, 0x20, 0x20, 0x42, 0x79, - 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x2c, 0x0a, 0x74, - 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x74, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x75, 0x61, - 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, - 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x20, 0x74, 0x6f, 0x0a, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x70, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2d, 0x2d, 0x74, 0x6f, 0x20, 0x6d, 0x61, - 0x6b, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x69, 0x74, 0x20, 0x72, - 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x0a, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x69, 0x74, 0x73, 0x20, 0x75, 0x73, 0x65, - 0x72, 0x73, 0x2e, 0x20, 0x20, 0x57, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, - 0x72, 0x65, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x47, - 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6f, - 0x66, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, - 0x72, 0x65, 0x3b, 0x20, 0x69, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x65, 0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x74, 0x6f, 0x0a, 0x61, - 0x6e, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x77, 0x6f, 0x72, - 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x74, - 0x68, 0x69, 0x73, 0x20, 0x77, 0x61, 0x79, 0x20, 0x62, 0x79, 0x20, 0x69, - 0x74, 0x73, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, 0x2e, 0x20, - 0x20, 0x59, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x61, 0x70, 0x70, - 0x6c, 0x79, 0x20, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x0a, 0x79, 0x6f, 0x75, - 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, - 0x74, 0x6f, 0x6f, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x57, 0x68, 0x65, 0x6e, - 0x20, 0x77, 0x65, 0x20, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x20, 0x6f, 0x66, - 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, - 0x72, 0x65, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, - 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2c, 0x20, 0x6e, 0x6f, 0x74, - 0x0a, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2e, 0x20, 0x20, 0x4f, 0x75, 0x72, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, - 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x0a, - 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x72, 0x65, - 0x65, 0x64, 0x6f, 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, - 0x73, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x73, 0x6f, - 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, - 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x0a, 0x74, - 0x68, 0x65, 0x6d, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, - 0x69, 0x73, 0x68, 0x29, 0x2c, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, - 0x6f, 0x75, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x6f, - 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x20, 0x69, 0x74, - 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x0a, 0x77, 0x61, 0x6e, 0x74, - 0x20, 0x69, 0x74, 0x2c, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, - 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, - 0x65, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x65, 0x20, 0x70, 0x69, 0x65, - 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6e, - 0x20, 0x6e, 0x65, 0x77, 0x0a, 0x66, 0x72, 0x65, 0x65, 0x20, 0x70, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6b, 0x6e, 0x6f, - 0x77, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f, - 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x6e, 0x67, - 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x54, 0x6f, 0x20, 0x70, 0x72, 0x6f, - 0x74, 0x65, 0x63, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x72, 0x69, - 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x6e, 0x65, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, - 0x20, 0x64, 0x65, 0x6e, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x79, 0x6f, 0x75, - 0x0a, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x73, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x6b, 0x69, 0x6e, 0x67, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x73, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65, 0x66, - 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x68, 0x61, 0x76, - 0x65, 0x0a, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x64, 0x69, - 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x70, - 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, - 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, - 0x69, 0x66, 0x0a, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, - 0x79, 0x20, 0x69, 0x74, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x74, - 0x6f, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x20, 0x6f, 0x66, - 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, - 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, - 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x64, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, - 0x73, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x20, - 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2c, 0x20, 0x77, 0x68, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x0a, 0x67, 0x72, 0x61, 0x74, 0x69, 0x73, 0x20, - 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x66, 0x65, 0x65, - 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x70, - 0x61, 0x73, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x73, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x0a, 0x66, 0x72, - 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, - 0x2e, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, - 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x79, 0x2c, 0x20, 0x74, 0x6f, 0x6f, - 0x2c, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x0a, 0x6f, 0x72, - 0x20, 0x63, 0x61, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, - 0x2e, 0x20, 0x20, 0x41, 0x6e, 0x64, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, - 0x75, 0x73, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, - 0x6d, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, - 0x73, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x79, 0x0a, 0x6b, 0x6e, - 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x44, 0x65, 0x76, 0x65, - 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, 0x20, - 0x47, 0x50, 0x4c, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x20, - 0x79, 0x6f, 0x75, 0x72, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x73, 0x74, 0x65, - 0x70, 0x73, 0x3a, 0x0a, 0x28, 0x31, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x32, - 0x29, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x0a, 0x67, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x79, 0x6f, 0x75, 0x20, - 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x70, 0x79, - 0x2c, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, - 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x20, 0x69, 0x74, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x46, 0x6f, - 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, - 0x70, 0x65, 0x72, 0x73, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x73, 0x27, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, - 0x50, 0x4c, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x65, - 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x73, 0x0a, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, - 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x20, 0x20, 0x46, - 0x6f, 0x72, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x75, 0x73, 0x65, 0x72, - 0x73, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x73, 0x27, 0x20, 0x73, 0x61, 0x6b, 0x65, 0x2c, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x47, 0x50, 0x4c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, - 0x61, 0x73, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x2c, 0x20, - 0x73, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x69, - 0x72, 0x20, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x20, 0x77, - 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x65, 0x72, - 0x72, 0x6f, 0x6e, 0x65, 0x6f, 0x75, 0x73, 0x6c, 0x79, 0x20, 0x74, 0x6f, - 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, - 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x53, 0x6f, - 0x6d, 0x65, 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x61, - 0x72, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, - 0x74, 0x6f, 0x20, 0x64, 0x65, 0x6e, 0x79, 0x20, 0x75, 0x73, 0x65, 0x72, - 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x72, - 0x75, 0x6e, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6d, - 0x2c, 0x20, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, - 0x72, 0x65, 0x72, 0x0a, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x20, 0x73, - 0x6f, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, - 0x66, 0x75, 0x6e, 0x64, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x6c, - 0x79, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, - 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x61, 0x69, 0x6d, 0x20, 0x6f, 0x66, 0x0a, 0x70, 0x72, 0x6f, 0x74, 0x65, - 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x27, - 0x20, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x20, 0x74, 0x6f, 0x20, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, - 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x20, 0x20, 0x54, 0x68, - 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, - 0x0a, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x6f, 0x66, 0x20, - 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x62, 0x75, 0x73, 0x65, 0x20, 0x6f, - 0x63, 0x63, 0x75, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x61, 0x72, 0x65, 0x61, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, - 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x73, 0x20, 0x74, 0x6f, - 0x0a, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x69, 0x73, 0x20, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x65, 0x6c, 0x79, - 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, - 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x75, 0x6e, 0x61, 0x63, 0x63, 0x65, - 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x65, - 0x72, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x77, 0x65, 0x0a, 0x68, - 0x61, 0x76, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x50, 0x4c, - 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, - 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x0a, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2e, 0x20, 0x20, 0x49, - 0x66, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x62, 0x6c, - 0x65, 0x6d, 0x73, 0x20, 0x61, 0x72, 0x69, 0x73, 0x65, 0x20, 0x73, 0x75, - 0x62, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, - 0x69, 0x6e, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x73, 0x2c, 0x20, 0x77, 0x65, 0x0a, 0x73, 0x74, 0x61, - 0x6e, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x74, 0x6f, 0x20, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, - 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x50, 0x4c, 0x2c, 0x20, 0x61, 0x73, - 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, - 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, - 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, - 0x65, 0x72, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x46, 0x69, 0x6e, 0x61, - 0x6c, 0x6c, 0x79, 0x2c, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x62, 0x79, 0x20, 0x73, - 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x70, 0x61, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x20, - 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, - 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x0a, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x20, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x2d, 0x70, 0x75, 0x72, 0x70, - 0x6f, 0x73, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, - 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, - 0x6f, 0x73, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x2c, - 0x20, 0x77, 0x65, 0x20, 0x77, 0x69, 0x73, 0x68, 0x20, 0x74, 0x6f, 0x0a, - 0x61, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, - 0x20, 0x61, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x0a, 0x6d, 0x61, - 0x6b, 0x65, 0x20, 0x69, 0x74, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, - 0x65, 0x74, 0x61, 0x72, 0x79, 0x2e, 0x20, 0x20, 0x54, 0x6f, 0x20, 0x70, - 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x50, 0x4c, 0x20, 0x61, 0x73, 0x73, - 0x75, 0x72, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0a, 0x70, 0x61, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, - 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x66, - 0x72, 0x65, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, - 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, - 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x70, - 0x79, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x6d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x54, 0x45, 0x52, 0x4d, - 0x53, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, - 0x49, 0x4f, 0x4e, 0x53, 0x0a, 0x0a, 0x20, 0x20, 0x30, 0x2e, 0x20, 0x44, - 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, - 0x0a, 0x20, 0x20, 0x22, 0x54, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, - 0x65, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x73, - 0x20, 0x74, 0x6f, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, - 0x33, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, - 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, - 0x0a, 0x0a, 0x20, 0x20, 0x22, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x22, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6d, 0x65, 0x61, - 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x2d, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x6c, 0x61, 0x77, 0x73, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, - 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6b, 0x69, 0x6e, 0x64, 0x73, - 0x20, 0x6f, 0x66, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2c, 0x20, 0x73, - 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x73, 0x65, 0x6d, 0x69, 0x63, - 0x6f, 0x6e, 0x64, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x73, - 0x6b, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x22, 0x20, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x63, - 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x0a, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x20, 0x20, - 0x45, 0x61, 0x63, 0x68, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x22, 0x79, 0x6f, 0x75, 0x22, 0x2e, - 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x65, 0x73, - 0x22, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x22, 0x72, 0x65, 0x63, 0x69, 0x70, - 0x69, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, - 0x65, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, - 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x54, - 0x6f, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x22, 0x20, 0x61, - 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, - 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x66, 0x72, 0x6f, 0x6d, - 0x20, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x61, 0x70, 0x74, 0x20, 0x61, 0x6c, - 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x0a, 0x69, 0x6e, - 0x20, 0x61, 0x20, 0x66, 0x61, 0x73, 0x68, 0x69, 0x6f, 0x6e, 0x20, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x70, - 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, - 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x0a, 0x65, - 0x78, 0x61, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2e, 0x20, 0x20, - 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, - 0x67, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, - 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x61, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x65, 0x61, 0x72, - 0x6c, 0x69, 0x65, 0x72, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6f, 0x72, - 0x20, 0x61, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x22, 0x62, 0x61, 0x73, - 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, - 0x61, 0x72, 0x6c, 0x69, 0x65, 0x72, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2e, - 0x0a, 0x0a, 0x20, 0x20, 0x41, 0x20, 0x22, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x20, 0x6d, 0x65, 0x61, - 0x6e, 0x73, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x6f, 0x72, 0x20, - 0x61, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, - 0x0a, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x54, 0x6f, 0x20, 0x22, - 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x22, 0x20, 0x61, - 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, - 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x74, 0x68, 0x69, - 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x69, 0x74, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, - 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2c, - 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, - 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, - 0x69, 0x6c, 0x79, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, - 0x6f, 0x72, 0x0a, 0x69, 0x6e, 0x66, 0x72, 0x69, 0x6e, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x70, - 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6c, 0x61, 0x77, 0x2c, 0x20, - 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x61, - 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x72, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x61, - 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x70, - 0x79, 0x2e, 0x20, 0x20, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x69, 0x6e, 0x67, 0x2c, 0x0a, 0x64, 0x69, - 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x6f, 0x75, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x69, 0x6e, - 0x67, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x6f, - 0x6d, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x61, 0x73, 0x20, 0x77, 0x65, 0x6c, - 0x6c, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x54, 0x6f, 0x20, 0x22, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x79, 0x22, 0x20, 0x61, 0x20, 0x77, 0x6f, 0x72, 0x6b, - 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6b, - 0x69, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x74, 0x68, 0x65, - 0x72, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x2e, - 0x20, 0x20, 0x4d, 0x65, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x61, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, - 0x67, 0x68, 0x0a, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, - 0x72, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x6e, 0x6f, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, - 0x79, 0x2c, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x0a, 0x0a, 0x20, 0x20, - 0x41, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x73, 0x20, 0x22, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, - 0x61, 0x74, 0x65, 0x20, 0x4c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x4e, 0x6f, - 0x74, 0x69, 0x63, 0x65, 0x73, 0x22, 0x0a, 0x74, 0x6f, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x69, 0x65, - 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x69, - 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, - 0x6c, 0x65, 0x0a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x28, 0x31, 0x29, 0x20, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x72, - 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, - 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x32, 0x29, 0x0a, 0x74, 0x65, - 0x6c, 0x6c, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, - 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, - 0x74, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x20, 0x28, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, - 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, - 0x6e, 0x74, 0x69, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x29, 0x2c, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x65, 0x73, 0x20, - 0x6d, 0x61, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x75, 0x6e, 0x64, 0x65, - 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68, 0x6f, 0x77, 0x20, - 0x74, 0x6f, 0x20, 0x76, 0x69, 0x65, 0x77, 0x20, 0x61, 0x20, 0x63, 0x6f, - 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x0a, - 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, - 0x65, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, - 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65, - 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x6f, - 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x73, - 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x61, 0x0a, 0x6d, 0x65, 0x6e, - 0x75, 0x2c, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x69, 0x6e, 0x65, - 0x6e, 0x74, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6d, 0x65, 0x65, 0x74, - 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, - 0x72, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x31, 0x2e, 0x20, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x43, 0x6f, 0x64, 0x65, 0x2e, - 0x0a, 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x22, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x61, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6d, 0x65, 0x61, - 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x0a, 0x66, 0x6f, - 0x72, 0x20, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, - 0x6f, 0x20, 0x69, 0x74, 0x2e, 0x20, 0x20, 0x22, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x6d, 0x65, 0x61, - 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6f, - 0x66, 0x20, 0x61, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x0a, 0x0a, 0x20, - 0x20, 0x41, 0x20, 0x22, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, - 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x22, 0x20, - 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, - 0x20, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x0a, 0x73, 0x74, - 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, - 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x72, 0x65, 0x63, 0x6f, - 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, - 0x61, 0x72, 0x64, 0x73, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x6f, - 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, - 0x73, 0x65, 0x20, 0x6f, 0x66, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, - 0x61, 0x63, 0x65, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x0a, 0x69, 0x73, 0x20, 0x77, 0x69, 0x64, 0x65, 0x6c, 0x79, - 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x6d, 0x6f, 0x6e, 0x67, 0x20, - 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, - 0x0a, 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x22, 0x53, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x20, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, - 0x73, 0x22, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, - 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x79, - 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, - 0x0a, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, - 0x72, 0x6b, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x77, 0x68, 0x6f, 0x6c, - 0x65, 0x2c, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x28, 0x61, 0x29, 0x20, - 0x69, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, - 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6f, 0x66, 0x0a, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x4d, 0x61, - 0x6a, 0x6f, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, - 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x4d, 0x61, 0x6a, - 0x6f, 0x72, 0x0a, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x29, 0x20, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x74, 0x6f, - 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0a, 0x4d, 0x61, - 0x6a, 0x6f, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6d, 0x70, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x20, 0x53, 0x74, 0x61, - 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, - 0x61, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, - 0x68, 0x20, 0x61, 0x6e, 0x0a, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x69, - 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x64, - 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x20, 0x20, 0x41, 0x0a, 0x22, - 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x6d, - 0x65, 0x61, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, - 0x20, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x0a, 0x28, 0x6b, 0x65, - 0x72, 0x6e, 0x65, 0x6c, 0x2c, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2c, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x73, 0x6f, 0x20, 0x6f, 0x6e, 0x29, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x0a, 0x28, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x79, - 0x29, 0x20, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x72, 0x75, 0x6e, 0x73, 0x2c, - 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x0a, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x72, 0x20, 0x75, - 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x69, - 0x74, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x22, 0x43, - 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x61, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, - 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x61, 0x6c, - 0x6c, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x77, 0x6f, - 0x72, 0x6b, 0x29, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, - 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x20, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x20, 0x20, - 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x74, 0x20, - 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, - 0x6b, 0x27, 0x73, 0x0a, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x4c, - 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x72, - 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x2d, 0x70, 0x75, 0x72, - 0x70, 0x6f, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x20, 0x6f, - 0x72, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, - 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x72, - 0x65, 0x65, 0x0a, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x20, - 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x73, - 0x65, 0x64, 0x20, 0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, - 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, - 0x0a, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x20, 0x20, 0x46, 0x6f, - 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x43, - 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, - 0x63, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x73, 0x73, 0x6f, - 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x20, 0x66, 0x6f, 0x72, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, - 0x6b, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6c, 0x69, - 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x0a, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x64, 0x20, 0x73, 0x75, 0x62, 0x70, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x73, 0x20, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, - 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, - 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2c, 0x0a, 0x73, 0x75, - 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x62, 0x79, 0x20, 0x69, 0x6e, 0x74, - 0x69, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x63, - 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, - 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, - 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x0a, 0x73, 0x75, 0x62, 0x70, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, - 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x0a, - 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x79, - 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x75, - 0x73, 0x65, 0x72, 0x73, 0x0a, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, - 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x66, 0x72, - 0x6f, 0x6d, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, - 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x0a, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x54, - 0x68, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, - 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x64, - 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x0a, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, - 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x32, 0x2e, 0x20, 0x42, 0x61, 0x73, 0x69, - 0x63, 0x20, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, - 0x67, 0x68, 0x74, 0x73, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, - 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, - 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x20, 0x6f, 0x66, 0x0a, - 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6f, 0x6e, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x72, - 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x64, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x65, 0x74, - 0x2e, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, - 0x6c, 0x79, 0x20, 0x61, 0x66, 0x66, 0x69, 0x72, 0x6d, 0x73, 0x20, 0x79, - 0x6f, 0x75, 0x72, 0x20, 0x75, 0x6e, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, - 0x64, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x20, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x65, - 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, - 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x0a, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, - 0x69, 0x73, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x62, - 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x67, - 0x69, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x73, 0x0a, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, - 0x74, 0x75, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x20, 0x20, 0x54, - 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, - 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x73, - 0x20, 0x79, 0x6f, 0x75, 0x72, 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x66, 0x61, 0x69, 0x72, 0x20, 0x75, 0x73, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x65, 0x71, - 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61, 0x73, - 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6c, - 0x61, 0x77, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x6d, - 0x61, 0x79, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6e, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, - 0x74, 0x65, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, - 0x75, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x0a, 0x63, 0x6f, 0x6e, - 0x76, 0x65, 0x79, 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, - 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x73, 0x6f, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x61, 0x73, 0x20, 0x79, - 0x6f, 0x75, 0x72, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, - 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x72, 0x65, - 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x0a, 0x69, 0x6e, 0x20, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x2e, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, - 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x70, 0x75, 0x72, - 0x70, 0x6f, 0x73, 0x65, 0x0a, 0x6f, 0x66, 0x20, 0x68, 0x61, 0x76, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x6d, 0x61, 0x6b, 0x65, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, - 0x6c, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x2c, 0x20, - 0x6f, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x79, - 0x6f, 0x75, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x20, 0x66, 0x61, 0x63, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, - 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, - 0x75, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x79, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, - 0x79, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6d, 0x61, 0x74, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, - 0x69, 0x63, 0x68, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x64, 0x6f, 0x0a, 0x6e, - 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x63, - 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x20, 0x20, 0x54, - 0x68, 0x6f, 0x73, 0x65, 0x20, 0x74, 0x68, 0x75, 0x73, 0x20, 0x6d, 0x61, - 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x0a, 0x66, 0x6f, - 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x64, - 0x6f, 0x20, 0x73, 0x6f, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x76, 0x65, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, - 0x20, 0x62, 0x65, 0x68, 0x61, 0x6c, 0x66, 0x2c, 0x20, 0x75, 0x6e, 0x64, - 0x65, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x64, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2c, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x65, - 0x72, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x70, 0x72, 0x6f, - 0x68, 0x69, 0x62, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x66, - 0x72, 0x6f, 0x6d, 0x20, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x61, - 0x6e, 0x79, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, - 0x0a, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, - 0x67, 0x68, 0x74, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x69, 0x72, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x79, - 0x6f, 0x75, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, - 0x79, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x61, - 0x6e, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x69, 0x72, - 0x63, 0x75, 0x6d, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x69, - 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, - 0x73, 0x6f, 0x6c, 0x65, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, - 0x0a, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, - 0x65, 0x6c, 0x6f, 0x77, 0x2e, 0x20, 0x20, 0x53, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x3b, 0x20, - 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x30, 0x0a, 0x6d, - 0x61, 0x6b, 0x65, 0x73, 0x20, 0x69, 0x74, 0x20, 0x75, 0x6e, 0x6e, 0x65, - 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x2e, 0x0a, 0x0a, 0x20, 0x20, - 0x33, 0x2e, 0x20, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6e, - 0x67, 0x20, 0x55, 0x73, 0x65, 0x72, 0x73, 0x27, 0x20, 0x4c, 0x65, 0x67, - 0x61, 0x6c, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x46, 0x72, - 0x6f, 0x6d, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x2d, 0x43, 0x69, 0x72, 0x63, - 0x75, 0x6d, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4c, 0x61, - 0x77, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x68, - 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x65, 0x6d, 0x65, - 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, - 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x74, - 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, - 0x0a, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x20, 0x75, 0x6e, 0x64, - 0x65, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x61, 0x77, 0x20, 0x66, 0x75, - 0x6c, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x75, 0x6e, 0x64, - 0x65, 0x72, 0x20, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x0a, 0x31, - 0x31, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x57, 0x49, 0x50, - 0x4f, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, - 0x74, 0x72, 0x65, 0x61, 0x74, 0x79, 0x20, 0x61, 0x64, 0x6f, 0x70, 0x74, - 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x32, 0x30, 0x20, 0x44, 0x65, 0x63, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x31, 0x39, 0x39, 0x36, 0x2c, 0x20, - 0x6f, 0x72, 0x0a, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x6c, - 0x61, 0x77, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74, - 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x69, 0x72, 0x63, 0x75, - 0x6d, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, - 0x73, 0x75, 0x63, 0x68, 0x0a, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, - 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x79, - 0x6f, 0x75, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, 0x61, 0x20, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, - 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x69, 0x76, 0x65, 0x20, - 0x61, 0x6e, 0x79, 0x20, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x70, 0x6f, - 0x77, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x6f, 0x72, 0x62, 0x69, - 0x64, 0x0a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x76, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, - 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x61, - 0x73, 0x75, 0x72, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x75, 0x63, 0x68, - 0x20, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x76, 0x65, 0x6e, 0x74, 0x69, - 0x6f, 0x6e, 0x0a, 0x69, 0x73, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x65, 0x78, 0x65, 0x72, 0x63, 0x69, - 0x73, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, - 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x0a, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x79, 0x6f, 0x75, - 0x20, 0x64, 0x69, 0x73, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x61, 0x6e, - 0x79, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x74, 0x6f, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x20, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x0a, 0x6d, 0x6f, - 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x61, - 0x73, 0x20, 0x61, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x2c, 0x20, - 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x77, 0x6f, 0x72, 0x6b, 0x27, 0x73, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x73, - 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, - 0x69, 0x72, 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x27, - 0x20, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x73, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x6f, 0x72, 0x62, 0x69, 0x64, 0x20, - 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x0a, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, - 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x61, 0x73, 0x75, - 0x72, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x34, 0x2e, 0x20, 0x43, - 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x56, 0x65, 0x72, - 0x62, 0x61, 0x74, 0x69, 0x6d, 0x20, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x73, - 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, - 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, 0x76, 0x65, 0x72, 0x62, - 0x61, 0x74, 0x69, 0x6d, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x27, 0x73, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, - 0x63, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x0a, - 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20, 0x69, 0x74, 0x2c, 0x20, - 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, - 0x6d, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x6f, 0x6e, - 0x73, 0x70, 0x69, 0x63, 0x75, 0x6f, 0x75, 0x73, 0x6c, 0x79, 0x20, 0x61, - 0x6e, 0x64, 0x0a, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, - 0x74, 0x65, 0x6c, 0x79, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x20, 0x6f, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x63, 0x6f, 0x70, - 0x79, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, - 0x69, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x3b, 0x0a, 0x6b, - 0x65, 0x65, 0x70, 0x20, 0x69, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x20, 0x61, - 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x0a, 0x6e, 0x6f, 0x6e, - 0x2d, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, 0x20, - 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x37, - 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3b, 0x0a, 0x6b, 0x65, 0x65, 0x70, - 0x20, 0x69, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, - 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x61, 0x62, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, - 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, - 0x74, 0x79, 0x3b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x67, 0x69, 0x76, 0x65, - 0x20, 0x61, 0x6c, 0x6c, 0x0a, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, - 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x6d, 0x61, - 0x79, 0x20, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x20, 0x61, 0x6e, 0x79, - 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, - 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, - 0x61, 0x63, 0x68, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, - 0x2c, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, - 0x79, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x75, 0x70, 0x70, - 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, - 0x6e, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x66, 0x65, 0x65, - 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x35, 0x2e, 0x20, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x59, - 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, - 0x79, 0x20, 0x61, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x62, 0x61, 0x73, - 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x65, 0x20, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2c, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, - 0x6f, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x6f, - 0x64, 0x65, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, - 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x2c, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, - 0x6f, 0x75, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6d, 0x65, 0x65, 0x74, - 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, - 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x3a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x29, 0x20, 0x54, 0x68, - 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, - 0x63, 0x61, 0x72, 0x72, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x69, 0x6e, - 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x74, 0x2c, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x67, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x72, - 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x20, 0x64, 0x61, 0x74, 0x65, - 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x29, 0x20, 0x54, 0x68, - 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, - 0x63, 0x61, 0x72, 0x72, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x69, 0x6e, - 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, - 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x64, - 0x64, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x73, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x37, 0x2e, - 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x73, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x20, 0x74, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x65, 0x70, 0x20, 0x69, 0x6e, - 0x74, 0x61, 0x63, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, - 0x69, 0x63, 0x65, 0x73, 0x22, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x29, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, - 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2c, - 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x77, 0x68, 0x6f, 0x6c, 0x65, 0x2c, - 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, - 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x20, 0x77, 0x68, - 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, - 0x20, 0x70, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, - 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2e, 0x20, 0x20, - 0x54, 0x68, 0x69, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x69, 0x63, - 0x65, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, - 0x79, 0x2c, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x37, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x2c, - 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x68, 0x6f, 0x6c, - 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, - 0x6b, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x69, - 0x74, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x79, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x64, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, - 0x65, 0x6e, 0x73, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x73, 0x20, 0x6e, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, - 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65, - 0x72, 0x20, 0x77, 0x61, 0x79, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, - 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, - 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, - 0x74, 0x65, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x64, 0x20, 0x69, 0x74, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, - 0x29, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, - 0x6b, 0x20, 0x68, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x65, - 0x61, 0x63, 0x68, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x41, 0x70, 0x70, - 0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x20, 0x4c, 0x65, 0x67, - 0x61, 0x6c, 0x20, 0x4e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x73, 0x3b, 0x20, - 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, - 0x68, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x20, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, - 0x74, 0x65, 0x20, 0x4c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x4e, 0x6f, 0x74, - 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6e, 0x65, 0x65, 0x64, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x6d, 0x20, 0x64, 0x6f, 0x20, 0x73, 0x6f, 0x2e, 0x0a, 0x0a, 0x20, - 0x20, 0x41, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x73, 0x65, 0x70, 0x61, - 0x72, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x64, - 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x0a, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x72, - 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, - 0x69, 0x72, 0x20, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, - 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x68, - 0x69, 0x63, 0x68, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x69, 0x74, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, - 0x20, 0x74, 0x6f, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x20, 0x6c, - 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x2c, 0x0a, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x20, - 0x61, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x61, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x72, - 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x2c, 0x20, 0x69, 0x73, - 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x0a, 0x22, - 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x22, 0x20, 0x69, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, - 0x73, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, - 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x72, - 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x0a, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, - 0x6f, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, - 0x67, 0x61, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x73, 0x20, 0x75, 0x73, 0x65, 0x72, - 0x73, 0x0a, 0x62, 0x65, 0x79, 0x6f, 0x6e, 0x64, 0x20, 0x77, 0x68, 0x61, - 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, - 0x64, 0x75, 0x61, 0x6c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x74, 0x2e, 0x20, 0x20, 0x49, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x0a, - 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, - 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x6f, 0x74, 0x68, 0x65, 0x72, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x36, 0x2e, 0x20, - 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x4e, 0x6f, - 0x6e, 0x2d, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x46, 0x6f, 0x72, - 0x6d, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x6d, - 0x61, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, 0x61, 0x20, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, - 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, - 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x75, 0x6e, 0x64, - 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, - 0x0a, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x34, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x35, 0x2c, 0x20, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6e, - 0x76, 0x65, 0x79, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x2d, 0x72, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, - 0x20, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, - 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x0a, 0x69, 0x6e, 0x20, 0x6f, 0x6e, - 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x77, - 0x61, 0x79, 0x73, 0x3a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x29, - 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, - 0x69, 0x6e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x6d, 0x62, 0x6f, 0x64, - 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x2c, 0x20, 0x61, 0x20, 0x70, 0x68, - 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x70, 0x68, 0x79, 0x73, - 0x69, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, - 0x29, 0x2c, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, - 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x66, - 0x69, 0x78, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x20, 0x64, 0x75, - 0x72, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, - 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x61, 0x72, 0x69, 0x6c, - 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, - 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x62, 0x29, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, - 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x65, - 0x6d, 0x62, 0x6f, 0x64, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x2c, 0x20, - 0x61, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x28, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, - 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, - 0x64, 0x69, 0x75, 0x6d, 0x29, 0x2c, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x6e, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, - 0x6f, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, - 0x74, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x20, 0x79, 0x65, 0x61, 0x72, - 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x6f, 0x6e, 0x67, 0x20, 0x61, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6f, - 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x70, 0x61, 0x72, 0x65, 0x20, 0x70, - 0x61, 0x72, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x65, 0x72, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x69, 0x76, 0x65, - 0x20, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x20, 0x77, 0x68, 0x6f, 0x20, - 0x70, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, - 0x65, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x28, 0x31, 0x29, - 0x20, 0x61, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, - 0x62, 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x20, 0x64, 0x75, - 0x72, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, - 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, - 0x6d, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x61, 0x72, 0x69, 0x6c, - 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, - 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x61, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x6e, 0x6f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, - 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x6f, - 0x66, 0x20, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, - 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, - 0x76, 0x65, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x32, 0x29, - 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, - 0x6f, 0x70, 0x79, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x66, 0x72, 0x6f, - 0x6d, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x61, 0x74, 0x20, 0x6e, 0x6f, - 0x20, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x29, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, - 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x20, 0x63, - 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x66, 0x65, - 0x72, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, - 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x63, 0x63, 0x61, 0x73, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, - 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x6c, - 0x79, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, - 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x6e, - 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x61, - 0x63, 0x63, 0x6f, 0x72, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x36, 0x62, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, - 0x29, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, - 0x20, 0x62, 0x79, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, - 0x20, 0x61, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x65, - 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, - 0x28, 0x67, 0x72, 0x61, 0x74, 0x69, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x29, - 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x20, - 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x20, 0x61, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, - 0x65, 0x20, 0x77, 0x61, 0x79, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, - 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6e, 0x6f, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, - 0x68, 0x61, 0x72, 0x67, 0x65, 0x2e, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, - 0x6e, 0x65, 0x65, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x20, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, - 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, - 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, 0x72, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x20, 0x20, 0x49, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x74, - 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, - 0x64, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2c, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, - 0x6f, 0x6e, 0x20, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x74, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x28, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x79, - 0x6f, 0x75, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x74, 0x68, 0x69, 0x72, - 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, - 0x74, 0x73, 0x20, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, - 0x74, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x61, - 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, - 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x74, 0x6f, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, - 0x63, 0x6f, 0x64, 0x65, 0x20, 0x73, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x20, - 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x6e, - 0x64, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, - 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x20, 0x20, 0x52, 0x65, 0x67, - 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x77, - 0x68, 0x61, 0x74, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x68, - 0x6f, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x79, - 0x6f, 0x75, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x6f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x65, - 0x6e, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, - 0x74, 0x20, 0x69, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, - 0x73, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x61, 0x73, 0x20, 0x6e, 0x65, - 0x65, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x61, 0x74, 0x69, - 0x73, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x0a, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x29, 0x20, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, - 0x20, 0x70, 0x65, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x2d, 0x70, 0x65, 0x65, - 0x72, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x69, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x65, - 0x65, 0x72, 0x73, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, - 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x61, 0x72, 0x65, 0x20, 0x62, - 0x65, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x6c, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x61, - 0x74, 0x20, 0x6e, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, - 0x72, 0x67, 0x65, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x73, 0x75, - 0x62, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x36, 0x64, 0x2e, - 0x0a, 0x0a, 0x20, 0x20, 0x41, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, - 0x62, 0x6c, 0x65, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x6f, 0x73, - 0x65, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x64, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x64, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, - 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x61, 0x73, 0x20, 0x61, - 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x4c, 0x69, 0x62, 0x72, - 0x61, 0x72, 0x79, 0x2c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x62, 0x65, 0x0a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2e, - 0x0a, 0x0a, 0x20, 0x20, 0x41, 0x20, 0x22, 0x55, 0x73, 0x65, 0x72, 0x20, - 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x20, 0x69, 0x73, 0x20, - 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x28, 0x31, 0x29, 0x20, 0x61, - 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x20, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x2c, 0x20, 0x77, 0x68, 0x69, - 0x63, 0x68, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x79, - 0x0a, 0x74, 0x61, 0x6e, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x65, - 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x79, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, - 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x75, 0x73, - 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, - 0x6e, 0x61, 0x6c, 0x2c, 0x20, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x2c, - 0x0a, 0x6f, 0x72, 0x20, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x68, 0x6f, 0x6c, - 0x64, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73, 0x2c, 0x20, - 0x6f, 0x72, 0x20, 0x28, 0x32, 0x29, 0x20, 0x61, 0x6e, 0x79, 0x74, 0x68, - 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x20, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x6c, 0x64, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x0a, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x64, 0x77, - 0x65, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x20, 0x49, 0x6e, 0x20, - 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, - 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, - 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x2c, 0x0a, 0x64, 0x6f, 0x75, 0x62, 0x74, 0x66, 0x75, - 0x6c, 0x20, 0x63, 0x61, 0x73, 0x65, 0x73, 0x20, 0x73, 0x68, 0x61, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x20, 0x6f, - 0x66, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x20, - 0x20, 0x46, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x75, 0x6c, 0x61, 0x72, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x62, - 0x79, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, - 0x61, 0x72, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2c, 0x20, 0x22, 0x6e, 0x6f, - 0x72, 0x6d, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x22, - 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, - 0x0a, 0x74, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x20, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2c, - 0x20, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x0a, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x75, 0x73, 0x65, 0x72, - 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, - 0x61, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, - 0x61, 0x72, 0x20, 0x75, 0x73, 0x65, 0x72, 0x0a, 0x61, 0x63, 0x74, 0x75, - 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x75, 0x73, 0x65, 0x73, 0x2c, 0x20, 0x6f, - 0x72, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x72, - 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x20, 0x20, 0x41, - 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x0a, 0x69, 0x73, 0x20, - 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x20, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x72, 0x65, 0x67, 0x61, 0x72, - 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x68, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x73, 0x75, 0x62, - 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x0a, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x2c, 0x20, 0x69, 0x6e, 0x64, - 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x6e, - 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x20, - 0x75, 0x73, 0x65, 0x73, 0x2c, 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, - 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x75, 0x73, 0x65, 0x73, 0x20, 0x72, - 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x0a, 0x74, 0x68, 0x65, - 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x6e, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x6f, - 0x66, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x0a, 0x0a, 0x20, - 0x20, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x55, 0x73, - 0x65, 0x72, 0x20, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x6d, - 0x65, 0x61, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x73, 0x2c, 0x0a, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, - 0x75, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x73, - 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, - 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, - 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x55, 0x73, 0x65, 0x72, 0x20, 0x50, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x0a, 0x61, 0x20, 0x6d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x73, 0x20, 0x43, - 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x20, 0x20, 0x54, 0x68, - 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x0a, 0x73, 0x75, 0x66, 0x66, 0x69, - 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x64, 0x20, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x0a, 0x63, 0x6f, 0x64, 0x65, 0x20, - 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x6f, 0x20, 0x63, 0x61, 0x73, - 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, - 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x65, 0x72, 0x65, - 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x6f, 0x6c, 0x65, 0x6c, - 0x79, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x0a, 0x6d, 0x6f, - 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, - 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x64, 0x65, - 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, - 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x77, 0x6f, - 0x72, 0x6b, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, - 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x2c, 0x20, 0x6f, - 0x72, 0x0a, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x6c, - 0x6c, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, - 0x6e, 0x2c, 0x20, 0x61, 0x20, 0x55, 0x73, 0x65, 0x72, 0x20, 0x50, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x69, 0x6e, 0x67, - 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x73, 0x20, 0x61, 0x73, 0x0a, 0x70, - 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, - 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, - 0x67, 0x68, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, - 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x55, 0x73, 0x65, - 0x72, 0x20, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x69, 0x73, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x63, 0x69, - 0x70, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x65, 0x72, - 0x70, 0x65, 0x74, 0x75, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x61, 0x0a, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x74, - 0x65, 0x72, 0x6d, 0x20, 0x28, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, - 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, - 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x29, 0x2c, 0x20, 0x74, 0x68, - 0x65, 0x0a, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, - 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, - 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, - 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, 0x65, 0x64, 0x0a, 0x62, - 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x20, 0x42, 0x75, 0x74, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x0a, 0x69, 0x66, 0x20, - 0x6e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, - 0x6e, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x74, 0x68, 0x69, 0x72, - 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x79, 0x20, 0x72, 0x65, 0x74, 0x61, - 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, - 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x73, 0x65, 0x72, 0x20, - 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x28, 0x66, 0x6f, 0x72, - 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x68, 0x61, 0x73, 0x0a, 0x62, - 0x65, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x20, 0x52, 0x4f, 0x4d, 0x29, 0x2e, 0x0a, 0x0a, - 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x61, - 0x0a, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, - 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, - 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2c, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, - 0x79, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x73, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x77, 0x6f, 0x72, 0x6b, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, - 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, - 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, - 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x63, 0x69, - 0x70, 0x69, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x6f, - 0x72, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x55, 0x73, 0x65, 0x72, 0x20, 0x50, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, - 0x69, 0x63, 0x68, 0x20, 0x69, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, - 0x65, 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, - 0x64, 0x2e, 0x20, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, - 0x6f, 0x20, 0x61, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, - 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x6e, 0x69, 0x65, - 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x61, 0x64, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x6c, 0x79, 0x20, 0x61, 0x66, 0x66, 0x65, - 0x63, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6f, 0x72, 0x20, - 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x0a, 0x0a, - 0x20, 0x20, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, - 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x0a, - 0x69, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, - 0x69, 0x6e, 0x20, 0x61, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x6c, 0x79, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x69, 0x6e, 0x0a, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, - 0x6f, 0x72, 0x6d, 0x29, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, - 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x6e, - 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6b, 0x65, - 0x79, 0x20, 0x66, 0x6f, 0x72, 0x0a, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, - 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x69, 0x6e, 0x67, 0x2e, - 0x0a, 0x0a, 0x20, 0x20, 0x37, 0x2e, 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x2e, - 0x0a, 0x0a, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x65, 0x72, - 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, - 0x0a, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x62, 0x79, 0x20, - 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6f, - 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6f, - 0x66, 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, - 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, - 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, - 0x72, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x73, - 0x68, 0x61, 0x6c, 0x6c, 0x0a, 0x62, 0x65, 0x20, 0x74, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x67, - 0x68, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x77, 0x65, 0x72, 0x65, 0x20, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x74, 0x0a, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, - 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x61, 0x77, 0x2e, 0x20, 0x20, 0x49, - 0x66, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, - 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2c, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6d, 0x61, - 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x73, 0x65, - 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x0a, 0x75, 0x6e, 0x64, - 0x65, 0x72, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x62, 0x75, - 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, - 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x72, 0x65, 0x6d, - 0x61, 0x69, 0x6e, 0x73, 0x20, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x65, - 0x64, 0x20, 0x62, 0x79, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, - 0x74, 0x20, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, 0x61, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2c, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x74, 0x20, - 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x61, - 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x72, - 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x70, 0x79, - 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, - 0x79, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x0a, 0x69, 0x74, - 0x2e, 0x20, 0x20, 0x28, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x77, 0x72, - 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6f, - 0x77, 0x6e, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x20, 0x69, - 0x6e, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x63, 0x61, - 0x73, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x79, 0x6f, 0x75, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x29, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, - 0x6d, 0x61, 0x79, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x0a, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x6e, 0x20, - 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2c, 0x20, 0x61, 0x64, - 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x74, - 0x6f, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, - 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, - 0x69, 0x63, 0x68, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x68, 0x61, 0x76, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x67, 0x69, 0x76, 0x65, - 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, - 0x20, 0x20, 0x4e, 0x6f, 0x74, 0x77, 0x69, 0x74, 0x68, 0x73, 0x74, 0x61, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, - 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x79, 0x6f, 0x75, 0x0a, - 0x61, 0x64, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x79, - 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x28, 0x69, 0x66, 0x20, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6f, - 0x66, 0x0a, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x29, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, - 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, - 0x65, 0x72, 0x6d, 0x73, 0x3a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, - 0x29, 0x20, 0x44, 0x69, 0x73, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x69, 0x6e, - 0x67, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x20, 0x6f, - 0x72, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6c, - 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x64, 0x69, 0x66, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x66, 0x72, 0x6f, - 0x6d, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, - 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x31, 0x35, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, - 0x36, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x20, 0x6f, 0x72, 0x0a, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x62, 0x29, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x6e, - 0x6f, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x61, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, - 0x20, 0x4c, 0x65, 0x67, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4e, - 0x6f, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x20, 0x69, 0x74, 0x3b, 0x20, 0x6f, 0x72, 0x0a, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x29, 0x20, 0x50, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74, - 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x69, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, - 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x2c, 0x20, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x79, 0x73, 0x20, - 0x61, 0x73, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, - 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x3b, 0x20, 0x6f, 0x72, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x64, 0x29, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x79, 0x20, 0x70, 0x75, - 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x6f, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x3b, - 0x20, 0x6f, 0x72, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x29, 0x20, - 0x44, 0x65, 0x63, 0x6c, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, - 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x72, 0x61, 0x64, - 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x6c, 0x61, 0x77, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6f, 0x6d, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, - 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x3b, - 0x20, 0x6f, 0x72, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x29, 0x20, - 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, - 0x64, 0x65, 0x6d, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x20, - 0x62, 0x79, 0x20, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x20, 0x77, 0x68, - 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x73, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x28, - 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x74, 0x29, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, - 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x63, - 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6c, 0x69, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, - 0x68, 0x65, 0x73, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, - 0x74, 0x75, 0x61, 0x6c, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, - 0x79, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x6c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, - 0x41, 0x6c, 0x6c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6e, 0x6f, - 0x6e, 0x2d, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, - 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, - 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x6f, - 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x22, 0x66, 0x75, - 0x72, 0x74, 0x68, 0x65, 0x72, 0x0a, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x69, - 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x31, 0x30, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x61, 0x73, - 0x20, 0x79, 0x6f, 0x75, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x64, 0x20, 0x69, 0x74, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, - 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x2c, - 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, - 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x69, - 0x73, 0x0a, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x62, - 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x61, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, - 0x65, 0x72, 0x0a, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x61, 0x20, - 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x73, 0x0a, 0x61, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, - 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x62, 0x75, 0x74, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x73, 0x20, - 0x72, 0x65, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x69, 0x6e, 0x67, - 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x0a, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x79, 0x6f, 0x75, - 0x20, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x64, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x61, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, - 0x72, 0x6b, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x20, - 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x0a, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, - 0x72, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x0a, 0x6e, 0x6f, 0x74, 0x20, 0x73, - 0x75, 0x72, 0x76, 0x69, 0x76, 0x65, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, - 0x72, 0x65, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x69, 0x6e, 0x67, - 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, - 0x61, 0x64, 0x64, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x74, 0x6f, - 0x20, 0x61, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, - 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, - 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x79, 0x6f, 0x75, - 0x0a, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2c, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x65, - 0x76, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x0a, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x6f, - 0x73, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x6f, 0x72, - 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x69, 0x6e, - 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x0a, 0x77, 0x68, 0x65, - 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, - 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, - 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x74, - 0x65, 0x72, 0x6d, 0x73, 0x2c, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x76, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, 0x2c, 0x20, - 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x66, 0x6f, 0x72, - 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, - 0x61, 0x74, 0x65, 0x6c, 0x79, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, - 0x6e, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x6f, - 0x72, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, - 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x0a, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, - 0x70, 0x70, 0x6c, 0x79, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, - 0x77, 0x61, 0x79, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x38, 0x2e, 0x20, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, - 0x0a, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x20, 0x61, - 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, - 0x6b, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x61, 0x73, 0x20, - 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6c, 0x79, 0x0a, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x2e, 0x20, 0x20, 0x41, 0x6e, 0x79, 0x20, 0x61, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, - 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, - 0x74, 0x65, 0x20, 0x6f, 0x72, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x2c, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x75, - 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x20, 0x79, 0x6f, - 0x75, 0x72, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, - 0x65, 0x6e, 0x73, 0x65, 0x20, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x61, 0x74, 0x65, - 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x20, - 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, - 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x0a, - 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x6f, 0x66, - 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x31, 0x29, - 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, - 0x2c, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x65, 0x61, - 0x73, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x76, 0x69, 0x6f, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, - 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x0a, 0x6c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x63, 0x6f, - 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, 0x6f, 0x6c, 0x64, - 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x29, 0x0a, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x2c, 0x20, - 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, - 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x70, - 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x65, - 0x72, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, - 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, - 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x20, - 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x62, 0x29, 0x20, 0x70, 0x65, - 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x2c, 0x20, 0x69, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, - 0x67, 0x68, 0x74, 0x0a, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x66, - 0x61, 0x69, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x69, - 0x66, 0x79, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x62, 0x79, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, - 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x36, 0x30, - 0x20, 0x64, 0x61, 0x79, 0x73, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x63, 0x65, 0x73, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x4d, 0x6f, 0x72, 0x65, 0x6f, 0x76, - 0x65, 0x72, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6c, 0x69, 0x63, - 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x63, - 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, 0x6f, 0x6c, - 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x0a, 0x72, 0x65, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x61, 0x6e, - 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, - 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x0a, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x62, 0x79, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, - 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x68, 0x61, 0x76, 0x65, 0x0a, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, - 0x65, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, - 0x61, 0x6e, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x29, 0x20, 0x66, 0x72, - 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0a, 0x63, 0x6f, 0x70, 0x79, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x75, - 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x69, 0x6f, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x74, - 0x6f, 0x20, 0x33, 0x30, 0x20, 0x64, 0x61, 0x79, 0x73, 0x20, 0x61, 0x66, - 0x74, 0x65, 0x72, 0x0a, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x72, 0x65, 0x63, - 0x65, 0x69, 0x70, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, - 0x66, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, - 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, - 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x6c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x20, 0x77, 0x68, 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, - 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x63, 0x6f, - 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x79, 0x6f, 0x75, 0x20, - 0x75, 0x6e, 0x64, 0x65, 0x72, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, - 0x79, 0x6f, 0x75, 0x72, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, - 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, - 0x6e, 0x74, 0x6c, 0x79, 0x0a, 0x72, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x64, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x64, 0x6f, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x79, 0x20, - 0x74, 0x6f, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20, 0x6e, - 0x65, 0x77, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, - 0x0a, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x31, 0x30, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x39, 0x2e, 0x20, 0x41, 0x63, - 0x63, 0x65, 0x70, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x4e, 0x6f, 0x74, - 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x48, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x6f, 0x70, - 0x69, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, - 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, - 0x70, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20, - 0x6f, 0x72, 0x0a, 0x72, 0x75, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, - 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x2e, 0x20, 0x20, 0x41, 0x6e, 0x63, 0x69, 0x6c, - 0x6c, 0x61, 0x72, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x0a, 0x6f, - 0x63, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x6f, 0x6c, - 0x65, 0x6c, 0x79, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, - 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x65, 0x65, 0x72, 0x2d, 0x74, - 0x6f, 0x2d, 0x70, 0x65, 0x65, 0x72, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x74, 0x6f, 0x20, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, - 0x79, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x77, 0x69, 0x73, 0x65, 0x20, 0x64, - 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x2e, 0x20, 0x20, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, - 0x2c, 0x0a, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x67, 0x72, - 0x61, 0x6e, 0x74, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x70, - 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x72, 0x0a, - 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2e, - 0x20, 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x69, 0x6e, 0x67, 0x65, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x69, - 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x64, 0x6f, 0x0a, 0x6e, 0x6f, 0x74, - 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, - 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x20, 0x20, 0x54, - 0x68, 0x65, 0x72, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x62, 0x79, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x6f, - 0x72, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x20, 0x61, 0x0a, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, - 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x69, 0x6e, - 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, - 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x73, 0x6f, 0x2e, - 0x0a, 0x0a, 0x20, 0x20, 0x31, 0x30, 0x2e, 0x20, 0x41, 0x75, 0x74, 0x6f, - 0x6d, 0x61, 0x74, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x44, 0x6f, 0x77, 0x6e, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x45, 0x61, 0x63, - 0x68, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, - 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x20, - 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, - 0x79, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x20, 0x61, - 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x72, 0x6f, - 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, - 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x73, - 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x2c, 0x20, 0x6d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, - 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x0a, 0x66, 0x6f, 0x72, 0x20, - 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, - 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x79, 0x20, - 0x74, 0x68, 0x69, 0x72, 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x20, - 0x41, 0x6e, 0x20, 0x22, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, - 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x0a, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x72, - 0x20, 0x73, 0x75, 0x62, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x6c, 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x2c, 0x20, 0x6f, 0x72, - 0x20, 0x73, 0x75, 0x62, 0x64, 0x69, 0x76, 0x69, 0x64, 0x69, 0x6e, 0x67, - 0x20, 0x61, 0x6e, 0x0a, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x65, 0x72, - 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, - 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, - 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x77, 0x68, 0x6f, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x61, 0x6c, 0x73, - 0x6f, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x20, 0x77, - 0x68, 0x61, 0x74, 0x65, 0x76, 0x65, 0x72, 0x0a, 0x6c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x27, 0x73, 0x20, 0x70, 0x72, 0x65, 0x64, 0x65, 0x63, 0x65, - 0x73, 0x73, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x65, 0x73, 0x74, 0x20, 0x68, 0x61, 0x64, 0x20, 0x6f, 0x72, 0x20, - 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x0a, 0x67, 0x69, 0x76, 0x65, 0x20, 0x75, - 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, - 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x2c, 0x20, 0x70, 0x6c, 0x75, 0x73, 0x20, 0x61, 0x20, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x73, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x0a, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, - 0x64, 0x65, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x66, - 0x0a, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x64, 0x65, 0x63, 0x65, - 0x73, 0x73, 0x6f, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x69, 0x74, 0x20, - 0x6f, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x20, 0x69, - 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, - 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x6d, 0x61, - 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x73, 0x65, - 0x20, 0x61, 0x6e, 0x79, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, - 0x72, 0x63, 0x69, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x67, 0x72, 0x61, 0x6e, - 0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x66, 0x66, 0x69, 0x72, - 0x6d, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x20, - 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x0a, 0x6e, 0x6f, - 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x20, 0x61, 0x20, 0x6c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x65, 0x65, 0x2c, 0x20, - 0x72, 0x6f, 0x79, 0x61, 0x6c, 0x74, 0x79, 0x2c, 0x20, 0x6f, 0x72, 0x20, - 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x65, 0x72, 0x63, 0x69, 0x73, - 0x65, 0x20, 0x6f, 0x66, 0x0a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, - 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, - 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x79, 0x6f, 0x75, 0x20, - 0x6d, 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x74, 0x65, 0x20, 0x6c, 0x69, 0x74, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x0a, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, - 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x2d, 0x63, - 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x69, 0x6e, 0x20, - 0x61, 0x20, 0x6c, 0x61, 0x77, 0x73, 0x75, 0x69, 0x74, 0x29, 0x20, 0x61, - 0x6c, 0x6c, 0x65, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x0a, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x20, - 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x66, - 0x72, 0x69, 0x6e, 0x67, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x6d, 0x61, - 0x6b, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x2c, - 0x20, 0x73, 0x65, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, 0x66, - 0x66, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x0a, 0x73, - 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, - 0x20, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, - 0x69, 0x74, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x31, 0x31, 0x2e, 0x20, 0x50, - 0x61, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x41, - 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, - 0x72, 0x22, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x20, 0x77, 0x68, 0x6f, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x65, 0x73, 0x20, 0x75, 0x73, 0x65, 0x20, 0x75, 0x6e, 0x64, 0x65, - 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x0a, 0x4c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x20, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x20, 0x69, 0x73, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x2e, 0x20, 0x20, - 0x54, 0x68, 0x65, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x74, 0x68, 0x75, - 0x73, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x20, 0x69, - 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, - 0x27, 0x73, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x6f, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x41, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x27, 0x73, 0x20, 0x22, 0x65, 0x73, - 0x73, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x65, - 0x6e, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x22, 0x20, 0x61, - 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, - 0x74, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x0a, 0x6f, 0x77, 0x6e, - 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x2c, - 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x6c, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x20, 0x61, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x20, 0x6f, 0x72, 0x0a, 0x68, 0x65, 0x72, 0x65, 0x61, 0x66, 0x74, - 0x65, 0x72, 0x20, 0x61, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2c, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, - 0x62, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x69, 0x6e, 0x67, 0x65, 0x64, - 0x20, 0x62, 0x79, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6d, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x0a, 0x62, 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x6f, 0x66, 0x20, 0x6d, - 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, - 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x6c, 0x69, 0x6e, 0x67, - 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x6f, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x2c, 0x0a, 0x62, 0x75, 0x74, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x63, 0x6c, 0x61, - 0x69, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x6f, 0x75, - 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x69, 0x6e, - 0x67, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x73, 0x20, - 0x61, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, - 0x65, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x20, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x0a, 0x70, - 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x69, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x22, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x74, 0x6f, 0x20, - 0x67, 0x72, 0x61, 0x6e, 0x74, 0x0a, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, - 0x20, 0x73, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, - 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, - 0x0a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x45, 0x61, 0x63, 0x68, 0x20, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x20, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x61, 0x20, - 0x6e, 0x6f, 0x6e, 0x2d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, - 0x65, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x77, 0x69, 0x64, 0x65, - 0x2c, 0x20, 0x72, 0x6f, 0x79, 0x61, 0x6c, 0x74, 0x79, 0x2d, 0x66, 0x72, - 0x65, 0x65, 0x0a, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x6f, 0x72, 0x27, 0x73, 0x20, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x63, - 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x0a, 0x6d, 0x61, - 0x6b, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x6c, - 0x6c, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, - 0x20, 0x73, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, - 0x69, 0x73, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x2c, 0x20, 0x6d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x61, 0x67, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, - 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, - 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, - 0x20, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, - 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, - 0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x73, 0x2c, - 0x20, 0x61, 0x20, 0x22, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x69, 0x73, 0x20, 0x61, - 0x6e, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x0a, 0x61, - 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, - 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, 0x6e, 0x6f, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x20, - 0x61, 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x0a, 0x28, 0x73, 0x75, - 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x63, 0x65, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, - 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x6e, 0x61, 0x6e, 0x74, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x6f, 0x0a, 0x73, 0x75, 0x65, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x69, - 0x6e, 0x66, 0x72, 0x69, 0x6e, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x29, - 0x2e, 0x20, 0x20, 0x54, 0x6f, 0x20, 0x22, 0x67, 0x72, 0x61, 0x6e, 0x74, - 0x22, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, - 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, - 0x74, 0x6f, 0x20, 0x61, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x79, 0x20, 0x6d, - 0x65, 0x61, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6b, 0x65, - 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x72, - 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x20, - 0x61, 0x0a, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x67, 0x61, - 0x69, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, - 0x75, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, 0x61, 0x20, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2c, - 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x6c, 0x79, 0x20, 0x72, - 0x65, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x20, - 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x2c, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x20, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x73, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, - 0x0a, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2c, 0x20, 0x66, 0x72, - 0x65, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x2c, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x61, 0x0a, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x6c, 0x79, 0x20, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x6f, 0x72, - 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x72, 0x65, 0x61, 0x64, 0x69, - 0x6c, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, - 0x65, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x2c, 0x0a, 0x74, 0x68, 0x65, - 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x65, - 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x28, 0x31, 0x29, 0x20, 0x63, 0x61, - 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x73, - 0x6f, 0x0a, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x2c, - 0x20, 0x6f, 0x72, 0x20, 0x28, 0x32, 0x29, 0x20, 0x61, 0x72, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x70, 0x72, 0x69, - 0x76, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x6e, 0x65, 0x66, - 0x69, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x70, 0x61, - 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x77, 0x6f, 0x72, - 0x6b, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x33, 0x29, 0x20, 0x61, 0x72, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, - 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x20, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, - 0x61, 0x74, 0x65, 0x6e, 0x74, 0x0a, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x20, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x20, 0x20, 0x22, 0x4b, 0x6e, 0x6f, 0x77, 0x69, 0x6e, - 0x67, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x22, - 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x68, - 0x61, 0x76, 0x65, 0x0a, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x6b, - 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, - 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, - 0x65, 0x0a, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, - 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x72, 0x79, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x72, - 0x20, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x27, 0x73, - 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, - 0x0a, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, - 0x79, 0x2c, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x69, 0x6e, 0x66, - 0x72, 0x69, 0x6e, 0x67, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, - 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0a, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x65, - 0x76, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x49, 0x66, 0x2c, 0x20, 0x70, 0x75, 0x72, - 0x73, 0x75, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x72, 0x20, - 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, - 0x67, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x0a, 0x61, 0x72, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, - 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x70, - 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x20, 0x62, 0x79, 0x20, - 0x70, 0x72, 0x6f, 0x63, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x79, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x2c, - 0x20, 0x61, 0x0a, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x20, - 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, - 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, - 0x65, 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x70, - 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x0a, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x79, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x63, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, - 0x72, 0x6b, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x0a, 0x79, 0x6f, 0x75, 0x20, 0x67, 0x72, 0x61, 0x6e, - 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, - 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, - 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, - 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, - 0x72, 0x6b, 0x73, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, - 0x20, 0x69, 0x74, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x41, 0x20, 0x70, 0x61, - 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x20, 0x69, 0x73, 0x20, 0x22, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x69, 0x66, 0x20, - 0x69, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x69, 0x6e, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, - 0x69, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x72, - 0x63, 0x69, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x2c, 0x20, 0x6f, 0x72, 0x20, - 0x69, 0x73, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, - 0x6e, 0x2d, 0x65, 0x78, 0x65, 0x72, 0x63, 0x69, 0x73, 0x65, 0x20, 0x6f, - 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, - 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, - 0x0a, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x6c, 0x6c, - 0x79, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, - 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x6d, - 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, - 0x79, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x0a, - 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, - 0x61, 0x72, 0x65, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x79, 0x20, - 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, - 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x79, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x0a, 0x69, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x62, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, - 0x65, 0x2c, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x77, 0x68, 0x69, - 0x63, 0x68, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, - 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x74, 0x6f, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, - 0x66, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, - 0x79, 0x69, 0x6e, 0x67, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, - 0x6b, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, - 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x68, 0x69, 0x72, 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x79, 0x20, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, - 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x20, 0x77, 0x68, 0x6f, 0x20, 0x77, 0x6f, 0x75, - 0x6c, 0x64, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x79, 0x6f, 0x75, - 0x2c, 0x20, 0x61, 0x20, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x0a, 0x70, 0x61, 0x74, 0x65, 0x6e, - 0x74, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x28, 0x61, - 0x29, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x63, 0x6f, 0x70, - 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x0a, - 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x70, 0x69, - 0x65, 0x73, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, - 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, - 0x73, 0x29, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x62, 0x29, 0x20, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x69, 0x6c, 0x79, 0x0a, 0x66, 0x6f, 0x72, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x0a, 0x6f, - 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x70, 0x61, 0x74, 0x65, 0x6e, - 0x74, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x61, - 0x73, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x70, - 0x72, 0x69, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x32, 0x38, 0x20, 0x4d, - 0x61, 0x72, 0x63, 0x68, 0x20, 0x32, 0x30, 0x30, 0x37, 0x2e, 0x0a, 0x0a, - 0x20, 0x20, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, - 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x0a, 0x61, 0x6e, - 0x79, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x6c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, - 0x65, 0x72, 0x20, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x20, - 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x69, 0x6e, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x79, - 0x0a, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x62, - 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x74, 0x6f, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, - 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, - 0x70, 0x61, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x61, 0x77, 0x2e, 0x0a, - 0x0a, 0x20, 0x20, 0x31, 0x32, 0x2e, 0x20, 0x4e, 0x6f, 0x20, 0x53, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x4f, - 0x74, 0x68, 0x65, 0x72, 0x73, 0x27, 0x20, 0x46, 0x72, 0x65, 0x65, 0x64, - 0x6f, 0x6d, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x49, 0x66, 0x20, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, - 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x28, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x62, 0x79, 0x20, 0x63, 0x6f, 0x75, 0x72, 0x74, 0x20, 0x6f, 0x72, - 0x64, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x0a, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, - 0x69, 0x73, 0x65, 0x29, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x61, 0x64, 0x69, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x64, 0x6f, - 0x20, 0x6e, 0x6f, 0x74, 0x0a, 0x65, 0x78, 0x63, 0x75, 0x73, 0x65, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, - 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x79, 0x20, 0x61, 0x0a, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, - 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x6f, 0x20, 0x61, 0x73, 0x20, - 0x74, 0x6f, 0x20, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x79, 0x20, 0x73, - 0x69, 0x6d, 0x75, 0x6c, 0x74, 0x61, 0x6e, 0x65, 0x6f, 0x75, 0x73, 0x6c, - 0x79, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x0a, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x70, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x65, 0x6e, - 0x74, 0x20, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x61, - 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x0a, 0x6e, 0x6f, 0x74, - 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, 0x20, 0x69, 0x74, 0x20, 0x61, - 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x2e, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, - 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x66, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x20, 0x74, 0x6f, - 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x65, 0x20, 0x79, 0x6f, 0x75, - 0x0a, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, - 0x61, 0x20, 0x72, 0x6f, 0x79, 0x61, 0x6c, 0x74, 0x79, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d, - 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, - 0x6f, 0x6d, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, - 0x79, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, - 0x77, 0x61, 0x79, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x6f, 0x75, 0x6c, - 0x64, 0x20, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x79, 0x20, 0x62, 0x6f, - 0x74, 0x68, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x74, 0x65, 0x72, - 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x0a, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x6f, 0x75, 0x6c, - 0x64, 0x20, 0x62, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x66, 0x72, - 0x61, 0x69, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x6c, 0x79, - 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x79, - 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x31, 0x33, 0x2e, 0x20, - 0x55, 0x73, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x47, 0x4e, 0x55, 0x20, 0x41, 0x66, 0x66, 0x65, 0x72, 0x6f, 0x20, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x0a, - 0x0a, 0x20, 0x20, 0x4e, 0x6f, 0x74, 0x77, 0x69, 0x74, 0x68, 0x73, 0x74, - 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, - 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, - 0x68, 0x61, 0x76, 0x65, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, - 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x20, 0x61, - 0x6e, 0x79, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x77, - 0x6f, 0x72, 0x6b, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x64, - 0x0a, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x20, 0x33, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x47, 0x4e, 0x55, 0x20, 0x41, 0x66, 0x66, 0x65, 0x72, 0x6f, 0x20, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x69, 0x6e, - 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x0a, - 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x6f, 0x72, - 0x6b, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2e, - 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x0a, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x6e, - 0x74, 0x69, 0x6e, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x70, 0x70, - 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, - 0x72, 0x74, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20, - 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x0a, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x41, 0x66, - 0x66, 0x65, 0x72, 0x6f, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x2c, 0x0a, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x31, 0x33, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x72, 0x6e, - 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, - 0x61, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x77, 0x69, - 0x6c, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, - 0x74, 0x68, 0x65, 0x0a, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x73, 0x75, 0x63, 0x68, 0x2e, - 0x0a, 0x0a, 0x20, 0x20, 0x31, 0x34, 0x2e, 0x20, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x65, 0x64, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, - 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, - 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, - 0x72, 0x65, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x65, 0x64, 0x20, 0x61, 0x6e, - 0x64, 0x2f, 0x6f, 0x72, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x0a, 0x74, 0x68, 0x65, - 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x69, 0x6d, - 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x20, 0x20, - 0x53, 0x75, 0x63, 0x68, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x0a, 0x62, - 0x65, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x69, 0x6e, - 0x20, 0x73, 0x70, 0x69, 0x72, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, - 0x6d, 0x61, 0x79, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x20, 0x69, - 0x6e, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x6f, 0x0a, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6e, 0x65, 0x77, 0x20, - 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x72, 0x20, - 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x72, 0x6e, 0x73, 0x2e, 0x0a, 0x0a, 0x20, - 0x20, 0x45, 0x61, 0x63, 0x68, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x69, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x61, - 0x20, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, - 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x0a, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, - 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, - 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x64, 0x20, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x0a, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x20, 0x22, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, - 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x20, 0x74, - 0x6f, 0x20, 0x69, 0x74, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x68, 0x61, - 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, - 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x65, 0x64, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, - 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6c, 0x61, - 0x74, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x6f, - 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a, 0x46, 0x6f, 0x75, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x64, - 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x66, 0x79, 0x20, 0x61, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x0a, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, - 0x6d, 0x61, 0x79, 0x20, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x20, 0x61, - 0x6e, 0x79, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x65, - 0x76, 0x65, 0x72, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x0a, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, - 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x46, - 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, - 0x20, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x69, - 0x64, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x66, 0x75, 0x74, - 0x75, 0x72, 0x65, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, 0x20, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x63, - 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2c, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x27, 0x73, - 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x63, 0x63, - 0x65, 0x70, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, - 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x72, - 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x61, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x0a, - 0x74, 0x6f, 0x20, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x4c, 0x61, 0x74, 0x65, 0x72, - 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x67, 0x69, - 0x76, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x69, 0x66, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x70, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x20, 0x48, 0x6f, 0x77, - 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x6e, 0x6f, 0x20, 0x61, 0x64, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, - 0x69, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x61, - 0x6e, 0x79, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x6f, 0x72, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, - 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x79, 0x6f, 0x75, - 0x72, 0x20, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, - 0x6f, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x61, 0x0a, 0x6c, - 0x61, 0x74, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x31, 0x35, 0x2e, 0x20, 0x44, 0x69, 0x73, - 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x57, - 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x2e, 0x0a, 0x0a, 0x20, 0x20, - 0x54, 0x48, 0x45, 0x52, 0x45, 0x20, 0x49, 0x53, 0x20, 0x4e, 0x4f, 0x20, - 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, 0x20, 0x46, 0x4f, 0x52, - 0x20, 0x54, 0x48, 0x45, 0x20, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, - 0x2c, 0x20, 0x54, 0x4f, 0x20, 0x54, 0x48, 0x45, 0x20, 0x45, 0x58, 0x54, - 0x45, 0x4e, 0x54, 0x20, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x54, 0x54, 0x45, - 0x44, 0x20, 0x42, 0x59, 0x0a, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, - 0x42, 0x4c, 0x45, 0x20, 0x4c, 0x41, 0x57, 0x2e, 0x20, 0x20, 0x45, 0x58, - 0x43, 0x45, 0x50, 0x54, 0x20, 0x57, 0x48, 0x45, 0x4e, 0x20, 0x4f, 0x54, - 0x48, 0x45, 0x52, 0x57, 0x49, 0x53, 0x45, 0x20, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x44, 0x20, 0x49, 0x4e, 0x20, 0x57, 0x52, 0x49, 0x54, 0x49, 0x4e, - 0x47, 0x20, 0x54, 0x48, 0x45, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, - 0x47, 0x48, 0x54, 0x0a, 0x48, 0x4f, 0x4c, 0x44, 0x45, 0x52, 0x53, 0x20, - 0x41, 0x4e, 0x44, 0x2f, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, - 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, 0x45, 0x53, 0x20, 0x50, 0x52, 0x4f, - 0x56, 0x49, 0x44, 0x45, 0x20, 0x54, 0x48, 0x45, 0x20, 0x50, 0x52, 0x4f, - 0x47, 0x52, 0x41, 0x4d, 0x20, 0x22, 0x41, 0x53, 0x20, 0x49, 0x53, 0x22, - 0x20, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x20, 0x57, 0x41, 0x52, - 0x52, 0x41, 0x4e, 0x54, 0x59, 0x0a, 0x4f, 0x46, 0x20, 0x41, 0x4e, 0x59, - 0x20, 0x4b, 0x49, 0x4e, 0x44, 0x2c, 0x20, 0x45, 0x49, 0x54, 0x48, 0x45, - 0x52, 0x20, 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, 0x53, 0x45, 0x44, 0x20, - 0x4f, 0x52, 0x20, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x2c, 0x20, - 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x2c, 0x20, 0x42, - 0x55, 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, - 0x45, 0x44, 0x20, 0x54, 0x4f, 0x2c, 0x0a, 0x54, 0x48, 0x45, 0x20, 0x49, - 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, - 0x4e, 0x54, 0x49, 0x45, 0x53, 0x20, 0x4f, 0x46, 0x20, 0x4d, 0x45, 0x52, - 0x43, 0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, - 0x20, 0x41, 0x4e, 0x44, 0x20, 0x46, 0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, - 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, - 0x43, 0x55, 0x4c, 0x41, 0x52, 0x0a, 0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, - 0x45, 0x2e, 0x20, 0x20, 0x54, 0x48, 0x45, 0x20, 0x45, 0x4e, 0x54, 0x49, - 0x52, 0x45, 0x20, 0x52, 0x49, 0x53, 0x4b, 0x20, 0x41, 0x53, 0x20, 0x54, - 0x4f, 0x20, 0x54, 0x48, 0x45, 0x20, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, - 0x59, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x50, 0x45, 0x52, 0x46, 0x4f, 0x52, - 0x4d, 0x41, 0x4e, 0x43, 0x45, 0x20, 0x4f, 0x46, 0x20, 0x54, 0x48, 0x45, - 0x20, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x0a, 0x49, 0x53, 0x20, - 0x57, 0x49, 0x54, 0x48, 0x20, 0x59, 0x4f, 0x55, 0x2e, 0x20, 0x20, 0x53, - 0x48, 0x4f, 0x55, 0x4c, 0x44, 0x20, 0x54, 0x48, 0x45, 0x20, 0x50, 0x52, - 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x20, 0x50, 0x52, 0x4f, 0x56, 0x45, 0x20, - 0x44, 0x45, 0x46, 0x45, 0x43, 0x54, 0x49, 0x56, 0x45, 0x2c, 0x20, 0x59, - 0x4f, 0x55, 0x20, 0x41, 0x53, 0x53, 0x55, 0x4d, 0x45, 0x20, 0x54, 0x48, - 0x45, 0x20, 0x43, 0x4f, 0x53, 0x54, 0x20, 0x4f, 0x46, 0x0a, 0x41, 0x4c, - 0x4c, 0x20, 0x4e, 0x45, 0x43, 0x45, 0x53, 0x53, 0x41, 0x52, 0x59, 0x20, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x49, 0x4e, 0x47, 0x2c, 0x20, 0x52, - 0x45, 0x50, 0x41, 0x49, 0x52, 0x20, 0x4f, 0x52, 0x20, 0x43, 0x4f, 0x52, - 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x2e, 0x0a, 0x0a, 0x20, 0x20, - 0x31, 0x36, 0x2e, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x4c, 0x69, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x49, 0x4e, 0x20, 0x4e, - 0x4f, 0x20, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x20, 0x55, 0x4e, 0x4c, 0x45, - 0x53, 0x53, 0x20, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x20, - 0x42, 0x59, 0x20, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x42, 0x4c, - 0x45, 0x20, 0x4c, 0x41, 0x57, 0x20, 0x4f, 0x52, 0x20, 0x41, 0x47, 0x52, - 0x45, 0x45, 0x44, 0x20, 0x54, 0x4f, 0x20, 0x49, 0x4e, 0x20, 0x57, 0x52, - 0x49, 0x54, 0x49, 0x4e, 0x47, 0x0a, 0x57, 0x49, 0x4c, 0x4c, 0x20, 0x41, - 0x4e, 0x59, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, - 0x20, 0x48, 0x4f, 0x4c, 0x44, 0x45, 0x52, 0x2c, 0x20, 0x4f, 0x52, 0x20, - 0x41, 0x4e, 0x59, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x50, 0x41, - 0x52, 0x54, 0x59, 0x20, 0x57, 0x48, 0x4f, 0x20, 0x4d, 0x4f, 0x44, 0x49, - 0x46, 0x49, 0x45, 0x53, 0x20, 0x41, 0x4e, 0x44, 0x2f, 0x4f, 0x52, 0x20, - 0x43, 0x4f, 0x4e, 0x56, 0x45, 0x59, 0x53, 0x0a, 0x54, 0x48, 0x45, 0x20, - 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x20, 0x41, 0x53, 0x20, 0x50, - 0x45, 0x52, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x20, 0x41, 0x42, 0x4f, - 0x56, 0x45, 0x2c, 0x20, 0x42, 0x45, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x4c, - 0x45, 0x20, 0x54, 0x4f, 0x20, 0x59, 0x4f, 0x55, 0x20, 0x46, 0x4f, 0x52, - 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, 0x2c, 0x20, 0x49, 0x4e, - 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x41, 0x4e, 0x59, 0x0a, - 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x2c, 0x20, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x41, 0x4c, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x49, 0x44, 0x45, - 0x4e, 0x54, 0x41, 0x4c, 0x20, 0x4f, 0x52, 0x20, 0x43, 0x4f, 0x4e, 0x53, - 0x45, 0x51, 0x55, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x20, 0x44, 0x41, - 0x4d, 0x41, 0x47, 0x45, 0x53, 0x20, 0x41, 0x52, 0x49, 0x53, 0x49, 0x4e, - 0x47, 0x20, 0x4f, 0x55, 0x54, 0x20, 0x4f, 0x46, 0x20, 0x54, 0x48, 0x45, - 0x0a, 0x55, 0x53, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4e, 0x41, 0x42, - 0x49, 0x4c, 0x49, 0x54, 0x59, 0x20, 0x54, 0x4f, 0x20, 0x55, 0x53, 0x45, - 0x20, 0x54, 0x48, 0x45, 0x20, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, - 0x20, 0x28, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x20, - 0x42, 0x55, 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x4c, 0x49, 0x4d, 0x49, - 0x54, 0x45, 0x44, 0x20, 0x54, 0x4f, 0x20, 0x4c, 0x4f, 0x53, 0x53, 0x20, - 0x4f, 0x46, 0x0a, 0x44, 0x41, 0x54, 0x41, 0x20, 0x4f, 0x52, 0x20, 0x44, - 0x41, 0x54, 0x41, 0x20, 0x42, 0x45, 0x49, 0x4e, 0x47, 0x20, 0x52, 0x45, - 0x4e, 0x44, 0x45, 0x52, 0x45, 0x44, 0x20, 0x49, 0x4e, 0x41, 0x43, 0x43, - 0x55, 0x52, 0x41, 0x54, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x4c, 0x4f, 0x53, - 0x53, 0x45, 0x53, 0x20, 0x53, 0x55, 0x53, 0x54, 0x41, 0x49, 0x4e, 0x45, - 0x44, 0x20, 0x42, 0x59, 0x20, 0x59, 0x4f, 0x55, 0x20, 0x4f, 0x52, 0x20, - 0x54, 0x48, 0x49, 0x52, 0x44, 0x0a, 0x50, 0x41, 0x52, 0x54, 0x49, 0x45, - 0x53, 0x20, 0x4f, 0x52, 0x20, 0x41, 0x20, 0x46, 0x41, 0x49, 0x4c, 0x55, - 0x52, 0x45, 0x20, 0x4f, 0x46, 0x20, 0x54, 0x48, 0x45, 0x20, 0x50, 0x52, - 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x20, 0x54, 0x4f, 0x20, 0x4f, 0x50, 0x45, - 0x52, 0x41, 0x54, 0x45, 0x20, 0x57, 0x49, 0x54, 0x48, 0x20, 0x41, 0x4e, - 0x59, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x50, 0x52, 0x4f, 0x47, - 0x52, 0x41, 0x4d, 0x53, 0x29, 0x2c, 0x0a, 0x45, 0x56, 0x45, 0x4e, 0x20, - 0x49, 0x46, 0x20, 0x53, 0x55, 0x43, 0x48, 0x20, 0x48, 0x4f, 0x4c, 0x44, - 0x45, 0x52, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, - 0x50, 0x41, 0x52, 0x54, 0x59, 0x20, 0x48, 0x41, 0x53, 0x20, 0x42, 0x45, - 0x45, 0x4e, 0x20, 0x41, 0x44, 0x56, 0x49, 0x53, 0x45, 0x44, 0x20, 0x4f, - 0x46, 0x20, 0x54, 0x48, 0x45, 0x20, 0x50, 0x4f, 0x53, 0x53, 0x49, 0x42, - 0x49, 0x4c, 0x49, 0x54, 0x59, 0x20, 0x4f, 0x46, 0x0a, 0x53, 0x55, 0x43, - 0x48, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, 0x2e, 0x0a, 0x0a, - 0x20, 0x20, 0x31, 0x37, 0x2e, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, - 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, - 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x31, 0x35, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x31, 0x36, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x49, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6c, 0x61, - 0x69, 0x6d, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x61, 0x72, 0x72, - 0x61, 0x6e, 0x74, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6c, - 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x64, 0x0a, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, - 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x67, 0x69, - 0x76, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, - 0x67, 0x61, 0x6c, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x20, 0x61, - 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, - 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x2c, - 0x0a, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, - 0x6f, 0x75, 0x72, 0x74, 0x73, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, - 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, - 0x6c, 0x61, 0x77, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x73, - 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x6c, 0x79, 0x20, 0x61, 0x70, - 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x0a, 0x61, - 0x6e, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x20, 0x77, - 0x61, 0x69, 0x76, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, - 0x20, 0x63, 0x69, 0x76, 0x69, 0x6c, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x74, 0x68, 0x65, 0x0a, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2c, - 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x61, 0x20, 0x77, 0x61, - 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, - 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, - 0x6c, 0x69, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x61, 0x63, - 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, 0x65, 0x73, 0x20, 0x61, 0x0a, - 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, - 0x66, 0x65, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x45, 0x4e, 0x44, 0x20, 0x4f, 0x46, 0x20, 0x54, 0x45, - 0x52, 0x4d, 0x53, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x43, 0x4f, 0x4e, 0x44, - 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x6f, 0x77, 0x20, - 0x74, 0x6f, 0x20, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x54, 0x68, 0x65, - 0x73, 0x65, 0x20, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x74, 0x6f, 0x20, - 0x59, 0x6f, 0x75, 0x72, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x73, 0x0a, 0x0a, 0x20, 0x20, 0x49, 0x66, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x20, - 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, - 0x61, 0x6e, 0x74, 0x20, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x73, 0x74, 0x0a, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, - 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2c, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x77, 0x61, 0x79, 0x20, 0x74, 0x6f, - 0x20, 0x61, 0x63, 0x68, 0x69, 0x65, 0x76, 0x65, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6b, 0x65, - 0x20, 0x69, 0x74, 0x0a, 0x66, 0x72, 0x65, 0x65, 0x20, 0x73, 0x6f, 0x66, - 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x65, 0x76, 0x65, 0x72, 0x79, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x61, 0x6e, - 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, - 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x54, - 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x73, 0x6f, 0x2c, 0x20, 0x61, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, - 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, - 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x2e, 0x20, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, - 0x20, 0x73, 0x61, 0x66, 0x65, 0x73, 0x74, 0x0a, 0x74, 0x6f, 0x20, 0x61, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6d, - 0x6f, 0x73, 0x74, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x6c, 0x79, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x20, - 0x6f, 0x66, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x3b, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x69, - 0x6c, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, - 0x76, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x0a, - 0x74, 0x68, 0x65, 0x20, 0x22, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x22, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x61, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x74, - 0x6f, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, - 0x69, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x0a, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x3c, 0x6f, 0x6e, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, - 0x20, 0x74, 0x6f, 0x20, 0x67, 0x69, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x27, 0x73, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x62, 0x72, - 0x69, 0x65, 0x66, 0x20, 0x69, 0x64, 0x65, 0x61, 0x20, 0x6f, 0x66, 0x20, - 0x77, 0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, - 0x2e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, - 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x3c, 0x79, 0x65, - 0x61, 0x72, 0x3e, 0x20, 0x20, 0x3c, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, - 0x66, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x3e, 0x0a, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x20, 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x3a, 0x20, 0x79, 0x6f, - 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, 0x74, 0x20, 0x61, 0x6e, - 0x64, 0x2f, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x74, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, - 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x46, - 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x65, - 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x20, 0x33, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x79, 0x20, - 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, - 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x73, 0x20, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x70, 0x65, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, - 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x2c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x74, 0x20, 0x57, 0x49, 0x54, 0x48, - 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x57, 0x41, 0x52, 0x52, - 0x41, 0x4e, 0x54, 0x59, 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, - 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, - 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, - 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4d, - 0x45, 0x52, 0x43, 0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, - 0x54, 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x49, 0x54, 0x4e, 0x45, 0x53, - 0x53, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, - 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, 0x52, 0x50, 0x4f, - 0x53, 0x45, 0x2e, 0x20, 0x20, 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x73, - 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, 0x20, 0x63, 0x6f, - 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, - 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x20, 0x3c, 0x68, 0x74, 0x74, 0x70, - 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6e, 0x75, 0x2e, 0x6f, - 0x72, 0x67, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x2f, - 0x3e, 0x2e, 0x0a, 0x0a, 0x41, 0x6c, 0x73, 0x6f, 0x20, 0x61, 0x64, 0x64, - 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6f, 0x6e, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x6f, 0x20, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x62, - 0x79, 0x20, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x63, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x70, 0x65, 0x72, 0x20, 0x6d, - 0x61, 0x69, 0x6c, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x49, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x64, - 0x6f, 0x65, 0x73, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, - 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x69, 0x74, 0x20, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x20, 0x61, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x0a, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, - 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, - 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x0a, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x3c, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x3e, 0x20, - 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, - 0x43, 0x29, 0x20, 0x3c, 0x79, 0x65, 0x61, 0x72, 0x3e, 0x20, 0x20, 0x3c, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, - 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63, 0x6f, 0x6d, - 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x41, 0x42, 0x53, 0x4f, - 0x4c, 0x55, 0x54, 0x45, 0x4c, 0x59, 0x20, 0x4e, 0x4f, 0x20, 0x57, 0x41, - 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x74, 0x79, 0x70, 0x65, - 0x20, 0x60, 0x73, 0x68, 0x6f, 0x77, 0x20, 0x77, 0x27, 0x2e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x66, - 0x72, 0x65, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x61, 0x72, - 0x65, 0x20, 0x77, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x6f, - 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x65, 0x20, 0x69, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x64, - 0x65, 0x72, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x20, 0x60, 0x73, 0x68, 0x6f, 0x77, 0x20, 0x63, 0x27, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x68, 0x79, 0x70, 0x6f, 0x74, - 0x68, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x20, 0x60, 0x73, 0x68, 0x6f, 0x77, 0x20, 0x77, - 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x73, 0x68, 0x6f, 0x77, 0x20, - 0x63, 0x27, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x73, 0x68, - 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, - 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x73, - 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x20, 0x20, 0x4f, 0x66, 0x20, - 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x72, - 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x27, 0x73, 0x20, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x0a, 0x6d, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x74, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x47, 0x55, - 0x49, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2c, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x75, - 0x73, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x22, 0x61, 0x62, 0x6f, 0x75, 0x74, - 0x20, 0x62, 0x6f, 0x78, 0x22, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x59, 0x6f, - 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x61, 0x6c, 0x73, - 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x65, - 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x72, 0x20, 0x28, 0x69, 0x66, 0x20, - 0x79, 0x6f, 0x75, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x61, 0x73, 0x20, - 0x61, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x65, 0x72, - 0x29, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x2c, - 0x0a, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x2c, 0x20, 0x74, 0x6f, 0x20, - 0x73, 0x69, 0x67, 0x6e, 0x20, 0x61, 0x20, 0x22, 0x63, 0x6f, 0x70, 0x79, - 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6c, 0x61, - 0x69, 0x6d, 0x65, 0x72, 0x22, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x2c, 0x20, 0x69, - 0x66, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x2e, - 0x0a, 0x46, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68, - 0x6f, 0x77, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x50, 0x4c, 0x2c, 0x20, - 0x73, 0x65, 0x65, 0x0a, 0x3c, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, - 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6e, 0x75, 0x2e, 0x6f, 0x72, 0x67, 0x2f, - 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x2f, 0x3e, 0x2e, 0x0a, - 0x0a, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, - 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, - 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x0a, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x70, 0x72, - 0x6f, 0x70, 0x72, 0x69, 0x65, 0x74, 0x61, 0x72, 0x79, 0x20, 0x70, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, - 0x79, 0x6f, 0x75, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, 0x72, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, - 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x0a, 0x6d, 0x61, 0x79, 0x20, 0x63, 0x6f, - 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x74, 0x20, 0x6d, 0x6f, - 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x74, 0x6f, - 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, - 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x65, 0x74, - 0x61, 0x72, 0x79, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x0a, 0x74, 0x68, - 0x65, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2e, 0x20, 0x20, - 0x49, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x77, - 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, - 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x4c, 0x65, 0x73, 0x73, - 0x65, 0x72, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x0a, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x2e, 0x20, 0x20, 0x42, 0x75, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, - 0x74, 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x72, 0x65, - 0x61, 0x64, 0x0a, 0x3c, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, - 0x77, 0x77, 0x2e, 0x67, 0x6e, 0x75, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, - 0x68, 0x69, 0x6c, 0x6f, 0x73, 0x6f, 0x70, 0x68, 0x79, 0x2f, 0x77, 0x68, - 0x79, 0x2d, 0x6e, 0x6f, 0x74, 0x2d, 0x6c, 0x67, 0x70, 0x6c, 0x2e, 0x68, - 0x74, 0x6d, 0x6c, 0x3e, 0x2e, 0x0a, 0x0a, 0x3d, 0x3d, 0x3d, 0x20, 0x52, - 0x61, 0x73, 0x70, 0x69, 0x63, 0x61, 0x6d, 0x20, 0x3d, 0x3d, 0x3d, 0x0a, - 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, - 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x41, - 0x56, 0x41, 0x20, 0x28, 0x20, 0x41, 0x76, 0x61, 0x20, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, - 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x2c, 0x20, 0x61, 0x76, 0x61, - 0x20, 0x20, 0x61, 0x74, 0x20, 0x75, 0x63, 0x6f, 0x20, 0x64, 0x6f, 0x74, - 0x20, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x4d, 0x61, 0x69, 0x6e, 0x20, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x52, 0x61, 0x66, 0x61, 0x65, 0x6c, - 0x20, 0x4d, 0x75, 0x6e, 0x6f, 0x7a, 0x20, 0x53, 0x61, 0x6c, 0x69, 0x6e, - 0x61, 0x73, 0x20, 0x28, 0x72, 0x6d, 0x73, 0x61, 0x6c, 0x69, 0x6e, 0x61, - 0x73, 0x20, 0x61, 0x74, 0x20, 0x75, 0x63, 0x6f, 0x20, 0x64, 0x6f, 0x74, - 0x20, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, - 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x72, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, - 0x72, 0x20, 0x42, 0x53, 0x44, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x20, 0x61, 0x73, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x64, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x0a, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2c, - 0x20, 0x41, 0x56, 0x41, 0x20, 0x28, 0x20, 0x41, 0x76, 0x61, 0x20, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f, 0x72, 0x64, 0x6f, - 0x62, 0x61, 0x2c, 0x20, 0x61, 0x76, 0x61, 0x20, 0x20, 0x61, 0x74, 0x20, - 0x75, 0x63, 0x6f, 0x20, 0x64, 0x6f, 0x74, 0x20, 0x65, 0x73, 0x29, 0x0a, - 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x52, 0x65, - 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x20, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, - 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x2c, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x6f, 0x75, 0x74, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, - 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, - 0x61, 0x72, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x3a, 0x0a, 0x31, 0x2e, 0x20, - 0x52, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, - 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, - 0x62, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, - 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, - 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x69, 0x73, 0x63, - 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x0a, 0x32, 0x2e, 0x20, 0x52, - 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, - 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x72, - 0x65, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, - 0x69, 0x67, 0x68, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x74, 0x69, - 0x63, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x73, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x69, - 0x73, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, - 0x2f, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6d, 0x61, - 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x0a, 0x33, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x61, - 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6d, - 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x6d, 0x65, 0x6e, - 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x65, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x6d, 0x75, 0x73, 0x74, - 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x61, - 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x3a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, - 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, - 0x72, 0x65, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x64, - 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x76, 0x61, 0x20, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, 0x20, - 0x6f, 0x66, 0x20, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x2e, 0x0a, - 0x0a, 0x34, 0x2e, 0x20, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x74, 0x79, 0x20, 0x6e, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x73, 0x20, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x73, - 0x0a, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, - 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x64, 0x6f, 0x72, - 0x73, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, - 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x20, 0x64, - 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, - 0x65, 0x0a, 0x20, 0x20, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, - 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x70, 0x72, - 0x69, 0x6f, 0x72, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, - 0x0a, 0x54, 0x48, 0x49, 0x53, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, - 0x52, 0x45, 0x20, 0x49, 0x53, 0x20, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, - 0x45, 0x44, 0x20, 0x42, 0x59, 0x20, 0x41, 0x56, 0x41, 0x20, 0x27, 0x27, - 0x41, 0x53, 0x20, 0x49, 0x53, 0x27, 0x27, 0x20, 0x41, 0x4e, 0x44, 0x20, - 0x41, 0x4e, 0x59, 0x0a, 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, 0x53, 0x20, - 0x4f, 0x52, 0x20, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x20, 0x57, - 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x49, 0x45, 0x53, 0x2c, 0x20, 0x49, - 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x2c, 0x20, 0x42, 0x55, - 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, - 0x44, 0x20, 0x54, 0x4f, 0x2c, 0x20, 0x54, 0x48, 0x45, 0x20, 0x49, 0x4d, - 0x50, 0x4c, 0x49, 0x45, 0x44, 0x0a, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, - 0x54, 0x49, 0x45, 0x53, 0x20, 0x4f, 0x46, 0x20, 0x4d, 0x45, 0x52, 0x43, - 0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x20, - 0x41, 0x4e, 0x44, 0x20, 0x46, 0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, 0x20, - 0x46, 0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, - 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, - 0x20, 0x41, 0x52, 0x45, 0x0a, 0x44, 0x49, 0x53, 0x43, 0x4c, 0x41, 0x49, - 0x4d, 0x45, 0x44, 0x2e, 0x20, 0x49, 0x4e, 0x20, 0x4e, 0x4f, 0x20, 0x45, - 0x56, 0x45, 0x4e, 0x54, 0x20, 0x53, 0x48, 0x41, 0x4c, 0x4c, 0x20, 0x41, - 0x56, 0x41, 0x20, 0x42, 0x45, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x4c, 0x45, - 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x4e, 0x59, 0x0a, 0x44, 0x49, 0x52, - 0x45, 0x43, 0x54, 0x2c, 0x20, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, - 0x54, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x41, - 0x4c, 0x2c, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x2c, 0x20, - 0x45, 0x58, 0x45, 0x4d, 0x50, 0x4c, 0x41, 0x52, 0x59, 0x2c, 0x20, 0x4f, - 0x52, 0x20, 0x43, 0x4f, 0x4e, 0x53, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x54, - 0x49, 0x41, 0x4c, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, 0x0a, - 0x28, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x2c, 0x20, - 0x42, 0x55, 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x4c, 0x49, 0x4d, 0x49, - 0x54, 0x45, 0x44, 0x20, 0x54, 0x4f, 0x2c, 0x20, 0x50, 0x52, 0x4f, 0x43, - 0x55, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x4f, 0x46, 0x20, 0x53, - 0x55, 0x42, 0x53, 0x54, 0x49, 0x54, 0x55, 0x54, 0x45, 0x20, 0x47, 0x4f, - 0x4f, 0x44, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x53, 0x3b, 0x0a, 0x4c, 0x4f, 0x53, 0x53, 0x20, 0x4f, 0x46, - 0x20, 0x55, 0x53, 0x45, 0x2c, 0x20, 0x44, 0x41, 0x54, 0x41, 0x2c, 0x20, - 0x4f, 0x52, 0x20, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x54, 0x53, 0x3b, 0x20, - 0x4f, 0x52, 0x20, 0x42, 0x55, 0x53, 0x49, 0x4e, 0x45, 0x53, 0x53, 0x20, - 0x49, 0x4e, 0x54, 0x45, 0x52, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, - 0x29, 0x20, 0x48, 0x4f, 0x57, 0x45, 0x56, 0x45, 0x52, 0x20, 0x43, 0x41, - 0x55, 0x53, 0x45, 0x44, 0x20, 0x41, 0x4e, 0x44, 0x0a, 0x4f, 0x4e, 0x20, - 0x41, 0x4e, 0x59, 0x20, 0x54, 0x48, 0x45, 0x4f, 0x52, 0x59, 0x20, 0x4f, - 0x46, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, - 0x20, 0x57, 0x48, 0x45, 0x54, 0x48, 0x45, 0x52, 0x20, 0x49, 0x4e, 0x20, - 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x2c, 0x20, 0x53, 0x54, - 0x52, 0x49, 0x43, 0x54, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, - 0x54, 0x59, 0x2c, 0x20, 0x4f, 0x52, 0x20, 0x54, 0x4f, 0x52, 0x54, 0x0a, - 0x28, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x4e, - 0x45, 0x47, 0x4c, 0x49, 0x47, 0x45, 0x4e, 0x43, 0x45, 0x20, 0x4f, 0x52, - 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x57, 0x49, 0x53, 0x45, 0x29, 0x20, - 0x41, 0x52, 0x49, 0x53, 0x49, 0x4e, 0x47, 0x20, 0x49, 0x4e, 0x20, 0x41, - 0x4e, 0x59, 0x20, 0x57, 0x41, 0x59, 0x20, 0x4f, 0x55, 0x54, 0x20, 0x4f, - 0x46, 0x20, 0x54, 0x48, 0x45, 0x20, 0x55, 0x53, 0x45, 0x20, 0x4f, 0x46, - 0x20, 0x54, 0x48, 0x49, 0x53, 0x0a, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, - 0x52, 0x45, 0x2c, 0x20, 0x45, 0x56, 0x45, 0x4e, 0x20, 0x49, 0x46, 0x20, - 0x41, 0x44, 0x56, 0x49, 0x53, 0x45, 0x44, 0x20, 0x4f, 0x46, 0x20, 0x54, - 0x48, 0x45, 0x20, 0x50, 0x4f, 0x53, 0x53, 0x49, 0x42, 0x49, 0x4c, 0x49, - 0x54, 0x59, 0x20, 0x4f, 0x46, 0x20, 0x53, 0x55, 0x43, 0x48, 0x20, 0x44, - 0x41, 0x4d, 0x41, 0x47, 0x45, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x0a, 0x3d, 0x3d, 0x3d, 0x20, - 0x52, 0x61, 0x70, 0x69, 0x64, 0x20, 0x58, 0x4d, 0x4c, 0x20, 0x3d, 0x3d, - 0x3d, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, - 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x2c, 0x20, 0x32, 0x30, - 0x30, 0x37, 0x20, 0x4d, 0x61, 0x72, 0x63, 0x69, 0x6e, 0x20, 0x4b, 0x61, - 0x6c, 0x69, 0x63, 0x69, 0x6e, 0x73, 0x6b, 0x69, 0x0a, 0x0a, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, - 0x68, 0x65, 0x72, 0x65, 0x62, 0x79, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, - 0x65, 0x64, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x66, 0x20, - 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x61, - 0x6e, 0x79, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x20, 0x6f, 0x62, - 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6f, - 0x70, 0x79, 0x0a, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, - 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, - 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x29, 0x2c, - 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x61, 0x6c, 0x0a, 0x69, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x72, 0x65, 0x73, - 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x6f, 0x75, 0x74, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, - 0x73, 0x0a, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x63, 0x6f, - 0x70, 0x79, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x2c, 0x20, - 0x6d, 0x65, 0x72, 0x67, 0x65, 0x2c, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20, 0x73, - 0x65, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x0a, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, - 0x72, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x74, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, - 0x73, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x6f, 0x6d, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, - 0x73, 0x20, 0x66, 0x75, 0x72, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, - 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x73, 0x6f, 0x2c, 0x0a, 0x73, 0x75, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a, 0x0a, - 0x54, 0x68, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x6f, - 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x69, - 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, - 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, - 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, - 0x62, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x0a, 0x63, 0x6f, 0x70, 0x69, 0x65, - 0x73, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74, 0x61, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, - 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x0a, 0x0a, 0x54, 0x48, 0x45, 0x20, - 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x49, 0x53, 0x20, - 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x44, 0x20, 0x22, 0x41, 0x53, - 0x20, 0x49, 0x53, 0x22, 0x2c, 0x20, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, - 0x54, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, 0x20, 0x4f, - 0x46, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x4b, 0x49, 0x4e, 0x44, 0x2c, 0x20, - 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, 0x53, 0x20, 0x4f, 0x52, 0x0a, 0x49, - 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x4c, - 0x55, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x42, 0x55, 0x54, 0x20, 0x4e, 0x4f, - 0x54, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x20, 0x54, 0x4f, - 0x20, 0x54, 0x48, 0x45, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, - 0x49, 0x45, 0x53, 0x20, 0x4f, 0x46, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, - 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x0a, - 0x46, 0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, 0x20, - 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, - 0x20, 0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, 0x20, 0x41, 0x4e, 0x44, - 0x20, 0x4e, 0x4f, 0x4e, 0x49, 0x4e, 0x46, 0x52, 0x49, 0x4e, 0x47, 0x45, - 0x4d, 0x45, 0x4e, 0x54, 0x2e, 0x20, 0x49, 0x4e, 0x20, 0x4e, 0x4f, 0x20, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x20, 0x53, 0x48, 0x41, 0x4c, 0x4c, 0x0a, - 0x54, 0x48, 0x45, 0x20, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x53, 0x20, - 0x4f, 0x52, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, - 0x20, 0x48, 0x4f, 0x4c, 0x44, 0x45, 0x52, 0x53, 0x20, 0x42, 0x45, 0x20, - 0x4c, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, - 0x4e, 0x59, 0x20, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x2c, 0x20, 0x44, 0x41, - 0x4d, 0x41, 0x47, 0x45, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, - 0x45, 0x52, 0x0a, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, - 0x2c, 0x20, 0x57, 0x48, 0x45, 0x54, 0x48, 0x45, 0x52, 0x20, 0x49, 0x4e, - 0x20, 0x41, 0x4e, 0x20, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x4f, - 0x46, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x2c, 0x20, - 0x54, 0x4f, 0x52, 0x54, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, - 0x52, 0x57, 0x49, 0x53, 0x45, 0x2c, 0x20, 0x41, 0x52, 0x49, 0x53, 0x49, - 0x4e, 0x47, 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x2c, 0x0a, 0x4f, 0x55, 0x54, - 0x20, 0x4f, 0x46, 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4e, 0x20, 0x43, 0x4f, - 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x57, 0x49, 0x54, - 0x48, 0x20, 0x54, 0x48, 0x45, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, - 0x52, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x54, 0x48, 0x45, 0x20, 0x55, 0x53, - 0x45, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x44, - 0x45, 0x41, 0x4c, 0x49, 0x4e, 0x47, 0x53, 0x0a, 0x49, 0x4e, 0x20, 0x54, - 0x48, 0x45, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x2e, - 0x0a, 0x0a, 0x0a, 0x3d, 0x3d, 0x3d, 0x20, 0x6a, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x20, 0x3d, 0x3d, 0x3d, 0x0a, 0x6a, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x20, 0x4a, 0x61, 0x76, 0x61, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, - 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x20, 0x76, 0x31, 0x2e, 0x36, - 0x2e, 0x32, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6a, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x0a, 0x0a, 0x43, - 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x32, 0x30, 0x31, - 0x31, 0x2c, 0x20, 0x4a, 0x6f, 0x68, 0x6e, 0x20, 0x52, 0x65, 0x73, 0x69, - 0x67, 0x0a, 0x44, 0x75, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x4d, 0x49, 0x54, 0x20, 0x6f, 0x72, 0x20, 0x47, 0x50, 0x4c, - 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x20, 0x6c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x2e, 0x0a, 0x68, 0x74, 0x74, - 0x70, 0x3a, 0x2f, 0x2f, 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x6f, - 0x72, 0x67, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, 0x0a, - 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x53, 0x69, 0x7a, - 0x7a, 0x6c, 0x65, 0x2e, 0x6a, 0x73, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x3a, - 0x2f, 0x2f, 0x73, 0x69, 0x7a, 0x7a, 0x6c, 0x65, 0x6a, 0x73, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x32, 0x30, 0x31, 0x31, 0x2c, 0x20, 0x54, 0x68, 0x65, 0x20, - 0x44, 0x6f, 0x6a, 0x6f, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x0a, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, - 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, - 0x49, 0x54, 0x2c, 0x20, 0x42, 0x53, 0x44, 0x2c, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x47, 0x50, 0x4c, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x73, 0x2e, 0x0a, 0x0a, 0x3d, 0x3d, 0x3d, 0x20, 0x54, 0x68, 0x72, 0x65, - 0x65, 0x2e, 0x6a, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x0a, 0x54, 0x68, 0x65, - 0x20, 0x4d, 0x49, 0x54, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, - 0xc2, 0xa9, 0x20, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x32, 0x30, 0x31, 0x35, - 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x2e, 0x6a, 0x73, 0x20, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x73, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x68, 0x65, 0x72, - 0x65, 0x62, 0x79, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x2c, - 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, - 0x72, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x20, - 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x74, 0x61, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x0a, - 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x73, 0x73, - 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, 0x22, 0x53, 0x6f, - 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x6f, - 0x20, 0x64, 0x65, 0x61, 0x6c, 0x0a, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, - 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x0a, 0x74, - 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2c, - 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x2c, 0x20, 0x6d, 0x65, 0x72, - 0x67, 0x65, 0x2c, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2c, - 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, - 0x20, 0x73, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, - 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x6c, - 0x0a, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2c, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x6d, - 0x69, 0x74, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x20, 0x74, - 0x6f, 0x20, 0x77, 0x68, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, - 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x0a, 0x66, - 0x75, 0x72, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x64, 0x6f, 0x20, 0x73, 0x6f, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, - 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a, 0x0a, 0x54, 0x68, 0x65, - 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, - 0x69, 0x67, 0x68, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x69, - 0x63, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x0a, - 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, - 0x72, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, - 0x72, 0x65, 0x2e, 0x0a, 0x0a, 0x54, 0x48, 0x45, 0x20, 0x53, 0x4f, 0x46, - 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x49, 0x53, 0x20, 0x50, 0x52, 0x4f, - 0x56, 0x49, 0x44, 0x45, 0x44, 0x20, 0x22, 0x41, 0x53, 0x20, 0x49, 0x53, - 0x22, 0x2c, 0x20, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x20, 0x57, - 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, 0x20, 0x4f, 0x46, 0x20, 0x41, - 0x4e, 0x59, 0x20, 0x4b, 0x49, 0x4e, 0x44, 0x2c, 0x20, 0x45, 0x58, 0x50, - 0x52, 0x45, 0x53, 0x53, 0x20, 0x4f, 0x52, 0x0a, 0x49, 0x4d, 0x50, 0x4c, - 0x49, 0x45, 0x44, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, - 0x4e, 0x47, 0x20, 0x42, 0x55, 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x4c, - 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x20, 0x54, 0x4f, 0x20, 0x54, 0x48, - 0x45, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x49, 0x45, 0x53, - 0x20, 0x4f, 0x46, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, 0x4e, 0x54, - 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x0a, 0x46, 0x49, 0x54, - 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, - 0x41, 0x52, 0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, - 0x52, 0x50, 0x4f, 0x53, 0x45, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x4e, 0x4f, - 0x4e, 0x49, 0x4e, 0x46, 0x52, 0x49, 0x4e, 0x47, 0x45, 0x4d, 0x45, 0x4e, - 0x54, 0x2e, 0x20, 0x49, 0x4e, 0x20, 0x4e, 0x4f, 0x20, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x20, 0x53, 0x48, 0x41, 0x4c, 0x4c, 0x20, 0x54, 0x48, 0x45, - 0x0a, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x53, 0x20, 0x4f, 0x52, 0x20, - 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x20, 0x48, 0x4f, - 0x4c, 0x44, 0x45, 0x52, 0x53, 0x20, 0x42, 0x45, 0x20, 0x4c, 0x49, 0x41, - 0x42, 0x4c, 0x45, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x4e, 0x59, 0x20, - 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x2c, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, - 0x45, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x0a, - 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x20, 0x57, - 0x48, 0x45, 0x54, 0x48, 0x45, 0x52, 0x20, 0x49, 0x4e, 0x20, 0x41, 0x4e, - 0x20, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x4f, 0x46, 0x20, 0x43, - 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x2c, 0x20, 0x54, 0x4f, 0x52, - 0x54, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x57, 0x49, - 0x53, 0x45, 0x2c, 0x20, 0x41, 0x52, 0x49, 0x53, 0x49, 0x4e, 0x47, 0x20, - 0x46, 0x52, 0x4f, 0x4d, 0x2c, 0x0a, 0x4f, 0x55, 0x54, 0x20, 0x4f, 0x46, - 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4e, 0x20, 0x43, 0x4f, 0x4e, 0x4e, 0x45, - 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x57, 0x49, 0x54, 0x48, 0x20, 0x54, - 0x48, 0x45, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, - 0x4f, 0x52, 0x20, 0x54, 0x48, 0x45, 0x20, 0x55, 0x53, 0x45, 0x20, 0x4f, - 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x44, 0x45, 0x41, 0x4c, - 0x49, 0x4e, 0x47, 0x53, 0x20, 0x49, 0x4e, 0x0a, 0x54, 0x48, 0x45, 0x20, - 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x2e, 0x0a, 0x0a, 0x20, - 0x0a, 0x0a -}; -unsigned int licenses_txt_len = 39710; diff --git a/src/Calibrator.cpp b/src/Calibrator.cpp index d9b4227..9c8d991 100644 --- a/src/Calibrator.cpp +++ b/src/Calibrator.cpp @@ -85,7 +85,7 @@ bool Calibrator::detectLaserX(real * laserX, PixelLocation& topLocation, PixelLo bool detected = false; ImageProcessor imageProcessor; int firstRowLaserCol = 0; - real percentPixelsOverThreshold = 0; + int numBad1, numBad2; int numLocations = 0; int maxNumLocations = camera->getImageHeight(); PixelLocation * laserLocations = new PixelLocation[maxNumLocations]; @@ -98,7 +98,8 @@ bool Calibrator::detectLaserX(real * laserX, PixelLocation& topLocation, PixelLo laserLocations, maxNumLocations, firstRowLaserCol, - percentPixelsOverThreshold, + numBad1, + numBad2, NULL); // diff --git a/src/Camera.cpp b/src/Camera.cpp index fcc616b..1b76d5f 100644 --- a/src/Camera.cpp +++ b/src/Camera.cpp @@ -29,11 +29,15 @@ namespace freelss { +#define VIDEO_CAMERA_TYPE Camera::CT_MMALVIDEO +//#define VIDEO_CAMERA_TYPE Camera::CT_RASPICAM + CriticalSection Camera::m_cs = CriticalSection(); Camera * Camera::m_instance = NULL; -Camera::CameraType Camera::m_cameraType = Camera::CT_RASPICAM; +Camera::CameraType Camera::m_cameraType = VIDEO_CAMERA_TYPE; int Camera::m_reqImageWidth = 0; int Camera::m_reqImageHeight = 0; +int Camera::m_reqFrameRate = 0; Camera::Camera() { @@ -58,7 +62,7 @@ Camera * Camera::getInstance() } else if (m_cameraType == Camera::CT_RASPICAM) { - std::cout << "Creating video mode camera resolution=" << m_reqImageWidth << "x" << m_reqImageHeight << std::endl; + std::cout << "Creating Raspicam video mode camera resolution=" << m_reqImageWidth << "x" << m_reqImageHeight << std::endl; m_instance = new RaspicamCamera(m_reqImageWidth, m_reqImageHeight); } else if (m_cameraType == Camera::CT_MMALSTILL) @@ -68,7 +72,8 @@ Camera * Camera::getInstance() } else if (m_cameraType == Camera::CT_MMALVIDEO) { - m_instance = new MmalVideoCamera(); + std::cout << "Creating MMAL video mode camera resolution=" << m_reqImageWidth << "x" << m_reqImageHeight << std::endl; + m_instance = new MmalVideoCamera(m_reqImageWidth, m_reqImageHeight, m_reqFrameRate); } else { @@ -109,6 +114,7 @@ void Camera::reinitialize() Camera::CameraType type; int reqImageWidth; int reqImageHeight; + int reqFrameRate; switch (cameraMode) { @@ -116,30 +122,46 @@ void Camera::reinitialize() type = CT_MMALSTILL; reqImageWidth = 2592; reqImageHeight = 1944; + reqFrameRate = 15; break; case CM_VIDEO_5MP: - type = CT_RASPICAM; - reqImageWidth = 2560; - reqImageHeight = 1920; + type = VIDEO_CAMERA_TYPE; + reqImageWidth = 2592; + reqImageHeight = 1944; + reqFrameRate = 15; + //reqImageHeight = 1944; + //reqImageWidth = 2560; + //reqImageHeight = 1920; break; case CM_VIDEO_HD: - type = CT_RASPICAM; + type = VIDEO_CAMERA_TYPE; reqImageWidth = 1600; reqImageHeight = 1200; + reqFrameRate = 30; break; case CM_VIDEO_1P2MP: - type = CT_RASPICAM; + type = VIDEO_CAMERA_TYPE; + //reqImageWidth = 1296; + //reqImageHeight = 972; reqImageWidth = 1280; reqImageHeight = 960; + //reqImageWidth = 1312; + //reqImageHeight = 984; + //reqImageWidth = 1324; + //reqImageHeight = 993; + //reqImageWidth = 1288; + //reqImageHeight = 966; + reqFrameRate = 42; break; case CM_VIDEO_VGA: + type = VIDEO_CAMERA_TYPE; reqImageWidth = 640; reqImageHeight = 480; - type = CT_RASPICAM; + reqFrameRate = 60; break; default: @@ -159,6 +181,7 @@ void Camera::reinitialize() m_cameraType = type; m_reqImageWidth = reqImageWidth; m_reqImageHeight = reqImageHeight; + m_reqFrameRate = reqFrameRate; } } catch (...) diff --git a/src/Camera.h b/src/Camera.h index d4826bc..fbb8da0 100644 --- a/src/Camera.h +++ b/src/Camera.h @@ -96,6 +96,9 @@ class Camera /** The requested image height */ static int m_reqImageHeight; + + /** The requested frame rate */ + static int m_reqFrameRate; }; } diff --git a/src/Facetizer.cpp b/src/Facetizer.cpp new file mode 100644 index 0000000..ccf568b --- /dev/null +++ b/src/Facetizer.cpp @@ -0,0 +1,273 @@ +/* + **************************************************************************** + * Copyright (c) 2014 Uriah Liggett * + * This file is part of FreeLSS. * + * * + * FreeLSS is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * FreeLSS is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with FreeLSS. If not, see . * + **************************************************************************** +*/ + +#include "Main.h" +#include "Facetizer.h" +#include "Camera.h" + +namespace freelss +{ + +static real32 DistanceSquared(const ColoredPoint& a, const ColoredPoint&b) +{ + real32 dx = a.x - b.x; + real32 dy = a.y - b.y; + real32 dz = a.z - b.z; + + return dx * dx + dy * dy + dz * dz; +} + +Facetizer::Facetizer() : + m_maxEdgeDistMmSq(12.4 * 12.2), // TODO: Make this a setting or autodetect it based off the distance to table and the detail level + m_imageWidth(0) +{ + +} + +void Facetizer::facetize(FaceMap & faces, std::vector& results, bool connectLastFrameToFirst, Progress& progress, bool updateVertexNormals) +{ + progress.setPercent(0); + + m_imageWidth = Camera::getInstance()->getImageWidth(); + + + uint32 numTriangles = 0; + + int iStep = 0; + + std::vector firstFrame; + std::vector frameA; + std::vector frameB; + std::vector frameC; + + std::vector * currentFrame = &frameA; + std::vector * lastFrame = &frameB; + + size_t resultIndex = 0; + size_t totNumPoints = 0; + + // Set the index of the data points + for (size_t iPt = 0; iPt < results.size(); iPt++) + { + results[iPt].index = (uint32) iPt; + } + + real percent = 0; + while (DataPoint::readNextFrame(frameC, results, resultIndex)) + { + real newPct = 100.0f * resultIndex / results.size(); + if (newPct - percent > 0.1) + { + progress.setPercent(newPct); + percent = newPct; + } + + * currentFrame = frameC; + totNumPoints += currentFrame->size(); + + // Sort the results in decreasing Y + //std::sort(currentFrame->begin(), currentFrame->end(), SortRecordByYValue); + + if (iStep > 0) + { + addFacesForColumn(* currentFrame, * lastFrame, faces, numTriangles); + } + else if (connectLastFrameToFirst) + { + // Store the first frame for usage later on + firstFrame = frameC; + } + + // Swap to the other buffer to populate it + std::vector * tmpFrame = lastFrame; + lastFrame = currentFrame; + currentFrame = tmpFrame; + + iStep++; + } + + // If this was a full scan close the loop + if (connectLastFrameToFirst && iStep > 0) + { + totNumPoints += firstFrame.size(); + addFacesForColumn(firstFrame, * lastFrame, faces, numTriangles); + } + + std::cout << "Meshed " << (iStep + 1) << " scans with a total of " << totNumPoints << " points." << std::endl; + + std::cout << "Computing vertex normals..." << std::endl; + + const std::vector& triangles = faces.triangles; + + Vector3 normal; + for (size_t idx = 0; idx < triangles.size(); idx += 3) + { + ColoredPoint& pt1 = results[triangles[idx]].point; + ColoredPoint& pt2 = results[triangles[idx + 1]].point; + ColoredPoint& pt3 = results[triangles[idx + 2]].point; + + Vector3 v1 (pt2.x - pt1.x, pt2.y - pt1.y, pt2.z - pt1.z); + Vector3 v2 (pt3.x - pt2.x, pt3.y - pt2.y, pt3.z - pt2.z); + + v1.cross(normal, v2); + normal.normalize(); + + pt1.normal = normal; + pt2.normal = normal; + pt3.normal = normal; + } + + std::cout << "Vertex normals computed." << std::endl; +} + +bool Facetizer::isInwardFacingFace(const DataPoint& p1, const DataPoint& p2, const DataPoint& p3) +{ + int laserSide = p1.laserSide; + bool inwardFacing = false; + float halfImageWidth = m_imageWidth * 0.5f; // If it's past the centerline then it will result in an inward facing triangle + + if (laserSide == (int)Laser::LEFT_LASER) + { + inwardFacing = p1.pixel.x > halfImageWidth || p2.pixel.x > halfImageWidth || p3.pixel.x > halfImageWidth; + } + else if (laserSide == (int)Laser::RIGHT_LASER) + { + inwardFacing = p1.pixel.x < halfImageWidth || p2.pixel.x < halfImageWidth || p3.pixel.x < halfImageWidth; + } + else + { + throw Exception("Unsupported LaserSide in StlWriter::isInwardFacingFace"); + } + + return inwardFacing; +} + + +/* +foreach column + set row to 0 + foreach pt in prev_column + // Fan connect to the row + while cell[row] is within range and cell[row + 1] is within range and closer to this point than the one below + createTriangle(pt, cell[row], cell[row + 1]) + row++ + + // Extend mesh down to start processing the next point + if nextPt is within range + createTriangle(pt, nextPt, cell[row]) + + + */ +void Facetizer::addFacesForColumn(const std::vector& currentFrame, const std::vector& lastFrame, FaceMap& faces, uint32& numTriangles) +{ + size_t iCur = 0; + + for (size_t iLst = 0; iLst + 1 < lastFrame.size(); iLst++) + { + const DataPoint & l1 = lastFrame[iLst]; + const DataPoint & l2 = lastFrame[iLst + 1]; + + // If the current point is in range + while (iCur + 1 < currentFrame.size()) + { + const DataPoint & c1 = currentFrame[iCur]; + const DataPoint & c2 = currentFrame[iCur + 1]; + + // If there is a hole in the model, skip along until there isn't one + if (isValidTriangle(l1.point, c1.point, c2.point)) + { + real32 distSq1 = DistanceSquared(l1.point, c2.point); + real32 distSq2 = DistanceSquared(l2.point, c2.point); + + // While this C point is closer to this L point than the next L point, create a triangle fan with it + // Don't generate triangles bigger than our maximum allowable edge distance + // if (distSq1 < distSq2 && distSq1 <= m_maxEdgeDistMmSq) + if (distSq1 < distSq2) + { + // Determine if we need to flip the normal or not + bool flipNormal = isInwardFacingFace(l1, c1, c2); + addTriangle(l1, c1, c2, flipNormal, faces); + numTriangles++; + } + else + { + // Connect to this triangle + if (isValidTriangle(l2.point, l1.point, c1.point)) + { + bool flipNormal = isInwardFacingFace(l2, l1, c1); + addTriangle(l2, l1, c1, flipNormal, faces); + numTriangles++; + } + else + { + iCur++; + } + + // It's closer to the next L point, so advance to it + break; + } + } + else + { + iCur++; + break; + } + + // Advance to the next row + iCur++; + } + } +} + +bool Facetizer::isValidTriangle(const ColoredPoint& pt1, const ColoredPoint& pt2, const ColoredPoint& pt3) +{ + if (DistanceSquared(pt1, pt2) > m_maxEdgeDistMmSq) + { + return false; + } + else if (DistanceSquared(pt1, pt3) > m_maxEdgeDistMmSq) + { + return false; + } + else if (DistanceSquared(pt2, pt3) > m_maxEdgeDistMmSq) + { + return false; + } + + return true; +} + +void Facetizer::addTriangle(const DataPoint& pt1, const DataPoint& pt2, const DataPoint& pt3, bool flipNormal, FaceMap& faces) +{ + if (!flipNormal) + { + faces.triangles.push_back(pt1.index); + faces.triangles.push_back(pt2.index); + faces.triangles.push_back(pt3.index); + } + else + { + faces.triangles.push_back(pt3.index); + faces.triangles.push_back(pt2.index); + faces.triangles.push_back(pt1.index); + } +} + +} diff --git a/src/NeutralFileWriter.h b/src/Facetizer.h similarity index 56% rename from src/NeutralFileWriter.h rename to src/Facetizer.h index 7321682..1ebade7 100644 --- a/src/NeutralFileWriter.h +++ b/src/Facetizer.h @@ -20,32 +20,35 @@ #pragma once +#include "Laser.h" +#include "Progress.h" + namespace freelss { -class NeutralFileWriter +class Facetizer { public: - NeutralFileWriter(); - ~NeutralFileWriter(); - - void beginBatch(); - void commit(); - void open(const std::string& filename); - void close(); - void write(const NeutralFileRecord& record); -private: - - void prepareStatement(); + Facetizer(); - /** The SQL for creating the database */ - static const char * CREATE_DATABASE_SQL; + void facetize(FaceMap & outFaces, std::vector& results, bool connectLastFrameToFirst, Progress& progress, bool updateVertexNormals); - /** The Sqlite database */ - sqlite3 * m_db; - - /** The prepared statement */ - sqlite3_stmt * m_stmt; +private: + /** + * Indicates if the face is oriented point into the model and the normal needs to get flipped. + * This method assumes that the camera is looking straight down -z and x = 0. The y doesn't matter. + * This method assumes that all points were taken from the same laser. + */ + bool isInwardFacingFace(const DataPoint& p1, const DataPoint& p2, const DataPoint& p3); + bool isValidTriangle(const ColoredPoint& pt1, const ColoredPoint& pt2, const ColoredPoint& pt3); + void addFacesForColumn(const std::vector& currentFrame, const std::vector& lastFrame, FaceMap& fout, uint32& numTriangles); + void addTriangle(const DataPoint& pt1, const DataPoint& pt2, const DataPoint& pt3, bool flipNormal, FaceMap& fout); + + /** The max triangle edge distance in mm sq */ + real32 m_maxEdgeDistMmSq; + + /** The image width of the current camera */ + int m_imageWidth; }; } diff --git a/src/HttpServer.cpp b/src/HttpServer.cpp index 5659607..075e6b8 100644 --- a/src/HttpServer.cpp +++ b/src/HttpServer.cpp @@ -917,14 +917,8 @@ static int ProcessPageRequest(RequestInfo * reqInfo) scanner->setTask(Scanner::GENERATE_DEBUG); Preset& preset = PresetManager::get()->getActivePreset(); - Laser::LaserSide laserSide = preset.laserSide; - if (laserSide != Laser::LEFT_LASER && laserSide != Laser::RIGHT_LASER) - { - laserSide = Laser::RIGHT_LASER; - std::cout <<"Defaulting laser side to right laser." << std::endl; - } - scanner->generateDebugInfo(laserSide); + scanner->generateDebugInfo(preset.laserSide); ret = RetrieveFile(reqInfo, "/dbg/5.png"); responded = true; diff --git a/src/ImageProcessor.cpp b/src/ImageProcessor.cpp index d4857a3..7954288 100644 --- a/src/ImageProcessor.cpp +++ b/src/ImageProcessor.cpp @@ -29,6 +29,8 @@ #define PEAK_FILTER 0 #define INV_SQRT_2PI 0.3989422804014327 +#define MAX_NUM_LASER_RANGES 3 // TODO: Place this in the settings + #if GUASS_FILTER #include #endif @@ -115,7 +117,7 @@ ImageProcessor::~ImageProcessor() } int ImageProcessor::process(const Image& before, const Image& after, Image * debuggingImage, PixelLocation * laserLocations, - int maxNumLocations, int& firstRowLaserCol, real & percentPixelsOverThreshold, const char * debuggingCsvFile) + int maxNumLocations, int& firstRowLaserCol, int& numRowsBadFromColor, int& numRowsBadFromNumRanges, const char * debuggingCsvFile) { const real MAX_MAGNITUDE_SQ = 255 * 255 * 3; // The maximum pixel magnitude sq we can see const real INV_MAX_MAGNITUDE_SQ = 1.0f / MAX_MAGNITUDE_SQ; @@ -143,9 +145,7 @@ int ImageProcessor::process(const Image& before, const Image& after, Image * deb unsigned rowStep = width * components; int numLocations = 0; - int numMerged = 0; - int numPixelsOverThreshold = 0; // The location that we last detected a laser line int prevLaserCol = firstRowLaserCol; @@ -165,17 +165,14 @@ int ImageProcessor::process(const Image& before, const Image& after, Image * deb for (unsigned iCol = 0; iCol < rowStep; iCol += components) { // Perform image subtraction -#if 0 // Only consider the red channel - const int r = (int)br[iCol + 0] - (int)ar[iCol + 0]; - const int magSq = r * r; - real mag = 255.0f * (magSq * 0.000015379f); -#else // Use general magnitude + + // Use general magnitude const int r = (int)br[iCol + 0] - (int)ar[iCol + 0]; const int g = (int)br[iCol + 1] - (int)ar[iCol + 1]; const int b = (int)br[iCol + 2] - (int)ar[iCol + 2]; const int magSq = r * r + g * g + b * b; real mag = 255.0f * (magSq * INV_MAX_MAGNITUDE_SQ); -#endif + if (writeDebugImage) { if (mag > m_laserMagnitudeThreshold) @@ -195,9 +192,6 @@ int ImageProcessor::process(const Image& before, const Image& after, Image * deb // Compare it against the threshold if (mag > m_laserMagnitudeThreshold) { - // Flag that this pixel was over the threshold value - numPixelsOverThreshold++; - // The start of pixels with laser in them if (m_laserRanges[numLaserRanges].startCol == -1) { @@ -261,25 +255,41 @@ int ImageProcessor::process(const Image& before, const Image& after, Image * deb rowOut << std::endl; } - // If we have a valid laser region - if (numLaserRanges > 0) + // Removes the ranges that on closer inspection don't appear to be caused by the laser + if (numLaserRanges < MAX_NUM_LASER_RANGES) { - int rangeChoice = detectBestLaserRange(m_laserRanges, numLaserRanges, prevLaserCol); - prevLaserCol = m_laserRanges[rangeChoice].centerCol; + if (numLaserRanges > 0) + { + //numLaserRanges = removeInvalidLaserRanges(m_laserRanges, width, numLaserRanges, br); - real centerCol = detectLaserRangeCenter(m_laserRanges[rangeChoice], ar, br); + // If we have a valid laser region + if (numLaserRanges > 0) + { + int rangeChoice = detectBestLaserRange(m_laserRanges, numLaserRanges, prevLaserCol); + prevLaserCol = m_laserRanges[rangeChoice].centerCol; - laserLocations[numLocations].x = centerCol; - laserLocations[numLocations].y = iRow; + real centerCol = detectLaserRangeCenter(m_laserRanges[rangeChoice], ar, br); - // If this is the first row that a laser is detected in, set the firstRowLaserCol member - if (numLocations == 0) - { - firstRowLaserCol = m_laserRanges[rangeChoice].startCol; - } + laserLocations[numLocations].x = centerCol; + laserLocations[numLocations].y = iRow; - numLocations++; + // If this is the first row that a laser is detected in, set the firstRowLaserCol member + if (numLocations == 0) + { + firstRowLaserCol = m_laserRanges[rangeChoice].startCol; + } + numLocations++; + } + else + { + numRowsBadFromColor++; + } + } + } + else + { + numRowsBadFromNumRanges++; } // Increment to the next row @@ -297,17 +307,114 @@ int ImageProcessor::process(const Image& before, const Image& after, Image * deb std::cout << "Merged " << numMerged << " laser ranges." << std::endl; } + if (numRowsBadFromColor > 0) + { + std::cout << "Dropped " << numRowsBadFromColor << " laser rows because the color wasn't red enough. " << std::endl; + } + + if (numRowsBadFromNumRanges > 0) + { + std::cout << numRowsBadFromNumRanges << " laser rows contained too many ranges. " << std::endl; + } + if (debuggingCsvFile != NULL) { rowOut.close(); } - // Compute the number of pixels over the threshold - percentPixelsOverThreshold = 100.0f * numPixelsOverThreshold / (width * height); - return numLocations; } +int ImageProcessor::removeInvalidLaserRanges(ImageProcessor::LaserRange * ranges, int imageWidth, int numLaserRanges, unsigned char * br) +{ + // Look for a ramp up and ramp down of the red component centered around the laser range to differentiate + // a laser from things moving in the background + const real MIN_RED_VALUE = 255.0f * 0.85f; + + int components = 3; + std::vector goodRanges; // TODO: Check if this is a bottleneck + + for (int iRng = 0; iRng < numLaserRanges; iRng++) + { + const ImageProcessor::LaserRange& range = ranges[iRng]; + int startCol = range.startCol; + int endCol = range.endCol; + int rangeWidth = endCol - startCol + 1; + + /* + int rampWidth = rangeWidth; + + // Determine where to start computing the median of the "pre" portion of the laser line + int preStart = MAX(0, startCol - rampWidth); + int preWidth = MAX(0, startCol - preStart); + + // Determine where to start computing the median of the "post" portion of the laser line + int postStart = MIN(imageWidth, endCol + rampWidth); + int postWidth = rampWidth; + + if (postStart + postWidth >= imageWidth) + { + postWidth = imageWidth - postStart; + } + + real preAvg = computeMeanAverage(br + preStart * components, preWidth, components); + real postAvg = computeMeanAverage(br + postStart * components, postWidth, components); + */ + + real rangeAvg = computeMeanAverage(br + components * startCol, rangeWidth, components); + + + //std::cout << (int)preAvg << " " << (int)rangeAvg << " " << (int)postAvg << std::endl; + + // If there is a ramp up and ramp down then include this range + if (rangeAvg > MIN_RED_VALUE) + { + goodRanges.push_back(range); + } + } + + // Update the ranges + if ((int)goodRanges.size() != numLaserRanges) + { + for (size_t iRng = 0; iRng < goodRanges.size(); iRng++) + { + ranges[iRng] = goodRanges[iRng]; + } + } + + return (int) goodRanges.size(); +} + +real ImageProcessor::computeMeanAverage(unsigned char * br, int numSteps, int stepSize) +{ + real avg = 0; + real invStep = 255.0f / numSteps; + + Hsv hsv; + + // Red is the first component of an RGB triplet so we can use br directly + for (int iStep = 0; iStep < numSteps; iStep++) + { + float r = br[iStep * stepSize]; + float g = br[iStep * stepSize + 1]; + float b = br[iStep * stepSize + 2]; + + toHsv(r, g, b, &hsv); + + // Red wraps HSV colorspace so check both sides + real red = hsv.h <= 180 ? hsv.h : 360 - hsv.h; + + //std::cout << r << "," << g << "," << b << " " << h << " " << red << std::endl; + + // The smaller the value "red" then the closer to the color red it is + + // normalize 0-1 and scale to 0-255 + avg += ((180 - red) / 180) * invStep; + } + + return avg; +} + real ImageProcessor::detectLaserRangeCenter(const ImageProcessor::LaserRange& range, unsigned char * ar, unsigned char * br) { int startCol = range.startCol; @@ -454,43 +561,58 @@ int ImageProcessor::detectBestLaserRange(ImageProcessor::LaserRange * ranges, in return bestRange; } -void ImageProcessor::toHsv(unsigned char r, unsigned char g, unsigned char b, Hsv * hsv) +void ImageProcessor::toHsv(real r, real g, real b, Hsv * hsv) { - // Compute the Value - unsigned char max = MAX3(r, g, b); - hsv->v = static_cast(max); - if (max == 0) + r /= 255; + g /= 255; + b /= 255; + real h; + + real M = MAX3(r,g,b); + real m = MIN3(r,g,b); + real C = M - m; + + if (C == 0) { - hsv->h = 0; - hsv->s = 0; - return; + h = 0; + } + else if (M == r) + { + h = fmodf ((g - b) / C, 6); + } + else if(M == g) + { + h = (b - r) / C + 2; + } + else + { + h = (r - g) / C + 4; } - // Compute saturation - unsigned char min = MIN3(r, g, b); - hsv->s = (max - min) / (real)max; - - float delta = max - min; + h *= 60; - // Compute Hue - if(r == max) + if (h < 0) { - hsv->h = (g - b) / delta; + h += 360; } - else if(g == max) + + real s; + real v = M; + if(v == 0) { - hsv->h = 2 + (b - r) / delta; + s = 0; } else { - hsv->h = 4 + (r - g) / delta; - hsv->h *= 60; - - if(hsv->h < 0 ) - { - hsv->h += 360; - } + s = C / v; } + + s *= 100; + v *= 100; + hsv->h = h; + hsv->s = s; + hsv->v = v; + } } // ns scanner diff --git a/src/ImageProcessor.h b/src/ImageProcessor.h index a667b23..2f5f137 100644 --- a/src/ImageProcessor.h +++ b/src/ImageProcessor.h @@ -42,7 +42,7 @@ class ImageProcessor * @return Returns the number of locations written to @p laserLocations. */ int process(const Image& before, const Image& after, Image * debuggingImage, PixelLocation * laserLocations, int maxNumLocations, - int& firstRowLaserCol, real & percentPixelsOverThreshold, const char * debuggingCsvFile); + int& firstRowLaserCol, int& numRowsBadFromColor, int& numRowsBadFromNumRanges, const char * debuggingCsvFile); private: @@ -54,12 +54,17 @@ class ImageProcessor int centerCol; }; + /** Removes the ranges that on closer inspection don't appear to be caused by the laser */ + int removeInvalidLaserRanges(ImageProcessor::LaserRange * ranges, int imageWidth, int numRanges, unsigned char * laserOnPixels); + int detectBestLaserRange(ImageProcessor::LaserRange * ranges, int numRanges, int prevLaserCol); real detectLaserRangeCenter(const ImageProcessor::LaserRange& range, unsigned char * ar, unsigned char * br); + real computeMeanAverage(unsigned char * br, int numSteps, int stepSize); + /** Converts the RGB color to HSV */ - static void toHsv(unsigned char r, unsigned char g, unsigned char b, Hsv * hsv); + static void toHsv(real r, real g, real b, Hsv * hsv); static const real RED_HUE_LOWER_THRESHOLD; static const real RED_HUE_UPPER_THRESHOLD; static const unsigned RANGE_DISTANCE_THRESHOLD; diff --git a/src/LaserResultsMerger.cpp b/src/LaserResultsMerger.cpp index ac9a0bc..1cda68f 100644 --- a/src/LaserResultsMerger.cpp +++ b/src/LaserResultsMerger.cpp @@ -35,7 +35,7 @@ LaserResultsMerger::LaserResultsMerger() : // Do nothing } -int LaserResultsMerger::getIndex(const NeutralFileRecord& record) +int LaserResultsMerger::getIndex(const DataPoint& record) { real pct1 = record.pseudoFrame / m_numFramesPerRevolution; real pct2 = record.point.y / m_maxPointY; @@ -46,9 +46,9 @@ int LaserResultsMerger::getIndex(const NeutralFileRecord& record) return dim1 * MASK_DIM_2 + dim2; } -void LaserResultsMerger::merge(std::vector & out, - std::vector & leftLaserResults, - std::vector & rightLaserResults, +void LaserResultsMerger::merge(std::vector & out, + std::vector & leftLaserResults, + std::vector & rightLaserResults, int numFramesPerRevolution, int numFramesBetweenLaserPlanes, int maxPointY, @@ -101,7 +101,7 @@ void LaserResultsMerger::merge(std::vector & out, for (size_t iRight = 0; iRight < rightLaserResults.size(); iRight++) { - NeutralFileRecord& right = rightLaserResults[iRight]; + DataPoint& right = rightLaserResults[iRight]; right.pseudoFrame = right.frame; // Make the Right laser black @@ -116,7 +116,7 @@ void LaserResultsMerger::merge(std::vector & out, progress.setPercent(10); for (size_t iLeft = 0; iLeft < leftLaserResults.size(); iLeft++) { - NeutralFileRecord& left = leftLaserResults[iLeft]; + DataPoint& left = leftLaserResults[iLeft]; // Align the frames of the left and right lasers left.pseudoFrame = left.frame + m_numFramesBetweenLaserPlanes; @@ -145,7 +145,7 @@ void LaserResultsMerger::merge(std::vector & out, out = rightLaserResults; for (size_t iRight = 0; iRight < rightLaserResults.size(); iRight++) { - NeutralFileRecord& right = rightLaserResults[iRight]; + DataPoint& right = rightLaserResults[iRight]; mask[getIndex(right)] = 1; } @@ -157,7 +157,7 @@ void LaserResultsMerger::merge(std::vector & out, // for (size_t iLeft = 0; iLeft < leftLaserResults.size(); iLeft++) { - NeutralFileRecord& left = leftLaserResults[iLeft]; + DataPoint& left = leftLaserResults[iLeft]; if (mask[getIndex(left)] == 0) { diff --git a/src/LaserResultsMerger.h b/src/LaserResultsMerger.h index 4211b68..4323036 100644 --- a/src/LaserResultsMerger.h +++ b/src/LaserResultsMerger.h @@ -37,9 +37,9 @@ class LaserResultsMerger public: LaserResultsMerger(); - void merge(std::vector & out, - std::vector & leftLaserResults, - std::vector & rightLaserResults, + void merge(std::vector & out, + std::vector & leftLaserResults, + std::vector & rightLaserResults, int numFramesPerRevolution, int numFramesBetweenLaserPlanes, int maxPointY, @@ -48,7 +48,7 @@ class LaserResultsMerger private: - int getIndex(const NeutralFileRecord& record); + int getIndex(const DataPoint& record); int m_numFramesBetweenLaserPlanes; real m_numFramesPerRevolution; diff --git a/src/Main.cpp b/src/Main.cpp index 0d10e96..a83d0e5 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -32,7 +32,7 @@ #include #include -static bool SortRecordByRow(const freelss::NeutralFileRecord& a, const freelss::NeutralFileRecord& b) +static bool SortRecordByRow(const freelss::DataPoint& a, const freelss::DataPoint& b) { return a.pixel.y < b.pixel.y; } @@ -182,7 +182,7 @@ time_t ScanResult::getScanDate() const return files.front().creationTime; } -bool NeutralFileRecord::readNextFrame(std::vector& out, const std::vector& results, size_t & resultIndex) +bool DataPoint::readNextFrame(std::vector& out, const std::vector& results, size_t & resultIndex) { out.clear(); @@ -201,7 +201,7 @@ bool NeutralFileRecord::readNextFrame(std::vector& out, const return true; } -void NeutralFileRecord::computeAverage(const std::vector& bin, NeutralFileRecord& out) +void DataPoint::computeAverage(const std::vector& bin, DataPoint& out) { out = bin.front(); @@ -219,7 +219,7 @@ void NeutralFileRecord::computeAverage(const std::vector& bin for (size_t iBin = 0; iBin < bin.size(); iBin++) { - const NeutralFileRecord& br = bin[iBin]; + const DataPoint& br = bin[iBin]; rotation += invSize * br.rotation; pixelLocationX += invSize * br.pixel.x; @@ -243,29 +243,34 @@ void NeutralFileRecord::computeAverage(const std::vector& bin out.point.b = ptB; } -void NeutralFileRecord::lowpassFilter(std::vector& output, std::vector& frame, unsigned maxNumRows, unsigned numRowBins) +void DataPoint::lowpassFilter(std::vector& output, std::vector& frame, unsigned maxNumRows, unsigned numRowBins) { - output.clear(); - // Sanity check if (frame.empty()) { return; } + // No binning can occur, so copy + if (numRowBins >= maxNumRows) + { + output.insert(output.end(), frame.begin(), frame.end()); + return; + } + // Sort by image row std::sort(frame.begin(), frame.end(), SortRecordByRow); unsigned binSize = maxNumRows / numRowBins; // Holds the current contents of the bin - std::vector bin; + std::vector bin; unsigned nextBinY = frame.front().pixel.y + binSize; // unsigned bin = frame.front().pixel.y / numRowBins; for (size_t iFr = 0; iFr < frame.size(); iFr++) { - NeutralFileRecord& record = frame[iFr]; + DataPoint& record = frame[iFr]; if (record.pixel.y < nextBinY) { @@ -276,7 +281,7 @@ void NeutralFileRecord::lowpassFilter(std::vector& output, st // Average the bin results and add it to the output if (!bin.empty()) { - NeutralFileRecord out; + DataPoint out; computeAverage(bin, out); output.push_back(out); @@ -291,7 +296,7 @@ void NeutralFileRecord::lowpassFilter(std::vector& output, st // Process any results still left in the bin if (!bin.empty()) { - NeutralFileRecord out; + DataPoint out; computeAverage(bin, out); output.push_back(out); diff --git a/src/Main.h b/src/Main.h index da776f3..1e52faf 100644 --- a/src/Main.h +++ b/src/Main.h @@ -83,8 +83,8 @@ The origin is the center of the turn table. // Non-configurable settings #define FREELSS_VERSION_MAJOR 1 -#define FREELSS_VERSION_MINOR 4 -#define FREELSS_VERSION_NAME "FreeLSS 1.4" +#define FREELSS_VERSION_MINOR 5 +#define FREELSS_VERSION_NAME "FreeLSS 1.5" #define PI 3.14159265359 @@ -107,7 +107,7 @@ The origin is the center of the turn table. #endif #ifndef MAX3 -#define MAX3(a, b, c) (MAX(MIN(a, b), c)) +#define MAX3(a, b, c) (MAX(MAX(a, b), c)) #endif namespace freelss @@ -117,6 +117,7 @@ typedef std::string Exception; typedef unsigned char byte; typedef unsigned int uint32; typedef unsigned short uint16; +typedef unsigned char uint8; typedef float real32; typedef double real64; typedef float real; @@ -156,6 +157,9 @@ struct PixelLocation /** 3D Real Location */ struct Vector3 { + Vector3() : x(0), y(0), z(0){ } + Vector3(real x, real y, real z) : x(x), y(y), z(z) { } + void normalize() { real len = sqrt(x * x + y * y + z * z); @@ -169,6 +173,13 @@ struct Vector3 return x * a.x + y * a.y + z * a.z; } + void cross (Vector3& out, const Vector3& v) const + { + out.x = y * v.z - z * v.y; + out.y = z * v.x - x * v.z; + out.z = x * v.y - y * v.x; + } + real x; real y; real z; @@ -176,9 +187,9 @@ struct Vector3 struct ColoredPoint { - real x; - real y; - real z; + real32 x; + real32 y; + real32 z; Vector3 normal; @@ -204,35 +215,42 @@ struct Plane Vector3 point; }; +struct FaceMap +{ + /** The triangles */ + std::vector triangles; +}; + struct Ray { Vector3 origin; Vector3 direction; }; -struct NeutralFileRecord +struct DataPoint { /** Populates frameC with the next frame from the results vector starting at index resultIndex */ - static bool readNextFrame(std::vector& out, const std::vector& results, size_t & resultIndex); + static bool readNextFrame(std::vector& out, const std::vector& results, size_t & resultIndex); /** * Reduce the number of result rows and filter out some of the noise * @param maxNumRows - The number of rows in the image the produced the frame. * @param numRowBins - The total number of row bins in the entire image, not necessarily what is returned by this function. */ - static void lowpassFilter(std::vector& output, std::vector& frame, unsigned maxNumRows, unsigned numRowBins); + static void lowpassFilter(std::vector& output, std::vector& frame, unsigned maxNumRows, unsigned numRowBins); /** * Computes the average of all the records in the bin. */ - static void computeAverage(const std::vector& bin, NeutralFileRecord& out); + static void computeAverage(const std::vector& bin, DataPoint& out); PixelLocation pixel; ColoredPoint point; real rotation; - int frame; - int laserSide; - int pseudoFrame; + uint16 frame; + uint8 laserSide; + uint16 pseudoFrame; + uint32 index; }; struct ScanResultFile diff --git a/src/Makefile b/src/Makefile index 53c61e2..c34ff28 100644 --- a/src/Makefile +++ b/src/Makefile @@ -11,11 +11,12 @@ OBJECTS=WebContent.o PropertyReaderWriter.o Main.o \ HttpServer.o CriticalSection.o Scanner.o Image.o ImageProcessor.o \ Thread.o A4988TurnTable.o RelayLaser.o LocationMapper.o \ PlyWriter.o Calibrator.o RaspistillCamera.o \ - NeutralFileWriter.o NeutralFileReader.o RaspicamCamera.o \ + RaspicamCamera.o \ Camera.o MmalStillCamera.o \ MmalVideoCamera.o PixelLocationWriter.o StlWriter.o TurnTable.o \ Laser.o Preset.o PresetManager.o Setup.o LaserResultsMerger.o\ - XyzWriter.o UpdateManager.o Progress.o FileWriter.o MemWriter.o + XyzWriter.o UpdateManager.o Progress.o FileWriter.o MemWriter.o \ + Facetizer.o all: freelss @@ -82,12 +83,6 @@ WebContent.o: WebContent.cpp WebContent.h Main.h Calibrator.o: Calibrator.cpp Calibrator.h Main.h $(CC) -c $(CFLAGS) Calibrator.cpp -NeutralFileWriter.o: NeutralFileWriter.cpp NeutralFileWriter.h Main.h - $(CC) -c $(CFLAGS) NeutralFileWriter.cpp - -NeutralFileReader.o: NeutralFileReader.cpp NeutralFileReader.h Main.h - $(CC) -c $(CFLAGS) NeutralFileReader.cpp - Camera.o: Camera.cpp Camera.h Main.h $(CC) -c $(CFLAGS) Camera.cpp @@ -127,6 +122,9 @@ FileWriter.o: FileWriter.cpp FileWriter.h Main.h MemWriter.o: MemWriter.cpp MemWriter.h Main.h $(CC) -c $(CFLAGS) MemWriter.cpp +Facetizer.o: Facetizer.cpp Facetizer.h Main.h + $(CC) -c $(CFLAGS) Facetizer.cpp + github: mkdir -p ../../github mkdir -p ../../github/src diff --git a/src/MmalStillCamera.cpp b/src/MmalStillCamera.cpp index 1c0611d..f3f22ad 100644 --- a/src/MmalStillCamera.cpp +++ b/src/MmalStillCamera.cpp @@ -37,8 +37,6 @@ #define FULL_FOV_PREVIEW_4x3_X 1296 #define FULL_FOV_PREVIEW_4x3_Y 972 -#define SCREEN_WIDTH 1920 -#define SCREEN_HEIGHT 1080 namespace freelss diff --git a/src/MmalVideoCamera.cpp b/src/MmalVideoCamera.cpp index 1d9f332..78fab32 100644 --- a/src/MmalVideoCamera.cpp +++ b/src/MmalVideoCamera.cpp @@ -22,33 +22,27 @@ #include "Main.h" #include "MmalVideoCamera.h" +#include "Thread.h" #define MMAL_CAMERA_PREVIEW_PORT 0 #define MMAL_CAMERA_VIDEO_PORT 1 #define MMAL_CAMERA_CAPTURE_PORT 2 #define VIDEO_OUTPUT_BUFFERS_NUM 3 -#define FULL_RES_VIDEO_FRAME_RATE_NUM 30 #define FULL_RES_VIDEO_FRAME_RATE_DEN 1 -#define FULL_FOV_PREVIEW_4x3_X 1296 -#define FULL_FOV_PREVIEW_4x3_Y 972 - -#define MMAL_SPLITTER_VIDEO_PORT 0 -#define MMAL_SPLITTER_CAPTURE_PORT 1 - -//#define CAMERA_IMAGE_WIDTH 2592 -//#define CAMERA_IMAGE_HEIGHT 1944 - -#define CAMERA_IMAGE_WIDTH 1280 -#define CAMERA_IMAGE_HEIGHT 960 - namespace freelss { struct Mmal_CallbackData { - Mmal_CallbackData() + Mmal_CallbackData() : + acquire(false), + buffer(NULL), + bufferSize(0), + bytesWritten(0), + pool(NULL), + outputQueue(NULL) { vcos_assert(vcos_semaphore_create(&complete_semaphore, "Scanner-Video-sem", 0) == VCOS_SUCCESS); } @@ -58,6 +52,7 @@ struct Mmal_CallbackData vcos_semaphore_delete(&complete_semaphore); } + bool acquire; byte * buffer; size_t bufferSize; size_t bytesWritten; @@ -67,128 +62,54 @@ struct Mmal_CallbackData MMAL_QUEUE_T * outputQueue; }; -static MMAL_STATUS_T connect_ports(MMAL_PORT_T *output_port, MMAL_PORT_T *input_port, MMAL_CONNECTION_T **connection) -{ - MMAL_STATUS_T status; - - status = mmal_connection_create(connection, output_port, input_port, MMAL_CONNECTION_FLAG_TUNNELLING | MMAL_CONNECTION_FLAG_ALLOCATION_ON_INPUT); - - if (status == MMAL_SUCCESS) - { - status = mmal_connection_enable(*connection); - if (status != MMAL_SUCCESS) - { - mmal_connection_destroy(*connection); - } - } - - return status; -} - -static void CameraControlCallback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) -{ - if (buffer->cmd != MMAL_EVENT_PARAMETER_CHANGED) - { - std::cerr << "Received unexpected camera control callback event" << std::endl; - } - - mmal_buffer_header_release(buffer); -} -#if 1 static void EncoderBufferCallback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) { - std::cout << "In EncoderBufferCallback" << std::endl; - - Mmal_CallbackData *pData = (Mmal_CallbackData *)port->userdata; - - //to handle the user not reading frames, remove and return any pre-existing ones - if(mmal_queue_length(pData->outputQueue) >= 2) - { - if(MMAL_BUFFER_HEADER_T* existing_buffer = mmal_queue_get(pData->outputQueue)) - { - mmal_buffer_header_release(existing_buffer); - if (port->is_enabled) - { - MMAL_STATUS_T status = MMAL_SUCCESS; - MMAL_BUFFER_HEADER_T *new_buffer; - new_buffer = mmal_queue_get(pData->pool->queue); - if (new_buffer) - { - status = mmal_port_send_buffer(port, new_buffer); - } - - if (!new_buffer || status != MMAL_SUCCESS) - { - std::cerr << "Unable to return a buffer to the video port" << std::endl; - } - } - } - } - - //add the buffer to the output queue - mmal_queue_put(pData->outputQueue, buffer); -} -#else -static void EncoderBufferCallback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) -{ - int complete = 0; - // We pass our file handle and other stuff in via the userdata field. Mmal_CallbackData *pData = (Mmal_CallbackData *)port->userdata; bool imageTaken = false; - std::cout << "EncoderBufferCallback" << std::endl; + //std::cout << "EncoderBufferCallback" << std::endl; if (pData) { - int bytes_written = buffer->length; - if (buffer->length) { // Copy the image data pData->cs.enter(); - std::cout << "EncoderBufferCallback - Locking buffer" << std::endl; - mmal_buffer_header_mem_lock(buffer); - if (pData->buffer != NULL) + if (pData->acquire) { - int writeSize = buffer->length; - if (pData->bytesWritten + writeSize > pData->bufferSize) - { - writeSize = pData->bufferSize - pData->bytesWritten; - } + //std::cout << "EncoderBufferCallback - Locking buffer" << std::endl; + mmal_buffer_header_mem_lock(buffer); - // Copy to our image buffer and move the pointer forward - if (writeSize > 0) + if (pData->buffer != NULL && pData->bytesWritten == 0) { - // memcpy(pData->buffer, buffer->data, writeSize); + int writeSize = buffer->length; - // The data is RGBA so we must copy just the RGB bytes - int step = 1; - byte * dst = pData->buffer; - for (int i = 0; i < buffer->length; i++) + // Copy to our image buffer and move the pointer forward + if (writeSize > 0) { - * dst = buffer->data[i]; - dst++; - - if (step == 3) - { - i++; - step = 1; - } + memcpy(pData->buffer, buffer->data, MIN(writeSize, pData->bufferSize)); + + pData->bytesWritten += writeSize; + imageTaken = true; + + //std::cerr << "SRC Buffer Length: " << buffer->length << std::endl; + //std::cerr << "SRC Buffer Offset: " << buffer->offset << std::endl; + //std::cerr << "DST Buffer Size: " << pData->bufferSize << std::endl; + //std::cerr << "TOT Bytes Written: " << pData->bytesWritten << std::endl; + //std::cerr << "Write Size: " << writeSize << std::endl; } } - // Unset our buffer now that we have copied to it - pData->buffer = NULL; - imageTaken = true; - } + //std::cout << "EncoderBufferCallback - Unlocking buffer" << std::endl; + mmal_buffer_header_mem_unlock(buffer); - std::cout << "EncoderBufferCallback - Unlocking buffer" << std::endl; - mmal_buffer_header_mem_unlock(buffer); + pData->acquire = false; + } pData->cs.leave(); } } @@ -200,7 +121,7 @@ static void EncoderBufferCallback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffe // Notify the user that the image is ready if (imageTaken) { - std::cout << "EncoderBufferCallback - Posting semaphore" << std::endl; + //std::cout << "EncoderBufferCallback - Posting semaphore" << std::endl << std::endl; vcos_semaphore_post(&(pData->complete_semaphore)); } @@ -208,41 +129,37 @@ static void EncoderBufferCallback(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffe mmal_buffer_header_release(buffer); // and send one back to the port (if still open) - if (port->is_enabled) + if (port->is_enabled && pData->pool && pData->pool->queue) { - std::cout << "EncoderBufferCallback - Requeing buffer" << std::endl; - MMAL_STATUS_T status = MMAL_SUCCESS; - MMAL_BUFFER_HEADER_T *new_buffer; - - new_buffer = mmal_queue_get(pData->pool->queue); + //std::cout << "EncoderBufferCallback - Requeing buffer" << std::endl; + MMAL_BUFFER_HEADER_T *new_buffer = NULL; - if (new_buffer) + if (pData->pool && pData->pool->queue) { - status = mmal_port_send_buffer(port, new_buffer); + new_buffer = mmal_queue_get(pData->pool->queue); } - if (!new_buffer || status != MMAL_SUCCESS) + if (new_buffer) { - std::cerr << "Unable to return a buffer to the encoder port" << std::endl; + mmal_port_send_buffer(port, new_buffer); } + + //std::cout << "EncoderBufferCallback - Buffer Returned" << std::endl; } } -#endif -MmalVideoCamera::MmalVideoCamera() : +MmalVideoCamera::MmalVideoCamera(int imageWidth, int imageHeight, int frameRate) : + m_imageWidth(imageWidth), + m_imageHeight(imageHeight), + m_frameRate(frameRate), + m_imagePreviewWidth(VCOS_ALIGN_UP(imageWidth, 32)), + m_imagePreviewHeight(VCOS_ALIGN_UP(imageHeight, 16)), m_callbackData(NULL), m_camera(NULL), - m_preview(NULL), - m_resizer(NULL), - m_splitter(NULL), m_pool(NULL), - m_previewPort(NULL), m_videoPort(NULL), m_stillPort(NULL), - m_resizerPort(NULL), m_targetPort(NULL), - m_splitterPort(NULL), - m_outputQueue(NULL), m_targetPortEnabled(false) { m_callbackData = new Mmal_CallbackData(); @@ -250,50 +167,22 @@ MmalVideoCamera::MmalVideoCamera() : createCameraComponent(); std::cout << "Created camera" << std::endl; - createPreview(); - std::cout << "Created preview" << std::endl; + //std::cout << "Target Image Width: " << VCOS_ALIGN_UP(m_imageWidth, 32) << std::endl; + //std::cout << "Target Image Height: " << VCOS_ALIGN_UP(m_imageHeight, 16) << std::endl; - createSplitter(); - std::cout << "Created splitter" << std::endl; + std::cout << "Target Image Width: " << m_imageWidth << std::endl; + std::cout << "Target Image Height: " << m_imageHeight << std::endl; - createResizer(); - std::cout << "Created resizer" << std::endl; - - std::cout << "Target Image Width: " << VCOS_ALIGN_UP(CAMERA_IMAGE_WIDTH, 32) << std::endl; - std::cout << "Target Image Height: " << VCOS_ALIGN_UP(CAMERA_IMAGE_HEIGHT, 16) << std::endl; - - - MMAL_STATUS_T status; - - // We will read from the resizer - m_targetPort = m_resizerPort; + m_targetPort = m_videoPort; createBufferPool(); - std::cout << "Created buffer pool" << std::endl; - - // Hook-up the preview port because the camera requires it - MMAL_CONNECTION_T *preview_connection = NULL; - status = connect_ports(m_previewPort, m_preview->input[0], &preview_connection); - if (status != MMAL_SUCCESS) - { - throw Exception("Error connecting preview port"); - } - - // Connect the video to the splitter - MMAL_CONNECTION_T *splitter_connection = NULL; - status = connect_ports(m_videoPort, m_splitter->input[0], &splitter_connection); - if (status != MMAL_SUCCESS) - { - throw Exception("Error connecting preview port"); - } - // Connect the splitter to our resizer - MMAL_CONNECTION_T *resizer_connection = NULL; - status = connect_ports(m_splitterPort, m_resizer->input[0], &resizer_connection); - if (status != MMAL_SUCCESS) + double startTime = GetTimeInSeconds(); + do { - throw Exception("Failed to connect camera video out port to resizer input port"); - } + sendBuffers(); + Thread::usleep(10000); + } while ((GetTimeInSeconds() - startTime) < 1); std::cout << "Initialized camera" << std::endl; } @@ -309,19 +198,9 @@ MmalVideoCamera::~MmalVideoCamera() } } - if (m_outputQueue != NULL) - { - mmal_queue_destroy(m_outputQueue); - } - if (m_camera != NULL) { - mmal_component_destroy(m_camera); - } - - if (m_preview != NULL) - { - mmal_component_destroy(m_preview); + mmal_component_disable(m_camera); } if (m_pool != NULL) @@ -329,74 +208,14 @@ MmalVideoCamera::~MmalVideoCamera() mmal_port_pool_destroy(m_targetPort, m_pool); } - if (m_splitter != NULL) - { - mmal_component_destroy(m_splitter); - } - - if (m_resizer != NULL) + if (m_camera != NULL) { - mmal_component_destroy(m_resizer); + mmal_component_destroy(m_camera); } delete m_callbackData; } -void MmalVideoCamera::createSplitter() -{ - if (m_videoPort == NULL) - { - throw Exception("Video port is not configured"); - } - - if (m_splitter != NULL) - { - throw Exception("The splitter is already configured"); - } - - MMAL_PORT_T *input_port = NULL, *output_port = NULL; - MMAL_STATUS_T status; - - //create the camera component - status = mmal_component_create(MMAL_COMPONENT_DEFAULT_VIDEO_SPLITTER, &m_splitter); - if (status != MMAL_SUCCESS) - { - throw Exception("Failed to create splitter component"); - } - - //check we have output ports - if (m_splitter->output_num != 4 || m_splitter->input_num != 1) - { - throw Exception("Splitter doesn't have correct ports"); - } - - //get the ports - input_port = m_splitter->input[0]; - mmal_format_copy(input_port->format, m_videoPort->format); - - input_port->buffer_num = 3; - - status = mmal_port_format_commit(input_port); - if (status != MMAL_SUCCESS) - { - throw Exception("Couldn't set resizer input port format"); - } - - for(unsigned i = 0; i < m_splitter->output_num; i++) - { - output_port = m_splitter->output[i]; - output_port->buffer_num = 3; - - mmal_format_copy(output_port->format, input_port->format); - status = mmal_port_format_commit(output_port); - if (status != MMAL_SUCCESS) - { - throw Exception("Couldn't set resizer output port format"); - } - } - - m_splitterPort = m_splitter->output[MMAL_SPLITTER_CAPTURE_PORT]; -} void MmalVideoCamera::createBufferPool() { @@ -428,22 +247,7 @@ void MmalVideoCamera::createBufferPool() } // Send all the buffers to the encoder output port - int num = mmal_queue_length(m_pool->queue); - - for (int q = 0; q < num; q++) - { - MMAL_BUFFER_HEADER_T *buffer = mmal_queue_get(m_pool->queue); - - if (buffer == NULL) - { - std::cerr << "Unable to get buffer " << q << " from the pool" << std::endl; - } - - if (mmal_port_send_buffer(m_targetPort, buffer)!= MMAL_SUCCESS) - { - std::cerr << "Unable to send a buffer " << q << " to encoder output port " << std::endl; - } - } + sendBuffers(); // Start the capture if (mmal_port_parameter_set_boolean(m_videoPort, MMAL_PARAMETER_CAPTURE, 1) != MMAL_SUCCESS) @@ -452,139 +256,6 @@ void MmalVideoCamera::createBufferPool() } } -void MmalVideoCamera::createResizer() -{ - MMAL_COMPONENT_T *resizer = NULL; - MMAL_PORT_T *resizer_input = NULL, *resizer_output = NULL; - MMAL_STATUS_T status; - MMAL_QUEUE_T* output_queue = NULL; - - if (m_videoPort == NULL) - { - throw Exception("Video port is NULL"); - } - - try - { - status = mmal_component_create("vc.ril.resize", &resizer); - if (status != MMAL_SUCCESS) - { - throw Exception("Unable to create image resizer component"); - } - - if (resizer->input_num != 1 || resizer->output_num != 1) - { - throw Exception("Resizer doesn't have input/output ports"); - } - - resizer_output = resizer->output[0]; - resizer_input = resizer->input[0]; - - // Specify the input format - mmal_format_copy(resizer_input->format, m_videoPort->format); - resizer_input->buffer_num = 3; - status = mmal_port_format_commit(resizer_input); - if (status != MMAL_SUCCESS) - { - throw Exception("Unable to set format on image resizer input port"); - } - - // Specify out output format - mmal_format_copy(resizer_output->format, resizer_input->format); - resizer_output->format->encoding = MMAL_ENCODING_RGBA; //MMAL_ENCODING_BGR24; // MMAL_ENCODING_RGBA - resizer_output->format->encoding_variant = MMAL_ENCODING_RGBA; //MMAL_ENCODING_BGR24; // MMAL_ENCODING_RGBA - resizer_output->format->es->video.width = VCOS_ALIGN_UP(CAMERA_IMAGE_WIDTH, 32); - resizer_output->format->es->video.height = VCOS_ALIGN_UP(CAMERA_IMAGE_HEIGHT, 16); - resizer_output->format->es->video.crop.x = 0; - resizer_output->format->es->video.crop.y = 0; - resizer_output->format->es->video.crop.width = VCOS_ALIGN_UP(CAMERA_IMAGE_WIDTH, 32); - resizer_output->format->es->video.crop.height = VCOS_ALIGN_UP(CAMERA_IMAGE_HEIGHT, 16); - resizer_output->format->es->video.frame_rate.num = FULL_RES_VIDEO_FRAME_RATE_NUM; - resizer_output->format->es->video.frame_rate.den = FULL_RES_VIDEO_FRAME_RATE_DEN; - - // Commit the port changes to the output port - status = mmal_port_format_commit(resizer_output); - if (status != MMAL_SUCCESS) - { - throw Exception("Unable to set format on image resizer output port"); - } - - // Enable the resizer component - status = mmal_component_enable(resizer); - if (status != MMAL_SUCCESS) - { - throw Exception("Error enabling resizer"); - } - - /* UML - //create the output queue - output_queue = mmal_queue_create(); - if(!output_queue) - { - throw Exception("Error creating output queue"); - } - */ - } - catch (Exception& ex) - { - std::cerr << ex << std::endl; - if (resizer != NULL) - { - mmal_component_destroy(resizer); - resizer = NULL; - } - - throw; - } - catch (...) - { - std::cerr << "Unknown error occurred" << std::endl; - if (resizer != NULL) - { - mmal_component_destroy(resizer); - resizer = NULL; - } - - throw; - } - - m_resizer = resizer; - m_resizerPort = resizer_output; - m_outputQueue = output_queue; - m_callbackData->outputQueue = m_outputQueue; -} - -void MmalVideoCamera::createPreview() -{ - MMAL_COMPONENT_T * preview = NULL; - MMAL_STATUS_T status; - - try - { - status = mmal_component_create("vc.null_sink", &preview); - if (status != MMAL_SUCCESS) - { - throw Exception("Error creating preview sink"); - } - - status = mmal_component_enable(preview); - if (status != MMAL_SUCCESS) - { - throw Exception("Error enabling preview"); - } - } - catch (...) - { - if (preview != NULL) - { - mmal_component_destroy(preview); - } - - throw; - } - - m_preview = preview; -} void MmalVideoCamera::createCameraComponent() { @@ -611,23 +282,18 @@ void MmalVideoCamera::createCameraComponent() video_port = camera->output[MMAL_CAMERA_VIDEO_PORT]; still_port = camera->output[MMAL_CAMERA_CAPTURE_PORT]; - // Enable the camera, and tell it its control callback function - status = mmal_port_enable(camera->control, CameraControlCallback); - if (status != MMAL_SUCCESS) - { - throw Exception("Unable to enable control port"); - } - // Populate the camera configuration struct MMAL_PARAMETER_CAMERA_CONFIG_T cameraConfig; cameraConfig.hdr.id = MMAL_PARAMETER_CAMERA_CONFIG; cameraConfig.hdr.size = sizeof(cameraConfig); - cameraConfig.max_stills_w = CAMERA_IMAGE_WIDTH; - cameraConfig.max_stills_h = CAMERA_IMAGE_HEIGHT; + cameraConfig.max_stills_w = m_imageWidth; + cameraConfig.max_stills_h = m_imageHeight; cameraConfig.stills_yuv422 = 0; - cameraConfig.one_shot_stills = 1; - cameraConfig.max_preview_video_w = VCOS_ALIGN_UP(FULL_FOV_PREVIEW_4x3_X, 32); - cameraConfig.max_preview_video_h = VCOS_ALIGN_UP(FULL_FOV_PREVIEW_4x3_Y, 16); + cameraConfig.one_shot_stills = 0; + //cameraConfig.max_preview_video_w = VCOS_ALIGN_UP(m_imagePreviewWidth, 32); + //cameraConfig.max_preview_video_h = VCOS_ALIGN_UP(m_imagePreviewHeight, 16); + cameraConfig.max_preview_video_w = m_imagePreviewWidth; + cameraConfig.max_preview_video_h = m_imagePreviewHeight; cameraConfig.num_preview_video_frames = 3; cameraConfig.stills_capture_circular_buffer_height = 0; cameraConfig.fast_preview_resume = 0; @@ -639,42 +305,22 @@ void MmalVideoCamera::createCameraComponent() throw Exception("Error calling mmal_port_parameter_set()"); } - // - // Setup the preview port - // - format = preview_port->format; - format->encoding = MMAL_ENCODING_OPAQUE; - format->encoding_variant = MMAL_ENCODING_I420; - - format->es->video.width = VCOS_ALIGN_UP(FULL_FOV_PREVIEW_4x3_X, 32); - format->es->video.height = VCOS_ALIGN_UP(FULL_FOV_PREVIEW_4x3_Y, 16); - format->es->video.crop.x = 0; - format->es->video.crop.y = 0; - format->es->video.crop.width = FULL_FOV_PREVIEW_4x3_X; - format->es->video.crop.height = FULL_FOV_PREVIEW_4x3_Y; - format->es->video.frame_rate.num = FULL_RES_VIDEO_FRAME_RATE_NUM; - format->es->video.frame_rate.den = FULL_RES_VIDEO_FRAME_RATE_DEN; - - status = mmal_port_format_commit(preview_port); - if (status != MMAL_SUCCESS) - { - throw Exception("Failure to setup camera preview port"); - } - // // Setup the video port // format = video_port->format; - format->encoding = MMAL_ENCODING_I420; - format->encoding_variant = MMAL_ENCODING_I420; + format->encoding = MMAL_ENCODING_BGR24; + format->encoding_variant = MMAL_ENCODING_BGR24; - format->es->video.width = VCOS_ALIGN_UP(CAMERA_IMAGE_WIDTH, 32); - format->es->video.height = VCOS_ALIGN_UP(CAMERA_IMAGE_HEIGHT, 16); + format->es->video.width = VCOS_ALIGN_UP(m_imageWidth, 32); + format->es->video.height = VCOS_ALIGN_UP(m_imageHeight, 16); + //format->es->video.width = m_imageWidth; + //format->es->video.height = m_imageHeight; format->es->video.crop.x = 0; format->es->video.crop.y = 0; - format->es->video.crop.width = CAMERA_IMAGE_WIDTH; - format->es->video.crop.height = CAMERA_IMAGE_HEIGHT; - format->es->video.frame_rate.num = FULL_RES_VIDEO_FRAME_RATE_NUM; + format->es->video.crop.width = m_imageWidth; + format->es->video.crop.height = m_imageHeight; + format->es->video.frame_rate.num = m_frameRate; format->es->video.frame_rate.den = FULL_RES_VIDEO_FRAME_RATE_DEN; status = mmal_port_format_commit(video_port); @@ -689,35 +335,12 @@ void MmalVideoCamera::createCameraComponent() video_port->buffer_num = VIDEO_OUTPUT_BUFFERS_NUM; } - // Use the video format for images as well - format = still_port->format; - - // Set our stills format on the stills (for encoder) port - - - format->encoding = MMAL_ENCODING_I420; - format->encoding_variant = MMAL_ENCODING_I420; - - format->es->video.width = VCOS_ALIGN_UP(CAMERA_IMAGE_WIDTH, 32); - format->es->video.height = VCOS_ALIGN_UP(CAMERA_IMAGE_HEIGHT, 16); - format->es->video.crop.x = 0; - format->es->video.crop.y = 0; - format->es->video.crop.width = CAMERA_IMAGE_WIDTH; - format->es->video.crop.height = CAMERA_IMAGE_HEIGHT; - format->es->video.frame_rate.num = FULL_RES_VIDEO_FRAME_RATE_NUM; - format->es->video.frame_rate.den = FULL_RES_VIDEO_FRAME_RATE_DEN; - - status = mmal_port_format_commit(still_port); - if (status != MMAL_SUCCESS) - { - throw Exception("Failure to setup camera image port"); - } - - // Verify number of buffers - if (still_port->buffer_num < VIDEO_OUTPUT_BUFFERS_NUM) - { - still_port->buffer_num = VIDEO_OUTPUT_BUFFERS_NUM; - } + // Flip the image + MMAL_PARAMETER_MIRROR_T mirror = {{MMAL_PARAMETER_MIRROR, sizeof(MMAL_PARAMETER_MIRROR_T)}, MMAL_PARAM_MIRROR_NONE}; + mirror.value = MMAL_PARAM_MIRROR_BOTH; + mmal_port_parameter_set(preview_port, &mirror.hdr); + mmal_port_parameter_set(video_port, &mirror.hdr); + mmal_port_parameter_set(still_port, &mirror.hdr); // Enable component status = mmal_component_enable(camera); @@ -725,6 +348,8 @@ void MmalVideoCamera::createCameraComponent() { throw Exception("camera component couldn't be enabled"); } + + std::cout << "Camera Enabled..." << std::endl; } catch (...) { @@ -737,41 +362,34 @@ void MmalVideoCamera::createCameraComponent() } m_camera = camera; - m_previewPort = preview_port; + //m_previewPort = preview_port; m_videoPort = video_port; m_stillPort = still_port; } - -void MmalVideoCamera::acquireImage(Image * image) +void MmalVideoCamera::sendBuffers() { - // Enable the encoder output port - std::cout << "Acquiring image..." << std::endl; - // Send all the buffers to the encoder output port - int num = mmal_queue_length(m_pool->queue); - - for (int q = 0; q < num; q++) - { - MMAL_BUFFER_HEADER_T *buffer = mmal_queue_get(m_pool->queue); + int num = mmal_queue_length(m_pool->queue); - if (buffer == NULL) - { - std::cerr << "Unable to get buffer " << q << " from the pool" << std::endl; - } + for (int q = 0; q < num; q++) + { + MMAL_BUFFER_HEADER_T *new_buffer = mmal_queue_get(m_pool->queue); - if (mmal_port_send_buffer(m_targetPort, buffer)!= MMAL_SUCCESS) - { - std::cerr << "Unable to send a buffer " << q << " to encoder output port " << std::endl; - } + if (new_buffer == NULL) + { + std::cerr << "Unable to get buffer " << q << " from the pool" << std::endl; } - // Start the capture - if (mmal_port_parameter_set_boolean(m_videoPort, MMAL_PARAMETER_CAPTURE, 1) == MMAL_SUCCESS) + if (mmal_port_send_buffer(m_videoPort, new_buffer)!= MMAL_SUCCESS) { - + std::cerr << "Unable to send a buffer " << q << " to encoder output port " << std::endl; } + } +} - /* +void MmalVideoCamera::acquireImage(Image * image) +{ + // Enable the encoder output port m_targetPort->userdata = (struct MMAL_PORT_USERDATA_T *) m_callbackData; m_callbackData->cs.enter(); @@ -779,60 +397,26 @@ void MmalVideoCamera::acquireImage(Image * image) m_callbackData->pool = m_pool; m_callbackData->bufferSize = image->getPixelBufferSize(); m_callbackData->bytesWritten = 0; + m_callbackData->acquire = true; m_callbackData->cs.leave(); - */ - /* UML - unsigned char * dst = image->getPixels(); + sendBuffers(); - if(MMAL_BUFFER_HEADER_T *buffer = mmal_queue_get(m_outputQueue)) + bool waiting = true; + while (waiting) { - //lock it - mmal_buffer_header_mem_lock(buffer); - - // memcpy(pData->buffer, buffer->data, writeSize); - - // The data is RGBA so we must copy just the RGB bytes - int step = 1; - for (unsigned i = 0; i < buffer->length; i++) + m_callbackData->cs.enter(); + if (!m_callbackData->acquire) { - * dst = buffer->data[i]; - dst++; - - if (step == 3) - { - i++; - step = 1; - } + waiting = false; } - - mmal_buffer_header_mem_unlock(buffer); - mmal_buffer_header_release(buffer); - - // and send it back to the port (if still open) - if (m_targetPort->is_enabled) + else { - MMAL_STATUS_T status = MMAL_SUCCESS; - MMAL_BUFFER_HEADER_T *new_buffer; - new_buffer = mmal_queue_get(m_pool->queue); - if (new_buffer) - { - status = mmal_port_send_buffer(m_targetPort, new_buffer); - } - - if (!new_buffer || status != MMAL_SUCCESS) - { - std::cerr << "Unable to return a buffer to the video port\n"; - } + //Thread::usleep(10000); + Thread::usleep(10000); } + m_callbackData->cs.leave(); } - else - { - std::cerr << "!! No buffer available" << std::endl; - } - */ - - std::cout << "Acquisition done..." << std::endl; } bool MmalVideoCamera::acquireJpeg(byte* buffer, unsigned * size) @@ -848,8 +432,6 @@ bool MmalVideoCamera::acquireJpeg(byte* buffer, unsigned * size) // Acquire an image acquireImage(&image); - //memcpy(buffer, image.getPixels(), image.getPixelBufferSize()); - // Convert the image to a JPEG Image::convertToJpeg(image, buffer, size); @@ -858,12 +440,12 @@ bool MmalVideoCamera::acquireJpeg(byte* buffer, unsigned * size) int MmalVideoCamera::getImageHeight() const { - return CAMERA_IMAGE_HEIGHT; + return m_imageHeight; } int MmalVideoCamera::getImageWidth() const { - return CAMERA_IMAGE_WIDTH; + return m_imageWidth; } int MmalVideoCamera::getImageComponents() const diff --git a/src/MmalVideoCamera.h b/src/MmalVideoCamera.h index 6bbc401..26d3677 100644 --- a/src/MmalVideoCamera.h +++ b/src/MmalVideoCamera.h @@ -38,7 +38,7 @@ struct Mmal_CallbackData; class MmalVideoCamera : public Camera { public: - MmalVideoCamera(); + MmalVideoCamera(int imageWidth, int imageHeight, int frameRate); ~MmalVideoCamera(); void acquireImage(Image * image); @@ -63,27 +63,23 @@ class MmalVideoCamera : public Camera real getFocalLength() const; private: - void createPreview(); - void createResizer(); void createCameraComponent(); void createBufferPool(); - void createSplitter(); + void sendBuffers(); private: + int m_imageWidth; + int m_imageHeight; + int m_frameRate; + int m_imagePreviewWidth; + int m_imagePreviewHeight; Mmal_CallbackData * m_callbackData; - CriticalSection m_cs; MMAL_COMPONENT_T * m_camera; - MMAL_COMPONENT_T * m_preview; - MMAL_COMPONENT_T * m_resizer; - MMAL_COMPONENT_T * m_splitter; MMAL_POOL_T * m_pool; - MMAL_PORT_T * m_previewPort; MMAL_PORT_T * m_videoPort; MMAL_PORT_T * m_stillPort; - MMAL_PORT_T * m_resizerPort; MMAL_PORT_T * m_targetPort; - MMAL_PORT_T * m_splitterPort; MMAL_QUEUE_T * m_outputQueue; bool m_targetPortEnabled; diff --git a/src/NeutralFileReader.cpp b/src/NeutralFileReader.cpp deleted file mode 100644 index 2ddd049..0000000 --- a/src/NeutralFileReader.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - **************************************************************************** - * Copyright (c) 2014 Uriah Liggett * - * This file is part of FreeLSS. * - * * - * FreeLSS is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * FreeLSS is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with FreeLSS. If not, see . * - **************************************************************************** -*/ - -#include "Main.h" -#include "NeutralFileReader.h" - - -namespace freelss -{ - -const char * NeutralFileReader::SELECT_SQL = "SELECT RED, GREEN, BLUE, X, Y, Z, COLUMN, ROW, ROTATION, STEP FROM RESULTS ORDER BY STEP ASC"; - -NeutralFileReader::NeutralFileReader() : - m_db(NULL), - m_stmt(NULL), - m_recordReady(false), - m_moreResults(false) -{ - // Do nothing -} - - -NeutralFileReader::~NeutralFileReader() -{ - close(); -} - -void NeutralFileReader::open(const std::string& filename) -{ - if (m_db != NULL) - { - return; - } - - if (sqlite3_open(filename.c_str(), &m_db) != 0) - { - throw Exception(std::string("Could not open sqlite database: ") + filename); - } -} - -void NeutralFileReader::close() -{ - if (m_stmt != NULL) - { - sqlite3_finalize(m_stmt); - m_stmt = NULL; - } - - if (m_db != NULL) - { - sqlite3_close(m_db); - m_db = NULL; - } -} - -void NeutralFileReader::start() -{ - if (m_stmt != NULL) - { - sqlite3_finalize(m_stmt); - m_stmt = NULL; - } - - // Create the prepared statement - char * errMsg = 0; - int rc = sqlite3_prepare_v2(m_db, NeutralFileReader::SELECT_SQL, -1, &m_stmt, NULL); - if (rc != SQLITE_OK) - { - std::string error = errMsg; - sqlite3_free(errMsg); - throw Exception("Error calling sqlite3_prepare_v2: " + error); - } - - m_recordReady = false; - m_moreResults = true; -} - -bool NeutralFileReader::readNextStep(std::vector& records) -{ - if (m_stmt == NULL) - { - throw Exception("Prepared statement is NULL"); - } - - if (!m_moreResults) - { - return false; - } - - // Clear any previous results - records.clear(); - - int lastStep = -1; - - // Copy the previously read record - if (m_recordReady) - { - records.push_back(m_record); - lastStep = m_record.frame; - m_recordReady = false; - } - - bool firstRow = true; - while (true) - { - if (sqlite3_step(m_stmt) == SQLITE_ROW) - { - NeutralFileRecord record; - - record.point.r = sqlite3_column_int(m_stmt, 0); - record.point.g = sqlite3_column_int(m_stmt, 1); - record.point.b = sqlite3_column_int(m_stmt, 2); - record.point.x = sqlite3_column_double(m_stmt, 3); - record.point.y = sqlite3_column_double(m_stmt, 4); - record.point.z = sqlite3_column_double(m_stmt, 5); - record.pixel.x = sqlite3_column_double(m_stmt, 6); - record.pixel.y = sqlite3_column_double(m_stmt, 7); - record.rotation = sqlite3_column_double(m_stmt, 8); - record.frame = sqlite3_column_int(m_stmt, 9); - - // Check if we are moving to the next scan frame - if (!firstRow && record.frame != lastStep) - { - m_record = record; - m_recordReady = true; - lastStep = record.frame; - break; - } - - firstRow = false; - lastStep = record.frame; - records.push_back(record); - } - else - { - m_moreResults = false; - } - } - - return m_moreResults; -} - -} // ns sdl diff --git a/src/NeutralFileReader.h b/src/NeutralFileReader.h deleted file mode 100644 index aaa481a..0000000 --- a/src/NeutralFileReader.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - **************************************************************************** - * Copyright (c) 2014 Uriah Liggett * - * This file is part of FreeLSS. * - * * - * FreeLSS is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * FreeLSS is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with FreeLSS. If not, see . * - **************************************************************************** -*/ - -#pragma once - -namespace freelss -{ - -class NeutralFileReader -{ -public: - NeutralFileReader(); - ~NeutralFileReader(); - - void open(const std::string& filename); - void close(); - void start(); - bool readNextStep(std::vector& records); - -private: - - void prepareStatement(); - - /** The SQL for creating the database */ - static const char * SELECT_SQL; - - /** The Sqlite database */ - sqlite3 * m_db; - - /** The prepared statement */ - sqlite3_stmt * m_stmt; - - /** Temp record */ - NeutralFileRecord m_record; - - /** Indicates if we should use the tmp record or not */ - bool m_recordReady; - - /** Indicates if there are more rows to be read */ - bool m_moreResults; -}; - -} diff --git a/src/NeutralFileWriter.cpp b/src/NeutralFileWriter.cpp deleted file mode 100644 index 26c7284..0000000 --- a/src/NeutralFileWriter.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/* - **************************************************************************** - * Copyright (c) 2014 Uriah Liggett * - * This file is part of FreeLSS. * - * * - * FreeLSS is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * FreeLSS is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with FreeLSS. If not, see . * - **************************************************************************** -*/ -#include "Main.h" -#include "NeutralFileWriter.h" - -namespace freelss -{ - -const char * NeutralFileWriter::CREATE_DATABASE_SQL = "\ -CREATE TABLE RESULTS (RED INTEGER, GREEN INTEGER, BLUE INTEGER, X REAL, Y REAL, Z REAL, COLUMN REAL, ROW REAL, ROTATION REAL, STEP INTEGER);\n"; - -NeutralFileWriter::NeutralFileWriter() : - m_db(NULL), - m_stmt(NULL) -{ - // Do nothing -} - -NeutralFileWriter::~NeutralFileWriter() -{ - close(); -} - -void NeutralFileWriter::open(const std::string& filename) -{ - if (m_db != NULL) - { - return; - } - - // If the file exists, delete it - if (access(filename.c_str(), F_OK) == 0) - { - if (remove(filename.c_str()) == -1) - { - throw Exception("Error removing file: " + filename); - } - } - - if (sqlite3_open(filename.c_str(), &m_db) != 0) - { - throw Exception(std::string("Could not open sqlite database: ") + filename); - } - - char * errMsg = 0; - int rc = sqlite3_exec(m_db, NeutralFileWriter::CREATE_DATABASE_SQL, NULL, NULL, &errMsg); - if (rc != SQLITE_OK) - { - std::string error = errMsg; - sqlite3_free(errMsg); - throw Exception("SQL Error: " + error); - } - - // Disable wait on write - errMsg = 0; - rc = sqlite3_exec(m_db, "PRAGMA synchronous = OFF", NULL, NULL, &errMsg); - if (rc != SQLITE_OK) - { - std::string error = errMsg; - sqlite3_free(errMsg); - throw Exception("Error setting synchronous mode: " + error); - } - - // In-memory journal only - errMsg = 0; - rc = sqlite3_exec(m_db, "PRAGMA journal_mode = MEMORY", NULL, NULL, &errMsg); - if (rc != SQLITE_OK) - { - std::string error = errMsg; - sqlite3_free(errMsg); - throw Exception("Error setting journal_mode: " + error); - } -} - -void NeutralFileWriter::close() -{ - if (m_stmt != NULL) - { - sqlite3_finalize(m_stmt); - m_stmt = NULL; - } - - if (m_db != NULL) - { - sqlite3_close(m_db); - m_db = NULL; - } -} - -void NeutralFileWriter::write(const NeutralFileRecord& record) -{ - if (m_db == NULL) - { - throw Exception("The database is not open"); - } - - sqlite3_bind_int(m_stmt, 1, (int)record.point.r); - sqlite3_bind_int(m_stmt, 2, (int)record.point.g); - sqlite3_bind_int(m_stmt, 3, (int)record.point.b); - sqlite3_bind_double(m_stmt, 4, record.point.x); - sqlite3_bind_double(m_stmt, 5, record.point.y); - sqlite3_bind_double(m_stmt, 6, record.point.z); - sqlite3_bind_double(m_stmt, 7, record.pixel.x); - sqlite3_bind_double(m_stmt, 8, record.pixel.y); - sqlite3_bind_double(m_stmt, 9, record.rotation); - sqlite3_bind_int(m_stmt, 10, record.frame); - - sqlite3_step(m_stmt); - sqlite3_clear_bindings(m_stmt); - sqlite3_reset(m_stmt); -} - -void NeutralFileWriter::beginBatch() -{ - // Create the prepared statement - prepareStatement(); - - char * errMsg = 0; - int rc = sqlite3_exec(m_db, "BEGIN TRANSACTION", NULL, NULL, &errMsg); - if(rc != SQLITE_OK) - { - std::string error = errMsg; - sqlite3_free(errMsg); - throw Exception(std::string("Error beginning transaction: ") + error); - } -} - -void NeutralFileWriter::prepareStatement() -{ - if (m_stmt != NULL) - { - sqlite3_finalize(m_stmt); - m_stmt = NULL; - } - - // Create the prepared statement - char * errMsg = 0; - const char * sql = "INSERT INTO RESULTS (RED, GREEN, BLUE, X, Y, Z, COLUMN, ROW, ROTATION, STEP) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"; - int rc = sqlite3_prepare_v2(m_db, sql, -1, &m_stmt, NULL); - if (rc != SQLITE_OK) - { - std::string error = errMsg; - sqlite3_free(errMsg); - throw Exception(std::string("Error calling sqlite3_prepare_v2: ") + error); - } -} - -void NeutralFileWriter::commit() -{ - if (m_stmt == NULL) - { - return; - } - - char * errMsg = 0; - int rc = sqlite3_exec(m_db, "END TRANSACTION", NULL, NULL, &errMsg); - if(rc != SQLITE_OK) - { - std::string error = errMsg; - sqlite3_free(errMsg); - throw Exception(std::string("Error committing transaction: ") + error); - } - - sqlite3_finalize(m_stmt); - m_stmt = NULL; -} - -} diff --git a/src/PlyWriter.cpp b/src/PlyWriter.cpp index 5037a50..8a9d4e2 100644 --- a/src/PlyWriter.cpp +++ b/src/PlyWriter.cpp @@ -29,6 +29,7 @@ namespace freelss PlyWriter::PlyWriter() : m_writer(NULL), m_totalNumPoints(0), + m_totalNumFaces(0), m_numPointsWritten(0), m_dataFormat(PLY_BINARY) { @@ -40,6 +41,11 @@ void PlyWriter::setTotalNumPoints(int totalNumPoints) m_totalNumPoints = totalNumPoints; } +void PlyWriter::setTotalNumFacesFromFaceMap(const FaceMap& faces) +{ + m_totalNumFaces = faces.triangles.size() / 3; +} + void PlyWriter::setDataFormat(PlyDataFormat dataRepresentation) { m_dataFormat = dataRepresentation; @@ -80,7 +86,7 @@ void PlyWriter::begin(IWriter * writer) sstr << "property uchar red" << std::endl; sstr << "property uchar green" << std::endl; sstr << "property uchar blue" << std::endl; - sstr << "element face 0" << std::endl; + sstr << "element face " << m_totalNumFaces << std::endl; sstr << "property list uchar int vertex_indices" << std::endl; sstr << "end_header" << std::endl; @@ -88,6 +94,54 @@ void PlyWriter::begin(IWriter * writer) m_writer->write(header.c_str(), header.size()); } +void PlyWriter::writeFaces(const FaceMap& faces) +{ + if (m_dataFormat == PLY_ASCII) + { + writeAsciiFaces(faces); + } + else if (m_dataFormat == PLY_BINARY) + { + writeBinaryFaces(faces); + } + else + { + throw Exception("Unsupported PLY data format"); + } +} + +void PlyWriter::writeAsciiFaces(const FaceMap& faces) +{ + const std::vector& triangles = faces.triangles; + + for (size_t idx = 0; idx < triangles.size(); idx += 3) + { + std::stringstream sstr; + sstr << "3 " << triangles[idx] << " " << triangles[idx + 1] << " " << triangles[idx + 2] << std::endl; + + std::string data = sstr.str(); + m_writer->write(data.c_str(), data.size()); + } +} + +void PlyWriter::writeBinaryFaces(const FaceMap& faces) +{ + const std::vector& triangles = faces.triangles; + + for (size_t idx = 0; idx < triangles.size(); idx += 3) + { + uint8 numVert = 3; + uint32 v1 = triangles[idx]; + uint32 v2 = triangles[idx + 1]; + uint32 v3 = triangles[idx + 2]; + + m_writer->write((const char *)&numVert, sizeof(numVert)); + m_writer->write((const char *)&v1, sizeof(v1)); + m_writer->write((const char *)&v2, sizeof(v2)); + m_writer->write((const char *)&v3, sizeof(v3)); + } +} + void PlyWriter::writePoints(ColoredPoint * points, int numPoints) { // Check the number of points diff --git a/src/PlyWriter.h b/src/PlyWriter.h index 2a1d489..ebb6d46 100644 --- a/src/PlyWriter.h +++ b/src/PlyWriter.h @@ -34,15 +34,21 @@ class PlyWriter void setDataFormat(PlyDataFormat dataRepresentation); void setTotalNumPoints(int totalNumPoints); + void setTotalNumFacesFromFaceMap(const FaceMap& faces); void begin(IWriter * writer); void writePoints(ColoredPoint * points, int numPoints); + void writeFaces(const FaceMap& faces); void end(); private: void writeAsciiPoints(ColoredPoint * points, int numPoints); void writeBinaryPoints(ColoredPoint * points, int numPoints); + void writeAsciiFaces(const FaceMap& faces); + void writeBinaryFaces(const FaceMap& faces); + IWriter * m_writer; int m_totalNumPoints; + int m_totalNumFaces; int m_numPointsWritten; PlyDataFormat m_dataFormat; }; diff --git a/src/Preset.cpp b/src/Preset.cpp index ede346c..e59703d 100644 --- a/src/Preset.cpp +++ b/src/Preset.cpp @@ -81,85 +81,88 @@ void Preset::decodeProperties(const std::vector& properties, const std isActivePreset = false; this->name = name; + if (name.empty()) + { + return; + } + + const std::string prefix = "presets."; for (size_t iProp = 0; iProp < properties.size(); iProp++) { const Property& prop = properties[iProp]; - if (!name.empty()) + if (prop.name == prefix + name + ".laserSide") { - if (EndsWith(prop.name, name + ".laserSide")) - { - laserSide = (Laser::LaserSide) ToInt(prop.value); - } - else if (EndsWith(prop.name, name + ".cameraMode")) - { - cameraMode = (Camera::CameraMode) ToInt(prop.value); - } - else if (EndsWith(prop.name, name + ".laserThreshold")) - { - laserThreshold = ToReal(prop.value); - } - else if (EndsWith(prop.name, name + ".minLaserWidth")) - { - minLaserWidth = ToInt(prop.value); - } - else if (EndsWith(prop.name, name + ".maxLaserWidth")) - { - maxLaserWidth = ToInt(prop.value); - } - else if (EndsWith(prop.name, name + ".maxObjectSize")) - { - maxObjectSize = ToReal(prop.value); - } - else if (EndsWith(prop.name, name + ".maxTriangleEdgeLength")) - { - maxTriangleEdgeLength = ToReal(prop.value); - } - else if (EndsWith(prop.name, name + ".numLaserRowBins")) - { - numLaserRowBins = ToInt(prop.value); - } - else if (EndsWith(prop.name, name + ".laserDelay")) - { - laserDelay = ToInt(prop.value); - } - else if (EndsWith(prop.name, name + ".stabilityDelay")) - { - stabilityDelay = ToInt(prop.value); - } - else if (EndsWith(prop.name, name + ".active")) - { - isActivePreset = ToInt(prop.value) == 1; - } - else if (EndsWith(prop.name, name + ".framesPerRevolution")) - { - framesPerRevolution = ToInt(prop.value); - } - else if (EndsWith(prop.name, name + ".generateXyz")) - { - generateXyz = ToBool(prop.value); - } - else if (EndsWith(prop.name, name + ".generateStl")) - { - generateStl = ToBool(prop.value); - } - else if (EndsWith(prop.name, name + ".generatePly")) - { - generatePly = ToBool(prop.value); - } - else if (EndsWith(prop.name, name + ".groundPlaneHeight")) - { - groundPlaneHeight = ToReal(prop.value); - } - else if (EndsWith(prop.name, name + ".laserMergeAction")) - { - laserMergeAction = (LaserMergeAction) ToInt(prop.value); - } - else if (EndsWith(prop.name, name + ".plyDataFormat")) - { - plyDataFormat = (PlyDataFormat) ToInt(prop.value); - } + laserSide = (Laser::LaserSide) ToInt(prop.value); + } + else if (prop.name == prefix + name + ".cameraMode") + { + cameraMode = (Camera::CameraMode) ToInt(prop.value); + } + else if (prop.name == prefix + name + ".laserThreshold") + { + laserThreshold = ToReal(prop.value); + } + else if (prop.name == prefix + name + ".minLaserWidth") + { + minLaserWidth = ToInt(prop.value); + } + else if (prop.name == prefix + name + ".maxLaserWidth") + { + maxLaserWidth = ToInt(prop.value); + } + else if (prop.name == prefix + name + ".maxObjectSize") + { + maxObjectSize = ToReal(prop.value); + } + else if (prop.name == prefix + name + ".maxTriangleEdgeLength") + { + maxTriangleEdgeLength = ToReal(prop.value); + } + else if (prop.name == prefix + name + ".numLaserRowBins") + { + numLaserRowBins = ToInt(prop.value); + } + else if (prop.name == prefix + name + ".laserDelay") + { + laserDelay = ToInt(prop.value); + } + else if (prop.name == prefix + name + ".stabilityDelay") + { + stabilityDelay = ToInt(prop.value); + } + else if (prop.name == prefix + name + ".active") + { + isActivePreset = ToInt(prop.value) == 1; + } + else if (prop.name == prefix + name + ".framesPerRevolution") + { + framesPerRevolution = ToInt(prop.value); + } + else if (prop.name == prefix + name + ".generateXyz") + { + generateXyz = ToBool(prop.value); + } + else if (prop.name == prefix + name + ".generateStl") + { + generateStl = ToBool(prop.value); + } + else if (prop.name == prefix + name + ".generatePly") + { + generatePly = ToBool(prop.value); + } + else if (prop.name == prefix + name + ".groundPlaneHeight") + { + groundPlaneHeight = ToReal(prop.value); + } + else if (prop.name == prefix + name + ".laserMergeAction") + { + laserMergeAction = (LaserMergeAction) ToInt(prop.value); + } + else if (prop.name == prefix + name + ".plyDataFormat") + { + plyDataFormat = (PlyDataFormat) ToInt(prop.value); } } } diff --git a/src/Progress.cpp b/src/Progress.cpp index d6b4e84..0d7203a 100644 --- a/src/Progress.cpp +++ b/src/Progress.cpp @@ -66,6 +66,7 @@ void Progress::setPercent(real percent) void Progress::setLabel(const std::string& label) { m_cs.enter(); + std::cout << label << "..." << std::endl; m_label = label; m_cs.leave(); } diff --git a/src/Scanner.cpp b/src/Scanner.cpp index 20bafb5..1896137 100644 --- a/src/Scanner.cpp +++ b/src/Scanner.cpp @@ -27,11 +27,11 @@ #include "Laser.h" #include "Camera.h" #include "PixelLocationWriter.h" -#include "NeutralFileReader.h" #include "StlWriter.h" #include "XyzWriter.h" #include "LaserResultsMerger.h" #include "FileWriter.h" +#include "Facetizer.h" namespace freelss { @@ -45,7 +45,7 @@ static bool CompareScanResultFiles(const ScanResultFile& a, const ScanResultFile return a.extension > b.extension; } -static bool ComparePseudoSteps(const NeutralFileRecord& a, const NeutralFileRecord& b) +static bool ComparePseudoSteps(const DataPoint& a, const DataPoint& b) { if (a.pseudoFrame != b.pseudoFrame) { @@ -66,13 +66,14 @@ Scanner::Scanner() : m_progress(), m_status(), m_maxNumFrameRetries(5), // TODO: Place this in Database - m_maxPercentPixelsOverThreshold(3), // TODO: Place this in Database + m_maxNumFailedRows(10), // TODO: Place this in Database m_columnPoints(NULL), m_startTimeSec(0), m_remainingTime(0), m_firstRowRightLaserCol(0), m_firstRowLeftLaserCol(0), m_maxNumLocations(0), + m_maxFramesPerRevolution(0), m_radiansBetweenLaserPlanes(0), m_radiansPerFrame(0), m_rightLaserLoc(), @@ -279,22 +280,26 @@ void Scanner::run() int numFrames = 0; - int maxFramesPerRevolution = preset.framesPerRevolution; - if (maxFramesPerRevolution < 1) + m_maxFramesPerRevolution = preset.framesPerRevolution; + if (m_maxFramesPerRevolution < 1) { - maxFramesPerRevolution = 1; + m_maxFramesPerRevolution = 1; } int stepsPerRevolution = Setup::get()->stepsPerRevolution; - if (maxFramesPerRevolution > stepsPerRevolution) + if (m_maxFramesPerRevolution > stepsPerRevolution) { - maxFramesPerRevolution = stepsPerRevolution; + m_maxFramesPerRevolution = stepsPerRevolution; } try { // Enable the turn table motor m_turnTable->setMotorEnabled(true); + + // Wait a second in case the object shakes + Thread::usleep(1000000); + std::cout << "Enabled motor" << std::endl; if (m_laser == NULL) @@ -315,7 +320,7 @@ void Scanner::run() float rangeRadians = (m_range / 360) * (2 * PI); // The number of steps for a single frame - int stepsPerFrame = ceil(stepsPerRevolution / (float)maxFramesPerRevolution); + int stepsPerFrame = ceil(stepsPerRevolution / (float)m_maxFramesPerRevolution); if (stepsPerFrame < 1) { stepsPerFrame = 1; @@ -393,11 +398,11 @@ void Scanner::run() time1 = GetTimeInSeconds(); // Merge the left and right lasers and sort the results - std::vector results; + std::vector results; LaserResultsMerger merger; m_results.enter(); - merger.merge(results, m_leftLaserResults, m_rightLaserResults, maxFramesPerRevolution, + merger.merge(results, m_leftLaserResults, m_rightLaserResults, m_maxFramesPerRevolution, m_numFramesBetweenLaserPlanes, Camera::getInstance()->getImageHeight(), preset.laserMergeAction, m_progress); m_results.leave(); @@ -419,6 +424,18 @@ void Scanner::run() timingStats.laserMergeTime += GetTimeInSeconds() - time1; + // Mesh the point cloud + FaceMap faces; + if (preset.generatePly || preset.generateStl) + { + Facetizer facetizer; + + time1 = GetTimeInSeconds(); + m_progress.setLabel("Facetizing Point Cloud"); + facetizer.facetize(faces, results, m_range > 359, m_progress, true); + timingStats.facetizationTime += GetTimeInSeconds() - time1; + } + // Write the PLY file std::cout << "Starting output thread..." << std::endl; if (preset.generatePly) @@ -441,6 +458,7 @@ void Scanner::run() PlyWriter plyWriter; plyWriter.setDataFormat(preset.plyDataFormat); plyWriter.setTotalNumPoints((int)results.size()); + plyWriter.setTotalNumFacesFromFaceMap(faces); plyWriter.begin(&plyOut); real percent = 0; @@ -456,9 +474,10 @@ void Scanner::run() plyWriter.writePoints(&results[iRec].point, 1); } + plyWriter.writeFaces(faces); plyWriter.end(); plyOut.close(); - timingStats.pointCloudWritingTime += GetTimeInSeconds() - time1; + timingStats.plyWritingTime += GetTimeInSeconds() - time1; } // Generate the XYZ file @@ -468,7 +487,7 @@ void Scanner::run() time1 = GetTimeInSeconds(); XyzWriter xyzWriter; xyzWriter.write(m_filename, results, m_progress); - timingStats.pointCloudWritingTime += GetTimeInSeconds() - time1; + timingStats.xyzWritingTime += GetTimeInSeconds() - time1; } // Generate the STL file @@ -477,8 +496,8 @@ void Scanner::run() std::cout << "Generating STL mesh..." << std::endl; time1 = GetTimeInSeconds(); StlWriter stlWriter; - stlWriter.write(m_filename, results, m_range > 359, m_progress); - timingStats.meshWritingTime = GetTimeInSeconds() - time1; + stlWriter.write(m_filename, results, faces, m_progress); + timingStats.stlWritingTime = GetTimeInSeconds() - time1; } logTimingStats(timingStats); @@ -494,37 +513,100 @@ void Scanner::run() void Scanner::generateDebugInfo(Laser::LaserSide laserSide) { + Setup * setup = Setup::get(); + // Prepare for scanning prepareScan(); + std::string debuggingCsv = std::string(DEBUG_OUTPUT_DIR) + "/0.csv"; + m_laser->turnOff(Laser::ALL_LASERS); acquireImage(&m_image1); - m_laser->turnOn(laserSide); - acquireImage(&m_image2); + Image leftDebuggingImage; + std::vector leftLocations (m_maxNumLocations); + int numLeftLocations = 0; - m_laser->turnOff(laserSide); - - Image debuggingImage; + if (laserSide == Laser::LEFT_LASER || laserSide == Laser::ALL_LASERS) + { + m_laser->turnOn(Laser::LEFT_LASER); + acquireImage(&m_image2); + + m_laser->turnOff(Laser::LEFT_LASER); + + int firstRowLaserCol = m_camera->getImageWidth() * 0.5; + int numRowsBadFromColor = 0; + int numRowsBadFromNumRanges = 0; + + numLeftLocations = m_imageProcessor.process(m_image1, + m_image2, + &leftDebuggingImage, + &leftLocations.front(), + m_maxNumLocations, + firstRowLaserCol, + numRowsBadFromColor, + numRowsBadFromNumRanges, + debuggingCsv.c_str()); + + // If we had major problems with this frame, try it again + std::cout << "numRowsBadFromColor: " << numRowsBadFromColor << std::endl; + std::cout << "numRowsBadFromNumRanges: " << numRowsBadFromNumRanges << std::endl; + + // Map the points so that points below the ground plane and outside the max object size are omitted + int numLocationsMapped = 0; + LocationMapper locMapper(setup->leftLaserLocation, setup->cameraLocation); + locMapper.mapPoints(&leftLocations.front(), &m_image1, m_columnPoints, numLeftLocations, numLocationsMapped); + numLeftLocations = numLocationsMapped; + } - std::string debuggingCsv = std::string(DEBUG_OUTPUT_DIR) + "/0.csv"; + Image rightDebuggingImage; + std::vector rightLocations(m_maxNumLocations); + int numRightLocations = 0; + if (laserSide == Laser::RIGHT_LASER || laserSide == Laser::ALL_LASERS) + { + m_laser->turnOn(Laser::RIGHT_LASER); + acquireImage(&m_image2); + + m_laser->turnOff(Laser::RIGHT_LASER); + + int firstRowLaserCol = m_camera->getImageWidth() * 0.5; + int numRowsBadFromColor = 0; + int numRowsBadFromNumRanges = 0; + + numRightLocations = m_imageProcessor.process(m_image1, + m_image2, + &rightDebuggingImage, + &rightLocations.front(), + m_maxNumLocations, + firstRowLaserCol, + numRowsBadFromColor, + numRowsBadFromNumRanges, + debuggingCsv.c_str()); + + // If we had major problems with this frame, try it again + std::cout << "numRowsBadFromColor: " << numRowsBadFromColor << std::endl; + std::cout << "numRowsBadFromNumRanges: " << numRowsBadFromNumRanges << std::endl; + + + // Map the points so that points below the ground plane and outside the max object size are omitted + int numLocationsMapped = 0; + LocationMapper locMapper(setup->rightLaserLocation, setup->cameraLocation); + locMapper.mapPoints(&rightLocations.front(), &m_image1, m_columnPoints, numRightLocations, numLocationsMapped); + numRightLocations = numLocationsMapped; + } - int firstRowLaserCol = m_camera->getImageWidth() * 0.5; - real percentPixelsOverThreshold = 0; - int numLocations = m_imageProcessor.process(m_image1, - m_image2, - &debuggingImage, - m_laserLocations, - m_maxNumLocations, - firstRowLaserCol, - percentPixelsOverThreshold, - debuggingCsv.c_str()); + // + // Merge the two debugging images + // + Image debuggingImage; + mergeDebuggingImages(debuggingImage, leftDebuggingImage, rightDebuggingImage, laserSide); std::string baseFilename = std::string(DEBUG_OUTPUT_DIR) + "/"; // Overlay the pixels onto the debug image and write that as a new image PixelLocationWriter locWriter; - Image::overlayPixels(debuggingImage, m_laserLocations, numLocations); + Image::overlayPixels(debuggingImage, &rightLocations.front(), numRightLocations); + Image::overlayPixels(debuggingImage, &leftLocations.front(), numLeftLocations); locWriter.writeImage(debuggingImage, debuggingImage.getWidth(), debuggingImage.getHeight(), baseFilename + "5.png"); m_progress.setPercent(100); @@ -535,6 +617,61 @@ void Scanner::generateDebugInfo(Laser::LaserSide laserSide) std::cout << "Done." << std::endl; } +void Scanner::mergeDebuggingImages(Image& outImage, const Image& leftDebuggingImage, const Image& rightDebuggingImage, Laser::LaserSide laserSide) +{ + + if (laserSide == Laser::RIGHT_LASER) + { + memcpy(outImage.getPixels(), rightDebuggingImage.getPixels(), outImage.getPixelBufferSize()); + } + else if (laserSide == Laser::LEFT_LASER) + { + memcpy(outImage.getPixels(), leftDebuggingImage.getPixels(), outImage.getPixelBufferSize()); + } + else if (laserSide == Laser::ALL_LASERS) + { + // + // Merge the two images with a MAX operator + // + unsigned char * left = leftDebuggingImage.getPixels(); + unsigned char * right = rightDebuggingImage.getPixels(); + unsigned numPixels = leftDebuggingImage.getWidth() * leftDebuggingImage.getHeight(); + unsigned char * out = outImage.getPixels(); + for (unsigned iPx = 0; iPx < numPixels; iPx++) + { + int lr = (int) left[0]; + int lg = (int) left[1]; + int lb = (int) left[2]; + int leftMagSq = lr * lr + lg * lg + lb * lb; + + int rr = (int) right[0]; + int rg = (int) right[1]; + int rb = (int) right[2]; + int rightMagSq = rr * rr + rg * rg + rb * rb; + + if (leftMagSq > rightMagSq) + { + out[0] = (unsigned char) lr; + out[1] = (unsigned char) lg; + out[2] = (unsigned char) lb; + } + else + { + out[0] = (unsigned char) rr; + out[1] = (unsigned char) rg; + out[2] = (unsigned char) rb; + } + + left += 3; + right += 3; + out += 3; + } + } + else + { + throw Exception("Unsupported LaserSide"); + } +} void Scanner::singleScan(int frame, float rotation, float frameRotation, LocationMapper& leftLocMapper, LocationMapper& rightLocMapper, TimingStats * timingStats) { @@ -587,6 +724,9 @@ void Scanner::singleScan(int frame, float rotation, float frameRotation, // If it didn't succeed, take the first image again if (!goodResult) { + // Wait some period of time for the cause of the disruption to go away + Thread::usleep(1000000); + // Take a picture with the laser off time1 = GetTimeInSeconds(); acquireImage(&m_image1); @@ -632,10 +772,11 @@ void Scanner::singleScan(int frame, float rotation, float frameRotation, } } -bool Scanner::processScan(std::vector & results, int frame, float rotation, LocationMapper& locMapper, Laser::LaserSide laserSide, int & firstRowLaserCol, TimingStats * timingStats) +bool Scanner::processScan(std::vector & results, int frame, float rotation, LocationMapper& locMapper, Laser::LaserSide laserSide, int & firstRowLaserCol, TimingStats * timingStats) { int numLocationsMapped = 0; - real percentPixelsOverThreshold = 0; + int numRowsBadFromColor = 0; + int numRowsBadFromNumRanges = 0; // Send the pictures off for processing double time1 = GetTimeInSeconds(); @@ -645,17 +786,22 @@ bool Scanner::processScan(std::vector & results, int frame, f m_laserLocations, m_maxNumLocations, firstRowLaserCol, - percentPixelsOverThreshold, + numRowsBadFromColor, + numRowsBadFromNumRanges, NULL); timingStats->imageProcessingTime += GetTimeInSeconds() - time1; // If we had major problems with this frame, try it again - std::cout << "percentPixelsOverThreshold: " << percentPixelsOverThreshold << std::endl; - if (percentPixelsOverThreshold > m_maxPercentPixelsOverThreshold) + std::cout << "numRowsBadFromColor: " << numRowsBadFromColor << std::endl; + std::cout << "numRowsBadFromNumRanges: " << numRowsBadFromNumRanges << std::endl; + + if (numRowsBadFromNumRanges > m_maxNumFailedRows) { - std::cout << "!! Many bad laser locations suspected, pctOverThreshold=" << percentPixelsOverThreshold - << ", maxPct=" << m_maxPercentPixelsOverThreshold << ", rescanning..." << std::endl; + std::cout << "!! Too many bad laser locations suspected" + << ", numRowsBadFromColor=" << numRowsBadFromColor + << ", numRowsBadFromNumRanges=" << numRowsBadFromNumRanges + << ", rescanning..." << std::endl; timingStats->numFrameRetries++; @@ -698,20 +844,28 @@ bool Scanner::processScan(std::vector & results, int frame, f // Rotate the points rotatePoints(m_columnPoints, rotation, numLocationsMapped); - // Write to the neutral file - time1 = GetTimeInSeconds(); - m_results.enter(); + std::vector rawResults; for (int iLoc = 0; iLoc < numLocationsMapped; iLoc++) { - NeutralFileRecord record; + DataPoint record; record.pixel = m_laserLocations[iLoc]; record.point = m_columnPoints[iLoc]; record.rotation = laserSide == Laser::RIGHT_LASER ? rotation : rotation + m_radiansBetweenLaserPlanes; record.frame = frame; record.laserSide = (int) laserSide; - results.push_back(record); + rawResults.push_back(record); } + + uint32 maxNumRows = Camera::getInstance()->getImageHeight(); + uint32 numRowBins = MAX(400, m_maxFramesPerRevolution / 4); + + time1 = GetTimeInSeconds(); + + // Reduce the number of result rows and filter out some of the noise + m_results.enter(); + DataPoint::lowpassFilter(results, rawResults, maxNumRows, numRowBins); m_results.leave(); + timingStats->pointProcessingTime += GetTimeInSeconds() - time1; } @@ -800,8 +954,8 @@ void Scanner::logTimingStats(const Scanner::TimingStats& stats) double now = GetTimeInSeconds(); double totalTime = now - stats.startTime; - double accountedTime = stats.meshWritingTime + stats.imageAcquisitionTime + stats.imageProcessingTime + stats.pointMappingTime - + stats.pointProcessingTime + stats.rotationTime + stats.pointCloudWritingTime + stats.laserTime + stats.laserMergeTime; + double accountedTime = stats.xyzWritingTime + stats.facetizationTime + stats.stlWritingTime + stats.imageAcquisitionTime + stats.imageProcessingTime + stats.pointMappingTime + + stats.pointProcessingTime + stats.rotationTime + stats.plyWritingTime + stats.laserTime + stats.laserMergeTime; double unaccountedTime = totalTime - accountedTime; double rate = totalTime / stats.numFrames; @@ -815,8 +969,10 @@ void Scanner::logTimingStats(const Scanner::TimingStats& stats) std::cout << "Point Rotating:\t" << (100.0 * stats.pointProcessingTime / totalTime) << "%" << std::endl; std::cout << "Table Rotation:\t" << (100.0 * stats.rotationTime / totalTime) << "%" << std::endl; std::cout << "Laser Merging:\t" << (100.0 * stats.laserMergeTime / totalTime) << "%" << std::endl; - std::cout << "Point Cloud Writing:\t" << (100.0 * stats.pointCloudWritingTime / totalTime) << "%" << std::endl; - std::cout << "Mesh Writing:\t" << (100.0 * stats.meshWritingTime / totalTime) << "%" << std::endl; + std::cout << "PLY Writing:\t" << (100.0 * stats.plyWritingTime / totalTime) << "%" << std::endl; + std::cout << "STL Writing:\t" << (100.0 * stats.stlWritingTime / totalTime) << "%" << std::endl; + std::cout << "XYZ Writing:\t" << (100.0 * stats.xyzWritingTime / totalTime) << "%" << std::endl; + std::cout << "Facetization:\t" << (100.0 * stats.facetizationTime / totalTime) << "%" << std::endl; std::cout << "Num Frame Retries:\t" << stats.numFrameRetries << std::endl; std::cout << "Num Frames:\t" << stats.numFrames << std::endl; std::cout << "Total Time (min):\t" << (totalTime / 60.0) << std::endl << std::endl; diff --git a/src/Scanner.h b/src/Scanner.h index 02e3d89..e7b37c6 100644 --- a/src/Scanner.h +++ b/src/Scanner.h @@ -82,8 +82,8 @@ class Scanner : public Thread /** The live data from the scanner */ struct LiveData { - std::vector * leftLaserResults; - std::vector * rightLaserResults; + std::vector * leftLaserResults; + std::vector * rightLaserResults; }; /** Returns the data being scanned and locks all other access to it */ @@ -101,8 +101,10 @@ class Scanner : public Thread double rotationTime; double startTime; double pointProcessingTime; - double pointCloudWritingTime; - double meshWritingTime; + double plyWritingTime; + double stlWritingTime; + double xyzWritingTime; + double facetizationTime; double laserTime; double laserMergeTime; int numFrameRetries; @@ -123,16 +125,11 @@ class Scanner : public Thread /** * Returns true if the scan was processed successfully and false if there was a problem and the frame needs to be again. */ - bool processScan(std::vector & results, int frame, float rotation, LocationMapper& locMapper, Laser::LaserSide laserSide, int & firstRowLaserCol, TimingStats * timingStats); + bool processScan(std::vector & results, int frame, float rotation, LocationMapper& locMapper, Laser::LaserSide laserSide, int & firstRowLaserCol, TimingStats * timingStats); void writeRangePoints(ColoredPoint * points, int numLocationsMapped,Laser::LaserSide laserSide); -private: - /** Unowned objects */ - Laser * m_laser; - Camera * m_camera; - TurnTable * m_turnTable; -private: + void mergeDebuggingImages(Image& outImage, const Image& leftDebuggingImage, const Image& rightDebuggingImage, Laser::LaserSide laserSide); /** * Prepares the object for scanning. @@ -143,6 +140,13 @@ class Scanner : public Thread * Acquires an image from the camera. */ void acquireImage(Image * image); +private: + /** Unowned objects */ + Laser * m_laser; + Camera * m_camera; + TurnTable * m_turnTable; + +private: /** Array of laser locations */ PixelLocation * m_laserLocations; @@ -173,8 +177,8 @@ class Scanner : public Thread /** The maximum number of times to try a frame (at a particular rotation) before giving up */ const int m_maxNumFrameRetries; - /** The threshold for percentage of pixels over the threshold */ - const real m_maxPercentPixelsOverThreshold; + /** The maximum number of failed laser detection rows before */ + const real m_maxNumFailedRows; /** The image points for every column */ ColoredPoint * m_columnPoints; @@ -194,6 +198,9 @@ class Scanner : public Thread /** Max number of pixel locations */ unsigned m_maxNumLocations; + /** The max number of frames per revolution */ + int m_maxFramesPerRevolution; + /** The angle between the left and right laser planes */ real m_radiansBetweenLaserPlanes; @@ -225,10 +232,10 @@ class Scanner : public Thread Scanner::Task m_task; /** Left laser results */ - std::vector m_leftLaserResults; + std::vector m_leftLaserResults; /** Right laser results */ - std::vector m_rightLaserResults; + std::vector m_rightLaserResults; /** Protection for the the 3D result data */ CriticalSection m_results; diff --git a/src/StlWriter.cpp b/src/StlWriter.cpp index 853a3fc..d87ba44 100644 --- a/src/StlWriter.cpp +++ b/src/StlWriter.cpp @@ -19,7 +19,6 @@ */ #include "Main.h" -#include "NeutralFileReader.h" #include "StlWriter.h" #include "Camera.h" #include "Laser.h" @@ -28,20 +27,10 @@ namespace freelss { -static real32 DistanceSquared(const ColoredPoint& a, const ColoredPoint&b) -{ - real32 dx = a.x - b.x; - real32 dy = a.y - b.y; - real32 dz = a.z - b.z; - - return dx * dx + dy * dy + dz * dz; -} StlWriter::StlWriter() : - m_maxEdgeDistMmSq(12.4 * 12.2), // TODO: Make this a setting or autodetect it based off the distance to table and the detail level - m_attribute(0), - m_imageWidth(0) + m_attribute(0) { m_normal[0] = 0; m_normal[1] = 0; @@ -49,7 +38,7 @@ StlWriter::StlWriter() : } -void StlWriter::write(const std::string& baseFilename, const std::vector& results, bool connectLastFrameToFirst, Progress& progress) +void StlWriter::write(const std::string& baseFilename, const std::vector& results, const FaceMap& faces, Progress& progress) { progress.setLabel("Generating STL file"); progress.setPercent(0); @@ -61,98 +50,24 @@ void StlWriter::write(const std::string& baseFilename, const std::vectorgetImageHeight(); // TODO: Make this use the image height that generated the result and not the current Camera - m_imageWidth = Camera::getInstance()->getImageWidth(); - uint32 numRowBins = 400; // TODO: Autodetect this or have it in Database - // Write the STL header - writeHeader(fout); + writeHeader(fout, faces); - uint32 numTriangles = 0; + const std::vector& triangles = faces.triangles; - try + for (size_t idx = 0; idx < triangles.size(); idx += 3) { - int iStep = 0; - - std::vector firstFrame; - std::vector frameA; - std::vector frameB; - std::vector frameC; - - std::vector * currentFrame = &frameA; - std::vector * lastFrame = &frameB; - - size_t resultIndex = 0; - size_t totNumPoints = 0; - - real percent = 0; - while (NeutralFileRecord::readNextFrame(frameC, results, resultIndex)) - { - real newPct = 100.0f * resultIndex / results.size(); - if (newPct - percent > 0.1) - { - progress.setPercent(newPct); - percent = newPct; - } - - // Reduce the number of result rows and filter out some of the noise - NeutralFileRecord::lowpassFilter(* currentFrame, frameC, maxNumRows, numRowBins); - - totNumPoints += currentFrame->size(); - - // Sort the results in decreasing Y - //std::sort(currentFrame->begin(), currentFrame->end(), SortRecordByYValue); - - if (iStep > 0) - { - writeTrianglesForColumn(* currentFrame, * lastFrame, fout, numTriangles); - } - else if (connectLastFrameToFirst) - { - // Store the first frame for usage later on - firstFrame = frameC; - } - - // Swap to the other buffer to populate it - std::vector * tmpFrame = lastFrame; - lastFrame = currentFrame; - currentFrame = tmpFrame; - - iStep++; - } - - // If this was a full scan close the loop - if (connectLastFrameToFirst && iStep > 0) - { - totNumPoints += firstFrame.size(); - writeTrianglesForColumn(firstFrame, * lastFrame, fout, numTriangles); - } - - fout.close(); - - std::cout << "Meshed " << (iStep + 1) << " scans with a total of " << totNumPoints << " points." << std::endl; - - int filePos = 80; // The file position where we should write the triangle count - std::fstream fp (stlFilename.c_str()); - if (!fp.is_open()) - { - throw Exception(std::string("Error updating triangle count in STL file: ") + stlFilename); - } + const ColoredPoint& pt1 = results[triangles[idx]].point; + const ColoredPoint& pt2 = results[triangles[idx + 1]].point; + const ColoredPoint& pt3 = results[triangles[idx + 2]].point; - fp.seekp(filePos, std::ios_base::beg); - fp.write((const char *)&numTriangles, sizeof(uint32)); - fp.close(); - } - catch (...) - { - fout.close(); - throw; + writeTriangle(pt1, pt2, pt3, fout); } fout.close(); } -void StlWriter::writeHeader(std::ofstream& fout) +void StlWriter::writeHeader(std::ofstream& fout, const FaceMap& faces) { unsigned char header[80]; memset(header, 0, sizeof(header)); @@ -162,189 +77,23 @@ void StlWriter::writeHeader(std::ofstream& fout) fout.write((const char *)header, sizeof(unsigned char) * 80); // Write number of triangles - uint32 numTriangles = 0; + uint32 numTriangles = (uint32) (faces.triangles.size() / 3); fout.write((const char *)&numTriangles, sizeof(uint32)); } -bool StlWriter::isInwardFacingFace(const NeutralFileRecord& p1, const NeutralFileRecord& p2, const NeutralFileRecord& p3) -{ - int laserSide = p1.laserSide; - bool inwardFacing = false; - float halfImageWidth = m_imageWidth * 0.5f; // If it's past the centerline then it will result in an inward facing triangle - - if (laserSide == (int)Laser::LEFT_LASER) - { - inwardFacing = p1.pixel.x > halfImageWidth || p2.pixel.x > halfImageWidth || p3.pixel.x > halfImageWidth; - } - else if (laserSide == (int)Laser::RIGHT_LASER) - { - inwardFacing = p1.pixel.x < halfImageWidth || p2.pixel.x < halfImageWidth || p3.pixel.x < halfImageWidth; - } - else - { - throw Exception("Unsupported LaserSide in StlWriter::isInwardFacingFace"); - } - - return inwardFacing; -} - -/* -foreach column - set row to 0 - foreach pt in prev_column - // Fan connect to the row - while cell[row] is within range and cell[row + 1] is within range and closer to this point than the one below - createTriangle(pt, cell[row], cell[row + 1]) - row++ - - // Extend mesh down to start processing the next point - if nextPt is within range - createTriangle(pt, nextPt, cell[row]) - - - */ -void StlWriter::writeTrianglesForColumn(const std::vector& currentFrame, const std::vector& lastFrame, std::ofstream& fout, uint32& numTriangles) +void StlWriter::writeTriangle(const ColoredPoint& pt1, const ColoredPoint& pt2, const ColoredPoint& pt3, std::ofstream& fout) { - size_t iCur = 0; - - for (size_t iLst = 0; iLst + 1 < lastFrame.size(); iLst++) - { - const NeutralFileRecord & l1 = lastFrame[iLst]; - const NeutralFileRecord & l2 = lastFrame[iLst + 1]; - - // If the current point is in range - while (iCur + 1 < currentFrame.size()) - { - const NeutralFileRecord & c1 = currentFrame[iCur]; - const NeutralFileRecord & c2 = currentFrame[iCur + 1]; - - // If there is a hole in the model, skip along until there isn't one - if (isValidTriangle(l1.point, c1.point, c2.point)) - { - real32 distSq1 = DistanceSquared(l1.point, c2.point); - real32 distSq2 = DistanceSquared(l2.point, c2.point); - - // While this C point is closer to this L point than the next L point, create a triangle fan with it - // Don't generate triangles bigger than our maximum allowable edge distance - // if (distSq1 < distSq2 && distSq1 <= m_maxEdgeDistMmSq) - if (distSq1 < distSq2) - { - // Determine if we need to flip the normal or not - bool flipNormal = isInwardFacingFace(l1, c1, c2); - writeTriangle(l1.point, c1.point, c2.point, flipNormal, fout); - numTriangles++; - } - else - { - // Connect to this triangle - if (isValidTriangle(l2.point, l1.point, c1.point)) - { - bool flipNormal = isInwardFacingFace(l2, l1, c1); - writeTriangle(l2.point, l1.point, c1.point, flipNormal, fout); - numTriangles++; - } - else - { - iCur++; - } - - // It's closer to the next L point, so advance to it - break; - } - } - else - { - iCur++; - break; - } - - // Advance to the next row - iCur++; - } - } -} - -bool StlWriter::isValidTriangle(const ColoredPoint& pt1, const ColoredPoint& pt2, const ColoredPoint& pt3) -{ - if (DistanceSquared(pt1, pt2) > m_maxEdgeDistMmSq) - { - return false; - } - else if (DistanceSquared(pt1, pt3) > m_maxEdgeDistMmSq) - { - return false; - } - else if (DistanceSquared(pt2, pt3) > m_maxEdgeDistMmSq) - { - return false; - } - - return true; -} - -void StlWriter::writeTriangle(const ColoredPoint& pt1, const ColoredPoint& pt2, const ColoredPoint& pt3, bool flipNormal, std::ofstream& fout) -{ - real32 pt1x, pt1y, pt1z; - real32 pt2x, pt2y, pt2z; - real32 pt3x, pt3y, pt3z; - - - if (!flipNormal) - { - pt1x = pt1.x; - pt1y = pt1.y; - pt1z = pt1.z; - pt2x = pt2.x; - pt2y = pt2.y; - pt2z = pt2.z; - pt3x = pt3.x; - pt3y = pt3.y; - pt3z = pt3.z; - } - else - { - pt1x = pt3.x; - pt1y = pt3.y; - pt1z = pt3.z; - pt2x = pt2.x; - pt2y = pt2.y; - pt2z = pt2.z; - pt3x = pt1.x; - pt3y = pt1.y; - pt3z = pt1.z; - } - - fout.write((const char *)&m_normal, sizeof(real32) * 3); - fout.write((const char *)&pt1x, sizeof(real32)); - fout.write((const char *)&pt1y, sizeof(real32)); - fout.write((const char *)&pt1z, sizeof(real32)); - fout.write((const char *)&pt2x, sizeof(real32)); - fout.write((const char *)&pt2y, sizeof(real32)); - fout.write((const char *)&pt2z, sizeof(real32)); - fout.write((const char *)&pt3x, sizeof(real32)); - fout.write((const char *)&pt3y, sizeof(real32)); - fout.write((const char *)&pt3z, sizeof(real32)); + fout.write((const char *)&pt1.x, sizeof(real32)); + fout.write((const char *)&pt1.y, sizeof(real32)); + fout.write((const char *)&pt1.z, sizeof(real32)); + fout.write((const char *)&pt2.x, sizeof(real32)); + fout.write((const char *)&pt2.y, sizeof(real32)); + fout.write((const char *)&pt2.z, sizeof(real32)); + fout.write((const char *)&pt3.x, sizeof(real32)); + fout.write((const char *)&pt3.y, sizeof(real32)); + fout.write((const char *)&pt3.z, sizeof(real32)); fout.write((const char *)&m_attribute, sizeof(uint16)); } -void StlWriter::populateBuffer(NeutralFileRecord * records, int numRecords, NeutralFileRecord ** buffer, int maxNumRecords) -{ - // Set all the pointers in buffer to NULL - memset(buffer, 0, sizeof(NeutralFileRecord *) * maxNumRecords); - - // Expand the records so that they sit at the same index as their pixel row - for (int i = 0; i < numRecords; i++) - { - int row = ROUND(records[i].pixel.y); - if (row >= maxNumRecords) - { - throw Exception("Pixel value is outside the maximum number of records"); - } - - // Point to the record - buffer[row] = &records[i]; - } -} - } diff --git a/src/StlWriter.h b/src/StlWriter.h index 307a4dd..ea19562 100644 --- a/src/StlWriter.h +++ b/src/StlWriter.h @@ -30,32 +30,14 @@ class StlWriter public: StlWriter(); - void write(const std::string& filename, const std::vector& results, bool connectLastFrameToFirst, Progress& progress); + void write(const std::string& filename, const std::vector& results, const FaceMap& faces, Progress& progress); private: - void writeHeader(std::ofstream& fout); - void populateBuffer(NeutralFileRecord * records, int numRecords, NeutralFileRecord ** buffer, int maxNumRecords); - void writeTrianglesForColumn(const std::vector& currentFrame, const std::vector& lastFrame, std::ofstream& fout, uint32& numTriangles); - void writeTriangle(const ColoredPoint& pt1, const ColoredPoint& pt2, const ColoredPoint& pt3, bool flipNormal, std::ofstream& fout); - - bool isValidTriangle(const ColoredPoint& pt1, const ColoredPoint& pt2, const ColoredPoint& pt3); - - /** - * Indicates if the face is oriented point into the model and the normal needs to get flipped. - * This method assumes that the camera is looking straight down -z and x = 0. The y doesn't matter. - * This method assumes that all points were taken from the same laser. - */ - bool isInwardFacingFace(const NeutralFileRecord& p1, const NeutralFileRecord& p2, const NeutralFileRecord& p3); - - - /** The max triangle edge distance in mm sq */ - real32 m_maxEdgeDistMmSq; + void writeHeader(std::ofstream& fout, const FaceMap& faces); + void writeTriangle(const ColoredPoint& pt1, const ColoredPoint& pt2, const ColoredPoint& pt3, std::ofstream& fout); real32 m_normal[3]; uint16 m_attribute; - - /** The image width of the current camera */ - int m_imageWidth; }; } diff --git a/src/WebContent.cpp b/src/WebContent.cpp index e815e84..3747644 100644 --- a/src/WebContent.cpp +++ b/src/WebContent.cpp @@ -293,6 +293,9 @@ const std::string WebContent::PLY_DATA_FORMAT_DESCR = "Whether to generate binar std::string WebContent::scan(const std::vector& pastScans) { + const Preset& preset = PresetManager::get()->getActivePreset(); + std::string presetName = preset.name; + std::stringstream sstr; sstr << "" << CSS @@ -309,6 +312,7 @@ std::string WebContent::scan(const std::vector& pastScans) \

Click the button to start the scan

\
\ +
Preset
\
Degrees
degrees
\ \ \ @@ -421,7 +425,7 @@ std::string WebContent::scanRunning(Progress& progress, real remainingTime) << JAVASCRIPT << std::endl << "" - << "

" + << "

" << progress.getLabel() << " is " << progress.getPercent() @@ -434,7 +438,9 @@ std::string WebContent::scanRunning(Progress& progress, real remainingTime) << " minutes remaining"; } - sstr << ". Preview

" + sstr << ". 
" + << "" + << "


" << "
" << "" << "" diff --git a/src/XyzWriter.cpp b/src/XyzWriter.cpp index 59ed038..b08f28c 100644 --- a/src/XyzWriter.cpp +++ b/src/XyzWriter.cpp @@ -26,7 +26,7 @@ namespace freelss { -void XyzWriter::write(const std::string& baseFilename, const std::vector& results, Progress& progress) +void XyzWriter::write(const std::string& baseFilename, const std::vector& results, Progress& progress) { // Sanity check if (results.empty()) @@ -49,12 +49,12 @@ void XyzWriter::write(const std::string& baseFilename, const std::vector frameA; - std::vector currentFrame; + std::vector frameA; + std::vector currentFrame; size_t resultIndex = 0; real percent = 0; - while (NeutralFileRecord::readNextFrame(frameA, results, resultIndex)) + while (DataPoint::readNextFrame(frameA, results, resultIndex)) { real newPct = 100.0f * resultIndex / results.size(); if (newPct - percent > 0.1) @@ -64,12 +64,12 @@ void XyzWriter::write(const std::string& baseFilename, const std::vector& results, Progress& progress); + void write(const std::string& filename, const std::vector& results, Progress& progress); }; }